diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-05-02 14:24:30 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-05-02 14:24:30 +0000 |
commit | b6dd6055a4fb8646805ba8f385aa7c99acd47817 (patch) | |
tree | 75d119559d552b54078eac7fecbb7445f0fcdf15 /lib/Sema/AttributeList.cpp | |
parent | 8049c44d972fc7266b4369e8960875c118c067e0 (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.cpp | 50 |
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; } |