Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / lld / test / MachO / lc-linker-option.ll
blob399b764134f3261a2c78d7144ae1fda688fe1e95
1 ; REQUIRES: x86
2 ; RUN: rm -rf %t; split-file %s %t
4 ; RUN: llvm-as %t/framework.ll -o %t/framework.o
5 ; RUN: %lld -lSystem %t/framework.o -o %t/frame
6 ; RUN: llvm-otool -l %t/frame | FileCheck --check-prefix=FRAME %s \
7 ; RUN:  --implicit-check-not LC_LOAD_DYLIB
8 ; FRAME:          cmd LC_LOAD_DYLIB
9 ; FRAME-NEXT: cmdsize
10 ; FRAME-NEXT:    name /usr/lib/libSystem.dylib
11 ; FRAME:          cmd LC_LOAD_DYLIB
12 ; FRAME-NEXT: cmdsize
13 ; FRAME-NEXT:    name /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
15 ; RUN: not %lld %t/framework.o -o %t/frame_no_autolink -ignore_auto_link 2>&1 | FileCheck --check-prefix=NO-AUTOLINK %s
16 ; RUN: not %lld %t/framework.o -o %t/frame_no_autolink --ignore-auto-link-option CoreFoundation 2>&1 | FileCheck --check-prefix=NO-AUTOLINK %s
17 ; RUN: not %lld %t/framework.o -o %t/frame_no_autolink --ignore-auto-link-option=CoreFoundation 2>&1 | FileCheck --check-prefix=NO-AUTOLINK %s
18 ; NO-AUTOLINK: error: undefined symbol: __CFBigNumGetInt128
20 ; RUN: llvm-as %t/l.ll -o %t/l.o
21 ;; The dynamic call to _CFBigNumGetInt128 uses dyld_stub_binder,
22 ;; which needs -lSystem from LC_LINKER_OPTION to get resolved.
23 ;; The reference to __cxa_allocate_exception will require -lc++ from
24 ;; LC_LINKER_OPTION to get resolved.
25 ; RUN: %no-lsystem-lld %t/l.o -o %t/l -framework CoreFoundation
26 ; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=LIB %s \
27 ; RUN:  --implicit-check-not LC_LOAD_DYLIB
28 ; LIB:          cmd LC_LOAD_DYLIB
29 ; LIB-NEXT: cmdsize
30 ; LIB-NEXT:    name /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
31 ; LIB:          cmd LC_LOAD_DYLIB
32 ; LIB-NEXT: cmdsize
33 ; LIB-NEXT:    name /usr/lib/libSystem.dylib
34 ; LIB:          cmd LC_LOAD_DYLIB
35 ; LIB-NEXT: cmdsize
36 ; LIB-NEXT:    name /usr/lib/libc++abi.dylib
38 ;; Check that we don't create duplicate LC_LOAD_DYLIBs.
39 ; RUN: %no-lsystem-lld -lSystem %t/l.o -o %t/l -framework CoreFoundation
40 ; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=LIB2 %s \
41 ; RUN:  --implicit-check-not LC_LOAD_DYLIB
42 ; LIB2:          cmd LC_LOAD_DYLIB
43 ; LIB2-NEXT: cmdsize
44 ; LIB2-NEXT:    name /usr/lib/libSystem.dylib
45 ; LIB2:          cmd LC_LOAD_DYLIB
46 ; LIB2-NEXT: cmdsize
47 ; LIB2-NEXT:    name /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
48 ; LIB2:          cmd LC_LOAD_DYLIB
49 ; LIB2-NEXT: cmdsize
50 ; LIB2-NEXT:    name /usr/lib/libc++abi.dylib
52 ; RUN: llvm-as %t/invalid.ll -o %t/invalid.o
53 ; RUN: not %lld %t/invalid.o -o /dev/null 2>&1 | FileCheck --check-prefix=INVALID %s
54 ; INVALID: error: -why_load is not allowed in LC_LINKER_OPTION
56 ;; This is a regression test for a dangling string reference issue that occurred
57 ;; when loading an archive-based framework via LC_LINKER_OPTION (see
58 ;; D111706). Prior to the fix, this would trigger a heap-use-after-free when run
59 ;; under ASAN.
60 ; RUN: llc %t/foo.ll -o %t/foo.o -filetype=obj
61 ; RUN: mkdir -p %t/Foo.framework
62 ;; In a proper framework, this is technically supposed to be a symlink to the
63 ;; actual archive at Foo.framework/Versions/Current, but we skip that here so
64 ;; that this test can run on Windows.
65 ; RUN: llvm-ar rcs %t/Foo.framework/Foo %t/foo.o
66 ; RUN: llc %t/load-framework-foo.ll -o %t/load-framework-foo.o -filetype=obj
67 ; RUN: llc %t/load-framework-undefined-symbol.ll -o %t/load-framework-undefined-symbol.o -filetype=obj
68 ; RUN: llc %t/load-missing.ll -o %t/load-missing.o -filetype=obj
69 ; RUN: llc %t/main.ll -o %t/main.o -filetype=obj
70 ; RUN: %lld %t/load-framework-foo.o %t/main.o -o %t/main -F%t
71 ; RUN: llvm-objdump --macho --syms %t/main | FileCheck %s --check-prefix=SYMS
73 ;; Make sure -all_load and -ObjC have no effect on libraries loaded via
74 ;; LC_LINKER_OPTION flags.
75 ; RUN: llc %t/load-library-foo.ll -o %t/load-library-foo.o -filetype=obj
76 ; RUN: llvm-ar rcs %t/libfoo.a %t/foo.o
77 ; RUN: %lld -all_load -ObjC %t/load-framework-foo.o %t/load-library-foo.o \
78 ; RUN:   %t/main.o -o %t/main -F%t -L%t
79 ; RUN: llvm-objdump --macho --syms %t/main | FileCheck %s --check-prefix=SYMS
81 ;; Note that _OBJC_CLASS_$_TestClass is *not* included here.
82 ; SYMS:       SYMBOL TABLE:
83 ; SYMS-NEXT:  g     F __TEXT,__text _main
84 ; SYMS-NEXT:  g     F __TEXT,__text __mh_execute_header
85 ; SYMS-NEXT:  *UND* dyld_stub_binder
86 ; SYMS-EMPTY:
88 ;; Make sure -all_load has effect when libraries are loaded via LC_LINKER_OPTION flags and explicitly passed as well
89 ; RUN: %lld -all_load %t/load-framework-foo.o %t/load-library-foo.o %t/main.o -o %t/main -F%t -L%t -lfoo
90 ; RUN: llvm-objdump --macho --syms %t/main | FileCheck %s --check-prefix=SYMS-ALL-LOAD
92 ;; Note that _OBJC_CLASS_$_TestClass is *included* here.
93 ; SYMS-ALL-LOAD:       SYMBOL TABLE:
94 ; SYMS-ALL-LOAD-NEXT:  g     F __TEXT,__text _main
95 ; SYMS-ALL-LOAD-NEXT:  g     O __DATA,__objc_data _OBJC_CLASS_$_TestClass
96 ; SYMS-ALL-LOAD-NEXT:  g     F __TEXT,__text __mh_execute_header
97 ; SYMS-ALL-LOAD-NEXT:  *UND* dyld_stub_binder
98 ; SYMS-ALL-LOAD-EMPTY:
100 ;; Make sure -force_load has effect when libraries are loaded via LC_LINKER_OPTION flags and explicitly passed as well
101 ; RUN: %lld %t/load-library-foo.o %t/main.o -o %t/main -F%t -L%t -force_load %t/libfoo.a
102 ; RUN: llvm-objdump --macho --syms %t/main | FileCheck %s --check-prefix=SYMS-FORCE-LOAD
104 ;; Note that _OBJC_CLASS_$_TestClass is *included* here.
105 ; SYMS-FORCE-LOAD:       SYMBOL TABLE:
106 ; SYMS-FORCE-LOAD-NEXT:  g     F __TEXT,__text _main
107 ; SYMS-FORCE-LOAD-NEXT:  g     O __DATA,__objc_data _OBJC_CLASS_$_TestClass
108 ; SYMS-FORCE-LOAD-NEXT:  g     F __TEXT,__text __mh_execute_header
109 ; SYMS-FORCE-LOAD-NEXT:  *UND* dyld_stub_binder
110 ; SYMS-FORCE-LOAD-EMPTY:
112 ;; Make sure -ObjC has effect when frameworks are loaded via LC_LINKER_OPTION flags and explicitly passed as well
113 ; RUN: %lld -ObjC %t/load-framework-foo.o %t/load-library-foo.o %t/main.o -o %t/main -F%t -L%t -framework Foo
114 ; RUN: llvm-objdump --macho --syms %t/main | FileCheck %s --check-prefix=SYMS-OBJC-LOAD
116 ;; Note that _OBJC_CLASS_$_TestClass is *included* here.
117 ; SYMS-OBJC-LOAD:       SYMBOL TABLE:
118 ; SYMS-OBJC-LOAD-NEXT:  g     F __TEXT,__text _main
119 ; SYMS-OBJC-LOAD-NEXT:  g     O __DATA,__objc_data _OBJC_CLASS_$_TestClass
120 ; SYMS-OBJC-LOAD-NEXT:  g     F __TEXT,__text __mh_execute_header
121 ; SYMS-OBJC-LOAD-NEXT:  *UND* dyld_stub_binder
122 ; SYMS-OBJC-LOAD-EMPTY:
124 ;; Make sure that frameworks containing object files or bitcode instead of
125 ;; dylibs or archives do not cause duplicate symbol errors
126 ; RUN: mkdir -p %t/Foo.framework
127 ; RUN: llc --filetype=obj %t/foo.ll -o %t/Foo.framework/Foo
128 ; RUN: llc --filetype=obj %t/load-framework-twice.ll -o %t/main
129 ;; Order of the object with the LC_LINKER_OPTION vs -framework arg is important.
130 ; RUN: %lld %t/main -F %t -framework Foo -framework Foo -o /dev/null
131 ; RUN: %lld -F %t -framework Foo -framework Foo %t/main -o /dev/null
133 ; RUN: llvm-as %t/foo.ll -o %t/Foo.framework/Foo
134 ; RUN: llvm-as %t/load-framework-twice.ll -o %t/main
135 ;; Order of the object with the LC_LINKER_OPTION vs -framework arg is important.
136 ; RUN: %lld %t/main -F %t -framework Foo -framework Foo -o /dev/null
137 ; RUN: %lld -F %t -framework Foo -framework Foo %t/main -o /dev/null
139 ;; Checks that "framework not found" errors from LC_LINKER_OPTIONS are not
140 ;; emitted unless the link fails or --strict-auto-link is passed.
141 ; RUN: %lld -ObjC %t/load-framework-foo.o %t/main.o -o %t/main-no-foo.out
142 ; RUN: llvm-objdump --macho --syms %t/main-no-foo.out | FileCheck %s --check-prefix=SYMS-NO-FOO
143 ; RUN: not %lld --strict-auto-link -ObjC %t/load-missing.o %t/main.o -o %t/main-no-foo.out 2>&1 \
144 ; RUN:   | FileCheck %s --check-prefix=MISSING-AUTO-LINK
145 ; RUN: %no-fatal-warnings-lld --strict-auto-link -ObjC %t/load-missing.o %t/main.o -o %t/main-no-foo.out 2>&1 \
146 ; RUN:   | FileCheck %s --check-prefix=MISSING-AUTO-LINK
147 ; RUN: not %lld -ObjC %t/load-framework-undefined-symbol.o %t/load-missing.o %t/main.o -o %t/main-no-foo.out 2>&1 \
148 ; RUN:   | FileCheck %s --check-prefixes=UNDEFINED-SYMBOL,MISSING-AUTO-LINK
150 ;; Verify that nothing from the framework is included.
151 ; SYMS-NO-FOO:       SYMBOL TABLE:
152 ; SYMS-NO-FOO-NEXT:  g     F __TEXT,__text _main
153 ; SYMS-NO-FOO-NOT:   g     O __DATA,__objc_data _OBJC_CLASS_$_TestClass
155 ; UNDEFINED-SYMBOL: undefined symbol: __SomeUndefinedSymbol
156 ; MISSING-AUTO-LINK: {{.+}}: auto-linked framework not found for -framework Foo
157 ; MISSING-AUTO-LINK: {{.+}}: auto-linked library not found for -lBar
159 ;--- framework.ll
160 target triple = "x86_64-apple-macosx10.15.0"
161 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
163 !0 = !{!"-framework", !"CoreFoundation"}
164 !llvm.linker.options = !{!0}
166 declare void @_CFBigNumGetInt128(...)
168 define void @main() {
169   call void @_CFBigNumGetInt128()
170   ret void
173 ;--- l.ll
174 target triple = "x86_64-apple-macosx10.15.0"
175 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
177 !0 = !{!"-lSystem"}
178 !1 = !{!"-lc++"}
179 !llvm.linker.options = !{!0, !0, !1}
181 declare void @_CFBigNumGetInt128(...)
182 declare ptr @__cxa_allocate_exception(i64)
184 define void @main() {
185   call void @_CFBigNumGetInt128()
186   call ptr @__cxa_allocate_exception(i64 4)
187   ret void
190 ;--- invalid.ll
192 target triple = "x86_64-apple-macosx10.15.0"
193 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
195 !0 = !{!"-why_load"}
196 !llvm.linker.options = !{!0}
198 define void @main() {
199   ret void
202 ;--- load-framework-foo.ll
203 target triple = "x86_64-apple-macosx10.15.0"
204 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
206 !0 = !{!"-framework", !"Foo"}
207 !llvm.linker.options = !{!0}
209 ;--- load-missing.ll
210 target triple = "x86_64-apple-macosx10.15.0"
211 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
213 !0 = !{!"-framework", !"Foo"}
214 !1 = !{!"-lBar"}
215 !llvm.linker.options = !{!0, !1}
217 ;--- load-framework-undefined-symbol.ll
218 target triple = "x86_64-apple-macosx10.15.0"
219 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
221 declare void @_SomeUndefinedSymbol(...)
222 define void @foo() {
223   call void @_SomeUndefinedSymbol()
224   ret void
227 ;--- load-framework-twice.ll
228 target triple = "x86_64-apple-macosx10.15.0"
229 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
231 !0 = !{!"-framework", !"Foo"}
232 !llvm.linker.options = !{!0, !0}
234 define void @main() {
235   ret void
238 ;--- load-library-foo.ll
239 target triple = "x86_64-apple-macosx10.15.0"
240 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
242 !0 = !{!"-lfoo"}
243 !llvm.linker.options = !{!0}
245 ;--- main.ll
246 target triple = "x86_64-apple-macosx10.15.0"
247 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
249 define void @main() {
250   ret void
253 !0 = !{!"-framework", !"Foo"}
254 !llvm.linker.options = !{!0}
256 ;--- foo.ll
257 target triple = "x86_64-apple-macosx10.15.0"
258 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
260 %struct._class_t = type {}
261 @"OBJC_CLASS_$_TestClass" = global %struct._class_t {}, section "__DATA, __objc_data", align 8