diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index cae2c867db..402b309f8e 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -619,16 +619,20 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, else if (LangOpts.getStackProtector() == LangOptions::SSPReq) F->addFnAttr(llvm::Attribute::StackProtectReq); - // When AddressSanitizer is enabled, set SanitizeAddress attribute - // unless __attribute__((no_sanitize_address)) is used. - if (SanOpts.Address && !D->hasAttr()) - F->addFnAttr(llvm::Attribute::SanitizeAddress); - // Same for ThreadSanitizer and __attribute__((no_sanitize_thread)) - if (SanOpts.Thread && !D->hasAttr()) - F->addFnAttr(llvm::Attribute::SanitizeThread); - // Same for MemorySanitizer and __attribute__((no_sanitize_memory)) - if (SanOpts.Memory && !D->hasAttr()) - F->addFnAttr(llvm::Attribute::SanitizeMemory); + // Add sanitizer attributes if function is not blacklisted. + if (!SanitizerBlacklist.isIn(*F)) { + // When AddressSanitizer is enabled, set SanitizeAddress attribute + // unless __attribute__((no_sanitize_address)) is used. + if (SanOpts.Address && !D->hasAttr()) + F->addFnAttr(llvm::Attribute::SanitizeAddress); + // Same for ThreadSanitizer and __attribute__((no_sanitize_thread)) + if (SanOpts.Thread && !D->hasAttr()) { + F->addFnAttr(llvm::Attribute::SanitizeThread); + } + // Same for MemorySanitizer and __attribute__((no_sanitize_memory)) + if (SanOpts.Memory && !D->hasAttr()) + F->addFnAttr(llvm::Attribute::SanitizeMemory); + } unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); if (alignment) diff --git a/test/CodeGen/address-safety-attr.cpp b/test/CodeGen/address-safety-attr.cpp index 88f75a1d50..f94efd62c9 100644 --- a/test/CodeGen/address-safety-attr.cpp +++ b/test/CodeGen/address-safety-attr.cpp @@ -1,9 +1,11 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck -check-prefix=WITHOUT %s // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address | FileCheck -check-prefix=ASAN %s -// RUN: echo "src:%s" > %t -// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t | FileCheck -check-prefix=BL %s +// RUN: echo "src:%s" > %t.file.blacklist +// RUN: echo "fun:*BlacklistedFunction*" > %t.func.blacklist +// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t.file.blacklist | FileCheck -check-prefix=BLFILE %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t.func.blacklist | FileCheck -check-prefix=BLFUNC %s -// FIXME: %t is like "src:x:\path\to\clang\test\CodeGen\address-safety-attr.cpp" +// FIXME: %t.file.blacklist is like "src:x:\path\to\clang\test\CodeGen\address-safety-attr.cpp" // REQUIRES: shell // The sanitize_address attribute should be attached to functions @@ -11,31 +13,42 @@ // is present. // WITHOUT: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] -// BL: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] +// BLFILE: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] +// BLFUNC: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] // ASAN: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] __attribute__((no_sanitize_address)) int NoAddressSafety1(int *a) { return *a; } // WITHOUT: NoAddressSafety2{{.*}}) [[NOATTR]] -// BL: NoAddressSafety2{{.*}}) [[NOATTR]] +// BLFILE: NoAddressSafety2{{.*}}) [[NOATTR]] +// BLFUNC: NoAddressSafety2{{.*}}) [[NOATTR]] // ASAN: NoAddressSafety2{{.*}}) [[NOATTR]] __attribute__((no_sanitize_address)) int NoAddressSafety2(int *a); int NoAddressSafety2(int *a) { return *a; } // WITHOUT: AddressSafetyOk{{.*}}) [[NOATTR]] -// BL: AddressSafetyOk{{.*}}) [[NOATTR]] +// BLFILE: AddressSafetyOk{{.*}}) [[NOATTR]] +// BLFUNC: AddressSafetyOk{{.*}}) [[WITH:#[0-9]+]] // ASAN: AddressSafetyOk{{.*}}) [[WITH:#[0-9]+]] int AddressSafetyOk(int *a) { return *a; } +// WITHOUT: BlacklistedFunction{{.*}}) [[NOATTR]] +// BLFILE: BlacklistedFunction{{.*}}) [[NOATTR]] +// BLFUNC: BlacklistedFunction{{.*}}) [[NOATTR]] +// ASAN: BlacklistedFunction{{.*}}) [[WITH]] +int BlacklistedFunction(int *a) { return *a; } + // WITHOUT: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] -// BL: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] +// BLFILE: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] +// BLFUNC: TemplateAddressSafetyOk{{.*}}) [[WITH]] // ASAN: TemplateAddressSafetyOk{{.*}}) [[WITH]] template int TemplateAddressSafetyOk() { return i; } // WITHOUT: TemplateNoAddressSafety{{.*}}) [[NOATTR]] -// BL: TemplateNoAddressSafety{{.*}}) [[NOATTR]] +// BLFILE: TemplateNoAddressSafety{{.*}}) [[NOATTR]] +// BLFUNC: TemplateNoAddressSafety{{.*}}) [[NOATTR]] // ASAN: TemplateNoAddressSafety{{.*}}) [[NOATTR]] template __attribute__((no_sanitize_address)) @@ -48,14 +61,19 @@ int force_instance = TemplateAddressSafetyOk<42>() int global1 = 0; int global2 = *(int*)((char*)&global1+1); // WITHOUT: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]] -// BL: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]] +// BLFILE: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]] +// BLFUNC: @__cxx_global_var_init{{.*}}[[WITH_NO_TF:#[0-9]+]] // ASAN: @__cxx_global_var_init{{.*}}[[WITH_NO_TF:#[0-9]+]] // WITHOUT: attributes [[NOATTR]] = { nounwind{{.*}} } // WITHOUT: attributes [[NOATTR_NO_TF]] = { nounwind } -// BL: attributes [[NOATTR]] = { nounwind{{.*}} } -// BL: attributes [[NOATTR_NO_TF]] = { nounwind } +// BLFILE: attributes [[NOATTR]] = { nounwind{{.*}} } +// BLFILE: attributes [[NOATTR_NO_TF]] = { nounwind } + +// BLFUNC: attributes [[NOATTR]] = { nounwind{{.*}} } +// BLFUNC: attributes [[WITH]] = { nounwind sanitize_address{{.*}} } +// BLFUNC: attributes [[WITH_NO_TF]] = { nounwind sanitize_address } // ASAN: attributes [[NOATTR]] = { nounwind{{.*}} } // ASAN: attributes [[WITH]] = { nounwind sanitize_address{{.*}} }