Index: lib/CodeGen/CGExpr.cpp =================================================================== --- lib/CodeGen/CGExpr.cpp +++ lib/CodeGen/CGExpr.cpp @@ -2127,6 +2127,7 @@ CGM.getModule(), Descriptor->getType(), /*isConstant=*/true, llvm::GlobalVariable::PrivateLinkage, Descriptor); GV->setUnnamedAddr(true); + CGM.disableSanitizerForGlobal(GV); // Remember the descriptor for this type. CGM.setTypeDescriptorInMap(T, GV); @@ -2170,14 +2171,23 @@ /// \endcode /// For an invalid SourceLocation, the Filename pointer is null. llvm::Constant *CodeGenFunction::EmitCheckSourceLocation(SourceLocation Loc) { + llvm::Constant *Filename; + int Line, Column; + PresumedLoc PLoc = getContext().getSourceManager().getPresumedLoc(Loc); + if (PLoc.isValid()) { + auto FilenameGV = CGM.GetAddrOfConstantCString(PLoc.getFilename(), ".src"); + CGM.disableSanitizerForGlobal(FilenameGV); + Filename = FilenameGV; + Line = PLoc.getLine(); + Column = PLoc.getColumn(); + } else { + Filename = llvm::Constant::getNullValue(Int8PtrTy); + Line = Column = 0; + } - llvm::Constant *Data[] = { - PLoc.isValid() ? CGM.GetAddrOfConstantCString(PLoc.getFilename(), ".src") - : llvm::Constant::getNullValue(Int8PtrTy), - Builder.getInt32(PLoc.isValid() ? PLoc.getLine() : 0), - Builder.getInt32(PLoc.isValid() ? PLoc.getColumn() : 0) - }; + llvm::Constant *Data[] = {Filename, Builder.getInt32(Line), + Builder.getInt32(Column)}; return llvm::ConstantStruct::getAnon(Data); } @@ -2214,6 +2224,7 @@ new llvm::GlobalVariable(CGM.getModule(), Info->getType(), false, llvm::GlobalVariable::PrivateLinkage, Info); InfoPtr->setUnnamedAddr(true); + CGM.disableSanitizerForGlobal(InfoPtr); SmallVector Args; SmallVector ArgTypes; Index: lib/CodeGen/CodeGenModule.h =================================================================== --- lib/CodeGen/CodeGenModule.h +++ lib/CodeGen/CodeGenModule.h @@ -1018,7 +1018,11 @@ void reportGlobalToASan(llvm::GlobalVariable *GV, const VarDecl &D, bool IsDynInit = false); void reportGlobalToASan(llvm::GlobalVariable *GV, SourceLocation Loc, - StringRef Name, bool IsDynInit = false); + StringRef Name, bool IsDynInit = false, + bool IsBlacklisted = false); + + /// Disable sanitizer instrumentation for this global. + void disableSanitizerForGlobal(llvm::GlobalVariable *GV); void addDeferredVTable(const CXXRecordDecl *RD) { DeferredVTables.push_back(RD); Index: lib/CodeGen/CodeGenModule.cpp =================================================================== --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -1962,11 +1962,11 @@ void CodeGenModule::reportGlobalToASan(llvm::GlobalVariable *GV, SourceLocation Loc, StringRef Name, - bool IsDynInit) { + bool IsDynInit, bool IsBlacklisted) { if (!LangOpts.Sanitize.Address) return; IsDynInit &= !SanitizerBL.isIn(*GV, "init"); - bool IsBlacklisted = SanitizerBL.isIn(*GV); + IsBlacklisted |= SanitizerBL.isIn(*GV); llvm::GlobalVariable *LocDescr = nullptr; llvm::GlobalVariable *GlobalName = nullptr; @@ -2019,6 +2019,13 @@ reportGlobalToASan(GV, D.getLocation(), OS.str(), IsDynInit); } +void CodeGenModule::disableSanitizerForGlobal(llvm::GlobalVariable *GV) { + // For now, just make sure the global is not modified by the ASan + // instrumentation. + if (LangOpts.Sanitize.Address) + reportGlobalToASan(GV, SourceLocation(), "", false, true); +} + static bool isVarDeclStrongDefinition(const VarDecl *D, bool NoCommon) { // Don't give variables common linkage if -fno-common was specified unless it // was overridden by a NoCommon attribute. Index: test/CodeGenCXX/catch-undef-behavior.cpp =================================================================== --- test/CodeGenCXX/catch-undef-behavior.cpp +++ test/CodeGenCXX/catch-undef-behavior.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr,address -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-ASAN struct S { double d; @@ -6,6 +7,12 @@ virtual int f(); }; +// Check that type descriptor global is not modified by ASan. +// CHECK-ASAN: [[TYPE_DESCR:@[0-9]+]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'S'\00" } + +// Check that type mismatch handler is not modified by ASan. +// CHECK-ASAN: private unnamed_addr global { { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }*, i8*, i8 } { {{.*}}, { i16, i16, [4 x i8] }* [[TYPE_DESCR]], {{.*}} } + struct T : S {}; // CHECK-LABEL: @_Z17reference_binding @@ -31,6 +38,7 @@ } // CHECK-LABEL: @_Z13member_access +// CHECK-ASAN-LABEL: @_Z13member_access void member_access(S *p) { // (1a) Check 'p' is appropriately sized and aligned for member access.