xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Attributes.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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