11//! Make sure that cross-language LTO works on riscv targets,
2- //! which requires extra abi metadata to be emitted.
2+ //! which requires extra `target- abi` metadata to be emitted.
33//@ needs-matching-clang
44//@ needs-llvm-components riscv
55extern crate run_make_support;
66
7- use run_make_support:: { bin_name, rustc, tmp_dir} ;
7+ use run_make_support:: { bin_name, clang , llvm_readobj , rustc, tmp_dir} ;
88use std:: {
99 env,
1010 path:: PathBuf ,
1111 process:: { Command , Output } ,
1212 str,
1313} ;
1414
15- fn handle_failed_output ( output : Output ) {
16- eprintln ! ( "output status: `{}`" , output. status) ;
17- eprintln ! ( "=== STDOUT ===\n {}\n \n " , String :: from_utf8( output. stdout) . unwrap( ) ) ;
18- eprintln ! ( "=== STDERR ===\n {}\n \n " , String :: from_utf8( output. stderr) . unwrap( ) ) ;
19- std:: process:: exit ( 1 )
20- }
21-
2215fn check_target ( target : & str , clang_target : & str , carch : & str , is_double_float : bool ) {
2316 eprintln ! ( "Checking target {target}" ) ;
2417 // Rust part
@@ -30,40 +23,24 @@ fn check_target(target: &str, clang_target: &str, carch: &str, is_double_float:
3023 . linker_plugin_lto ( "on" )
3124 . run ( ) ;
3225 // C part
33- let clang = env:: var ( "CLANG" ) . unwrap ( ) ;
34- let mut cmd = Command :: new ( clang) ;
35- let executable = tmp_dir ( ) . join ( "riscv-xlto" ) ;
36- cmd. arg ( "-target" )
37- . arg ( clang_target)
38- . arg ( format ! ( "-march={carch}" ) )
39- . arg ( format ! ( "-flto=thin" ) )
40- . arg ( format ! ( "-fuse-ld=lld" ) )
41- . arg ( "-nostdlib" )
42- . arg ( "-o" )
43- . arg ( & executable)
44- . arg ( "cstart.c" )
45- . arg ( tmp_dir ( ) . join ( "libriscv_xlto.rlib" ) ) ;
46- eprintln ! ( "{cmd:?}" ) ;
47- let output = cmd. output ( ) . unwrap ( ) ;
48- if !output. status . success ( ) {
49- handle_failed_output ( output) ;
50- }
26+ clang ( )
27+ . target ( clang_target)
28+ . arch ( carch)
29+ . lto ( "thin" )
30+ . use_ld ( "lld" )
31+ . no_stdlib ( )
32+ . out_exe ( "riscv-xlto" )
33+ . input ( "cstart.c" )
34+ . input ( tmp_dir ( ) . join ( "libriscv_xlto.rlib" ) )
35+ . run ( ) ;
36+
5137 // Check that the built binary has correct float abi
52- let llvm_readobj =
53- PathBuf :: from ( env:: var ( "LLVM_BIN_DIR" ) . unwrap ( ) ) . join ( bin_name ( "llvm-readobj" ) ) ;
54- let mut cmd = Command :: new ( llvm_readobj) ;
55- cmd. arg ( "--file-header" ) . arg ( executable) ;
56- eprintln ! ( "{cmd:?}" ) ;
57- let output = cmd. output ( ) . unwrap ( ) ;
58- if output. status . success ( ) {
59- assert ! (
60- !( is_double_float
61- ^ dbg!( str :: from_utf8( & output. stdout) . unwrap( ) )
62- . contains( "EF_RISCV_FLOAT_ABI_DOUBLE" ) )
63- )
64- } else {
65- handle_failed_output ( output) ;
66- }
38+ let executable = tmp_dir ( ) . join ( bin_name ( "riscv-xlto" ) ) ;
39+ let output = llvm_readobj ( ) . input ( & executable) . file_header ( ) . run ( ) ;
40+ let stdout = String :: from_utf8_lossy ( & output. stdout ) ;
41+ eprintln ! ( "obj:\n {}" , stdout) ;
42+
43+ assert ! ( !( is_double_float ^ stdout. contains( "EF_RISCV_FLOAT_ABI_DOUBLE" ) ) ) ;
6744}
6845
6946fn main ( ) {
0 commit comments