; REQUIRES: x86 ; RUN: rm -rf %t; split-file %s %t ; RUN: llc -filetype=obj %t/foo1.ll -o %t/foo1.o ; RUN: llc -filetype=obj %t/foo2.ll -o %t/foo2.o ; RUN: llvm-ar rcs %t/libfoo2.a %t/foo2.o ; RUN: llc -filetype=obj %t/foo3.ll -o %t/foo3.o ; RUN: llvm-ar rcs %t/libfoo3.a %t/foo3.o ; RUN: llc -filetype=obj %t/zoo2.ll -o %t/zoo2.o ; RUN: llvm-ar rcs %t/libzoo2.a %t/zoo2.o ; RUN: llc -filetype=obj %t/zoo3.ll -o %t/zoo3.o ; RUN: llvm-ar rcs %t/libzoo3.a %t/zoo3.o ; RUN: llc -filetype=obj %t/bar1.ll -o %t/bar1.o ; RUN: llc -filetype=obj %t/bar2.ll -o %t/bar2.o ; RUN: llvm-ar rcs %t/libbar2.a %t/bar2.o ; RUN: llc -filetype=obj %t/bar3.ll -o %t/bar3.o ; RUN: llvm-ar rcs %t/libbar3.a %t/bar3.o ; RUN: %lld -dylib -lSystem -L%t %t/foo1.o %t/bar1.o -o %t/order.out ; RUN: llvm-objdump --no-leading-addr --no-show-raw-insn -d %t/order.out | FileCheck %s ; We want to process input object files first ; before any lc-linker options are actually resolved. ; The lc-linker options are recursively processed. ; The following shows a chain of auto linker options, ; starting with foo1.o and bar1.o: ; ; foo1.o -> libfoo2.a(foo2.o) -> libfoo3.a(foo3.o) ; \ ; -> libzoo2.a(zoo2.o) -> libzoo3.a(zoo3.o) ; bar1.o -> libbar2.a(bar2.o) -> libbar3.a(bar3.o) ; CHECK: <_foo1>: ; CHECK: <_bar1>: ; CHECK: <_foo2>: ; CHECK: <_zoo2>: ; CHECK: <_bar2>: ; CHECK: <_foo3>: ; CHECK: <_zoo3>: ; CHECK: <_bar3>: ;--- foo1.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" !0 = !{!"-lfoo2"} !1 = !{!"-lzoo2"} !llvm.linker.options = !{!0, !1} define i32 @foo1() { %call = call i32 @foo2() %call2 = call i32 @zoo2() %add = add nsw i32 %call, %call2 ret i32 %add } declare i32 @foo2() declare i32 @zoo2() ;--- foo2.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" !0 = !{!"-lfoo3"} !llvm.linker.options = !{!0} define i32 @foo2() { %call = call i32 @foo3() %add = add nsw i32 %call, 2 ret i32 %add } declare i32 @foo3() ;--- foo3.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" define i32 @foo3() { ret i32 3 } ;--- zoo2.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" !0 = !{!"-lzoo3"} !llvm.linker.options = !{!0} define i32 @zoo2() { %call = call i32 @zoo3() %add = add nsw i32 %call, 2 ret i32 %add } declare i32 @zoo3() ;--- zoo3.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" define i32 @zoo3() { ret i32 30 } ;--- bar1.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" !0 = !{!"-lbar2"} !llvm.linker.options = !{!0} define i32 @bar1() { %call = call i32 @bar2() %add = add nsw i32 %call, 10 ret i32 %add } declare i32 @bar2() ;--- bar2.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" !0 = !{!"-lbar3"} !llvm.linker.options = !{!0} define i32 @bar2() { %call = call i32 @bar3() %add = add nsw i32 %call, 200 ret i32 %add } declare i32 @bar3() ;--- bar3.ll target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.15.0" define i32 @bar3() { ret i32 300 }