| REQUIRES: x86-registered-target,ld.lld,llvm-ar |
| |
| # Test that a DTLTO link succeeds and outputs the expected set of files |
| # correctly when archives are present. |
| |
| RUN: rm -rf %t && split-file %s %t && cd %t |
| # Compile sources into bitcode. -O2 is required for cross-module importing. |
| RUN: %clang -O2 --target=x86_64-linux-gnu -flto=thin -c foo.c boo.c moo.c loo.c voo.c main.c |
| |
| RUN: llvm-ar rcs archive.a foo.o boo.o moo.o |
| RUN: llvm-ar rcsT archive.thin.a loo.o voo.o |
| |
| # Build with DTLTO. |
| RUN: %clang -O2 --target=x86_64-linux-gnu -Werror -flto=thin \ |
| RUN: -fuse-ld=lld -nostdlib -e main \ |
| RUN: main.o archive.a archive.thin.a -o main.elf \ |
| RUN: -Wl,--thinlto-distributor=%python \ |
| RUN: -Wl,--thinlto-distributor-arg=%llvm_src_root/utils/dtlto/local.py \ |
| RUN: -Wl,--thinlto-remote-compiler=%clang \ |
| RUN: -Wl,--save-temps |
| |
| # Check that the required output files have been created. |
| RUN: ls | FileCheck %s --check-prefix=OUTPUTS |
| |
| # JSON jobs description. |
| OUTPUTS-DAG: {{^}}main.[[#PID:]].dist-file.json |
| |
| # Main source. |
| OUTPUTS-DAG: {{^}}main.1.[[#PID]].native.o{{$}} |
| OUTPUTS-DAG: {{^}}main.1.[[#PID]].native.o.thinlto.bc{{$}} |
| |
| # Regular archive members. |
| # Filename composition: <archive>(<member> at <offset>).<task>.<pid>.<task>.<pid>.native.o. |
| OUTPUTS-DAG: {{^}}archive.a(boo.o at [[#BOO_OFFSET:]]).2.[[#%X,HEXPID:]].2.[[#PID]].native.o{{$}} |
| OUTPUTS-DAG: {{^}}archive.a(boo.o at [[#BOO_OFFSET]]).2.[[#%X,HEXPID]].2.[[#PID]].native.o.thinlto.bc{{$}} |
| |
| OUTPUTS-DAG: {{^}}archive.a(foo.o at [[#FOO_OFFSET:]]).3.[[#%X,HEXPID]].3.[[#PID]].native.o{{$}} |
| OUTPUTS-DAG: {{^}}archive.a(foo.o at [[#FOO_OFFSET]]).3.[[#%X,HEXPID]].3.[[#PID]].native.o.thinlto.bc{{$}} |
| |
| OUTPUTS-DAG: {{^}}archive.a(moo.o at [[#MOO_OFFSET:]]).4.[[#%X,HEXPID]].4.[[#PID]].native.o{{$}} |
| OUTPUTS-DAG: {{^}}archive.a(moo.o at [[#MOO_OFFSET]]).4.[[#%X,HEXPID]].4.[[#PID]].native.o.thinlto.bc{{$}} |
| |
| # Thin archive members. |
| OUTPUTS-DAG: {{^}}voo.5.[[#PID]].native.o{{$}} |
| OUTPUTS-DAG: {{^}}voo.5.[[#PID]].native.o.thinlto.bc{{$}} |
| |
| OUTPUTS-DAG: {{^}}loo.6.[[#PID]].native.o{{$}} |
| OUTPUTS-DAG: {{^}}loo.6.[[#PID]].native.o.thinlto.bc{{$}} |
| |
| # Executable file. |
| OUTPUTS-DAG: {{^}}main.elf{{$}} |
| |
| #--- foo.c |
| volatile int foo_int; |
| __attribute__((retain)) int foo(int x) { return x + foo_int; } |
| |
| #--- boo.c |
| extern int foo(int x); |
| __attribute__((retain)) int boo(int x) { return foo(x); } |
| |
| #--- moo.c |
| __attribute__((retain)) int moo() { return 3; } |
| |
| #--- loo.c |
| extern int moo(int x); |
| __attribute__((retain)) int loo(int x) { return moo(x); } |
| |
| #--- voo.c |
| extern int foo(int x); |
| extern int loo(int x); |
| __attribute__((retain)) int voo(int x) { return foo(x) + loo(x + 1) + 7; } |
| |
| #--- main.c |
| extern int boo(int x); |
| extern int moo(); |
| extern int voo(int x); |
| __attribute__((retain)) int main(int argc, char** argv) { |
| return boo(argc) + moo() + voo(argc + 3); |
| } |