reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
; 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}