| ; 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 | 
 | } |