| //===-- 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 <optional> | |
| #include <string> | |
| #include <unordered_map> | |
| #include <unordered_set> | |
| namespace llvm_libc { | |
| class APIIndexer { | |
| private: | |
| std::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(std::nullopt) { | |
| 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 ObjectSpecMap; | |
| std::unordered_map<std::string, std::string> FunctionToHeaderMap; | |
| std::unordered_map<std::string, std::string> ObjectToHeaderMap; | |
| NameSet RequiredTypes; | |
| NameSet Structs; | |
| NameSet Enumerations; | |
| NameSet Functions; | |
| NameSet Objects; | |
| NameSet PublicHeaders; | |
| std::string getTypeAsString(llvm::Record *TypeRecord); | |
| }; | |
| } // namespace llvm_libc | |
| #endif // LLVM_LIBC_UTILS_LIBC_TABLE_GEN_UTILS_API_INDEXER_H |