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"); + 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") 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