xref: /llvm-project/llvm/test/Instrumentation/SanitizerCoverage/trace-pc-guard.ll (revision fc1270dd2972b5302ff8717d7dcf754c22bbddc3)
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