1b55f29c1SFangrui Song; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=4 -sanitizer-coverage-trace-pc-guard -mtriple=x86_64 -S | FileCheck %s --check-prefixes=CHECK,COMDAT,ELF 25bcb199aSFangrui Song 35bcb199aSFangrui Song; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=4 -sanitizer-coverage-trace-pc-guard -mtriple=aarch64-apple-darwin -S | FileCheck %s --check-prefixes=CHECK,MACHO 45bcb199aSFangrui Song 5b55f29c1SFangrui Song; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=4 -sanitizer-coverage-trace-pc-guard -mtriple=x86_64-windows -S | FileCheck %s --check-prefixes=CHECK,COMDAT,WIN 6b55f29c1SFangrui Song 739248779SFangrui Song; COMDAT: $foo = comdat nodeduplicate 839248779SFangrui Song; COMDAT: $CallViaVptr = comdat nodeduplicate 91067f217SAhmed Bougacha; COMDAT: $DirectBitcastCall = comdat nodeduplicate 10b55f29c1SFangrui Song 114d63892aSFangrui Song; ELF: @__sancov_gen_ = private global [3 x i32] zeroinitializer, section "__sancov_guards", comdat($foo), align 4{{$}} 124d63892aSFangrui Song; ELF-NEXT: @__sancov_gen_.1 = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($CallViaVptr), align 4{{$}} 131067f217SAhmed Bougacha; ELF-NEXT: @__sancov_gen_.2 = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($DirectBitcastCall), align 4{{$}} 145bcb199aSFangrui Song 154d63892aSFangrui Song; MACHO: @__sancov_gen_ = private global [3 x i32] zeroinitializer, section "__DATA,__sancov_guards", align 4{{$}} 164d63892aSFangrui Song; MACHO-NEXT: @__sancov_gen_.1 = private global [1 x i32] zeroinitializer, section "__DATA,__sancov_guards", align 4{{$}} 171067f217SAhmed Bougacha; MACHO-NEXT: @__sancov_gen_.2 = private global [1 x i32] zeroinitializer, section "__DATA,__sancov_guards", align 4{{$}} 185bcb199aSFangrui Song 19b55f29c1SFangrui Song; WIN: @__sancov_gen_ = private global [3 x i32] zeroinitializer, section ".SCOV$GM", comdat($foo), align 4{{$}} 20b55f29c1SFangrui Song; WIN-NEXT: @__sancov_gen_.1 = private global [1 x i32] zeroinitializer, section ".SCOV$GM", comdat($CallViaVptr), align 4{{$}} 211067f217SAhmed Bougacha; WIN-NEXT: @__sancov_gen_.2 = private global [1 x i32] zeroinitializer, section ".SCOV$GM", comdat($DirectBitcastCall), align 4{{$}} 22b55f29c1SFangrui Song 23*fc1270ddSFangrui Song; ELF: @llvm.used = appending global [1 x ptr] [ptr @sancov.module_ctor_trace_pc_guard] 24*fc1270ddSFangrui Song; ELF: @llvm.compiler.used = appending global [3 x ptr] [ptr @__sancov_gen_, ptr @__sancov_gen_.1, ptr @__sancov_gen_.2], section "llvm.metadata" 25*fc1270ddSFangrui Song; 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] 26b55f29c1SFangrui Song; MACHO-NOT: @llvm.compiler.used = 27*fc1270ddSFangrui Song; WIN: @llvm.used = appending global [1 x ptr] [ptr @sancov.module_ctor_trace_pc_guard], section "llvm.metadata" 28*fc1270ddSFangrui Song; WIN-NEXT: @llvm.compiler.used = appending global [3 x ptr] [ptr @__sancov_gen_, ptr @__sancov_gen_.1, ptr @__sancov_gen_.2], section "llvm.metadata" 295bcb199aSFangrui Song 305bcb199aSFangrui Song; CHECK-LABEL: define void @foo 315bcb199aSFangrui Song; CHECK: call void @__sanitizer_cov_trace_pc 325bcb199aSFangrui Song; CHECK: ret void 335bcb199aSFangrui Song 34*fc1270ddSFangrui Songdefine void @foo(ptr %a) sanitize_address { 355bcb199aSFangrui Songentry: 36*fc1270ddSFangrui Song %tobool = icmp eq ptr %a, null 375bcb199aSFangrui Song br i1 %tobool, label %if.end, label %if.then 385bcb199aSFangrui Song 395bcb199aSFangrui Song if.then: ; preds = %entry 40*fc1270ddSFangrui Song store i32 0, ptr %a, align 4 415bcb199aSFangrui Song br label %if.end 425bcb199aSFangrui Song 435bcb199aSFangrui Song if.end: ; preds = %entry, %if.then 445bcb199aSFangrui Song ret void 455bcb199aSFangrui Song} 465bcb199aSFangrui Song 475bcb199aSFangrui Song; CHECK-LABEL: define void @CallViaVptr 485bcb199aSFangrui Song; CHECK: call void @__sanitizer_cov_trace_pc_indir 495bcb199aSFangrui Song; CHECK: call void @__sanitizer_cov_trace_pc_indir 505bcb199aSFangrui Song; CHECK: ret void 515bcb199aSFangrui Song 52*fc1270ddSFangrui Song%struct.StructWithVptr = type { ptr } 535bcb199aSFangrui Song 54*fc1270ddSFangrui Songdefine void @CallViaVptr(ptr %foo) uwtable sanitize_address { 555bcb199aSFangrui Songentry: 56*fc1270ddSFangrui Song %vtable = load ptr, ptr %foo, align 8 57*fc1270ddSFangrui Song %0 = load ptr, ptr %vtable, align 8 58*fc1270ddSFangrui Song tail call void %0(ptr %foo) 59*fc1270ddSFangrui Song tail call void %0(ptr %foo) 605bcb199aSFangrui Song tail call void asm sideeffect "", ""() 615bcb199aSFangrui Song ret void 625bcb199aSFangrui Song} 635bcb199aSFangrui Song 641067f217SAhmed Bougacha; CHECK-LABEL: define void @DirectBitcastCall 651067f217SAhmed Bougacha; CHECK-NEXT: call void @__sanitizer_cov_trace_pc_guard 66*fc1270ddSFangrui Song; CHECK-NEXT: call void @direct_callee() 671067f217SAhmed Bougacha; CHECK-NEXT: ret void 681067f217SAhmed Bougacha 691067f217SAhmed Bougachadeclare i32 @direct_callee() 701067f217SAhmed Bougacha 711067f217SAhmed Bougachadefine void @DirectBitcastCall() sanitize_address { 72*fc1270ddSFangrui Song call void @direct_callee() 731067f217SAhmed Bougacha ret void 741067f217SAhmed Bougacha} 751067f217SAhmed Bougacha 76775a9483SFangrui Song; ELF-LABEL: define internal void @sancov.module_ctor_trace_pc_guard() #2 comdat { 77775a9483SFangrui Song; MACHO-LABEL: define internal void @sancov.module_ctor_trace_pc_guard() #2 { 78775a9483SFangrui Song 79775a9483SFangrui Song; CHECK: attributes #2 = { nounwind } 80