Skip to content

Commit

Permalink
Add thinlto support to codegen, assembly and coverage tests
Browse files Browse the repository at this point in the history
  • Loading branch information
DianQK committed Nov 18, 2023
1 parent e1e60b6 commit e64a895
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 15 deletions.
66 changes: 51 additions & 15 deletions src/tools/compiletest/src/runtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -474,14 +474,12 @@ impl<'test> TestCx<'test> {
self.fatal("missing --coverage-dump");
};

let proc_res = self.compile_test_and_save_ir();
let (proc_res, llvm_ir_path) = self.compile_test_and_save_ir();
if !proc_res.status.success() {
self.fatal_proc_rec("compilation failed!", &proc_res);
}
drop(proc_res);

let llvm_ir_path = self.output_base_name().with_extension("ll");

let mut dump_command = Command::new(coverage_dump_path);
dump_command.arg(llvm_ir_path);
let proc_res = self.run_command_to_procres(&mut dump_command);
Expand Down Expand Up @@ -2785,10 +2783,50 @@ impl<'test> TestCx<'test> {
proc_res.fatal(None, || on_failure(*self));
}

fn get_output_file(&self, extension: &str) -> TargetLocation {
let thin_lto = self.props.compile_flags.iter().any(|s| s.ends_with("lto=thin"));
if thin_lto {
TargetLocation::ThisDirectory(self.output_base_dir())
} else {
// This works with both `--emit asm` (as default output name for the assembly)
// and `ptx-linker` because the latter can write output at requested location.
let output_path = self.output_base_name().with_extension(extension);
let output_file = TargetLocation::ThisFile(output_path.clone());
output_file
}
}

fn get_filecheck_file(&self, extension: &str) -> PathBuf {
let thin_lto = self.props.compile_flags.iter().any(|s| s.ends_with("lto=thin"));
if thin_lto {
let file_stem = self.testpaths.file.file_stem().unwrap().to_str().unwrap();
let mut output_file = None;
for entry in self.output_base_dir().read_dir().unwrap() {
if let Ok(entry) = entry {
let entry_path = entry.path();
let entry_file = entry_path.file_name().unwrap().to_str().unwrap();
if entry_file.starts_with(&format!("{}.{}", file_stem, file_stem))
&& entry_file.ends_with(extension)
{
assert!(output_file.is_none(), "thinlto doesn't support multiple cgu tests");
output_file = Some(entry_file.to_string());
}
}
}
if let Some(output_file) = output_file {
self.output_base_dir().join(output_file)
} else {
self.output_base_name().with_extension(extension)
}
} else {
self.output_base_name().with_extension(extension)
}
}

// codegen tests (using FileCheck)

fn compile_test_and_save_ir(&self) -> ProcRes {
let output_file = TargetLocation::ThisDirectory(self.output_base_dir());
fn compile_test_and_save_ir(&self) -> (ProcRes, PathBuf) {
let output_file = self.get_output_file("ll");
let input_file = &self.testpaths.file;
let rustc = self.make_compile_args(
input_file,
Expand All @@ -2799,15 +2837,13 @@ impl<'test> TestCx<'test> {
Vec::new(),
);

self.compose_and_run_compiler(rustc, None)
let proc_res = self.compose_and_run_compiler(rustc, None);
let output_path = self.get_filecheck_file("ll");
(proc_res, output_path)
}

fn compile_test_and_save_assembly(&self) -> (ProcRes, PathBuf) {
// This works with both `--emit asm` (as default output name for the assembly)
// and `ptx-linker` because the latter can write output at requested location.
let output_path = self.output_base_name().with_extension("s");

let output_file = TargetLocation::ThisFile(output_path.clone());
let output_file = self.get_output_file("s");
let input_file = &self.testpaths.file;

let mut emit = Emit::None;
Expand Down Expand Up @@ -2837,7 +2873,9 @@ impl<'test> TestCx<'test> {
Vec::new(),
);

(self.compose_and_run_compiler(rustc, None), output_path)
let proc_res = self.compose_and_run_compiler(rustc, None);
let output_path = self.get_filecheck_file("s");
(proc_res, output_path)
}

fn verify_with_filecheck(&self, output: &Path) -> ProcRes {
Expand Down Expand Up @@ -2870,16 +2908,14 @@ impl<'test> TestCx<'test> {
self.fatal("missing --llvm-filecheck");
}

let proc_res = self.compile_test_and_save_ir();
let (proc_res, output_path) = self.compile_test_and_save_ir();
if !proc_res.status.success() {
self.fatal_proc_rec("compilation failed!", &proc_res);
}

if let Some(PassMode::Build) = self.pass_mode() {
return;
}

let output_path = self.output_base_name().with_extension("ll");
let proc_res = self.verify_with_filecheck(&output_path);
if !proc_res.status.success() {
self.fatal_proc_rec("verification with 'FileCheck' failed", &proc_res);
Expand Down
7 changes: 7 additions & 0 deletions tests/assembly/thinlto.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// compile-flags: -O -C lto=thin -C prefer-dynamic=no
// assembly-output: emit-asm

// CHECK: main

pub fn main() {
}
6 changes: 6 additions & 0 deletions tests/codegen/thinlto.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// compile-flags: -O -C lto=thin -C prefer-dynamic=no

// CHECK: main

pub fn main() {
}
8 changes: 8 additions & 0 deletions tests/coverage/thinlto.cov-map
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Function name: thinlto::main
Raw bytes (9): 0x[01, 01, 00, 01, 01, 03, 01, 01, 02]
Number of files: 1
- file 0 => global file 1
Number of expressions: 0
Number of file 0 mappings: 1
- Code(Counter(0)) at (prev + 3, 1) to (start + 1, 2)

4 changes: 4 additions & 0 deletions tests/coverage/thinlto.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// compile-flags: -O -C lto=thin -C prefer-dynamic=no

pub fn main() {
}

0 comments on commit e64a895

Please sign in to comment.