REQUIRES: lld-link ## Test that a DTLTO link succeeds and outputs the expected set of files ## correctly when thin archives are present. RUN: rm -rf %t && split-file %s %t && cd %t ## Compile bitcode. -O2 is required for cross-module importing. RUN: %clang -O2 --target=x86_64-pc-windows-msvc -flto=thin -c \ RUN: foo.c bar.c dog.c cat.c start.c ## Generate thin archives. RUN: lld-link /lib /llvmlibthin /out:foo.lib foo.o ## Create this bitcode thin archive in a subdirectory to test the expansion of ## the path to a bitcode file that is referenced using "..", e.g., in this case ## "../bar.o". RUN: mkdir lib RUN: lld-link /lib /llvmlibthin /out:lib/bar.lib bar.o ## Create this bitcode thin archive with an absolute path entry containing "..". RUN: lld-link /lib /llvmlibthin /out:dog.lib %t/lib/../dog.o RUN: lld-link /lib /llvmlibthin /out:cat.lib cat.o RUN: lld-link /lib /llvmlibthin /out:start.lib start.o ## Link from a different directory to ensure that thin archive member paths are ## resolved correctly relative to the archive locations. RUN: mkdir %t/out && cd %t/out RUN: lld-link /subsystem:console /machine:x64 /entry:start /out:my.exe \ RUN: %t/foo.lib %t/lib/bar.lib ../start.lib %t/cat.lib \ RUN: /includeoptional:dog ../dog.lib \ RUN: -thinlto-distributor:%python \ RUN: -thinlto-distributor-arg:%llvm_src_root/utils/dtlto/local.py \ RUN: -thinlto-remote-compiler:%clang \ RUN: /lldsavetemps ## Check that the required output files have been created. RUN: ls | FileCheck %s --check-prefix=OUTPUTS --implicit-check-not=cat ## JSON jobs description. OUTPUTS-DAG: my.[[#PID:]].dist-file.json ## Individual summary index files. OUTPUTS-DAG: start.1.[[#PID]].native.o.thinlto.bc{{$}} OUTPUTS-DAG: dog.2.[[#PID]].native.o.thinlto.bc{{$}} OUTPUTS-DAG: foo.3.[[#PID]].native.o.thinlto.bc{{$}} OUTPUTS-DAG: bar.4.[[#PID]].native.o.thinlto.bc{{$}} ## Native output object files. OUTPUTS-DAG: start.1.[[#PID]].native.o{{$}} OUTPUTS-DAG: dog.2.[[#PID]].native.o{{$}} OUTPUTS-DAG: foo.3.[[#PID]].native.o{{$}} OUTPUTS-DAG: bar.4.[[#PID]].native.o{{$}} ## It is important that cross-module inlining occurs for this test to show that Clang can ## successfully load the bitcode file dependencies recorded in the summary indices. ## Explicitly check that the expected importing has occurred. RUN: llvm-dis start.1.*.native.o.thinlto.bc -o - | \ RUN: FileCheck %s --check-prefixes=FOO,BAR,START RUN: llvm-dis dog.2.*.native.o.thinlto.bc -o - | \ RUN: FileCheck %s --check-prefixes=FOO,BAR,DOG,START RUN: llvm-dis foo.3.*.native.o.thinlto.bc -o - | \ RUN: FileCheck %s --check-prefixes=FOO,BAR,START RUN: llvm-dis bar.4.*.native.o.thinlto.bc -o - | \ RUN: FileCheck %s --check-prefixes=FOO,BAR,START FOO-DAG: foo.o BAR-DAG: bar.o DOG-DAG: dog.o START-DAG: start.o #--- foo.c extern int bar(int), start(int); __attribute__((retain)) int foo(int x) { return x + bar(x) + start(x); } #--- bar.c extern int foo(int), start(int); __attribute__((retain)) int bar(int x) { return x + foo(x) + start(x); } #--- dog.c extern int foo(int), bar(int), start(int); __attribute__((retain)) int dog(int x) { return x + foo(x) + bar(x) + start(x); } #--- cat.c __attribute__((retain)) void cat(int x) {} #--- start.c extern int foo(int), bar(int); __attribute__((retain)) int start(int x) { return x + foo(x) + bar(x); }