mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[asan] fix a bug (issue 19) where dlclose and the following mmap caused a false positive. compiler part.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146688 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -25,6 +25,9 @@ class Function;
|
|||||||
/// http://llvm.org/docs/LangRef.html#intg_global_ctors
|
/// http://llvm.org/docs/LangRef.html#intg_global_ctors
|
||||||
void appendToGlobalCtors(Module &M, Function *F, int Priority);
|
void appendToGlobalCtors(Module &M, Function *F, int Priority);
|
||||||
|
|
||||||
|
/// Same as appendToGlobalCtors(), but for global dtors.
|
||||||
|
void appendToGlobalDtors(Module &M, Function *F, int Priority);
|
||||||
|
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif // LLVM_TRANSFORMS_UTILS_MODULE_UTILS_H
|
#endif // LLVM_TRANSFORMS_UTILS_MODULE_UTILS_H
|
||||||
|
@@ -55,8 +55,11 @@ static const uintptr_t kCurrentStackFrameMagic = 0x41B58AB3;
|
|||||||
static const uintptr_t kRetiredStackFrameMagic = 0x45E0360E;
|
static const uintptr_t kRetiredStackFrameMagic = 0x45E0360E;
|
||||||
|
|
||||||
static const char *kAsanModuleCtorName = "asan.module_ctor";
|
static const char *kAsanModuleCtorName = "asan.module_ctor";
|
||||||
|
static const char *kAsanModuleDtorName = "asan.module_dtor";
|
||||||
|
static const int kAsanCtorAndCtorPriority = 1;
|
||||||
static const char *kAsanReportErrorTemplate = "__asan_report_";
|
static const char *kAsanReportErrorTemplate = "__asan_report_";
|
||||||
static const char *kAsanRegisterGlobalsName = "__asan_register_globals";
|
static const char *kAsanRegisterGlobalsName = "__asan_register_globals";
|
||||||
|
static const char *kAsanUnregisterGlobalsName = "__asan_unregister_globals";
|
||||||
static const char *kAsanInitName = "__asan_init";
|
static const char *kAsanInitName = "__asan_init";
|
||||||
static const char *kAsanMappingOffsetName = "__asan_mapping_offset";
|
static const char *kAsanMappingOffsetName = "__asan_mapping_offset";
|
||||||
static const char *kAsanMappingScaleName = "__asan_mapping_scale";
|
static const char *kAsanMappingScaleName = "__asan_mapping_scale";
|
||||||
@@ -559,6 +562,22 @@ bool AddressSanitizer::insertGlobalRedzones(Module &M) {
|
|||||||
IRB.CreatePointerCast(AllGlobals, IntptrTy),
|
IRB.CreatePointerCast(AllGlobals, IntptrTy),
|
||||||
ConstantInt::get(IntptrTy, n));
|
ConstantInt::get(IntptrTy, n));
|
||||||
|
|
||||||
|
// We also need to unregister globals at the end, e.g. when a shared library
|
||||||
|
// gets closed.
|
||||||
|
Function *AsanDtorFunction = Function::Create(
|
||||||
|
FunctionType::get(Type::getVoidTy(*C), false),
|
||||||
|
GlobalValue::InternalLinkage, kAsanModuleDtorName, &M);
|
||||||
|
BasicBlock *AsanDtorBB = BasicBlock::Create(*C, "", AsanDtorFunction);
|
||||||
|
IRBuilder<> IRB_Dtor(ReturnInst::Create(*C, AsanDtorBB));
|
||||||
|
Function *AsanUnregisterGlobals = cast<Function>(M.getOrInsertFunction(
|
||||||
|
kAsanUnregisterGlobalsName, IRB.getVoidTy(), IntptrTy, IntptrTy, NULL));
|
||||||
|
AsanUnregisterGlobals->setLinkage(Function::ExternalLinkage);
|
||||||
|
|
||||||
|
IRB_Dtor.CreateCall2(AsanUnregisterGlobals,
|
||||||
|
IRB.CreatePointerCast(AllGlobals, IntptrTy),
|
||||||
|
ConstantInt::get(IntptrTy, n));
|
||||||
|
appendToGlobalDtors(M, AsanDtorFunction, kAsanCtorAndCtorPriority);
|
||||||
|
|
||||||
DEBUG(dbgs() << M);
|
DEBUG(dbgs() << M);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -632,7 +651,7 @@ bool AddressSanitizer::runOnModule(Module &M) {
|
|||||||
Res |= handleFunction(M, *F);
|
Res |= handleFunction(M, *F);
|
||||||
}
|
}
|
||||||
|
|
||||||
appendToGlobalCtors(M, AsanCtorFunction, 1 /*high priority*/);
|
appendToGlobalCtors(M, AsanCtorFunction, kAsanCtorAndCtorPriority);
|
||||||
|
|
||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
@@ -19,7 +19,8 @@
|
|||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
void llvm::appendToGlobalCtors(Module &M, Function *F, int Priority) {
|
static void appendToGlobalArray(const char *Array,
|
||||||
|
Module &M, Function *F, int Priority) {
|
||||||
IRBuilder<> IRB(M.getContext());
|
IRBuilder<> IRB(M.getContext());
|
||||||
FunctionType *FnTy = FunctionType::get(IRB.getVoidTy(), false);
|
FunctionType *FnTy = FunctionType::get(IRB.getVoidTy(), false);
|
||||||
StructType *Ty = StructType::get(
|
StructType *Ty = StructType::get(
|
||||||
@@ -31,7 +32,7 @@ void llvm::appendToGlobalCtors(Module &M, Function *F, int Priority) {
|
|||||||
// Get the current set of static global constructors and add the new ctor
|
// Get the current set of static global constructors and add the new ctor
|
||||||
// to the list.
|
// to the list.
|
||||||
SmallVector<Constant *, 16> CurrentCtors;
|
SmallVector<Constant *, 16> CurrentCtors;
|
||||||
if (GlobalVariable * GVCtor = M.getNamedGlobal("llvm.global_ctors")) {
|
if (GlobalVariable * GVCtor = M.getNamedGlobal(Array)) {
|
||||||
if (Constant *Init = GVCtor->getInitializer()) {
|
if (Constant *Init = GVCtor->getInitializer()) {
|
||||||
unsigned n = Init->getNumOperands();
|
unsigned n = Init->getNumOperands();
|
||||||
CurrentCtors.reserve(n + 1);
|
CurrentCtors.reserve(n + 1);
|
||||||
@@ -51,6 +52,13 @@ void llvm::appendToGlobalCtors(Module &M, Function *F, int Priority) {
|
|||||||
// Create the new global variable and replace all uses of
|
// Create the new global variable and replace all uses of
|
||||||
// the old global variable with the new one.
|
// the old global variable with the new one.
|
||||||
(void)new GlobalVariable(M, NewInit->getType(), false,
|
(void)new GlobalVariable(M, NewInit->getType(), false,
|
||||||
GlobalValue::AppendingLinkage, NewInit,
|
GlobalValue::AppendingLinkage, NewInit, Array);
|
||||||
"llvm.global_ctors");
|
}
|
||||||
|
|
||||||
|
void llvm::appendToGlobalCtors(Module &M, Function *F, int Priority) {
|
||||||
|
appendToGlobalArray("llvm.global_ctors", M, F, Priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
void llvm::appendToGlobalDtors(Module &M, Function *F, int Priority) {
|
||||||
|
appendToGlobalArray("llvm.global_dtors", M, F, Priority);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user