diff options
author | Siva Chandra Reddy <sivachandra@google.com> | 2020-02-27 14:30:24 -0800 |
---|---|---|
committer | Siva Chandra Reddy <sivachandra@google.com> | 2020-02-28 23:27:32 -0800 |
commit | d1536673c68d5010d2a6a3a12a9dd205e8fca2d4 (patch) | |
tree | 1bd3780fc6a100b6a8c8739484c9b22bf07b5276 /libc/utils | |
parent | [X86] Move the function getOrCreateBoundaryAlignFragment (diff) | |
download | llvm-project-d1536673c68d5010d2a6a3a12a9dd205e8fca2d4.tar.gz llvm-project-d1536673c68d5010d2a6a3a12a9dd205e8fca2d4.tar.bz2 llvm-project-d1536673c68d5010d2a6a3a12a9dd205e8fca2d4.zip |
[libc] Add ability to generate enum types/values to HdrGen.
A target to generate the std C threads.h file has been added. This
utilizes the new feature added in this change.
Reviewers: phosek
Differential Revision: https://reviews.llvm.org/D75379
Diffstat (limited to 'libc/utils')
-rw-r--r-- | libc/utils/HdrGen/PublicAPICommand.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/libc/utils/HdrGen/PublicAPICommand.cpp b/libc/utils/HdrGen/PublicAPICommand.cpp index c07283814550..15263e580c14 100644 --- a/libc/utils/HdrGen/PublicAPICommand.cpp +++ b/libc/utils/HdrGen/PublicAPICommand.cpp @@ -75,11 +75,13 @@ class APIGenerator { // Mapping from names to records defining them. NameToRecordMapping MacroSpecMap; NameToRecordMapping TypeSpecMap; + NameToRecordMapping EnumerationSpecMap; NameToRecordMapping FunctionSpecMap; NameToRecordMapping MacroDefsMap; NameToRecordMapping TypeDeclsMap; NameSet Structs; + NameSet Enumerations; NameSet Functions; bool isaNamedType(llvm::Record *Def) { return isa(Def, NamedTypeClass); } @@ -136,6 +138,13 @@ class APIGenerator { FunctionSpecMap[std::string(FunctionSpec->getValueAsString("Name"))] = FunctionSpec; } + + auto EnumerationSpecList = + HeaderSpec->getValueAsListOfDefs("Enumerations"); + for (llvm::Record *EnumerationSpec : EnumerationSpecList) { + EnumerationSpecMap[std::string( + EnumerationSpec->getValueAsString("Name"))] = EnumerationSpec; + } } } } @@ -159,6 +168,10 @@ class APIGenerator { auto FunctionList = PublicAPI->getValueAsListOfStrings("Functions"); for (llvm::StringRef FunctionName : FunctionList) Functions.insert(std::string(FunctionName)); + + auto EnumerationList = PublicAPI->getValueAsListOfStrings("Enumerations"); + for (llvm::StringRef EnumerationName : EnumerationList) + Enumerations.insert(std::string(EnumerationName)); } void index(llvm::RecordKeeper &Records) { @@ -211,6 +224,25 @@ public: OS << '\n'; } + if (Enumerations.size() != 0) + OS << "enum {" << '\n'; + for (const auto &Name : Enumerations) { + if (EnumerationSpecMap.find(Name) == EnumerationSpecMap.end()) + llvm::PrintFatalError( + Name + " is not listed as an enumeration in any standard spec.\n"); + + llvm::Record *EnumerationSpec = EnumerationSpecMap[Name]; + OS << " " << EnumerationSpec->getValueAsString("Name"); + auto Value = EnumerationSpec->getValueAsString("Value"); + if (Value == "__default__") { + OS << ",\n"; + } else { + OS << " = " << Value << ",\n"; + } + } + if (Enumerations.size() != 0) + OS << "};\n\n"; + OS << "__BEGIN_C_DECLS\n\n"; for (auto &Name : Functions) { if (FunctionSpecMap.find(Name) == FunctionSpecMap.end()) |