forked from OSchip/llvm-project
[sancov] Fix PR33732
Coverage hooks that take less-than-64-bit-integers as parameters need the zeroext parameter attribute (http://llvm.org/docs/LangRef.html#paramattrs) to make sure they are properly extended by the x86_64 ABI. llvm-svn: 308296
This commit is contained in:
parent
0636fbd737
commit
9385aaa848
|
@ -281,6 +281,16 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
|
|||
SanCovTraceSwitchFunction =
|
||||
checkSanitizerInterfaceFunction(M.getOrInsertFunction(
|
||||
SanCovTraceSwitchName, VoidTy, Int64Ty, Int64PtrTy));
|
||||
// Make sure smaller parameters are zero-extended to i64 as required by the
|
||||
// x86_64 ABI.
|
||||
if (TargetTriple.getArch() == Triple::x86_64) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
SanCovTraceCmpFunction[i]->addParamAttr(0, Attribute::ZExt);
|
||||
SanCovTraceCmpFunction[i]->addParamAttr(1, Attribute::ZExt);
|
||||
}
|
||||
SanCovTraceDivFunction[0]->addParamAttr(0, Attribute::ZExt);
|
||||
}
|
||||
|
||||
|
||||
// We insert an empty inline asm after cov callbacks to avoid callback merge.
|
||||
EmptyAsm = InlineAsm::get(FunctionType::get(IRB.getVoidTy(), false),
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
; Test -sanitizer-coverage-trace-compares=1 API declarations on a non-x86_64 arch
|
||||
; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -sanitizer-coverage-trace-compares=1 -S | FileCheck %s
|
||||
|
||||
target triple = "x86_32-unknown-linux-gnu"
|
||||
define i32 @foo() #0 {
|
||||
entry:
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc_indir(i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp1(i8, i8)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp2(i16, i16)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp4(i32, i32)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp8(i64, i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_div4(i32)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_div8(i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_gep(i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_switch(i64, i64*)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc()
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc_guard(i32*)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc_guard_init(i32*, i32*)
|
||||
; CHECK-NOT: declare
|
|
@ -0,0 +1,22 @@
|
|||
; Test -sanitizer-coverage-trace-compares=1 API declarations on x86_64
|
||||
; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -sanitizer-coverage-trace-compares=1 -S | FileCheck %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define i32 @foo() #0 {
|
||||
entry:
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc_indir(i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp1(i8 zeroext, i8 zeroext)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp2(i16 zeroext, i16 zeroext)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp4(i32 zeroext, i32 zeroext)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_cmp8(i64, i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_div4(i32 zeroext)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_div8(i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_gep(i64)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_switch(i64, i64*)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc()
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc_guard(i32*)
|
||||
; CHECK: declare void @__sanitizer_cov_trace_pc_guard_init(i32*, i32*)
|
||||
; CHECK-NOT: declare
|
Loading…
Reference in New Issue