SanitizerCoverage: Convert tests to opaque pointers
This commit is contained in:
parent
256d5ad3e8
commit
fc1270dd29
|
@ -5,7 +5,7 @@
|
|||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define dso_local void @foo(i32* nocapture readnone %a, i32 %n) local_unnamed_addr {
|
||||
define dso_local void @foo(ptr nocapture readnone %a, i32 %n) local_unnamed_addr {
|
||||
entry:
|
||||
br label %do.body
|
||||
|
||||
|
|
|
@ -5,12 +5,12 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
|||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define void @foo(ptr %a) sanitize_address {
|
||||
entry:
|
||||
%tobool = icmp eq i32* %a, null
|
||||
%tobool = icmp eq ptr %a, null
|
||||
br i1 %tobool, label %if.end, label %if.then
|
||||
|
||||
if.then: ; preds = %entry
|
||||
store i32 0, i32* %a, align 4
|
||||
call void @foo(i32* %a)
|
||||
store i32 0, ptr %a, align 4
|
||||
call void @foo(ptr %a)
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %entry, %if.then
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
; and add sanitize_address to @_ZN1A1fEv
|
||||
|
||||
; Test that __sanitizer_cov_trace_pc_guard call has !dbg pointing to the opening { of A::f().
|
||||
; CHECK: call void @__sanitizer_cov_trace_pc_guard(i32*{{.*}}) #{{.*}}, !dbg [[A:!.*]]
|
||||
; CHECK: call void @__sanitizer_cov_trace_pc_guard(ptr{{.*}}) #{{.*}}, !dbg [[A:!.*]]
|
||||
; CHECK: [[A]] = !DILocation(line: 6, scope: !{{.*}})
|
||||
|
||||
|
||||
|
@ -25,11 +25,10 @@ target triple = "x86_64-unknown-linux-gnu"
|
|||
%struct.A = type { i32 }
|
||||
|
||||
; Function Attrs: nounwind readonly uwtable
|
||||
define i32 @_ZN1A1fEv(%struct.A* nocapture readonly %this) #0 align 2 !dbg !13 {
|
||||
define i32 @_ZN1A1fEv(ptr nocapture readonly %this) #0 align 2 !dbg !13 {
|
||||
entry:
|
||||
tail call void @llvm.dbg.value(metadata %struct.A* %this, i64 0, metadata !15, metadata !DIExpression()), !dbg !20
|
||||
%x = getelementptr inbounds %struct.A, %struct.A* %this, i64 0, i32 0, !dbg !21
|
||||
%0 = load i32, i32* %x, align 4, !dbg !21
|
||||
tail call void @llvm.dbg.value(metadata ptr %this, i64 0, metadata !15, metadata !DIExpression()), !dbg !20
|
||||
%0 = load i32, ptr %this, align 4, !dbg !21
|
||||
ret i32 %0, !dbg !21
|
||||
}
|
||||
|
||||
|
|
|
@ -4,31 +4,31 @@
|
|||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define void @foo(i32* %a) sanitize_address {
|
||||
define void @foo(ptr %a) sanitize_address {
|
||||
entry:
|
||||
%tobool = icmp eq i32* %a, null
|
||||
%tobool = icmp eq ptr %a, null
|
||||
br i1 %tobool, label %if.end, label %if.then
|
||||
|
||||
if.then: ; preds = %entry
|
||||
store i32 0, i32* %a, align 4
|
||||
store i32 0, ptr %a, align 4
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %entry, %if.then
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK0-NOT: @llvm.global_ctors = {{.*}}{ i32 2, void ()* @sancov.module_ctor }
|
||||
; CHECK1: @llvm.global_ctors = {{.*}}{ i32 2, void ()* @sancov.module_ctor, i8* null }
|
||||
; CHECK2: @llvm.global_ctors = {{.*}}{ i32 2, void ()* @sancov.module_ctor, i8* null }
|
||||
; CHECK0-NOT: @llvm.global_ctors = {{.*}}{ i32 2, ptr @sancov.module_ctor }
|
||||
; CHECK1: @llvm.global_ctors = {{.*}}{ i32 2, ptr @sancov.module_ctor, ptr null }
|
||||
; CHECK2: @llvm.global_ctors = {{.*}}{ i32 2, ptr @sancov.module_ctor, ptr null }
|
||||
|
||||
; CHECK0-NOT: call void @__sanitizer_cov(
|
||||
; CHECK0-NOT: call void @__sanitizer_cov_module_init(
|
||||
|
||||
; CHECK1-LABEL: define void @foo
|
||||
; CHECK1: %0 = load atomic i32, i32* {{.*}} monotonic, align 4, !nosanitize
|
||||
; CHECK1: %0 = load atomic i32, ptr {{.*}} monotonic, align 4, !nosanitize
|
||||
; CHECK1: %1 = icmp sge i32 0, %0
|
||||
; CHECK1: br i1 %1, label %2, label %3
|
||||
; CHECK1: call void @__sanitizer_cov(i32*{{.*}})
|
||||
; CHECK1: call void @__sanitizer_cov(ptr{{.*}})
|
||||
; CHECK1: call void asm sideeffect "", ""()
|
||||
; CHECK1-NOT: call void @__sanitizer_cov
|
||||
; CHECK1: ret void
|
||||
|
@ -68,15 +68,14 @@ entry:
|
|||
; CHECK3-NOT: call void @__sanitizer_cov
|
||||
; CHECK3: ret void
|
||||
|
||||
%struct.StructWithVptr = type { i32 (...)** }
|
||||
%struct.StructWithVptr = type { ptr }
|
||||
|
||||
define void @CallViaVptr(%struct.StructWithVptr* %foo) uwtable sanitize_address {
|
||||
define void @CallViaVptr(ptr %foo) uwtable sanitize_address {
|
||||
entry:
|
||||
%0 = bitcast %struct.StructWithVptr* %foo to void (%struct.StructWithVptr*)***
|
||||
%vtable = load void (%struct.StructWithVptr*)**, void (%struct.StructWithVptr*)*** %0, align 8
|
||||
%1 = load void (%struct.StructWithVptr*)*, void (%struct.StructWithVptr*)** %vtable, align 8
|
||||
tail call void %1(%struct.StructWithVptr* %foo)
|
||||
tail call void %1(%struct.StructWithVptr* %foo)
|
||||
%vtable = load ptr, ptr %foo, align 8
|
||||
%0 = load ptr, ptr %vtable, align 8
|
||||
tail call void %0(ptr %foo)
|
||||
tail call void %0(ptr %foo)
|
||||
tail call void asm sideeffect "", ""()
|
||||
ret void
|
||||
}
|
||||
|
|
|
@ -17,20 +17,20 @@ target triple = "x86_64-unknown-linux-gnu"
|
|||
; Check that __sanitizer_cov call has !dgb pointing to the beginning
|
||||
; of appropriate basic blocks.
|
||||
; CHECK-LABEL:_Z3fooPi
|
||||
; CHECK: call void @__sanitizer_cov{{.*}}(i32*{{.*}}) #{{.*}}, !dbg [[A:!.*]]
|
||||
; CHECK: call void @__sanitizer_cov{{.*}}(i32*{{.*}}) #{{.*}}, !dbg [[B:!.*]]
|
||||
; CHECK: call void @__sanitizer_cov{{.*}}(ptr{{.*}}) #{{.*}}, !dbg [[A:!.*]]
|
||||
; CHECK: call void @__sanitizer_cov{{.*}}(ptr{{.*}}) #{{.*}}, !dbg [[B:!.*]]
|
||||
; CHECK: ret void
|
||||
; CHECK: [[A]] = !DILocation(line: 1, scope: !{{.*}})
|
||||
; CHECK: [[B]] = !DILocation(line: 3, column: 5, scope: !{{.*}})
|
||||
|
||||
define void @_Z3fooPi(i32* %a) #0 !dbg !4 {
|
||||
define void @_Z3fooPi(ptr %a) #0 !dbg !4 {
|
||||
entry:
|
||||
tail call void @llvm.dbg.value(metadata i32* %a, i64 0, metadata !11, metadata !DIExpression()), !dbg !15
|
||||
%tobool = icmp eq i32* %a, null, !dbg !16
|
||||
tail call void @llvm.dbg.value(metadata ptr %a, i64 0, metadata !11, metadata !DIExpression()), !dbg !15
|
||||
%tobool = icmp eq ptr %a, null, !dbg !16
|
||||
br i1 %tobool, label %if.end, label %if.then, !dbg !16
|
||||
|
||||
if.then: ; preds = %entry
|
||||
store i32 0, i32* %a, align 4, !dbg !18, !tbaa !19
|
||||
store i32 0, ptr %a, align 4, !dbg !18, !tbaa !19
|
||||
br label %if.end, !dbg !18
|
||||
|
||||
if.end: ; preds = %entry, %if.then
|
||||
|
|
|
@ -4,37 +4,37 @@
|
|||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define void @gep_1(i32* nocapture %a, i32 %i) {
|
||||
define void @gep_1(ptr nocapture %a, i32 %i) {
|
||||
entry:
|
||||
%idxprom = sext i32 %i to i64
|
||||
%arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom
|
||||
store i32 0, i32* %arrayidx, align 4
|
||||
%arrayidx = getelementptr inbounds i32, ptr %a, i64 %idxprom
|
||||
store i32 0, ptr %arrayidx, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @gep_1(i32* nocapture %a, i32 %i)
|
||||
; CHECK-LABEL: define void @gep_1(ptr nocapture %a, i32 %i)
|
||||
; CHECK: call void @__sanitizer_cov_trace_gep(i64 %idxprom)
|
||||
; CHECK: ret void
|
||||
|
||||
|
||||
define void @gep_2([1000 x i32]* nocapture %a, i32 %i, i32 %j) {
|
||||
define void @gep_2(ptr nocapture %a, i32 %i, i32 %j) {
|
||||
entry:
|
||||
%idxprom = sext i32 %j to i64
|
||||
%idxprom1 = sext i32 %i to i64
|
||||
%arrayidx2 = getelementptr inbounds [1000 x i32], [1000 x i32]* %a, i64 %idxprom1, i64 %idxprom
|
||||
store i32 0, i32* %arrayidx2, align 4
|
||||
%arrayidx2 = getelementptr inbounds [1000 x i32], ptr %a, i64 %idxprom1, i64 %idxprom
|
||||
store i32 0, ptr %arrayidx2, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @gep_2([1000 x i32]* nocapture %a, i32 %i, i32 %j)
|
||||
; CHECK-LABEL: define void @gep_2(ptr nocapture %a, i32 %i, i32 %j)
|
||||
; CHECK: call void @__sanitizer_cov_trace_gep(i64 %idxprom1)
|
||||
; CHECK: call void @__sanitizer_cov_trace_gep(i64 %idxprom)
|
||||
; CHECK: ret void
|
||||
|
||||
; Just make sure we don't insturment this one and don't crash
|
||||
define void @gep_3(<2 x i8*> %a, i32 %i, i32 %j) {
|
||||
define void @gep_3(<2 x ptr> %a, i32 %i, i32 %j) {
|
||||
entry:
|
||||
%0 = getelementptr i8, <2 x i8*> %a, <2 x i64> <i64 8, i64 8>
|
||||
%0 = getelementptr i8, <2 x ptr> %a, <2 x i64> <i64 8, i64 8>
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @sancov.module_ctor_trace_pc_guard, ptr @sancov.module_ctor_trace_pc_guard }]
|
||||
; CHECK: @[[LLVM_COMPILER_USED:[a-zA-Z0-9_$"\\.-]+]] = appending global [1 x ptr] [ptr @__sancov_gen_], section "llvm.metadata"
|
||||
;.
|
||||
define void @foo(i32* %a) {
|
||||
define void @foo(ptr %a) {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: call void @__sanitizer_cov_trace_pc_guard(ptr @__sancov_gen_) #[[ATTR1:[0-9]+]]
|
||||
; CHECK-NEXT: ret void
|
||||
|
|
|
@ -5,20 +5,20 @@
|
|||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define void @foo(i32* %a) sanitize_address {
|
||||
define void @foo(ptr %a) sanitize_address {
|
||||
entry:
|
||||
%tobool = icmp eq i32* %a, null
|
||||
%tobool = icmp eq ptr %a, null
|
||||
br i1 %tobool, label %if.end, label %if.then
|
||||
|
||||
if.then: ; preds = %entry
|
||||
store i32 0, i32* %a, align 4
|
||||
store i32 0, ptr %a, align 4
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %entry, %if.then
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: private constant [6 x i64*] [i64* bitcast (void (i32*)* @foo to i64*), i64* inttoptr (i64 1 to i64*), i64* bitcast (i8* blockaddress(@foo, %entry.if.end_crit_edge) to i64*), i64* null, i64* bitcast (i8* blockaddress(@foo, %if.then) to i64*), i64* null], section "__sancov_pcs", comdat($foo), align 8
|
||||
; CHECK: private constant [6 x ptr] [ptr @foo, ptr inttoptr (i64 1 to ptr), ptr blockaddress(@foo, %entry.if.end_crit_edge), ptr null, ptr blockaddress(@foo, %if.then), ptr null], section "__sancov_pcs", comdat($foo), align 8
|
||||
; CHECK: @__start___sancov_pcs = extern_weak hidden global i64
|
||||
; CHECK-NEXT: @__stop___sancov_pcs = extern_weak hidden global i64
|
||||
; CHECK: define internal void @sancov.module_ctor
|
||||
|
|
|
@ -5,77 +5,74 @@
|
|||
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
||||
target triple = "i686-pc-windows-msvc18.0.0"
|
||||
|
||||
declare i32 @llvm.eh.typeid.for(i8*) #2
|
||||
declare i8* @llvm.frameaddress(i32)
|
||||
declare i8* @llvm.eh.recoverfp(i8*, i8*)
|
||||
declare i8* @llvm.localrecover(i8*, i8*, i32)
|
||||
declare i32 @llvm.eh.typeid.for(ptr) #2
|
||||
declare ptr @llvm.frameaddress(i32)
|
||||
declare ptr @llvm.eh.recoverfp(ptr, ptr)
|
||||
declare ptr @llvm.localrecover(ptr, ptr, i32)
|
||||
declare void @llvm.localescape(...) #1
|
||||
|
||||
declare i32 @_except_handler3(...)
|
||||
declare void @may_throw(i32* %r)
|
||||
declare void @may_throw(ptr %r)
|
||||
|
||||
define i32 @main() sanitize_address personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) {
|
||||
define i32 @main() sanitize_address personality ptr @_except_handler3 {
|
||||
entry:
|
||||
%r = alloca i32, align 4
|
||||
%__exception_code = alloca i32, align 4
|
||||
call void (...) @llvm.localescape(i32* nonnull %__exception_code)
|
||||
%0 = bitcast i32* %r to i8*
|
||||
store i32 0, i32* %r, align 4
|
||||
invoke void @may_throw(i32* nonnull %r) #4
|
||||
call void (...) @llvm.localescape(ptr nonnull %__exception_code)
|
||||
store i32 0, ptr %r, align 4
|
||||
invoke void @may_throw(ptr nonnull %r) #4
|
||||
to label %__try.cont unwind label %lpad
|
||||
|
||||
lpad: ; preds = %entry
|
||||
%1 = landingpad { i8*, i32 }
|
||||
catch i8* bitcast (i32 ()* @"\01?filt$0@0@main@@" to i8*)
|
||||
%2 = extractvalue { i8*, i32 } %1, 1
|
||||
%3 = call i32 @llvm.eh.typeid.for(i8* bitcast (i32 ()* @"\01?filt$0@0@main@@" to i8*)) #1
|
||||
%matches = icmp eq i32 %2, %3
|
||||
%0 = landingpad { ptr, i32 }
|
||||
catch ptr @"\01?filt$0@0@main@@"
|
||||
%1 = extractvalue { ptr, i32 } %0, 1
|
||||
%2 = call i32 @llvm.eh.typeid.for(ptr @"\01?filt$0@0@main@@") #1
|
||||
%matches = icmp eq i32 %1, %2
|
||||
br i1 %matches, label %__except, label %eh.resume
|
||||
|
||||
__except: ; preds = %lpad
|
||||
store i32 1, i32* %r, align 4
|
||||
store i32 1, ptr %r, align 4
|
||||
br label %__try.cont
|
||||
|
||||
__try.cont: ; preds = %entry, %__except
|
||||
%4 = load i32, i32* %r, align 4
|
||||
ret i32 %4
|
||||
%3 = load i32, ptr %r, align 4
|
||||
ret i32 %3
|
||||
|
||||
eh.resume: ; preds = %lpad
|
||||
resume { i8*, i32 } %1
|
||||
resume { ptr, i32 } %0
|
||||
}
|
||||
|
||||
; Check that we don't do any instrumentation.
|
||||
|
||||
; CHECK-LABEL: define i32 @main()
|
||||
; CHECK-NOT: load atomic i32, i32* {{.*}} monotonic, align 4, !nosanitize
|
||||
; CHECK-NOT: load atomic i32, ptr {{.*}} monotonic, align 4, !nosanitize
|
||||
; CHECK-NOT: call void @__sanitizer_cov
|
||||
; CHECK: ret i32
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal i32 @"\01?filt$0@0@main@@"() #1 {
|
||||
entry:
|
||||
%0 = tail call i8* @llvm.frameaddress(i32 1)
|
||||
%1 = tail call i8* @llvm.eh.recoverfp(i8* bitcast (i32 ()* @main to i8*), i8* %0)
|
||||
%2 = tail call i8* @llvm.localrecover(i8* bitcast (i32 ()* @main to i8*), i8* %1, i32 0)
|
||||
%__exception_code = bitcast i8* %2 to i32*
|
||||
%3 = getelementptr inbounds i8, i8* %0, i32 -20
|
||||
%4 = bitcast i8* %3 to { i32*, i8* }**
|
||||
%5 = load { i32*, i8* }*, { i32*, i8* }** %4, align 4
|
||||
%6 = getelementptr inbounds { i32*, i8* }, { i32*, i8* }* %5, i32 0, i32 0
|
||||
%7 = load i32*, i32** %6, align 4
|
||||
%8 = load i32, i32* %7, align 4
|
||||
store i32 %8, i32* %__exception_code, align 4
|
||||
%0 = tail call ptr @llvm.frameaddress(i32 1)
|
||||
%1 = tail call ptr @llvm.eh.recoverfp(ptr @main, ptr %0)
|
||||
%2 = tail call ptr @llvm.localrecover(ptr @main, ptr %1, i32 0)
|
||||
%3 = getelementptr inbounds i8, ptr %0, i32 -20
|
||||
%4 = load ptr, ptr %3, align 4
|
||||
%5 = getelementptr inbounds { ptr, ptr }, ptr %4, i32 0, i32 0
|
||||
%6 = load ptr, ptr %5, align 4
|
||||
%7 = load i32, ptr %6, align 4
|
||||
store i32 %7, ptr %2, align 4
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define internal i32 @"\01?filt$0@0@main@@"()
|
||||
; CHECK: tail call i8* @llvm.localrecover(i8* bitcast (i32 ()* @main to i8*), i8* {{.*}}, i32 0)
|
||||
; CHECK: tail call ptr @llvm.localrecover(ptr @main, ptr {{.*}}, i32 0)
|
||||
|
||||
define void @ScaleFilterCols_SSSE3(i8* %dst_ptr, i8* %src_ptr, i32 %dst_width, i32 %x, i32 %dx) sanitize_address {
|
||||
define void @ScaleFilterCols_SSSE3(ptr %dst_ptr, ptr %src_ptr, i32 %dst_width, i32 %x, i32 %dx) sanitize_address {
|
||||
entry:
|
||||
%dst_width.addr = alloca i32, align 4
|
||||
store i32 %dst_width, i32* %dst_width.addr, align 4
|
||||
%0 = call { i8*, i8*, i32, i32, i32 } asm sideeffect "", "=r,=r,={ax},=r,=r,=*rm,rm,rm,0,1,2,3,4,5,~{memory},~{cc},~{xmm0},~{xmm1},~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{dirflag},~{fpsr},~{flags}"(i32* elementtype(i32) nonnull %dst_width.addr, i32 %x, i32 %dx, i8* %dst_ptr, i8* %src_ptr, i32 0, i32 0, i32 0, i32 %dst_width)
|
||||
store i32 %dst_width, ptr %dst_width.addr, align 4
|
||||
%0 = call { ptr, ptr, i32, i32, i32 } asm sideeffect "", "=r,=r,={ax},=r,=r,=*rm,rm,rm,0,1,2,3,4,5,~{memory},~{cc},~{xmm0},~{xmm1},~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) nonnull %dst_width.addr, i32 %x, i32 %dx, ptr %dst_ptr, ptr %src_ptr, i32 0, i32 0, i32 0, i32 %dst_width)
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ target triple = "x86_64-unknown-linux-gnu"
|
|||
define i32 @foo() {
|
||||
entry:
|
||||
; CHECK-LABEL: define i32 @foo
|
||||
; CHECK-NOT: call i8* @llvm.frameaddress.p0i8(i32 0)
|
||||
; CHECK-NOT: call ptr @llvm.frameaddress.p0(i32 0)
|
||||
; CHECK-NOT: @__sancov_lowest_stack
|
||||
; CHECK: ret i32 7
|
||||
|
||||
|
@ -24,13 +24,13 @@ entry:
|
|||
define i32 @bar() {
|
||||
entry:
|
||||
; CHECK-LABEL: define i32 @bar
|
||||
; CHECK: [[framePtr:%[^ \t]+]] = call i8* @llvm.frameaddress.p0i8(i32 0)
|
||||
; CHECK: [[frameInt:%[^ \t]+]] = ptrtoint i8* [[framePtr]] to [[intType:i[0-9]+]]
|
||||
; CHECK: [[lowest:%[^ \t]+]] = load [[intType]], [[intType]]* @__sancov_lowest_stack
|
||||
; CHECK: [[framePtr:%[^ \t]+]] = call ptr @llvm.frameaddress.p0(i32 0)
|
||||
; CHECK: [[frameInt:%[^ \t]+]] = ptrtoint ptr [[framePtr]] to [[intType:i[0-9]+]]
|
||||
; CHECK: [[lowest:%[^ \t]+]] = load [[intType]], ptr @__sancov_lowest_stack
|
||||
; CHECK: [[cmp:%[^ \t]+]] = icmp ult [[intType]] [[frameInt]], [[lowest]]
|
||||
; CHECK: br i1 [[cmp]], label %[[ifLabel:[^ \t]+]], label
|
||||
; CHECK: [[ifLabel]]:
|
||||
; CHECK: store [[intType]] [[frameInt]], [[intType]]* @__sancov_lowest_stack
|
||||
; CHECK: store [[intType]] [[frameInt]], ptr @__sancov_lowest_stack
|
||||
; CHECK: %call = call i32 @foo()
|
||||
; CHECK: ret i32 %call
|
||||
|
||||
|
@ -38,6 +38,6 @@ entry:
|
|||
ret i32 %call
|
||||
}
|
||||
|
||||
define weak_odr hidden i64* @_ZTW21__sancov_lowest_stack() {
|
||||
ret i64* @__sancov_lowest_stack
|
||||
define weak_odr hidden ptr @_ZTW21__sancov_lowest_stack() {
|
||||
ret ptr @__sancov_lowest_stack
|
||||
}
|
||||
|
|
|
@ -4,30 +4,30 @@
|
|||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define void @foo(i8* %p1, i16* %p2, i32* %p4, i64* %p8, i128* %p16) {
|
||||
define void @foo(ptr %p1, ptr %p2, ptr %p4, ptr %p8, ptr %p16) {
|
||||
; =================== loads
|
||||
%1 = load i8, i8* %p1
|
||||
%2 = load i16, i16* %p2
|
||||
%3 = load i32, i32* %p4
|
||||
%4 = load i64, i64* %p8
|
||||
%5 = load i128, i128* %p16
|
||||
; LOADS: call void @__sanitizer_cov_load1(i8* %p1)
|
||||
; LOADS: call void @__sanitizer_cov_load2(i16* %p2)
|
||||
; LOADS: call void @__sanitizer_cov_load4(i32* %p4)
|
||||
; LOADS: call void @__sanitizer_cov_load8(i64* %p8)
|
||||
; LOADS: call void @__sanitizer_cov_load16(i128* %p16)
|
||||
%1 = load i8, ptr %p1
|
||||
%2 = load i16, ptr %p2
|
||||
%3 = load i32, ptr %p4
|
||||
%4 = load i64, ptr %p8
|
||||
%5 = load i128, ptr %p16
|
||||
; LOADS: call void @__sanitizer_cov_load1(ptr %p1)
|
||||
; LOADS: call void @__sanitizer_cov_load2(ptr %p2)
|
||||
; LOADS: call void @__sanitizer_cov_load4(ptr %p4)
|
||||
; LOADS: call void @__sanitizer_cov_load8(ptr %p8)
|
||||
; LOADS: call void @__sanitizer_cov_load16(ptr %p16)
|
||||
|
||||
; =================== stores
|
||||
store i8 %1, i8* %p1
|
||||
store i16 %2, i16* %p2
|
||||
store i32 %3, i32* %p4
|
||||
store i64 %4, i64* %p8
|
||||
store i128 %5, i128* %p16
|
||||
; STORES: call void @__sanitizer_cov_store1(i8* %p1)
|
||||
; STORES: call void @__sanitizer_cov_store2(i16* %p2)
|
||||
; STORES: call void @__sanitizer_cov_store4(i32* %p4)
|
||||
; STORES: call void @__sanitizer_cov_store8(i64* %p8)
|
||||
; STORES: call void @__sanitizer_cov_store16(i128* %p16)
|
||||
store i8 %1, ptr %p1
|
||||
store i16 %2, ptr %p2
|
||||
store i32 %3, ptr %p4
|
||||
store i64 %4, ptr %p8
|
||||
store i128 %5, ptr %p16
|
||||
; STORES: call void @__sanitizer_cov_store1(ptr %p1)
|
||||
; STORES: call void @__sanitizer_cov_store2(ptr %p2)
|
||||
; STORES: call void @__sanitizer_cov_store4(ptr %p4)
|
||||
; STORES: call void @__sanitizer_cov_store8(ptr %p8)
|
||||
; STORES: call void @__sanitizer_cov_store16(ptr %p16)
|
||||
|
||||
ret void
|
||||
}
|
||||
|
|
|
@ -20,24 +20,24 @@
|
|||
; WIN-NEXT: @__sancov_gen_.1 = private global [1 x i32] zeroinitializer, section ".SCOV$GM", comdat($CallViaVptr), align 4{{$}}
|
||||
; WIN-NEXT: @__sancov_gen_.2 = private global [1 x i32] zeroinitializer, section ".SCOV$GM", comdat($DirectBitcastCall), align 4{{$}}
|
||||
|
||||
; ELF: @llvm.used = appending global [1 x i8*] [i8* bitcast (void ()* @sancov.module_ctor_trace_pc_guard to i8*)]
|
||||
; ELF: @llvm.compiler.used = appending global [3 x i8*] [i8* bitcast ([3 x i32]* @__sancov_gen_ to i8*), i8* bitcast ([1 x i32]* @__sancov_gen_.1 to i8*), i8* bitcast ([1 x i32]* @__sancov_gen_.2 to i8*)], section "llvm.metadata"
|
||||
; MACHO: @llvm.used = appending global [4 x i8*] [i8* bitcast (void ()* @sancov.module_ctor_trace_pc_guard to i8*), i8* bitcast ([3 x i32]* @__sancov_gen_ to i8*), i8* bitcast ([1 x i32]* @__sancov_gen_.1 to i8*), i8* bitcast ([1 x i32]* @__sancov_gen_.2 to i8*)]
|
||||
; ELF: @llvm.used = appending global [1 x ptr] [ptr @sancov.module_ctor_trace_pc_guard]
|
||||
; ELF: @llvm.compiler.used = appending global [3 x ptr] [ptr @__sancov_gen_, ptr @__sancov_gen_.1, ptr @__sancov_gen_.2], section "llvm.metadata"
|
||||
; MACHO: @llvm.used = appending global [4 x ptr] [ptr @sancov.module_ctor_trace_pc_guard, ptr @__sancov_gen_, ptr @__sancov_gen_.1, ptr @__sancov_gen_.2]
|
||||
; MACHO-NOT: @llvm.compiler.used =
|
||||
; WIN: @llvm.used = appending global [1 x i8*] [i8* bitcast (void ()* @sancov.module_ctor_trace_pc_guard to i8*)], section "llvm.metadata"
|
||||
; WIN-NEXT: @llvm.compiler.used = appending global [3 x i8*] [i8* bitcast ([3 x i32]* @__sancov_gen_ to i8*), i8* bitcast ([1 x i32]* @__sancov_gen_.1 to i8*), i8* bitcast ([1 x i32]* @__sancov_gen_.2 to i8*)], section "llvm.metadata"
|
||||
; WIN: @llvm.used = appending global [1 x ptr] [ptr @sancov.module_ctor_trace_pc_guard], section "llvm.metadata"
|
||||
; WIN-NEXT: @llvm.compiler.used = appending global [3 x ptr] [ptr @__sancov_gen_, ptr @__sancov_gen_.1, ptr @__sancov_gen_.2], section "llvm.metadata"
|
||||
|
||||
; CHECK-LABEL: define void @foo
|
||||
; CHECK: call void @__sanitizer_cov_trace_pc
|
||||
; CHECK: ret void
|
||||
|
||||
define void @foo(i32* %a) sanitize_address {
|
||||
define void @foo(ptr %a) sanitize_address {
|
||||
entry:
|
||||
%tobool = icmp eq i32* %a, null
|
||||
%tobool = icmp eq ptr %a, null
|
||||
br i1 %tobool, label %if.end, label %if.then
|
||||
|
||||
if.then: ; preds = %entry
|
||||
store i32 0, i32* %a, align 4
|
||||
store i32 0, ptr %a, align 4
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %entry, %if.then
|
||||
|
@ -49,28 +49,27 @@ entry:
|
|||
; CHECK: call void @__sanitizer_cov_trace_pc_indir
|
||||
; CHECK: ret void
|
||||
|
||||
%struct.StructWithVptr = type { i32 (...)** }
|
||||
%struct.StructWithVptr = type { ptr }
|
||||
|
||||
define void @CallViaVptr(%struct.StructWithVptr* %foo) uwtable sanitize_address {
|
||||
define void @CallViaVptr(ptr %foo) uwtable sanitize_address {
|
||||
entry:
|
||||
%0 = bitcast %struct.StructWithVptr* %foo to void (%struct.StructWithVptr*)***
|
||||
%vtable = load void (%struct.StructWithVptr*)**, void (%struct.StructWithVptr*)*** %0, align 8
|
||||
%1 = load void (%struct.StructWithVptr*)*, void (%struct.StructWithVptr*)** %vtable, align 8
|
||||
tail call void %1(%struct.StructWithVptr* %foo)
|
||||
tail call void %1(%struct.StructWithVptr* %foo)
|
||||
%vtable = load ptr, ptr %foo, align 8
|
||||
%0 = load ptr, ptr %vtable, align 8
|
||||
tail call void %0(ptr %foo)
|
||||
tail call void %0(ptr %foo)
|
||||
tail call void asm sideeffect "", ""()
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @DirectBitcastCall
|
||||
; CHECK-NEXT: call void @__sanitizer_cov_trace_pc_guard
|
||||
; CHECK-NEXT: call void bitcast (i32 ()* @direct_callee to void ()*)()
|
||||
; CHECK-NEXT: call void @direct_callee()
|
||||
; CHECK-NEXT: ret void
|
||||
|
||||
declare i32 @direct_callee()
|
||||
|
||||
define void @DirectBitcastCall() sanitize_address {
|
||||
call void bitcast (i32 ()* @direct_callee to void ()*)()
|
||||
call void @direct_callee()
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
|
@ -6,34 +6,34 @@
|
|||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define void @foo(i32* %a) sanitize_address {
|
||||
define void @foo(ptr %a) sanitize_address {
|
||||
entry:
|
||||
%tobool = icmp eq i32* %a, null
|
||||
%tobool = icmp eq ptr %a, null
|
||||
br i1 %tobool, label %if.end, label %if.then
|
||||
|
||||
if.then: ; preds = %entry
|
||||
store i32 0, i32* %a, align 4
|
||||
store i32 0, ptr %a, align 4
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %entry, %if.then
|
||||
ret void
|
||||
}
|
||||
|
||||
define available_externally void @external_bar(i32* %a) sanitize_address {
|
||||
define available_externally void @external_bar(ptr %a) sanitize_address {
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @longjmp(i8*) noreturn
|
||||
declare void @longjmp(ptr) noreturn
|
||||
|
||||
; We expect three coverage points here for each BB.
|
||||
define void @cond_longjmp(i1 %cond, i8* %jmp_buf) sanitize_address {
|
||||
define void @cond_longjmp(i1 %cond, ptr %jmp_buf) sanitize_address {
|
||||
entry:
|
||||
br i1 %cond, label %lj, label %done
|
||||
done:
|
||||
ret void
|
||||
lj:
|
||||
call void @longjmp(i8* %jmp_buf)
|
||||
call void @longjmp(ptr %jmp_buf)
|
||||
unreachable
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,7 @@ lj:
|
|||
; CHECK_PC_GUARD: call void @longjmp
|
||||
; CHECK_PC_GUARD: unreachable
|
||||
|
||||
; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i32* @__start___sancov_guards, i32* @__stop___sancov_guards)
|
||||
; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(ptr @__start___sancov_guards, ptr @__stop___sancov_guards)
|
||||
|
||||
; CHECK_PC_GUARD_DARWIN-LABEL: define void @foo
|
||||
; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard
|
||||
|
@ -79,4 +79,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* @"\01section$start$__DATA$__sancov_guards", i32* @"\01section$end$__DATA$__sancov_guards")
|
||||
; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard_init(ptr @"\01section$start$__DATA$__sancov_guards", ptr @"\01section$end$__DATA$__sancov_guards")
|
||||
|
|
|
@ -29,22 +29,21 @@ source_filename = "t.cpp"
|
|||
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-windows-msvc19.10.24728"
|
||||
|
||||
%rtti.TypeDescriptor2 = type { i8**, i8*, [3 x i8] }
|
||||
%rtti.TypeDescriptor2 = type { ptr, ptr, [3 x i8] }
|
||||
%struct.Foo = type { i8 }
|
||||
|
||||
$"\01??_R0H@8" = comdat any
|
||||
|
||||
@"\01??_7type_info@@6B@" = external constant i8*
|
||||
@"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { i8** @"\01??_7type_info@@6B@", i8* null, [3 x i8] c".H\00" }, comdat
|
||||
@"\01??_7type_info@@6B@" = external constant ptr
|
||||
@"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { ptr @"\01??_7type_info@@6B@", ptr null, [3 x i8] c".H\00" }, comdat
|
||||
|
||||
; Function Attrs: uwtable
|
||||
define i32 @"\01?f@@YAHXZ"() local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
|
||||
define i32 @"\01?f@@YAHXZ"() local_unnamed_addr #0 personality ptr @__CxxFrameHandler3 {
|
||||
entry:
|
||||
%v = alloca %struct.Foo, align 1
|
||||
%e = alloca i32, align 4
|
||||
%0 = getelementptr inbounds %struct.Foo, %struct.Foo* %v, i64 0, i32 0
|
||||
call void @llvm.lifetime.start(i64 1, i8* nonnull %0) #4
|
||||
%call = call %struct.Foo* @"\01??0Foo@@QEAA@XZ"(%struct.Foo* nonnull %v)
|
||||
call void @llvm.lifetime.start(i64 1, ptr nonnull %v) #4
|
||||
%call = call ptr @"\01??0Foo@@QEAA@XZ"(ptr nonnull %v)
|
||||
invoke void @"\01?g@@YAXXZ"()
|
||||
to label %invoke.cont unwind label %ehcleanup
|
||||
|
||||
|
@ -53,50 +52,50 @@ invoke.cont: ; preds = %entry
|
|||
to label %try.cont unwind label %catch.dispatch
|
||||
|
||||
catch.dispatch: ; preds = %invoke.cont
|
||||
%1 = catchswitch within none [label %catch3, label %catch] unwind label %ehcleanup
|
||||
%0 = catchswitch within none [label %catch3, label %catch] unwind label %ehcleanup
|
||||
|
||||
catch3: ; preds = %catch.dispatch
|
||||
%2 = catchpad within %1 [%rtti.TypeDescriptor2* @"\01??_R0H@8", i32 0, i32* %e]
|
||||
invoke void @"\01?g@@YAXXZ"() [ "funclet"(token %2) ]
|
||||
%1 = catchpad within %0 [ptr @"\01??_R0H@8", i32 0, ptr %e]
|
||||
invoke void @"\01?g@@YAXXZ"() [ "funclet"(token %1) ]
|
||||
to label %invoke.cont4 unwind label %ehcleanup
|
||||
|
||||
invoke.cont4: ; preds = %catch3
|
||||
catchret from %2 to label %try.cont
|
||||
catchret from %1 to label %try.cont
|
||||
|
||||
try.cont: ; preds = %invoke.cont, %invoke.cont2, %invoke.cont4
|
||||
call void @"\01??1Foo@@QEAA@XZ"(%struct.Foo* nonnull %v) #4
|
||||
call void @llvm.lifetime.end(i64 1, i8* nonnull %0) #4
|
||||
call void @"\01??1Foo@@QEAA@XZ"(ptr nonnull %v) #4
|
||||
call void @llvm.lifetime.end(i64 1, ptr nonnull %v) #4
|
||||
ret i32 0
|
||||
|
||||
catch: ; preds = %catch.dispatch
|
||||
%3 = catchpad within %1 [i8* null, i32 64, i8* null]
|
||||
invoke void @"\01?g@@YAXXZ"() [ "funclet"(token %3) ]
|
||||
%2 = catchpad within %0 [ptr null, i32 64, ptr null]
|
||||
invoke void @"\01?g@@YAXXZ"() [ "funclet"(token %2) ]
|
||||
to label %invoke.cont2 unwind label %ehcleanup
|
||||
|
||||
invoke.cont2: ; preds = %catch
|
||||
catchret from %3 to label %try.cont
|
||||
catchret from %2 to label %try.cont
|
||||
|
||||
ehcleanup: ; preds = %catch3, %catch, %catch.dispatch, %entry
|
||||
%4 = cleanuppad within none []
|
||||
call void @"\01??1Foo@@QEAA@XZ"(%struct.Foo* nonnull %v) #4 [ "funclet"(token %4) ]
|
||||
call void @llvm.lifetime.end(i64 1, i8* nonnull %0) #4
|
||||
cleanupret from %4 unwind to caller
|
||||
%3 = cleanuppad within none []
|
||||
call void @"\01??1Foo@@QEAA@XZ"(ptr nonnull %v) #4 [ "funclet"(token %3) ]
|
||||
call void @llvm.lifetime.end(i64 1, ptr nonnull %v) #4
|
||||
cleanupret from %3 unwind to caller
|
||||
}
|
||||
|
||||
; Function Attrs: argmemonly nounwind
|
||||
declare void @llvm.lifetime.start(i64, i8* nocapture) #1
|
||||
declare void @llvm.lifetime.start(i64, ptr nocapture) #1
|
||||
|
||||
declare %struct.Foo* @"\01??0Foo@@QEAA@XZ"(%struct.Foo* returned) unnamed_addr #2
|
||||
declare ptr @"\01??0Foo@@QEAA@XZ"(ptr returned) unnamed_addr #2
|
||||
|
||||
declare void @"\01?g@@YAXXZ"() local_unnamed_addr #2
|
||||
|
||||
declare i32 @__CxxFrameHandler3(...)
|
||||
|
||||
; Function Attrs: nounwind
|
||||
declare void @"\01??1Foo@@QEAA@XZ"(%struct.Foo*) unnamed_addr #3
|
||||
declare void @"\01??1Foo@@QEAA@XZ"(ptr) unnamed_addr #3
|
||||
|
||||
; Function Attrs: argmemonly nounwind
|
||||
declare void @llvm.lifetime.end(i64, i8* nocapture) #1
|
||||
declare void @llvm.lifetime.end(i64, ptr nocapture) #1
|
||||
|
||||
attributes #0 = { uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
attributes #1 = { argmemonly nounwind }
|
||||
|
|
Loading…
Reference in New Issue