forked from OSchip/llvm-project
[SanitizerCoverage] Fix types of __stop* and __start* symbols
If a section is supposed to hold elements of type T, then the corresponding CreateSecStartEnd()'s Ty parameter represents T*. Forwarding it to GlobalVariable constructor causes the resulting GlobalVariable's type to be T*, and its SSA value type to be T**, which is one indirection too many. This issue is mostly masked by pointer casts, however, the global variable still gets an incorrect alignment, which causes SystemZ to choose wrong instructions to access the section.
This commit is contained in:
parent
a4e537d9c4
commit
153df1373e
|
@ -338,25 +338,24 @@ PreservedAnalyses ModuleSanitizerCoveragePass::run(Module &M,
|
|||
std::pair<Value *, Value *>
|
||||
ModuleSanitizerCoverage::CreateSecStartEnd(Module &M, const char *Section,
|
||||
Type *Ty) {
|
||||
GlobalVariable *SecStart =
|
||||
new GlobalVariable(M, Ty, false, GlobalVariable::ExternalLinkage, nullptr,
|
||||
getSectionStart(Section));
|
||||
GlobalVariable *SecStart = new GlobalVariable(
|
||||
M, Ty->getPointerElementType(), false, GlobalVariable::ExternalLinkage,
|
||||
nullptr, getSectionStart(Section));
|
||||
SecStart->setVisibility(GlobalValue::HiddenVisibility);
|
||||
GlobalVariable *SecEnd =
|
||||
new GlobalVariable(M, Ty, false, GlobalVariable::ExternalLinkage,
|
||||
nullptr, getSectionEnd(Section));
|
||||
GlobalVariable *SecEnd = new GlobalVariable(
|
||||
M, Ty->getPointerElementType(), false, GlobalVariable::ExternalLinkage,
|
||||
nullptr, getSectionEnd(Section));
|
||||
SecEnd->setVisibility(GlobalValue::HiddenVisibility);
|
||||
IRBuilder<> IRB(M.getContext());
|
||||
Value *SecEndPtr = IRB.CreatePointerCast(SecEnd, Ty);
|
||||
if (!TargetTriple.isOSBinFormatCOFF())
|
||||
return std::make_pair(IRB.CreatePointerCast(SecStart, Ty), SecEndPtr);
|
||||
return std::make_pair(SecStart, SecEnd);
|
||||
|
||||
// Account for the fact that on windows-msvc __start_* symbols actually
|
||||
// point to a uint64_t before the start of the array.
|
||||
auto SecStartI8Ptr = IRB.CreatePointerCast(SecStart, Int8PtrTy);
|
||||
auto GEP = IRB.CreateGEP(Int8Ty, SecStartI8Ptr,
|
||||
ConstantInt::get(IntptrTy, sizeof(uint64_t)));
|
||||
return std::make_pair(IRB.CreatePointerCast(GEP, Ty), SecEndPtr);
|
||||
return std::make_pair(IRB.CreatePointerCast(GEP, Ty), SecEnd);
|
||||
}
|
||||
|
||||
Function *ModuleSanitizerCoverage::CreateInitCallsForSections(
|
||||
|
|
|
@ -12,4 +12,4 @@ entry:
|
|||
; CHECK: store i8 %1, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @__sancov_gen_, i64 0, i64 0), align 1, !nosanitize
|
||||
ret void
|
||||
}
|
||||
; CHECK: call void @__sanitizer_cov_8bit_counters_init(i8* bitcast (i8** @__start___sancov_cntrs to i8*), i8* bitcast (i8** @__stop___sancov_cntrs to i8*))
|
||||
; CHECK: call void @__sanitizer_cov_8bit_counters_init(i8* @__start___sancov_cntrs, i8* @__stop___sancov_cntrs)
|
||||
|
|
|
@ -20,4 +20,4 @@ define void @foo() {
|
|||
entry:
|
||||
ret void
|
||||
}
|
||||
; CHECK: call void @__sanitizer_cov_bool_flag_init(i1* bitcast (i1** @__start___sancov_bools to i1*), i1* bitcast (i1** @__stop___sancov_bools to i1*))
|
||||
; CHECK: call void @__sanitizer_cov_bool_flag_init(i1* @__start___sancov_bools, i1* @__stop___sancov_bools)
|
||||
|
|
|
@ -74,7 +74,7 @@ lj:
|
|||
; CHECK_PC_GUARD: call void @longjmp
|
||||
; CHECK_PC_GUARD: unreachable
|
||||
|
||||
; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i32* bitcast (i32** @__start___sancov_guards to i32*), i32* bitcast (i32** @__stop___sancov_guards to i32*))
|
||||
; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i32* @__start___sancov_guards, i32* @__stop___sancov_guards)
|
||||
|
||||
; CHECK_PC_GUARD_DARWIN-LABEL: define void @foo
|
||||
; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard
|
||||
|
@ -82,4 +82,4 @@ lj:
|
|||
; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard
|
||||
; CHECK_PC_GUARD_DARWIN-NOT: call void @__sanitizer_cov_trace_pc
|
||||
; CHECK_PC_GUARD_DARWIN: ret void
|
||||
; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard_init(i32* bitcast (i32** @"\01section$start$__DATA$__sancov_guards" to i32*), i32* bitcast (i32** @"\01section$end$__DATA$__sancov_guards" to i32*))
|
||||
; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard_init(i32* @"\01section$start$__DATA$__sancov_guards", i32* @"\01section$end$__DATA$__sancov_guards")
|
||||
|
|
Loading…
Reference in New Issue