Skip to content

Commit

Permalink
Revert "[asan] Put ctor/dtor in comdat."
Browse files Browse the repository at this point in the history
This reverts commit r299696, which is causing mysterious test failures.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299880 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eugenis committed Apr 10, 2017
1 parent 9cf476f commit 465b9a5
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 54 deletions.
50 changes: 9 additions & 41 deletions lib/Transforms/Instrumentation/AddressSanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<GlobalVariable *> ExtendedGlobals,
ArrayRef<Constant *> MetadataInitializers);
Expand Down Expand Up @@ -645,9 +645,6 @@ class AddressSanitizerModule : public ModulePass {
Function *AsanUnregisterGlobals;
Function *AsanRegisterImageGlobals;
Function *AsanUnregisterImageGlobals;

Function *AsanCtorFunction = nullptr;
Function *AsanDtorFunction = nullptr;
};

// Stack poisoning does not play well with exception handling.
Expand Down Expand Up @@ -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<ConstantArray>(GV->getInitializer());
if (!CA)
return;

ConstantArray *CA = cast<ConstantArray>(GV->getInitializer());
for (Use &OP : CA->operands()) {
if (isa<ConstantAggregateZero>(OP)) continue;
ConstantStruct *CS = cast<ConstantStruct>(OP);
Expand Down Expand Up @@ -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));
}
Expand Down Expand Up @@ -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<GlobalVariable *, 16> GlobalsToChange;
Expand All @@ -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();

Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion test/Instrumentation/AddressSanitizer/instrument_global.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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"<stdin>\00", align 1
; CHECK: llvm.global_ctors
; CHECK: @__asan_gen_ = private constant [8 x i8] c"<stdin>\00", align 1
; CHECK: llvm.global_dtors

; Test that we don't instrument global arrays with static initializer
Expand Down
12 changes: 0 additions & 12 deletions test/Instrumentation/AddressSanitizer/no-globals.ll

This file was deleted.

0 comments on commit 465b9a5

Please sign in to comment.