From: Aaron Ballman Date: Thu, 27 Mar 2014 20:36:32 +0000 (+0000) Subject: Reverting r204952, while I figure out what's going on with the makefile build. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d35cc359e1572d9bdd8ea3ca83da79722c034b79;p=clang Reverting r204952, while I figure out what's going on with the makefile build. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204955 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Attributes.h b/include/clang/Basic/Attributes.h deleted file mode 100644 index 48242fe641..0000000000 --- a/include/clang/Basic/Attributes.h +++ /dev/null @@ -1,39 +0,0 @@ -//===--- Attributes.h - Attributes header -----------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_BASIC_ATTRIBUTES_H -#define LLVM_CLANG_BASIC_ATTRIBUTES_H - -#include "llvm/ADT/Triple.h" -#include "clang/Basic/LangOptions.h" - -namespace clang { - -class IdentifierInfo; - -enum class AttrSyntax { - /// Is the attribute identifier generally known for any syntax? - Generic, - /// Is the identifier known as a GNU-style attribute? - GNU, - /// Is the identifier known as a __declspec-style attribute? - Declspec, - // Is the identifier known as a C++-style attribute? - CXX -}; - -/// \brief Return true if we recognize and implement the attribute specified by -/// the given information. -bool HasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, - const IdentifierInfo *Attr, const llvm::Triple &T, - const LangOptions &LangOpts); - -} // end namespace clang - -#endif // LLVM_CLANG_BASIC_ATTRIBUTES_H diff --git a/include/clang/Basic/CMakeLists.txt b/include/clang/Basic/CMakeLists.txt index 98e8efda82..274b94da8e 100644 --- a/include/clang/Basic/CMakeLists.txt +++ b/include/clang/Basic/CMakeLists.txt @@ -28,12 +28,6 @@ clang_tablegen(AttrList.inc -gen-clang-attr-list SOURCE Attr.td TARGET ClangAttrList) -clang_tablegen(AttrHasAttributeImpl.inc -gen-clang-attr-has-attribute-impl - -I ${CMAKE_CURRENT_SOURCE_DIR}/../../ - SOURCE Attr.td - TARGET ClangAttrHasAttributeImpl - ) - # ARM NEON clang_tablegen(arm_neon.inc -gen-arm-neon-sema SOURCE arm_neon.td diff --git a/include/clang/Basic/Makefile b/include/clang/Basic/Makefile index a9358f06f5..6a33133252 100644 --- a/include/clang/Basic/Makefile +++ b/include/clang/Basic/Makefile @@ -6,7 +6,6 @@ BUILT_SOURCES = \ DiagnosticFrontendKinds.inc DiagnosticLexKinds.inc \ DiagnosticParseKinds.inc DiagnosticSemaKinds.inc \ DiagnosticSerializationKinds.inc \ - AttrHasAttributeImpl.inc \ DiagnosticIndexName.inc DiagnosticGroups.inc AttrList.inc arm_neon.inc \ Version.inc @@ -49,12 +48,6 @@ $(ObjDir)/AttrList.inc.tmp : Attr.td $(CLANG_TBLGEN) $(ObjDir)/.dir $(Verb) $(ClangTableGen) -gen-clang-attr-list -o $(call SYSPATH, $@) \ -I $(PROJ_SRC_DIR)/../.. $< -$(ObjDir)/AttrHasAttributeImpl.inc.tmp : Attr.td $(CLANG_TBLGEN) \ - $(ObjDir)/.dir - $(Echo) "Building Clang __has_attribute implementation with tblgen" - $(Verb) $(ClangTableGen) -gen-clang-attr-has-attribute-impl -o $(call SYSPATH, $@) \ - -I $(PROJ_SRC_DIR)/../../ $< - $(ObjDir)/arm_neon.inc.tmp : arm_neon.td $(CLANG_TBLGEN) $(ObjDir)/.dir $(Echo) "Building Clang arm_neon.inc with tblgen" $(Verb) $(ClangTableGen) -gen-arm-neon-sema -o $(call SYSPATH, $@) $< diff --git a/include/clang/CMakeLists.txt b/include/clang/CMakeLists.txt index 1d8aecd3b2..71c37fda78 100644 --- a/include/clang/CMakeLists.txt +++ b/include/clang/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(AST) add_subdirectory(Basic) add_subdirectory(Driver) +add_subdirectory(Lex) add_subdirectory(Parse) add_subdirectory(Sema) add_subdirectory(Serialization) diff --git a/include/clang/Lex/CMakeLists.txt b/include/clang/Lex/CMakeLists.txt new file mode 100644 index 0000000000..c41884efb4 --- /dev/null +++ b/include/clang/Lex/CMakeLists.txt @@ -0,0 +1,5 @@ +clang_tablegen(AttrSpellings.inc -gen-clang-attr-spelling-list + -I ${CMAKE_CURRENT_SOURCE_DIR}/../../ + SOURCE ../Basic/Attr.td + TARGET ClangAttrSpellings + ) diff --git a/include/clang/Lex/Makefile b/include/clang/Lex/Makefile new file mode 100644 index 0000000000..762b9a2587 --- /dev/null +++ b/include/clang/Lex/Makefile @@ -0,0 +1,13 @@ +CLANG_LEVEL := ../../.. +TD_SRC_DIR = $(PROJ_SRC_DIR)/../Basic +BUILT_SOURCES = AttrSpellings.inc + +TABLEGEN_INC_FILES_COMMON = 1 + +include $(CLANG_LEVEL)/Makefile + +$(ObjDir)/AttrSpellings.inc.tmp : $(TD_SRC_DIR)/Attr.td $(CLANG_TBLGEN) \ + $(ObjDir)/.dir + $(Echo) "Building Clang attribute spellings with tblgen" + $(Verb) $(ClangTableGen) -gen-clang-attr-spelling-list -o $(call SYSPATH, $@) \ + -I $(PROJ_SRC_DIR)/../../ $< diff --git a/include/clang/Makefile b/include/clang/Makefile index 5ba2dd2991..5f2077d2f0 100644 --- a/include/clang/Makefile +++ b/include/clang/Makefile @@ -1,5 +1,5 @@ CLANG_LEVEL := ../.. -DIRS := AST Basic Driver Parse Sema Serialization +DIRS := AST Basic Driver Lex Parse Sema Serialization include $(CLANG_LEVEL)/Makefile diff --git a/lib/Basic/Attributes.cpp b/lib/Basic/Attributes.cpp deleted file mode 100644 index 555c8f8789..0000000000 --- a/lib/Basic/Attributes.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "clang/Basic/Attributes.h" -#include "clang/Basic/IdentifierTable.h" -#include "llvm/ADT/StringSwitch.h" - -namespace clang { - -bool HasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, - const IdentifierInfo *Attr, const llvm::Triple &T, - const LangOptions &LangOpts) { - StringRef Name = Attr->getName(); - // Normalize the attribute name, __foo__ becomes foo. - if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__")) - Name = Name.substr(2, Name.size() - 4); - -#include "clang/Basic/AttrHasAttributeImpl.inc" - - return false; -} - -} // end namespace clang diff --git a/lib/Basic/CMakeLists.txt b/lib/Basic/CMakeLists.txt index 0448fdb0d4..d248d3dc82 100644 --- a/lib/Basic/CMakeLists.txt +++ b/lib/Basic/CMakeLists.txt @@ -4,7 +4,6 @@ set(LLVM_LINK_COMPONENTS ) add_clang_library(clangBasic - Attributes.cpp Builtins.cpp CharInfo.cpp Diagnostic.cpp diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 62a89c03e1..917d434c48 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -13,7 +13,6 @@ //===----------------------------------------------------------------------===// #include "clang/Lex/Preprocessor.h" -#include "clang/Basic/Attributes.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetInfo.h" @@ -1048,6 +1047,20 @@ static bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) { .Default(false); } +/// HasAttribute - Return true if we recognize and implement the attribute +/// specified by the given identifier. +static bool HasAttribute(const IdentifierInfo *II, const llvm::Triple &T) { + StringRef Name = II->getName(); + // Normalize the attribute name, __foo__ becomes foo. + if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__")) + Name = Name.substr(2, Name.size() - 4); + + // FIXME: Do we need to handle namespaces here? + return llvm::StringSwitch(Name) +#include "clang/Lex/AttrSpellings.inc" + .Default(false); +} + /// EvaluateHasIncludeCommon - Process a '__has_include("path")' /// or '__has_include_next("path")' expression. /// Returns true if successful. @@ -1386,8 +1399,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { // Check for a builtin is trivial. Value = FeatureII->getBuiltinID() != 0; } else if (II == Ident__has_attribute) - Value = HasAttribute(AttrSyntax::Generic, nullptr, FeatureII, - getTargetInfo().getTriple(), getLangOpts()); + Value = HasAttribute(FeatureII, getTargetInfo().getTriple()); else if (II == Ident__has_extension) Value = HasExtension(*this, FeatureII); else { diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp index 5780284fcc..a0749ebaf2 100644 --- a/utils/TableGen/ClangAttrEmitter.cpp +++ b/utils/TableGen/ClangAttrEmitter.cpp @@ -1720,16 +1720,22 @@ void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) { OS << " }\n"; } -static void GenerateHasAttrSpellingStringSwitch( - const std::vector &Attrs, raw_ostream &OS, - const std::string &Variety = "", const std::string &Scope = "") { - for (const auto *Attr : Attrs) { +// Emits the list of spellings for attributes. +void EmitClangAttrSpellingList(RecordKeeper &Records, raw_ostream &OS) { + emitSourceFileHeader("llvm::StringSwitch code to match attributes based on " + "the target triple, T", OS); + + std::vector Attrs = Records.getAllDerivedDefinitions("Attr"); + + for (auto I : Attrs) { + Record &Attr = *I; + // It is assumed that there will be an llvm::Triple object named T within // scope that can be used to determine whether the attribute exists in // a given target. std::string Test; - if (Attr->isSubClassOf("TargetSpecificAttr")) { - const Record *R = Attr->getValueAsDef("Target"); + if (Attr.isSubClassOf("TargetSpecificAttr")) { + const Record *R = Attr.getValueAsDef("Target"); std::vector Arches = R->getValueAsListOfStrings("Arches"); Test += "("; @@ -1754,79 +1760,13 @@ static void GenerateHasAttrSpellingStringSwitch( } Test += ")"; } - - // If this is the C++11 variety, also add in the LangOpts test. - if (Variety == "CXX11") - Test += " && LangOpts.CPlusPlus11"; - } else if (Variety == "CXX11") - // C++11 mode should be checked against LangOpts, which is presumed to be - // present in the caller. - Test = "LangOpts.CPlusPlus11"; - else + } else Test = "true"; - std::vector Spellings = GetFlattenedSpellings(*Attr); + std::vector Spellings = GetFlattenedSpellings(Attr); for (const auto &S : Spellings) - if (Variety.empty() || (Variety == S.variety() && - (Scope.empty() || Scope == S.nameSpace()))) - OS << " .Case(\"" << S.name() << "\", " << Test << ")\n"; - } - OS << " .Default(false);\n"; -} - -// Emits the list of spellings for attributes. -void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS) { - emitSourceFileHeader("Code to implement the __has_attribute logic", OS); - - // Separate all of the attributes out into four group: generic, C++11, GNU, - // and declspecs. Then generate a big switch statement for each of them. - std::vector Attrs = Records.getAllDerivedDefinitions("Attr"); - std::vector Declspec, GNU; - std::map> CXX; - - // Walk over the list of all attributes, and split them out based on the - // spelling variety. - for (auto *R : Attrs) { - std::vector Spellings = GetFlattenedSpellings(*R); - for (const auto &SI : Spellings) { - std::string Variety = SI.variety(); - if (Variety == "GNU") - GNU.push_back(R); - else if (Variety == "Declspec") - Declspec.push_back(R); - else if (Variety == "CXX11") { - CXX[SI.nameSpace()].push_back(R); - } - } - } - - OS << "switch (Syntax) {\n"; - OS << "case AttrSyntax::Generic:\n"; - OS << " return llvm::StringSwitch(Name)\n"; - GenerateHasAttrSpellingStringSwitch(Attrs, OS); - OS << "case AttrSyntax::GNU:\n"; - OS << " return llvm::StringSwitch(Name)\n"; - GenerateHasAttrSpellingStringSwitch(GNU, OS, "GNU"); - OS << "case AttrSyntax::Declspec:\n"; - OS << " return llvm::StringSwitch(Name)\n"; - GenerateHasAttrSpellingStringSwitch(Declspec, OS, "Declspec"); - OS << "case AttrSyntax::CXX: {\n"; - // C++11-style attributes are further split out based on the Scope. - for (std::map>::iterator I = CXX.begin(), - E = CXX.end(); - I != E; ++I) { - if (I != CXX.begin()) - OS << " else "; - if (I->first.empty()) - OS << "if (!Scope || Scope->getName() == \"\") {\n"; - else - OS << "if (Scope->getName() == \"" << I->first << "\") {\n"; - OS << " return llvm::StringSwitch(Name)\n"; - GenerateHasAttrSpellingStringSwitch(I->second, OS, "CXX11", I->first); - OS << "}"; + OS << ".Case(\"" << S.name() << "\", " << Test << ")\n"; } - OS << "\n}\n"; - OS << "}\n"; } void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS) { diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp index 4484e65097..6737f77749 100644 --- a/utils/TableGen/TableGen.cpp +++ b/utils/TableGen/TableGen.cpp @@ -29,7 +29,7 @@ enum ActionType { GenClangAttrList, GenClangAttrPCHRead, GenClangAttrPCHWrite, - GenClangAttrHasAttributeImpl, + GenClangAttrSpellingList, GenClangAttrSpellingListIndex, GenClangAttrASTVisitor, GenClangAttrTemplateInstantiate, @@ -72,8 +72,7 @@ cl::opt Action( "Generate clang PCH attribute reader"), clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", "Generate clang PCH attribute writer"), - clEnumValN(GenClangAttrHasAttributeImpl, - "gen-clang-attr-has-attribute-impl", + clEnumValN(GenClangAttrSpellingList, "gen-clang-attr-spelling-list", "Generate a clang attribute spelling list"), clEnumValN(GenClangAttrSpellingListIndex, "gen-clang-attr-spelling-index", @@ -160,8 +159,8 @@ bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { case GenClangAttrPCHWrite: EmitClangAttrPCHWrite(Records, OS); break; - case GenClangAttrHasAttributeImpl: - EmitClangAttrHasAttrImpl(Records, OS); + case GenClangAttrSpellingList: + EmitClangAttrSpellingList(Records, OS); break; case GenClangAttrSpellingListIndex: EmitClangAttrSpellingListIndex(Records, OS); diff --git a/utils/TableGen/TableGenBackends.h b/utils/TableGen/TableGenBackends.h index 7e05496647..f8e11a66eb 100644 --- a/utils/TableGen/TableGenBackends.h +++ b/utils/TableGen/TableGenBackends.h @@ -35,7 +35,7 @@ void EmitClangAttrImpl(RecordKeeper &Records, raw_ostream &OS); void EmitClangAttrList(RecordKeeper &Records, raw_ostream &OS); void EmitClangAttrPCHRead(RecordKeeper &Records, raw_ostream &OS); void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS); -void EmitClangAttrHasAttrImpl(RecordKeeper &Records, raw_ostream &OS); +void EmitClangAttrSpellingList(RecordKeeper &Records, raw_ostream &OS); void EmitClangAttrSpellingListIndex(RecordKeeper &Records, raw_ostream &OS); void EmitClangAttrASTVisitor(RecordKeeper &Records, raw_ostream &OS); void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream &OS);