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: ( at ).....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); }