Skip to content

Add thinlto support to codegen, assembly and coverage tests #118036

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 1 commit into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 55 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,54 @@ 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 name = self.testpaths.file.file_stem().unwrap().to_str().unwrap();
let canonical_name = name.replace('-', "_");
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!("{}.{}", name, canonical_name))
&& 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 +2841,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 +2877,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 +2912,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
8 changes: 8 additions & 0 deletions tests/assembly/thin-lto.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// compile-flags: -O -C lto=thin -C prefer-dynamic=no
// only-x86_64-unknown-linux-gnu
// assembly-output: emit-asm

// CHECK: main

pub fn main() {
}
7 changes: 7 additions & 0 deletions tests/codegen/thin-lto.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
// only-x86_64-unknown-linux-gnu

// CHECK: main

pub fn main() {
}
8 changes: 8 additions & 0 deletions tests/coverage/thin-lto.cov-map
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Function name: thin_lto::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)

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

4 changes: 4 additions & 0 deletions tests/coverage/thin-lto.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() {
}