@@ -129,7 +129,9 @@ fn main() {
129129 None => debug_log ! ( "RUNFILES_DIR: not set (split coverage postprocessing)" ) ,
130130 }
131131
132- let coverage_output_file = coverage_dir. join ( "coverage.dat" ) ;
132+ let coverage_output_file = env:: var ( "COVERAGE_OUTPUT_FILE" )
133+ . map ( PathBuf :: from)
134+ . unwrap_or_else ( |_| coverage_dir. join ( "coverage.dat" ) ) ;
133135 let profdata_file = coverage_dir. join ( "coverage.profdata" ) ;
134136 let llvm_cov_path = env:: var ( "RUST_LLVM_COV" ) . unwrap ( ) ;
135137 let llvm_profdata_path = env:: var ( "RUST_LLVM_PROFDATA" ) . unwrap ( ) ;
@@ -141,15 +143,43 @@ fn main() {
141143 Some ( ref rd) => find_metadata_file ( & execroot, rd, & llvm_profdata_path) ,
142144 None => execroot. join ( & llvm_profdata_path) ,
143145 } ;
144- let test_binary = match runfiles_dir {
145- Some ( ref rd) => find_test_binary ( & execroot, rd) ,
146- None => {
147- let bin_dir = config_bin_dir ( & execroot, & coverage_dir) ;
148- let test_binary = execroot
149- . join ( bin_dir)
150- . join ( env:: var ( "TEST_BINARY" ) . unwrap ( ) ) ;
151- debug_log ! ( "Resolved TEST_BINARY to: {}" , test_binary. display( ) ) ;
152- test_binary
146+ // When the JUnit runner wraps the test, TEST_BINARY points to the runner
147+ // and RUST_TEST_BIN holds the actual instrumented binary that llvm-cov needs.
148+ let test_binary = if let Ok ( rust_test_bin) = env:: var ( "RUST_TEST_BIN" ) {
149+ debug_log ! ( "Using RUST_TEST_BIN: {}" , rust_test_bin) ;
150+ match runfiles_dir {
151+ Some ( ref rd) => {
152+ let candidate = rd
153+ . join ( env:: var ( "TEST_WORKSPACE" ) . unwrap_or_default ( ) )
154+ . join ( & rust_test_bin) ;
155+ if candidate. exists ( ) {
156+ candidate
157+ } else {
158+ let candidate = rd. join ( & rust_test_bin) ;
159+ if candidate. exists ( ) {
160+ candidate
161+ } else {
162+ let bin_dir = config_bin_dir ( & execroot, & coverage_dir) ;
163+ execroot. join ( bin_dir) . join ( & rust_test_bin)
164+ }
165+ }
166+ }
167+ None => {
168+ let bin_dir = config_bin_dir ( & execroot, & coverage_dir) ;
169+ execroot. join ( bin_dir) . join ( & rust_test_bin)
170+ }
171+ }
172+ } else {
173+ match runfiles_dir {
174+ Some ( ref rd) => find_test_binary ( & execroot, rd) ,
175+ None => {
176+ let bin_dir = config_bin_dir ( & execroot, & coverage_dir) ;
177+ let test_binary = execroot
178+ . join ( bin_dir)
179+ . join ( env:: var ( "TEST_BINARY" ) . unwrap ( ) ) ;
180+ debug_log ! ( "Resolved TEST_BINARY to: {}" , test_binary. display( ) ) ;
181+ test_binary
182+ }
153183 }
154184 } ;
155185 let profraw_files: Vec < PathBuf > = fs:: read_dir ( coverage_dir)
0 commit comments