Files
clang-p2996/libc/utils/LibcTableGenUtil/APIIndexer.h
Siva Chandra Reddy a32af8252f [libc] Add a tool called WrapperGen.
This tool will be used to generate C wrappers for the C++ LLVM libc
implementations. This change does not hook this tool up to anything yet.
However, it can be useful for cases where one does not want to run the
objcopy step (to insert the C symbol in the object file) but can make use
of LTO to eliminate the cost of the additional wrapper call. This can be
relevant for certain downstream platforms. If this tool can benefit other
libc platforms in general, then it can be integrated into the build system
with options to use or not use the wrappers. An example of such a
platform is CUDA.

Reviewed By: abrachet

Differential Revision: https://reviews.llvm.org/D84848
2020-07-30 16:07:26 -07:00

81 lines
2.4 KiB
C++

//===-- A class to index libc API listed in tablegen files ------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H
#define LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H
#include "llvm/ADT/StringRef.h"
#include "llvm/TableGen/Record.h"
#include <string>
#include <unordered_map>
#include <unordered_set>
namespace llvm_libc {
class APIIndexer {
private:
llvm::Optional<llvm::StringRef> StdHeader;
// TableGen classes in spec.td.
llvm::Record *NamedTypeClass;
llvm::Record *PtrTypeClass;
llvm::Record *RestrictedPtrTypeClass;
llvm::Record *ConstTypeClass;
llvm::Record *StructClass;
llvm::Record *StandardSpecClass;
llvm::Record *PublicAPIClass;
bool isaNamedType(llvm::Record *Def);
bool isaStructType(llvm::Record *Def);
bool isaPtrType(llvm::Record *Def);
bool isaConstType(llvm::Record *Def);
bool isaRestrictedPtrType(llvm::Record *Def);
bool isaStandardSpec(llvm::Record *Def);
bool isaPublicAPI(llvm::Record *Def);
void indexStandardSpecDef(llvm::Record *StandardSpec);
void indexPublicAPIDef(llvm::Record *PublicAPI);
void index(llvm::RecordKeeper &Records);
public:
using NameToRecordMapping = std::unordered_map<std::string, llvm::Record *>;
using NameSet = std::unordered_set<std::string>;
// This indexes all headers, not just a specified one.
explicit APIIndexer(llvm::RecordKeeper &Records) : StdHeader(llvm::None) {
index(Records);
}
APIIndexer(llvm::StringRef Header, llvm::RecordKeeper &Records)
: StdHeader(Header) {
index(Records);
}
// Mapping from names to records defining them.
NameToRecordMapping MacroSpecMap;
NameToRecordMapping TypeSpecMap;
NameToRecordMapping EnumerationSpecMap;
NameToRecordMapping FunctionSpecMap;
NameToRecordMapping MacroDefsMap;
NameToRecordMapping TypeDeclsMap;
std::unordered_map<std::string, std::string> FunctionToHeaderMap;
NameSet Structs;
NameSet Enumerations;
NameSet Functions;
NameSet PublicHeaders;
std::string getTypeAsString(llvm::Record *TypeRecord);
};
} // namespace llvm_libc
#endif // LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H