only-needed-named-metadata.ll 2.17 KB
; 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 (...), bitcast (void ()* @linkoncefunc2 to void (...)*)

@weakalias = weak alias void (...), bitcast (void ()* @globalfunc1 to void (...)*)
@analias = alias void (...), bitcast (void ()* @globalfunc2 to void (...)*)

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 = !{i32 ()* @unused}
!1 = !{i32* @U}
!2 = !{i32 ()* @unused_linkonce}
!3 = !{i32* @U_linkonce}
!4 = !{void (...)* @weakalias}
!5 = !{void (...)* @analias}
!6 = !{void (...)* @linkoncealias}