xref: /llvm-project/clang/lib/Basic/Attributes.cpp (revision ad672ffb643c646ca7680c765342bd58252ecdbe)
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 
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 attributes.
16   StringRef ScopeName = Scope ? Scope->getName() : "";
17   if (ScopeName == "__gnu__")
18     ScopeName = ScopeName.slice(2, ScopeName.size() - 2);
19 
20 #include "clang/Basic/AttrHasAttributeImpl.inc"
21 
22   return 0;
23 }
24 
25 const char *attr::getSubjectMatchRuleSpelling(attr::SubjectMatchRule Rule) {
26   switch (Rule) {
27 #define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract)                            \
28   case attr::NAME:                                                             \
29     return SPELLING;
30 #include "clang/Basic/AttrSubMatchRulesList.inc"
31   }
32   llvm_unreachable("Invalid subject match rule");
33 }
34