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