summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2013-09-11 19:47:58 +0000
committerAaron Ballman <aaron@aaronballman.com>2013-09-11 19:47:58 +0000
commitd068607c136298bec0891d750389a55bac9f5c98 (patch)
tree58827002d9a2a04aa3e1808c126f28267b35222e /utils
parente80501ba640fae189d5f944b025a0079ec3c579f (diff)
downloadclang-d068607c136298bec0891d750389a55bac9f5c98.tar.gz
clang-d068607c136298bec0891d750389a55bac9f5c98.tar.bz2
clang-d068607c136298bec0891d750389a55bac9f5c98.tar.xz
Tablegen now generates a StringSwitch for attributes containing enumeration arguments to map strings to the proper enumeration value. This makes error checking more consistent and reduces the amount of hand-written code required.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190545 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/ClangAttrEmitter.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp
index 8922c5c023..7f42e455bd 100644
--- a/utils/TableGen/ClangAttrEmitter.cpp
+++ b/utils/TableGen/ClangAttrEmitter.cpp
@@ -134,6 +134,8 @@ namespace {
virtual void writeDump(raw_ostream &OS) const = 0;
virtual void writeDumpChildren(raw_ostream &OS) const {}
virtual void writeHasChildren(raw_ostream &OS) const { OS << "false"; }
+
+ virtual bool isEnumArg() const { return false; }
};
class SimpleArgument : public Argument {
@@ -524,6 +526,8 @@ namespace {
assert(!uniques.empty());
}
+ bool isEnumArg() const { return true; }
+
void writeAccessors(raw_ostream &OS) const {
OS << " " << type << " get" << getUpperName() << "() const {\n";
OS << " return " << getLowerName() << ";\n";
@@ -583,6 +587,22 @@ namespace {
}
OS << " }\n";
}
+
+ void writeConversion(raw_ostream &OS) const {
+ OS << " static bool ConvertStrTo" << type << "(StringRef Val, ";
+ OS << type << " &Out) {\n";
+ OS << " Optional<" << type << "> R = llvm::StringSwitch<Optional<";
+ OS << type << "> >(Val)\n";
+ for (size_t I = 0; I < enums.size(); ++I) {
+ OS << " .Case(\"" << values[I] << "\", ";
+ OS << getAttrName() << "Attr::" << enums[I] << ")\n";
+ }
+ OS << " .Default(Optional<" << type << ">());\n";
+ OS << " if (R) {\n";
+ OS << " Out = *R;\n return true;\n }\n";
+ OS << " return false;\n";
+ OS << " }\n";
+ }
};
class VersionArgument : public Argument {
@@ -1027,6 +1047,11 @@ void EmitClangAttrClass(RecordKeeper &Records, raw_ostream &OS) {
for (ai = Args.begin(); ai != ae; ++ai) {
(*ai)->writeAccessors(OS);
OS << "\n\n";
+
+ if ((*ai)->isEnumArg()) {
+ EnumArgument *EA = (EnumArgument *)*ai;
+ EA->writeConversion(OS);
+ }
}
OS << R.getValueAsString("AdditionalMembers");