Add an end-to-end run-make test for cross-lang LTO.
This commit is contained in:
parent
daa53a52a2
commit
75dcf9e35f
5 changed files with 69 additions and 0 deletions
25
src/test/run-make-fulldeps/cross-lang-lto-clang/Makefile
Normal file
25
src/test/run-make-fulldeps/cross-lang-lto-clang/Makefile
Normal file
|
@ -0,0 +1,25 @@
|
|||
# needs-matching-clang
|
||||
|
||||
# This test makes sure that cross-language inlining actually works by checking
|
||||
# the generated machine code.
|
||||
|
||||
-include ../tools.mk
|
||||
|
||||
all: cpp-executable rust-executable
|
||||
|
||||
cpp-executable:
|
||||
$(RUSTC) -Zcross-lang-lto=on -o $(TMPDIR)/librustlib-xlto.a -Copt-level=2 -Ccodegen-units=1 ./rustlib.rs
|
||||
clang -flto=thin -fuse-ld=lld -L $(TMPDIR) -lrustlib-xlto -o $(TMPDIR)/cmain ./cmain.c -O3
|
||||
# Make sure we don't find a call instruction to the function we expect to
|
||||
# always be inlined.
|
||||
llvm-objdump -d $(TMPDIR)/cmain | $(CGREP) -v -e "call.*rust_always_inlined"
|
||||
# As a sanity check, make sure we do find a call instruction to a
|
||||
# non-inlined function
|
||||
llvm-objdump -d $(TMPDIR)/cmain | $(CGREP) -e "call.*rust_never_inlined"
|
||||
|
||||
rust-executable:
|
||||
clang ./clib.c -flto=thin -c -o $(TMPDIR)/clib.o -O2
|
||||
(cd $(TMPDIR); $(AR) crus ./libxyz.a ./clib.o)
|
||||
$(RUSTC) -Zcross-lang-lto=on -L$(TMPDIR) -Copt-level=2 -Clinker=clang -Clink-arg=-fuse-ld=lld ./main.rs -o $(TMPDIR)/rsmain
|
||||
llvm-objdump -d $(TMPDIR)/rsmain | $(CGREP) -e "call.*c_never_inlined"
|
||||
llvm-objdump -d $(TMPDIR)/rsmain | $(CGREP) -v -e "call.*c_always_inlined"
|
9
src/test/run-make-fulldeps/cross-lang-lto-clang/clib.c
Normal file
9
src/test/run-make-fulldeps/cross-lang-lto-clang/clib.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
#include <stdint.h>
|
||||
|
||||
uint32_t c_always_inlined() {
|
||||
return 1234;
|
||||
}
|
||||
|
||||
__attribute__((noinline)) uint32_t c_never_inlined() {
|
||||
return 12345;
|
||||
}
|
12
src/test/run-make-fulldeps/cross-lang-lto-clang/cmain.c
Normal file
12
src/test/run-make-fulldeps/cross-lang-lto-clang/cmain.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <stdint.h>
|
||||
|
||||
// A trivial function defined in Rust, returning a constant value. This should
|
||||
// always be inlined.
|
||||
uint32_t rust_always_inlined();
|
||||
|
||||
|
||||
uint32_t rust_never_inlined();
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
return rust_never_inlined() + rust_always_inlined();
|
||||
}
|
11
src/test/run-make-fulldeps/cross-lang-lto-clang/main.rs
Normal file
11
src/test/run-make-fulldeps/cross-lang-lto-clang/main.rs
Normal file
|
@ -0,0 +1,11 @@
|
|||
#[link(name = "xyz")]
|
||||
extern "C" {
|
||||
fn c_always_inlined() -> u32;
|
||||
fn c_never_inlined() -> u32;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
println!("blub: {}", c_always_inlined() + c_never_inlined());
|
||||
}
|
||||
}
|
12
src/test/run-make-fulldeps/cross-lang-lto-clang/rustlib.rs
Normal file
12
src/test/run-make-fulldeps/cross-lang-lto-clang/rustlib.rs
Normal file
|
@ -0,0 +1,12 @@
|
|||
#![crate_type="staticlib"]
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn rust_always_inlined() -> u32 {
|
||||
42
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn rust_never_inlined() -> u32 {
|
||||
421
|
||||
}
|
Loading…
Add table
Reference in a new issue