1# REQUIRES: x86
2
3# RUN: rm -rf %t; split-file %s %t && cd %t
4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin main.s -o main.o
5# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin calls-foo.s -o calls-foo.o
6# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin 1.s -o 1.o
7# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin 2.s -o 2.o
8# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin common.s -o common.o
9
10# RUN: llvm-as 1.ll -o 1.bc
11# RUN: llvm-as 2.ll -o 2.bc
12
13## Neither 1.o nor 2.o is loaded.
14# RUN: %lld main.o --start-lib 1.o 2.o --end-lib -why_load | count 0
15# RUN: %lld main.o --start-lib -filelist filelist --end-lib -why_load | count 0
16# RUN: llvm-readobj -s a.out | FileCheck %s
17# CHECK-NOT: Name: _foo
18# CHECK-NOT: Name: _bar
19
20## _bar loads 2.o. The last --end-lib can be omitted.
21# RUN: %lld main.o -u _bar --start-lib 1.o 2.o -t -why_load | FileCheck %s --check-prefix=CHECK2WHY
22# RUN: %lld main.o -u _bar --start-lib -filelist filelist -t -why_load | FileCheck %s --check-prefix=CHECK2WHY
23# RUN: llvm-readobj -s a.out | FileCheck --check-prefix=CHECK2 %s
24# CHECK2WHY:      main.o
25# CHECK2WHY-NEXT: 2.o
26# CHECK2WHY-NEXT: _bar forced load of 2.o
27# CHECK2WHY-EMPTY:
28# CHECK2-NOT: Name: _foo
29# CHECK2: Name: _bar
30# CHECK2-NOT: Name: _foo
31
32## _foo loads 1.o. 1.o loads 2.o.
33# RUN: %lld main.o -u _foo --start-lib 1.o 2.o -why_load | FileCheck %s --check-prefix=CHECK3WHY
34# RUN: llvm-readobj -s a.out | FileCheck --check-prefix=CHECK3 %s
35# RUN: %lld main.o -u _foo --start-lib 2.o --end-lib --start-lib 1.o -why_load | FileCheck %s --check-prefix=CHECK3WHY
36# RUN: llvm-readobj -s a.out | FileCheck --check-prefix=CHECK3 %s
37# CHECK3WHY:      _foo forced load of 1.o
38# CHECK3WHY-NEXT: _bar forced load of 2.o
39# CHECK3WHY-EMPTY:
40# CHECK3-DAG: Name: _foo
41# CHECK3-DAG: Name: _bar
42
43## Don't treat undefined _bar in 1.o as a lazy definition.
44# RUN: not %lld main.o -u _bar --start-lib 1.o 2>&1 | FileCheck %s --check-prefix=CHECK4
45# CHECK4: error: undefined symbol: _bar
46
47# RUN: %lld main.o -u _common --start-lib common.o
48# RUN: llvm-readobj -s a.out | FileCheck %s --check-prefix=COMMON1
49# COMMON1: Name: _common
50
51# RUN: %lld main.o --start-lib common.o
52# RUN: llvm-readobj -s a.out | FileCheck %s --check-prefix=COMMON2
53# COMMON2-NOT: Name: _common
54
55## Neither 1.bc nor 2.bc is loaded.
56# RUN: %lld main.o --start-lib 1.bc 2.bc -why_load | count 0
57# RUN: llvm-readobj -s a.out | FileCheck %s --check-prefix=BITCODE
58# BITCODE-NOT: Name: _foo
59# BITCODE-NOT: Name: _bar
60
61## _bar loads 2.bc.
62# RUN: %lld main.o -u _bar --start-lib 1.bc 2.bc -why_load | FileCheck %s --check-prefix=BITCODE2WHY
63# RUN: llvm-readobj -s a.out | FileCheck %s --check-prefix=BITCODE2
64# BITCODE2WHY:      _bar forced load of 2.bc
65# BITCODE2WHY-EMPTY:
66# BITCODE2-NOT: Name: _foo
67# BITCODE2: Name: _bar
68# BITCODE2-NOT: Name: _foo
69
70## calls-foo.o loads 1.bc. 1.bc loads 2.bc.
71# RUN: %lld calls-foo.o --start-lib 1.bc 2.bc -why_load | FileCheck %s --check-prefix=BITCODE3WHY
72# RUN: llvm-readobj -s a.out | FileCheck --check-prefix=BITCODE3 %s
73# RUN: %lld calls-foo.o --start-lib 2.bc --end-lib --start-lib 1.bc -why_load | FileCheck %s --check-prefix=BITCODE3WHY
74# RUN: llvm-readobj -s a.out | FileCheck --check-prefix=BITCODE3 %s
75# BITCODE3WHY:      _foo forced load of 1.bc
76# BITCODE3WHY-NEXT: _bar forced load of 2.bc
77# BITCODE3WHY-EMPTY:
78# BITCODE3-DAG: Name: _foo
79
80# RUN: not %lld main.o --start-lib --start-lib 2>&1 | FileCheck -check-prefix=NESTED-LIB %s
81# NESTED-LIB: error: nested --start-lib
82
83# RUN: not %lld --end-lib 2>&1 | FileCheck %s --check-prefix=STRAY
84# STRAY: error: stray --end-lib
85
86#--- main.s
87.globl _main
88_main:
89
90#--- calls-foo.s
91.globl _main
92_main:
93  call _foo
94
95#--- 1.s
96.globl _foo
97_foo:
98  call _bar
99
100#--- 2.s
101.globl _bar
102_bar:
103  ret
104
105#--- common.s
106.comm _common, 1
107
108#--- 1.ll
109target triple = "x86_64-apple-macosx10.15.0"
110target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
111
112define void @foo() {
113  tail call void () @bar()
114  ret void
115}
116
117declare void @bar()
118
119#--- 2.ll
120target triple = "x86_64-apple-macosx10.15.0"
121target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
122
123define void @bar() {
124  ret void
125}
126
127#--- filelist
1281.o
1292.o
130