Clang Project

clang_source_code/lib/Basic/Attributes.cpp
1#include "clang/Basic/Attributes.h"
2#include "clang/Basic/AttrSubjectMatchRules.h"
3#include "clang/Basic/IdentifierTable.h"
4#include "llvm/ADT/StringSwitch.h"
5using namespace clang;
6
7int clang::hasAttribute(AttrSyntax Syntaxconst IdentifierInfo *Scope,
8                        const IdentifierInfo *Attrconst 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
27const 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