From 0191bf8655855c20755bb2a094c99000299cbea7 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 2 May 2012 14:50:50 +0000 Subject: [PATCH] Revert my optimization to AttributeList::getKind() in r155987; Benjamin has suggested a better approach. llvm-svn: 155989 --- clang/lib/Sema/AttributeList.cpp | 50 +++++++++-------------- clang/utils/TableGen/ClangAttrEmitter.cpp | 3 +- 2 files changed, 20 insertions(+), 33 deletions(-) diff --git a/clang/lib/Sema/AttributeList.cpp b/clang/lib/Sema/AttributeList.cpp index a380bb888774..f142ab4c0a32 100644 --- a/clang/lib/Sema/AttributeList.cpp +++ b/clang/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/StringMap.h" +#include "llvm/ADT/StringSwitch.h" using namespace clang; size_t AttributeList::allocated_size() const { @@ -97,30 +97,6 @@ AttributePool::createIntegerAttribute(ASTContext &C, IdentifierInfo *Name, return create(Name, TokLoc, 0, TokLoc, 0, TokLoc, &IArg, 1, 0); } - -typedef llvm::StringMap 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(); @@ -129,10 +105,22 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) { AttrName.size() >= 4) AttrName = AttrName.substr(2, AttrName.size() - 4); - static AttributeNameKindMap Map = createAttributeNameKindMap(); - AttributeNameKindMap::iterator Pos = Map.find(AttrName); - if (Pos != Map.end()) - return Pos->second; - - return UnknownAttribute; + return llvm::StringSwitch(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); } diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index 6dc015acfb90..7951fc467d20 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -1083,8 +1083,7 @@ void ClangAttrParsedAttrKindsEmitter::run(raw_ostream &OS) { AttrName = NormalizeAttrName(AttrName); Spelling = NormalizeAttrSpelling(Spelling); - OS << "Result[\"" << Spelling << "\"] = " << "AttributeList::AT_" - << AttrName << ";\n"; + OS << ".Case(\"" << Spelling << "\", " << "AT_" << AttrName << ")\n"; } } }