1*0b57cec5SDimitry Andric #include "clang/Basic/Attributes.h" 2*0b57cec5SDimitry Andric #include "clang/Basic/AttrSubjectMatchRules.h" 3*0b57cec5SDimitry Andric #include "clang/Basic/IdentifierTable.h" 4*0b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h" 5*0b57cec5SDimitry Andric using namespace clang; 6*0b57cec5SDimitry Andric 7*0b57cec5SDimitry Andric int clang::hasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope, 8*0b57cec5SDimitry Andric const IdentifierInfo *Attr, const TargetInfo &Target, 9*0b57cec5SDimitry Andric const LangOptions &LangOpts) { 10*0b57cec5SDimitry Andric StringRef Name = Attr->getName(); 11*0b57cec5SDimitry Andric // Normalize the attribute name, __foo__ becomes foo. 12*0b57cec5SDimitry Andric if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__")) 13*0b57cec5SDimitry Andric Name = Name.substr(2, Name.size() - 4); 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric // Normalize the scope name, but only for gnu and clang attributes. 16*0b57cec5SDimitry Andric StringRef ScopeName = Scope ? Scope->getName() : ""; 17*0b57cec5SDimitry Andric if (ScopeName == "__gnu__") 18*0b57cec5SDimitry Andric ScopeName = "gnu"; 19*0b57cec5SDimitry Andric else if (ScopeName == "_Clang") 20*0b57cec5SDimitry Andric ScopeName = "clang"; 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric #include "clang/Basic/AttrHasAttributeImpl.inc" 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric return 0; 25*0b57cec5SDimitry Andric } 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric const char *attr::getSubjectMatchRuleSpelling(attr::SubjectMatchRule Rule) { 28*0b57cec5SDimitry Andric switch (Rule) { 29*0b57cec5SDimitry Andric #define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract) \ 30*0b57cec5SDimitry Andric case attr::NAME: \ 31*0b57cec5SDimitry Andric return SPELLING; 32*0b57cec5SDimitry Andric #include "clang/Basic/AttrSubMatchRulesList.inc" 33*0b57cec5SDimitry Andric } 34*0b57cec5SDimitry Andric llvm_unreachable("Invalid subject match rule"); 35*0b57cec5SDimitry Andric } 36