xref: /llvm-project/llvm/test/Instrumentation/SanitizerCoverage/coff-comdat.ll (revision 41d5033eb162cb92b684855166cabfa3983b74c6)
1; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=1 -sanitizer-coverage-inline-8bit-counters=1 -sanitizer-coverage-pc-table=1 -S | FileCheck %s
2
3; Make sure we use the right comdat groups for COFF to avoid relocations
4; against discarded sections. Internal linkage functions are also different from
5; ELF. We don't add a module unique identifier.
6
7; Test based on this source:
8; int baz(int);
9; static int __attribute__((noinline)) bar(int x) {
10;   if (x)
11;     return baz(x);
12;   return 0;
13; }
14; int foo(int x) {
15;   if (baz(0))
16;     x = bar(x);
17;   return x;
18; }
19
20; Both new comdats should no duplicates on COFF.
21
22; CHECK: $foo = comdat nodeduplicate
23; CHECK: $bar = comdat nodeduplicate
24
25; Tables for 'foo' should be in the 'foo' comdat.
26
27; CHECK: @__sancov_gen_{{.*}} = private global [1 x i8] zeroinitializer, section ".SCOV$CM", comdat($foo), align 1
28
29; CHECK: @__sancov_gen_{{.*}} = private constant [2 x ptr]
30; CHECK-SAME: [ptr @foo, ptr inttoptr (i64 1 to ptr)],
31; CHECK-SAME: section ".SCOVP$M", comdat($foo), align 8
32
33; Tables for 'bar' should be in the 'bar' comdat.
34
35; CHECK: @__sancov_gen_{{.*}} = private global [1 x i8] zeroinitializer, section ".SCOV$CM", comdat($bar), align 1
36
37; CHECK: @__sancov_gen_{{.*}} = private constant [2 x ptr]
38; CHECK-SAME: [ptr @bar, ptr inttoptr (i64 1 to ptr)],
39; CHECK-SAME: section ".SCOVP$M", comdat($bar), align 8
40
41; 'foo' and 'bar' should be in their new comdat groups.
42
43; CHECK: define dso_local i32 @foo(i32 %x){{.*}} comdat {
44; CHECK: define internal fastcc i32 @bar(i32 %x){{.*}} comdat {
45
46target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
47target triple = "x86_64-pc-windows-msvc19.14.26433"
48
49; Function Attrs: nounwind uwtable
50define dso_local i32 @foo(i32 %x) local_unnamed_addr #0 {
51entry:
52  %call = tail call i32 @baz(i32 0) #3
53  %tobool = icmp eq i32 %call, 0
54  br i1 %tobool, label %if.end, label %if.then
55
56if.then:                                          ; preds = %entry
57  %call1 = tail call fastcc i32 @bar(i32 %x)
58  br label %if.end
59
60if.end:                                           ; preds = %entry, %if.then
61  %x.addr.0 = phi i32 [ %call1, %if.then ], [ %x, %entry ]
62  ret i32 %x.addr.0
63}
64
65declare dso_local i32 @baz(i32) local_unnamed_addr #1
66
67; Function Attrs: noinline nounwind uwtable
68define internal fastcc i32 @bar(i32 %x) unnamed_addr #2 {
69entry:
70  %tobool = icmp eq i32 %x, 0
71  br i1 %tobool, label %return, label %if.then
72
73if.then:                                          ; preds = %entry
74  %call = tail call i32 @baz(i32 %x) #3
75  br label %return
76
77return:                                           ; preds = %entry, %if.then
78  %retval.0 = phi i32 [ %call, %if.then ], [ 0, %entry ]
79  ret i32 %retval.0
80}
81
82attributes #0 = { nounwind uwtable }
83attributes #1 = { "asdf" }
84attributes #2 = { noinline nounwind uwtable }
85attributes #3 = { nounwind }
86