blob: b7570d03c85aebb40b8a196f7c21f3218c695d24 [file] [log] [blame]
Aaron Ballman2fbf9942014-03-31 13:14:44 +00001#include "clang/Basic/Attributes.h"
Alex Lorenz9e7bf162017-04-18 14:33:39 +00002#include "clang/Basic/AttrSubjectMatchRules.h"
Aaron Ballman2fbf9942014-03-31 13:14:44 +00003#include "clang/Basic/IdentifierTable.h"
4#include "llvm/ADT/StringSwitch.h"
5using namespace clang;
6
Aaron Ballmana0344c52014-11-14 13:44:02 +00007int clang::hasAttribute(AttrSyntax Syntax, const IdentifierInfo *Scope,
Bob Wilson7c730832015-07-20 22:57:31 +00008 const IdentifierInfo *Attr, const TargetInfo &Target,
9 const LangOptions &LangOpts) {
Aaron Ballman2fbf9942014-03-31 13:14:44 +000010 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#include "clang/Basic/AttrHasAttributeImpl.inc"
16
Aaron Ballmana0344c52014-11-14 13:44:02 +000017 return 0;
Aaron Ballman2fbf9942014-03-31 13:14:44 +000018}
Alex Lorenz9e7bf162017-04-18 14:33:39 +000019
20const char *attr::getSubjectMatchRuleSpelling(attr::SubjectMatchRule Rule) {
21 switch (Rule) {
22#define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract) \
23 case attr::NAME: \
24 return SPELLING;
25#include "clang/Basic/AttrSubMatchRulesList.inc"
26 }
27 llvm_unreachable("Invalid subject match rule");
28}