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