On Thu, Oct 8, 2015 at 12:24 PM, Aaron Ballman via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: aaronballman > Date: Thu Oct 8 14:24:08 2015 > New Revision: 249721 > > URL: http://llvm.org/viewvc/llvm-project?rev=249721&view=rev > Log: > When mapping no_sanitize_* attributes to no_sanitize attributes, handle > GNU-style formatting that involves prefix and suffix underscores. Cleans up > other usages of similar functionality. > > Patch by Adrian Zgorzalek! > > Modified: > cfe/trunk/lib/Sema/SemaDeclAttr.cpp > cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp > cfe/trunk/test/SemaCXX/attr-no-sanitize-memory.cpp > cfe/trunk/test/SemaCXX/attr-no-sanitize-thread.cpp > > Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=249721&r1=249720&r2=249721&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Thu Oct 8 14:24:08 2015 > @@ -1308,6 +1308,17 @@ void Sema::AddAssumeAlignedAttr(SourceRa > AssumeAlignedAttr(AttrRange, Context, E, OE, > SpellingListIndex)); > } > > +/// Normalize the attribute, __foo__ becomes foo. > +/// Returns true if normalization was applied. > +static bool normalizeName(StringRef &AttrName) { > + if (AttrName.startswith("__") && AttrName.endswith("__")) { > + assert(AttrName.size() > 4 && "Name too short"); > This assert will fire on the strings __, ___, and ____, which are valid in some of the below cases. > + AttrName = AttrName.drop_front(2).drop_back(2); > + return true; > + } > + return false; > +} > + > static void handleOwnershipAttr(Sema &S, Decl *D, const AttributeList > &AL) { > // This attribute must be applied to a function declaration. The first > // argument to the attribute must be an identifier, the name of the > resource, > @@ -1349,11 +1360,8 @@ static void handleOwnershipAttr(Sema &S, > > IdentifierInfo *Module = AL.getArgAsIdent(0)->Ident; > > - // Normalize the argument, __foo__ becomes foo. > StringRef ModuleName = Module->getName(); > - if (ModuleName.startswith("__") && ModuleName.endswith("__") && > - ModuleName.size() > 4) { > - ModuleName = ModuleName.drop_front(2).drop_back(2); > + if (normalizeName(ModuleName)) { > Module = &S.PP.getIdentifierTable().get(ModuleName); > } > > @@ -2648,9 +2656,7 @@ static void handleFormatAttr(Sema &S, De > IdentifierInfo *II = Attr.getArgAsIdent(0)->Ident; > StringRef Format = II->getName(); > > - // Normalize the argument, __foo__ becomes foo. > - if (Format.startswith("__") && Format.endswith("__")) { > - Format = Format.substr(2, Format.size() - 4); > + if (normalizeName(Format)) { > // If we've modified the string name, we need a new identifier for it. > II = &S.Context.Idents.get(Format); > } > @@ -3131,9 +3137,7 @@ static void handleModeAttr(Sema &S, Decl > IdentifierInfo *Name = Attr.getArgAsIdent(0)->Ident; > StringRef Str = Name->getName(); > > - // Normalize the attribute name, __foo__ becomes foo. > - if (Str.startswith("__") && Str.endswith("__")) > - Str = Str.substr(2, Str.size() - 4); > + normalizeName(Str); > > unsigned DestWidth = 0; > bool IntegerMode = true; > @@ -4533,8 +4537,10 @@ static void handleNoSanitizeAttr(Sema &S > > static void handleNoSanitizeSpecificAttr(Sema &S, Decl *D, > const AttributeList &Attr) { > + StringRef AttrName = Attr.getName()->getName(); > + normalizeName(AttrName); > std::string SanitizerName = > - llvm::StringSwitch<std::string>(Attr.getName()->getName()) > + llvm::StringSwitch<std::string>(AttrName) > .Case("no_address_safety_analysis", "address") > .Case("no_sanitize_address", "address") > .Case("no_sanitize_thread", "thread") > Is there any way we could use the spelling list index in this case rather than repeating the attribute names and __-stripping here? Modified: cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp?rev=249721&r1=249720&r2=249721&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp (original) > +++ cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp Thu Oct 8 > 14:24:08 2015 > @@ -5,12 +5,14 @@ > #if !__has_attribute(no_sanitize_address) > #error "Should support no_sanitize_address" > #endif > - > -void noanal_fun() NO_SANITIZE_ADDRESS; > - > -void noanal_fun_args() __attribute__((no_sanitize_address(1))); // \ > - // expected-error {{'no_sanitize_address' attribute takes no arguments}} > - > + > +void noanal_fun() NO_SANITIZE_ADDRESS; > + > +void noanal_fun_alt() __attribute__((__no_sanitize_address__)); > + > +void noanal_fun_args() __attribute__((no_sanitize_address(1))); // \ > + // expected-error {{'no_sanitize_address' attribute takes no arguments}} > + > int noanal_testfn(int y) NO_SANITIZE_ADDRESS; > > int noanal_testfn(int y) { > > Modified: cfe/trunk/test/SemaCXX/attr-no-sanitize-memory.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-no-sanitize-memory.cpp?rev=249721&r1=249720&r2=249721&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/attr-no-sanitize-memory.cpp (original) > +++ cfe/trunk/test/SemaCXX/attr-no-sanitize-memory.cpp Thu Oct 8 14:24:08 > 2015 > @@ -5,12 +5,14 @@ > #if !__has_attribute(no_sanitize_memory) > #error "Should support no_sanitize_memory" > #endif > - > -void noanal_fun() NO_SANITIZE_MEMORY; > - > -void noanal_fun_args() __attribute__((no_sanitize_memory(1))); // \ > - // expected-error {{'no_sanitize_memory' attribute takes no arguments}} > - > + > +void noanal_fun() NO_SANITIZE_MEMORY; > + > +void noanal_fun_alt() __attribute__((__no_sanitize_memory__)); > + > +void noanal_fun_args() __attribute__((no_sanitize_memory(1))); // \ > + // expected-error {{'no_sanitize_memory' attribute takes no arguments}} > + > int noanal_testfn(int y) NO_SANITIZE_MEMORY; > > int noanal_testfn(int y) { > > Modified: cfe/trunk/test/SemaCXX/attr-no-sanitize-thread.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-no-sanitize-thread.cpp?rev=249721&r1=249720&r2=249721&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/attr-no-sanitize-thread.cpp (original) > +++ cfe/trunk/test/SemaCXX/attr-no-sanitize-thread.cpp Thu Oct 8 14:24:08 > 2015 > @@ -5,12 +5,14 @@ > #if !__has_attribute(no_sanitize_thread) > #error "Should support no_sanitize_thread" > #endif > - > -void noanal_fun() NO_SANITIZE_THREAD; > - > -void noanal_fun_args() __attribute__((no_sanitize_thread(1))); // \ > - // expected-error {{'no_sanitize_thread' attribute takes no arguments}} > - > + > +void noanal_fun() NO_SANITIZE_THREAD; > + > +void noanal_fun_alt() __attribute__((__no_sanitize_thread__)); > + > +void noanal_fun_args() __attribute__((no_sanitize_thread(1))); // \ > + // expected-error {{'no_sanitize_thread' attribute takes no arguments}} > + > int noanal_testfn(int y) NO_SANITIZE_THREAD; > > int noanal_testfn(int y) { > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits