[WIP] Add a Trap sink to code generation (#279)
* First draft of TrapSink implementation. * Add trap sink calls to 'trapif' and 'trapff' recipes. * Add SourceLoc to trap sink calls, and add trap sink calls to all loads and stores. * Add IntegerDivisionByZero trap to div recipe. * Only emit load/store traps if 'notrap' flag is not set on the instruction. * Update filetest machinery to add new trap sink functionality. * Update filetests to include traps in output. * Add a few more trap outputs to filetests. * Add trap output to CLI tool.
This commit is contained in:
committed by
Dan Gohman
parent
d566faa8fb
commit
951ff11f85
@@ -44,6 +44,18 @@ impl binemit::RelocSink for PrintRelocs {
|
||||
}
|
||||
}
|
||||
|
||||
struct PrintTraps {
|
||||
flag_print: bool,
|
||||
}
|
||||
|
||||
impl binemit::TrapSink for PrintTraps {
|
||||
fn trap(&mut self, offset: binemit::CodeOffset, _srcloc: ir::SourceLoc, code: ir::TrapCode) {
|
||||
if self.flag_print {
|
||||
println!("trap: {} at {}", code, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(
|
||||
files: Vec<String>,
|
||||
flag_print: bool,
|
||||
@@ -94,8 +106,9 @@ fn handle_module(
|
||||
// Encode the result as machine code.
|
||||
let mut mem = Vec::new();
|
||||
let mut relocs = PrintRelocs { flag_print };
|
||||
let mut traps = PrintTraps { flag_print };
|
||||
mem.resize(size as usize, 0);
|
||||
context.emit_to_memory(mem.as_mut_ptr(), &mut relocs, &*isa);
|
||||
context.emit_to_memory(mem.as_mut_ptr(), &mut relocs, &mut traps, &*isa);
|
||||
|
||||
if flag_print {
|
||||
print!(".byte ");
|
||||
|
||||
Reference in New Issue
Block a user