| ; Without -only-needed we should lazy link linkonce globals, and the |
| ; metadata reference should not cause them to be linked. |
| ; RUN: llvm-link -S %S/Inputs/only-needed-named-metadata.ll %S/only-needed-named-metadata.ll | FileCheck %s |
| ; CHECK-NOT:@U_linkonce |
| ; CHECK-NOT:@unused_linkonce() |
| |
| ; With -only-needed the metadata references should not cause any of the |
| ; otherwise unreferenced globals to be linked. This also ensures that the |
| ; metadata references don't provoke the module linker to create declarations, |
| ; which are illegal for aliases and globals in comdats. |
| ; Note that doing -only-needed with the comdat shown below leads to a only |
| ; part of the comdat group being linked, which is not technically correct. |
| ; RUN: llvm-link -S -only-needed %S/Inputs/only-needed-named-metadata.ll %S/only-needed-named-metadata.ll | FileCheck %s -check-prefix=ONLYNEEDED |
| ; RUN: llvm-link -S -internalize -only-needed %S/Inputs/only-needed-named-metadata.ll %S/only-needed-named-metadata.ll | FileCheck %s -check-prefix=ONLYNEEDED |
| ; ONLYNEEDED-NOT:@U |
| ; ONLYNEEDED-NOT:@U_linkonce |
| ; ONLYNEEDED-NOT:@unused() |
| ; ONLYNEEDED-NOT:@unused_linkonce() |
| ; ONLYNEEDED-NOT:@linkoncealias |
| ; ONLYNEEDED-NOT:@linkoncefunc2() |
| ; ONLYNEEDED-NOT:@weakalias |
| ; ONLYNEEDED-NOT:@globalfunc1() |
| ; ONLYNEEDED-NOT:@analias |
| ; ONLYNEEDED-NOT:@globalfunc2() |
| |
| @X = global i32 5 |
| @U = global i32 6 |
| @U_linkonce = linkonce_odr hidden global i32 6 |
| define i32 @foo() { ret i32 7 } |
| define i32 @unused() { ret i32 8 } |
| define linkonce_odr hidden i32 @unused_linkonce() { ret i32 8 } |
| @linkoncealias = alias void (...), ptr @linkoncefunc2 |
| |
| @weakalias = weak alias void (...), ptr @globalfunc1 |
| @analias = alias void (...), ptr @globalfunc2 |
| |
| define void @globalfunc1() #0 { |
| entry: |
| ret void |
| } |
| |
| define void @globalfunc2() #0 { |
| entry: |
| ret void |
| } |
| |
| $linkoncefunc2 = comdat any |
| define linkonce_odr void @linkoncefunc2() #0 comdat { |
| entry: |
| ret void |
| } |
| |
| !llvm.named = !{!0, !1, !2, !3, !4, !5, !6} |
| !0 = !{ptr @unused} |
| !1 = !{ptr @U} |
| !2 = !{ptr @unused_linkonce} |
| !3 = !{ptr @U_linkonce} |
| !4 = !{ptr @weakalias} |
| !5 = !{ptr @analias} |
| !6 = !{ptr @linkoncealias} |