1;; Keep __profd_foo in a nodeduplicate comdat, despite a comdat of the same name 2;; in a previous object file. 3 4;; Regular LTO 5 6; RUN: rm -rf %t && split-file %s %t 7; RUN: llvm-as %t/a.ll -o %t/a.bc 8; RUN: llvm-as %t/b.ll -o %t/b.bc 9; RUN: llvm-as %t/c.ll -o %t/c.bc 10 11; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext --plugin-opt=save-temps \ 12; RUN: -u foo %t/a.bc --start-lib %t/b.bc --end-lib -o %t/ab 13 14; RUN: FileCheck %s --check-prefix=RESOL_AB < %t/ab.resolution.txt 15; RUN: llvm-readelf -x .data %t/ab | FileCheck %s --check-prefix=DATA 16 17; RESOL_AB: -r={{.*}}b.bc,__profc_foo,pl{{$}} 18 19;; .data contains a.bc:data. b.bc:data and c.bc:data are discarded. 20; DATA: 0x[[#%x,]] 01000000 00000000 ........ 21 22;; __profc_foo from c.bc is non-prevailing and thus discarded. 23; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext --plugin-opt=save-temps \ 24; RUN: -u foo -u c %t/a.bc --start-lib %t/b.bc %t/c.bc --end-lib -o %t/abc 25; RUN: FileCheck %s --check-prefix=RESOL_ABC < %t/abc.resolution.txt 26; RUN: llvm-readelf -x .data %t/abc | FileCheck %s --check-prefix=DATA 27 28; RESOL_ABC: -r={{.*}}b.bc,__profc_foo,pl{{$}} 29; RESOL_ABC: -r={{.*}}c.bc,__profc_foo,l{{$}} 30 31;; ThinLTO 32 33; RUN: rm -rf %t && split-file %s %t 34; RUN: opt --module-summary %t/a.ll -o %t/a.bc 35; RUN: opt --module-summary %t/b.ll -o %t/b.bc 36; RUN: opt --module-summary %t/c.ll -o %t/c.bc 37 38;; gold from binutils>=2.27 discards b.bc:__profc_foo even in the absence of --gc-sections. 39; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext \ 40; RUN: -u foo %t/a.bc --start-lib %t/b.bc %t/c.bc --end-lib -o %t/abc --gc-sections 41; RUN: llvm-readelf -x .data %t/abc | FileCheck %s --check-prefix=DATA 42 43;--- a.ll 44target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 45target triple = "x86_64-unknown-linux-gnu" 46 47$__profc_foo = comdat nodeduplicate 48@__profc_foo = private global i64 1, comdat, align 8 49@__profd_foo = private global ptr @__profc_foo, comdat($__profc_foo), align 8 50 51declare void @b() 52 53define i64 @foo() { 54 %v = load i64, ptr @__profc_foo 55 %inc = add i64 1, %v 56 store i64 %inc, ptr @__profc_foo 57 ret i64 %inc 58} 59 60define void @_start() { 61 call void @b() 62 ret void 63} 64 65;--- b.ll 66target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 67target triple = "x86_64-unknown-linux-gnu" 68 69$__profc_foo = comdat nodeduplicate 70@__profc_foo = weak hidden global i64 2, comdat, align 8 71@__profd_foo = private global ptr @__profc_foo, comdat($__profc_foo) 72 73define weak i64 @foo() { 74 %v = load i64, ptr @__profc_foo 75 %inc = add i64 1, %v 76 store i64 %inc, ptr @__profc_foo 77 ret i64 %inc 78} 79 80define void @b() { 81 ret void 82} 83 84;--- c.ll 85target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 86target triple = "x86_64-unknown-linux-gnu" 87 88$__profc_foo = comdat nodeduplicate 89@__profc_foo = weak hidden global i64 3, comdat, align 8 90@__profd_foo = private global ptr @__profc_foo, comdat($__profc_foo) 91 92define weak i64 @foo() { 93 %v = load i64, ptr @__profc_foo 94 %inc = add i64 1, %v 95 store i64 %inc, ptr @__profc_foo 96 ret i64 %inc 97} 98 99define void @c() { 100 ret void 101} 102