Hi Aaron,
Thank you for your work on improving our attributes, much appreciated!
We came across a project that was using "__attribute__ ((align(16)))" which now
gives a warning:
warning: unknown attribute 'align' ignored
I believe tightening our attribute syntax is goodness, but what do you think
about enhancing the attribute warning with "typo correction", so we can get
something like this:
warning: unknown attribute 'align' ignored; did you mean 'aligned' ?
along with a fixit ?
-Argyrios
On Jan 13, 2014, at 1:49 PM, Aaron Ballman <[email protected]> wrote:
> Please note that this *may* affect existing code (it found numerous
> bugs in our test cases, all of which have been rectified by other
> commits). I will pay attention to build bots, but if you find that an
> attribute used to be supported with a given syntax and is no longer
> supported, please let me know.
>
> Thanks!
>
> ~Aaron
>
> On Mon, Jan 13, 2014 at 4:42 PM, Aaron Ballman <[email protected]> wrote:
>> Author: aaronballman
>> Date: Mon Jan 13 15:42:39 2014
>> New Revision: 199144
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=199144&view=rev
>> Log:
>> When determining the attribute's parsed kind, pay attention to the syntax
>> used. This fixes bugs where an attribute has differing GNU and Declspec
>> spellings, but they are treated as the same. Eg) __declspec(aligned) when it
>> should be __attribute__((aligned)), and __attribute__((align)) when it
>> should be __declspec(align).
>>
>> Modified:
>> cfe/trunk/lib/Sema/AttributeList.cpp
>> cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
>>
>> Modified: cfe/trunk/lib/Sema/AttributeList.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AttributeList.cpp?rev=199144&r1=199143&r2=199144&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/AttributeList.cpp (original)
>> +++ cfe/trunk/lib/Sema/AttributeList.cpp Mon Jan 13 15:42:39 2014
>> @@ -139,7 +139,7 @@ AttributeList::Kind AttributeList::getKi
>> FullName += "::";
>> FullName += AttrName;
>>
>> - return ::getAttrKind(FullName);
>> + return ::getAttrKind(FullName, SyntaxUsed);
>> }
>>
>> unsigned AttributeList::getAttributeSpellingListIndex() const {
>>
>> Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=199144&r1=199143&r2=199144&view=diff
>> ==============================================================================
>> --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
>> +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Mon Jan 13 15:42:39 2014
>> @@ -2250,9 +2250,8 @@ void EmitClangAttrParsedAttrImpl(RecordK
>> void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream &OS) {
>> emitSourceFileHeader("Attribute name matcher", OS);
>>
>> - std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
>> -
>> - std::vector<StringMatcher::StringPair> Matches;
>> + std::vector<Record *> Attrs = Records.getAllDerivedDefinitions("Attr");
>> + std::vector<StringMatcher::StringPair> GNU, Declspec, CXX11, Keywords;
>> std::set<std::string> Seen;
>> for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end();
>> I != E; ++I) {
>> @@ -2261,8 +2260,16 @@ void EmitClangAttrParsedAttrKinds(Record
>> bool SemaHandler = Attr.getValueAsBit("SemaHandler");
>> bool Ignored = Attr.getValueAsBit("Ignored");
>> if (SemaHandler || Ignored) {
>> - std::vector<Record*> Spellings =
>> Attr.getValueAsListOfDefs("Spellings");
>> -
>> + // Attribute spellings can be shared between target-specific
>> attributes,
>> + // and can be shared between syntaxes for the same attribute. For
>> + // instance, an attribute can be spelled GNU<"interrupt"> for an ARM-
>> + // specific attribute, or MSP430-specific attribute. Additionally, an
>> + // attribute can be spelled GNU<"dllexport"> and Declspec<"dllexport">
>> + // for the same semantic attribute. Ultimately, we need to map each of
>> + // these to a single AttributeList::Kind value, but the StringMatcher
>> + // class cannot handle duplicate match strings. So we generate a list
>> of
>> + // string to match based on the syntax, and emit multiple string
>> matchers
>> + // depending on the syntax used.
>> std::string AttrName;
>> if (Attr.isSubClassOf("TargetSpecificAttr") &&
>> !Attr.isValueUnset("ParseKind")) {
>> @@ -2273,34 +2280,48 @@ void EmitClangAttrParsedAttrKinds(Record
>> } else
>> AttrName = NormalizeAttrName(StringRef(Attr.getName())).str();
>>
>> + std::vector<Record*> Spellings =
>> Attr.getValueAsListOfDefs("Spellings");
>> for (std::vector<Record*>::const_iterator I = Spellings.begin(),
>> E = Spellings.end(); I != E; ++I) {
>> std::string RawSpelling = (*I)->getValueAsString("Name");
>> -
>> - SmallString<64> Spelling;
>> - if ((*I)->getValueAsString("Variety") == "CXX11") {
>> + std::vector<StringMatcher::StringPair> *Matches = 0;
>> + std::string Spelling, Variety = (*I)->getValueAsString("Variety");
>> + if (Variety == "CXX11") {
>> + Matches = &CXX11;
>> Spelling += (*I)->getValueAsString("Namespace");
>> Spelling += "::";
>> - }
>> - Spelling += NormalizeAttrSpelling(RawSpelling);
>> + } else if (Variety == "GNU")
>> + Matches = &GNU;
>> + else if (Variety == "Declspec")
>> + Matches = &Declspec;
>> + else if (Variety == "Keyword")
>> + Matches = &Keywords;
>>
>> + assert(Matches && "Unsupported spelling variety found");
>> +
>> + Spelling += NormalizeAttrSpelling(RawSpelling);
>> if (SemaHandler)
>> - Matches.push_back(
>> - StringMatcher::StringPair(
>> - StringRef(Spelling),
>> - "return AttributeList::AT_" + AttrName + ";"));
>> + Matches->push_back(StringMatcher::StringPair(Spelling,
>> + "return AttributeList::AT_" + AttrName +
>> ";"));
>> else
>> - Matches.push_back(
>> - StringMatcher::StringPair(
>> - StringRef(Spelling),
>> - "return AttributeList::IgnoredAttribute;"));
>> + Matches->push_back(StringMatcher::StringPair(Spelling,
>> + "return AttributeList::IgnoredAttribute;"));
>> }
>> }
>> }
>>
>> - OS << "static AttributeList::Kind getAttrKind(StringRef Name) {\n";
>> - StringMatcher("Name", Matches, OS).Emit();
>> - OS << "return AttributeList::UnknownAttribute;\n"
>> + OS << "static AttributeList::Kind getAttrKind(StringRef Name, ";
>> + OS << "AttributeList::Syntax Syntax) {\n";
>> + OS << " if (AttributeList::AS_GNU == Syntax) {\n";
>> + StringMatcher("Name", GNU, OS).Emit();
>> + OS << " } else if (AttributeList::AS_Declspec == Syntax) {\n";
>> + StringMatcher("Name", Declspec, OS).Emit();
>> + OS << " } else if (AttributeList::AS_CXX11 == Syntax) {\n";
>> + StringMatcher("Name", CXX11, OS).Emit();
>> + OS << " } else if (AttributeList::AS_Keyword == Syntax) {\n";
>> + StringMatcher("Name", Keywords, OS).Emit();
>> + OS << " }\n";
>> + OS << " return AttributeList::UnknownAttribute;\n"
>> << "}\n";
>> }
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> [email protected]
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits