summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiva Chandra Reddy <sivachandra@google.com>2020-02-27 14:30:24 -0800
committerSiva Chandra Reddy <sivachandra@google.com>2020-02-28 23:27:32 -0800
commitd1536673c68d5010d2a6a3a12a9dd205e8fca2d4 (patch)
tree1bd3780fc6a100b6a8c8739484c9b22bf07b5276 /libc/utils
parent[X86] Move the function getOrCreateBoundaryAlignFragment (diff)
downloadllvm-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.cpp32
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())