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