1
1
//! 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.
3
3
//@ needs-matching-clang
4
4
//@ needs-llvm-components riscv
5
5
extern crate run_make_support;
6
6
7
- use run_make_support:: { bin_name, rustc, tmp_dir} ;
7
+ use run_make_support:: { bin_name, clang , llvm_readobj , rustc, tmp_dir} ;
8
8
use std:: {
9
9
env,
10
10
path:: PathBuf ,
11
11
process:: { Command , Output } ,
12
12
str,
13
13
} ;
14
14
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
-
22
15
fn check_target ( target : & str , clang_target : & str , carch : & str , is_double_float : bool ) {
23
16
eprintln ! ( "Checking target {target}" ) ;
24
17
// Rust part
@@ -30,40 +23,24 @@ fn check_target(target: &str, clang_target: &str, carch: &str, is_double_float:
30
23
. linker_plugin_lto ( "on" )
31
24
. run ( ) ;
32
25
// 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
+
51
37
// 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" ) ) ) ;
67
44
}
68
45
69
46
fn main ( ) {
0 commit comments