| # needs-matching-clang |
| |
| # This test makes sure that cross-language inlining can be used in conjunction |
| # with profile-guided optimization. The test only tests that the whole workflow |
| # can be executed without anything crashing. It does not test whether PGO or |
| # xLTO have any specific effect on the generated code. |
| |
| -include ../tools.mk |
| |
| COMMON_FLAGS=-Copt-level=3 -Ccodegen-units=1 |
| |
| # LLVM doesn't support instrumenting binaries that use SEH: |
| # https://bugs.llvm.org/show_bug.cgi?id=41279 |
| # |
| # Things work fine with -Cpanic=abort though. |
| ifdef IS_MSVC |
| COMMON_FLAGS+= -Cpanic=abort |
| endif |
| |
| all: cpp-executable rust-executable |
| |
| cpp-executable: |
| $(RUSTC) -Clinker-plugin-lto=on \ |
| -Cprofile-generate="$(TMPDIR)"/cpp-profdata \ |
| -o "$(TMPDIR)"/librustlib-xlto.a \ |
| $(COMMON_FLAGS) \ |
| ./rustlib.rs |
| $(CLANG) -flto=thin \ |
| -fprofile-generate="$(TMPDIR)"/cpp-profdata \ |
| -fuse-ld=lld \ |
| -L "$(TMPDIR)" \ |
| -lrustlib-xlto \ |
| -o "$(TMPDIR)"/cmain \ |
| -O3 \ |
| ./cmain.c |
| $(TMPDIR)/cmain |
| # Postprocess the profiling data so it can be used by the compiler |
| "$(LLVM_BIN_DIR)"/llvm-profdata merge \ |
| -o "$(TMPDIR)"/cpp-profdata/merged.profdata \ |
| "$(TMPDIR)"/cpp-profdata/default_*.profraw |
| $(RUSTC) -Clinker-plugin-lto=on \ |
| -Cprofile-use="$(TMPDIR)"/cpp-profdata/merged.profdata \ |
| -o "$(TMPDIR)"/librustlib-xlto.a \ |
| $(COMMON_FLAGS) \ |
| ./rustlib.rs |
| $(CLANG) -flto=thin \ |
| -fprofile-use="$(TMPDIR)"/cpp-profdata/merged.profdata \ |
| -fuse-ld=lld \ |
| -L "$(TMPDIR)" \ |
| -lrustlib-xlto \ |
| -o "$(TMPDIR)"/cmain \ |
| -O3 \ |
| ./cmain.c |
| |
| rust-executable: |
| exit |
| $(CLANG) ./clib.c -fprofile-generate="$(TMPDIR)"/rs-profdata -flto=thin -c -o $(TMPDIR)/clib.o -O3 |
| (cd $(TMPDIR); $(AR) crus ./libxyz.a ./clib.o) |
| $(RUSTC) -Clinker-plugin-lto=on \ |
| -Cprofile-generate="$(TMPDIR)"/rs-profdata \ |
| -L$(TMPDIR) \ |
| $(COMMON_FLAGS) \ |
| -Clinker=$(CLANG) \ |
| -Clink-arg=-fuse-ld=lld \ |
| -o $(TMPDIR)/rsmain \ |
| ./main.rs |
| $(TMPDIR)/rsmain |
| # Postprocess the profiling data so it can be used by the compiler |
| "$(LLVM_BIN_DIR)"/llvm-profdata merge \ |
| -o "$(TMPDIR)"/rs-profdata/merged.profdata \ |
| "$(TMPDIR)"/rs-profdata/default_*.profraw |
| $(CLANG) ./clib.c \ |
| -fprofile-use="$(TMPDIR)"/rs-profdata/merged.profdata \ |
| -flto=thin \ |
| -c \ |
| -o $(TMPDIR)/clib.o \ |
| -O3 |
| rm "$(TMPDIR)"/libxyz.a |
| (cd $(TMPDIR); $(AR) crus ./libxyz.a ./clib.o) |
| $(RUSTC) -Clinker-plugin-lto=on \ |
| -Cprofile-use="$(TMPDIR)"/rs-profdata/merged.profdata \ |
| -L$(TMPDIR) \ |
| $(COMMON_FLAGS) \ |
| -Clinker=$(CLANG) \ |
| -Clink-arg=-fuse-ld=lld \ |
| -o $(TMPDIR)/rsmain \ |
| ./main.rs |