From: Alex Shlyapnikov Date: Mon, 27 Mar 2017 23:11:47 +0000 (+0000) Subject: Revert "[asan] Put ctor/dtor in comdat." X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3c1e4143bab1b7c4a76fa2763ea6b0f34c5705a1;p=llvm Revert "[asan] Put ctor/dtor in comdat." Speculative revert, some libfuzzer tests are affected. This reverts commit r298756. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298889 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 47395653acf..ae047239d82 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -606,7 +606,7 @@ class AddressSanitizerModule : public ModulePass { private: void initializeCallbacks(Module &M); - bool InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool *CtorComdat); + bool InstrumentGlobals(IRBuilder<> &IRB, Module &M); void InstrumentGlobalsCOFF(IRBuilder<> &IRB, Module &M, ArrayRef ExtendedGlobals, ArrayRef MetadataInitializers); @@ -645,9 +645,6 @@ private: Function *AsanUnregisterGlobals; Function *AsanRegisterImageGlobals; Function *AsanUnregisterImageGlobals; - - Function *AsanCtorFunction = nullptr; - Function *AsanDtorFunction = nullptr; }; // Stack poisoning does not play well with exception handling. @@ -1431,13 +1428,8 @@ void AddressSanitizerModule::poisonOneInitializer(Function &GlobalInit, void AddressSanitizerModule::createInitializerPoisonCalls( Module &M, GlobalValue *ModuleName) { GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors"); - if (!GV) - return; - - ConstantArray *CA = dyn_cast(GV->getInitializer()); - if (!CA) - return; + ConstantArray *CA = cast(GV->getInitializer()); for (Use &OP : CA->operands()) { if (isa(OP)) continue; ConstantStruct *CS = cast(OP); @@ -1643,10 +1635,11 @@ AddressSanitizerModule::CreateMetadataGlobal(Module &M, Constant *Initializer, } IRBuilder<> AddressSanitizerModule::CreateAsanModuleDtor(Module &M) { - AsanDtorFunction = + Function *AsanDtorFunction = Function::Create(FunctionType::get(Type::getVoidTy(*C), false), GlobalValue::InternalLinkage, kAsanModuleDtorName, &M); BasicBlock *AsanDtorBB = BasicBlock::Create(*C, "", AsanDtorFunction); + appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndDtorPriority); return IRBuilder<>(ReturnInst::Create(*C, AsanDtorBB)); } @@ -1762,10 +1755,7 @@ void AddressSanitizerModule::InstrumentGlobalsWithMetadataArray( // This function replaces all global variables with new variables that have // trailing redzones. It also creates a function that poisons // redzones and inserts this function into llvm.global_ctors. -// Sets *CtorComdat to true if the global registration code emitted into the -// asan constructor is comdat-compatible. -bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool *CtorComdat) { - *CtorComdat = false; +bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M) { GlobalsMD.init(M); SmallVector GlobalsToChange; @@ -1775,10 +1765,7 @@ bool AddressSanitizerModule::InstrumentGlobals(IRBuilder<> &IRB, Module &M, bool } size_t n = GlobalsToChange.size(); - if (n == 0) { - *CtorComdat = true; - return false; - } + if (n == 0) return false; auto &DL = M.getDataLayout(); @@ -1950,36 +1937,17 @@ bool AddressSanitizerModule::runOnModule(Module &M) { if (CompileKernel) return false; - // Create a module constructor. A destructor is created lazily because not all - // platforms, and not all modules need it. + Function *AsanCtorFunction; std::tie(AsanCtorFunction, std::ignore) = createSanitizerCtorAndInitFunctions( M, kAsanModuleCtorName, kAsanInitName, /*InitArgTypes=*/{}, /*InitArgs=*/{}, kAsanVersionCheckName); + appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority); - bool CtorComdat = true; bool Changed = false; // TODO(glider): temporarily disabled globals instrumentation for KASan. if (ClGlobals) { IRBuilder<> IRB(AsanCtorFunction->getEntryBlock().getTerminator()); - Changed |= InstrumentGlobals(IRB, M, &CtorComdat); - } - - // Put the constructor and destructor in comdat if both - // (1) global instrumentation is not TU-specific - // (2) target is ELF. - if (TargetTriple.isOSBinFormatELF() && CtorComdat) { - AsanCtorFunction->setComdat(M.getOrInsertComdat(kAsanModuleCtorName)); - appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority, - AsanCtorFunction); - if (AsanDtorFunction) { - AsanDtorFunction->setComdat(M.getOrInsertComdat(kAsanModuleDtorName)); - appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndDtorPriority, - AsanDtorFunction); - } - } else { - appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndDtorPriority); - if (AsanDtorFunction) - appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndDtorPriority); + Changed |= InstrumentGlobals(IRB, M); } return Changed; diff --git a/test/Instrumentation/AddressSanitizer/instrument_global.ll b/test/Instrumentation/AddressSanitizer/instrument_global.ll index cddb4aaca3b..7df3d22dcde 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_global.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_global.ll @@ -6,8 +6,8 @@ target triple = "x86_64-unknown-linux-gnu" ; If a global is present, __asan_[un]register_globals should be called from ; module ctor/dtor -; CHECK: @__asan_gen_ = private constant [8 x i8] c"\00", align 1 ; CHECK: llvm.global_ctors +; CHECK: @__asan_gen_ = private constant [8 x i8] c"\00", align 1 ; CHECK: llvm.global_dtors ; Test that we don't instrument global arrays with static initializer diff --git a/test/Instrumentation/AddressSanitizer/no-globals.ll b/test/Instrumentation/AddressSanitizer/no-globals.ll deleted file mode 100644 index d91ff06378e..00000000000 --- a/test/Instrumentation/AddressSanitizer/no-globals.ll +++ /dev/null @@ -1,12 +0,0 @@ -; A module with no asan-instrumented globals has no asan destructor, and has an asan constructor in a comdat. -; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -asan -asan-module -S | FileCheck %s - -define void @f() { - ret void -} - -; CHECK-NOT: @llvm.global_dtors -; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 1, void ()* @asan.module_ctor, i8* bitcast (void ()* @asan.module_ctor to i8*) }] -; CHECK-NOT: @llvm.global_dtors -; CHECK: define internal void @asan.module_ctor() comdat -; CHECK-NOT: @llvm.global_dtors