clang: lib/Basic/Attributes.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

19

20#include "llvm/ADT/StringMap.h"

21#include "llvm/ADT/StringSwitch.h"

22

23using namespace clang;

24

28

29#include "clang/Basic/AttrHasAttributeImpl.inc"

30

31 return 0;

32}

33

37 StringRef Name = Attr->getName();

38

39 if (Name.size() >= 4 && Name.starts_with("__") && Name.ends_with("__"))

40 Name = Name.substr(2, Name.size() - 4);

41

42

43 StringRef ScopeName = Scope ? Scope->getName() : "";

44 if (ScopeName == "__gnu__")

45 ScopeName = "gnu";

46 else if (ScopeName == "_Clang")

47 ScopeName = "clang";

48

49

50

51

52

53

54

55

56 if (LangOpts.OpenMP && ScopeName == "omp" &&

57 (Name == "directive" || Name == "sequence"))

58 return 1;

59

61 if (res)

62 return res;

63

64

66 if (Ptr->hasSpelling(Syntax, Name))

67 return 1;

68

69 return 0;

70}

71

73 switch (Rule) {

74#define ATTR_MATCH_RULE(NAME, SPELLING, IsAbstract) \

75 case attr::NAME: \

76 return SPELLING;

77#include "clang/Basic/AttrSubMatchRulesList.inc"

78 }

79 llvm_unreachable("Invalid subject match rule");

80}

81

82static StringRef

86 return "";

87

88

89

90 StringRef ScopeName = Scope->getName();

93 if (ScopeName == "__gnu__")

94 ScopeName = "gnu";

95 else if (ScopeName == "_Clang")

96 ScopeName = "clang";

97 }

98 return ScopeName;

99}

100

102 StringRef NormalizedScopeName,

104

105

106 bool ShouldNormalize =

110 (NormalizedScopeName.empty() || NormalizedScopeName == "gnu" ||

111 NormalizedScopeName == "clang"));

112 StringRef AttrName = Name->getName();

113 if (ShouldNormalize && AttrName.size() >= 4 && AttrName.starts_with("__") &&

114 AttrName.ends_with("__"))

115 AttrName = AttrName.slice(2, AttrName.size() - 2);

116

117 return AttrName;

118}

119

121 return ScopeName && (ScopeName->isStr("gnu") || ScopeName->isStr("__gnu__"));

122}

123

125 return ScopeName && (ScopeName->isStr("clang") || ScopeName->isStr("_Clang"));

126}

127

128#include "clang/Sema/AttrParsedAttrKinds.inc"

129

134 StringRef AttrName = normalizeAttrName(Name, ScopeName, SyntaxUsed);

135

137 if (!ScopeName.empty()) {

141 }

143

145}

146

151 return ::getAttrKind(normalizeName(Name, ScopeName, SyntaxUsed), SyntaxUsed);

152}

153

155 return static_caststd::string\(

157}

158

161 return llvm::StringSwitchAttributeCommonInfo::Scope(ScopeName)

170}

171

172unsigned AttributeCommonInfo::calculateAttributeSpellingListIndex() const {

173

174

178

181

182#include "clang/Sema/AttrSpellingListIndex.inc"

183}

static SmallString< 64 > normalizeName(const IdentifierInfo *Name, const IdentifierInfo *Scope, AttributeCommonInfo::Syntax SyntaxUsed)

static AttributeCommonInfo::Scope getScopeFromNormalizedScopeName(StringRef ScopeName)

static int hasAttributeImpl(AttributeCommonInfo::Syntax Syntax, StringRef Name, StringRef ScopeName, const TargetInfo &Target, const LangOptions &LangOpts)

static StringRef normalizeAttrScopeName(const IdentifierInfo *Scope, AttributeCommonInfo::Syntax SyntaxUsed)

static StringRef normalizeAttrName(const IdentifierInfo *Name, StringRef NormalizedScopeName, AttributeCommonInfo::Syntax SyntaxUsed)

Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.

Defines the clang::LangOptions interface.

llvm::MachO::Target Target

Attr - This represents one attribute.

bool isClangScope() const

std::string getNormalizedFullName() const

Gets the normalized full name, which consists of both scope and name and with surrounding underscores...

Syntax

The style used to specify an attribute.

const IdentifierInfo * getScopeName() const

const IdentifierInfo * getAttrName() const

Kind getParsedKind() const

One of these records is kept for each identifier that is lexed.

bool isStr(const char(&Str)[StrLen]) const

Return true if this is the identifier for the specified string.

Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...

Scope - A scope is a transient data structure that is used while parsing the program.

Exposes information about the current target.

Defines the clang::TargetInfo interface.

SubjectMatchRule

A list of all the recognized kinds of attributes.

const char * getSubjectMatchRuleSpelling(SubjectMatchRule Rule)

The JSON file list parser is used to communicate input to InstallAPI.

int hasAttribute(AttributeCommonInfo::Syntax Syntax, const IdentifierInfo *Scope, const IdentifierInfo *Attr, const TargetInfo &Target, const LangOptions &LangOpts)

Return the version number associated with the attribute if we recognize and implement the attribute s...

const std::list< std::unique_ptr< ParsedAttrInfo > > & getAttributePluginInstances()