mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-30 23:31:12 +00:00
add debugir tool to build program
This commit is contained in:
parent
86a86341b3
commit
82b7208533
1 changed files with 62 additions and 0 deletions
|
@ -149,6 +149,68 @@ pub fn gen_from_mono_module(
|
||||||
// Uncomment this to see the module's optimized LLVM instruction output:
|
// Uncomment this to see the module's optimized LLVM instruction output:
|
||||||
// env.module.print_to_stderr();
|
// env.module.print_to_stderr();
|
||||||
|
|
||||||
|
// annotate the LLVM IR output with debug info
|
||||||
|
// so errors are reported with the line number of the LLVM source
|
||||||
|
if true {
|
||||||
|
let mut app_ll_file = std::path::PathBuf::from(app_o_file);
|
||||||
|
app_ll_file.set_extension("ll");
|
||||||
|
|
||||||
|
let mut app_ll_dbg_file = std::path::PathBuf::from(app_o_file);
|
||||||
|
app_ll_dbg_file.set_extension("dbg.ll");
|
||||||
|
|
||||||
|
let mut app_bc_file = std::path::PathBuf::from(app_o_file);
|
||||||
|
app_bc_file.set_extension("bc");
|
||||||
|
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
// write the ll code to a file, so we can modify it
|
||||||
|
module.print_to_file(&app_ll_file).unwrap();
|
||||||
|
|
||||||
|
// run the debugir https://github.com/vaivaswatha/debugir tool
|
||||||
|
match Command::new("debugir")
|
||||||
|
.env_clear()
|
||||||
|
.args(&[app_ll_file.to_str().unwrap()])
|
||||||
|
.output()
|
||||||
|
{
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(error) => {
|
||||||
|
use std::io::ErrorKind;
|
||||||
|
match error.kind() {
|
||||||
|
ErrorKind::NotFound => panic!(
|
||||||
|
r"I could not find the `debugir` tool on the PATH, install it from https://github.com/vaivaswatha/debugir"
|
||||||
|
),
|
||||||
|
_ => panic!("{:?}", error),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// assemble the .ll into a .bc
|
||||||
|
let _ = Command::new("llvm-as-10")
|
||||||
|
.env_clear()
|
||||||
|
.args(&[
|
||||||
|
app_ll_dbg_file.to_str().unwrap(),
|
||||||
|
"-o",
|
||||||
|
app_bc_file.to_str().unwrap(),
|
||||||
|
])
|
||||||
|
.output()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// write the .o file. Note that this builds the .o for the local machine,
|
||||||
|
// and ignores the `target_machine` entirely.
|
||||||
|
let _ = Command::new("llc-10")
|
||||||
|
.env_clear()
|
||||||
|
.args(&[
|
||||||
|
"-filetype=obj",
|
||||||
|
app_bc_file.to_str().unwrap(),
|
||||||
|
"-o",
|
||||||
|
app_o_file.to_str().unwrap(),
|
||||||
|
])
|
||||||
|
.output()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Emit the .o file
|
// Emit the .o file
|
||||||
|
|
||||||
let reloc = RelocMode::Default;
|
let reloc = RelocMode::Default;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue