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