[TableGen] Only normalize the spelling of GNU-style attributes.
Summary: When Sema looks up an attribute name, it strips off leading and trailing "__" if the attribute is GNU-style. That is, __attribute__((foo)) and __attribute__((__foo__)) are equivalent. This is only true for GNU-style attributes. In particular, __declspec(__foo__) is not equivalent to __declspec(foo), and Sema respects this difference. This patch fixes TableGen to match Sema's behavior. The spelling 'GNU<"__foo__">' should be normalized to 'GNU<"foo">', but 'Declspec<"__foo__">' should not be changed. This is necessary to make CUDA compilation work on Windows, because e.g. the __device__ attribute is spelled __declspec(__device__). Attr.td does not contain any Declspec spellings that start or end with "__", so this change should not affect any other attributes. Reviewers: rnk Subscribers: cfe-commits, tra Differential Revision: https://reviews.llvm.org/D28318 llvm-svn: 291129
This commit is contained in:
parent
1863d611f8
commit
4086fe5cd1
|
@ -133,10 +133,9 @@ static StringRef NormalizeNameForSpellingComparison(StringRef Name) {
|
|||
return Name.trim("_");
|
||||
}
|
||||
|
||||
// Normalize attribute spelling only if the spelling has both leading
|
||||
// and trailing underscores. For example, __ms_struct__ will be
|
||||
// normalized to "ms_struct"; __cdecl will remain intact.
|
||||
static StringRef NormalizeAttrSpelling(StringRef AttrSpelling) {
|
||||
// Normalize the spelling of a GNU attribute (i.e. "x" in "__attribute__((x))"),
|
||||
// removing "__" if it appears at the beginning and end of the attribute's name.
|
||||
static StringRef NormalizeGNUAttrSpelling(StringRef AttrSpelling) {
|
||||
if (AttrSpelling.startswith("__") && AttrSpelling.endswith("__")) {
|
||||
AttrSpelling = AttrSpelling.substr(2, AttrSpelling.size() - 4);
|
||||
}
|
||||
|
@ -3045,7 +3044,11 @@ void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) {
|
|||
|
||||
assert(Matches && "Unsupported spelling variety found");
|
||||
|
||||
Spelling += NormalizeAttrSpelling(RawSpelling);
|
||||
if (Variety == "GNU")
|
||||
Spelling += NormalizeGNUAttrSpelling(RawSpelling);
|
||||
else
|
||||
Spelling += RawSpelling;
|
||||
|
||||
if (SemaHandler)
|
||||
Matches->push_back(StringMatcher::StringPair(Spelling,
|
||||
"return AttributeList::AT_" + AttrName + ";"));
|
||||
|
|
Loading…
Reference in New Issue