aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/AttributeList.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-05-02 14:24:30 +0000
committerDouglas Gregor <dgregor@apple.com>2012-05-02 14:24:30 +0000
commitb6dd6055a4fb8646805ba8f385aa7c99acd47817 (patch)
tree75d119559d552b54078eac7fecbb7445f0fcdf15 /lib/Sema/AttributeList.cpp
parent8049c44d972fc7266b4369e8960875c118c067e0 (diff)
Replace the StringSwitch in AttributeList::getKind(const
IdentifierInfo *) with a static StringMap, improving -fsyntax-only performance by 1% for the example in <rdar://problem/11004361>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155987 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/AttributeList.cpp')
-rw-r--r--lib/Sema/AttributeList.cpp50
1 files changed, 31 insertions, 19 deletions
diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp
index f142ab4c0a..a380bb8887 100644
--- a/lib/Sema/AttributeList.cpp
+++ b/lib/Sema/AttributeList.cpp
@@ -14,7 +14,7 @@
#include "clang/Sema/AttributeList.h"
#include "clang/AST/Expr.h"
#include "clang/Basic/IdentifierTable.h"
-#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/StringMap.h"
using namespace clang;
size_t AttributeList::allocated_size() const {
@@ -97,6 +97,30 @@ AttributePool::createIntegerAttribute(ASTContext &C, IdentifierInfo *Name,
return create(Name, TokLoc, 0, TokLoc, 0, TokLoc, &IArg, 1, 0);
}
+
+typedef llvm::StringMap<AttributeList::Kind> AttributeNameKindMap;
+
+static AttributeNameKindMap createAttributeNameKindMap(){
+ AttributeNameKindMap Result;
+#include "clang/Sema/AttrParsedAttrKinds.inc"
+ Result["address_space"] = AttributeList::AT_address_space;
+ Result["align"] = AttributeList::AT_aligned; // FIXME: should it be "aligned"?
+ Result["base_check"] = AttributeList::AT_base_check;
+ Result["bounded"] = AttributeList::IgnoredAttribute; // OpenBSD
+ Result["__const"] = AttributeList::AT_const; // some GCC headers do contain this spelling
+ Result["cf_returns_autoreleased"] = AttributeList::AT_cf_returns_autoreleased;
+ Result["mode"] = AttributeList::AT_mode;
+ Result["vec_type_hint"] = AttributeList::IgnoredAttribute;
+ Result["ext_vector_type"] = AttributeList::AT_ext_vector_type;
+ Result["neon_vector_type"] = AttributeList::AT_neon_vector_type;
+ Result["neon_polyvector_type"] = AttributeList::AT_neon_polyvector_type;
+ Result["opencl_image_access"] = AttributeList::AT_opencl_image_access;
+ Result["objc_gc"] = AttributeList::AT_objc_gc;
+ Result["objc_ownership"] = AttributeList::AT_objc_ownership;
+ Result["vector_size"] = AttributeList::AT_vector_size;
+ return Result;
+}
+
AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
StringRef AttrName = Name->getName();
@@ -105,22 +129,10 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
AttrName.size() >= 4)
AttrName = AttrName.substr(2, AttrName.size() - 4);
- return llvm::StringSwitch<AttributeList::Kind>(AttrName)
- #include "clang/Sema/AttrParsedAttrKinds.inc"
- .Case("address_space", AT_address_space)
- .Case("align", AT_aligned) // FIXME - should it be "aligned"?
- .Case("base_check", AT_base_check)
- .Case("bounded", IgnoredAttribute) // OpenBSD
- .Case("__const", AT_const) // some GCC headers do contain this spelling
- .Case("cf_returns_autoreleased", AT_cf_returns_autoreleased)
- .Case("mode", AT_mode)
- .Case("vec_type_hint", IgnoredAttribute)
- .Case("ext_vector_type", AT_ext_vector_type)
- .Case("neon_vector_type", AT_neon_vector_type)
- .Case("neon_polyvector_type", AT_neon_polyvector_type)
- .Case("opencl_image_access", AT_opencl_image_access)
- .Case("objc_gc", AT_objc_gc)
- .Case("objc_ownership", AT_objc_ownership)
- .Case("vector_size", AT_vector_size)
- .Default(UnknownAttribute);
+ static AttributeNameKindMap Map = createAttributeNameKindMap();
+ AttributeNameKindMap::iterator Pos = Map.find(AttrName);
+ if (Pos != Map.end())
+ return Pos->second;
+
+ return UnknownAttribute;
}