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
81 lines
2.4 KiB
C++
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
|