Skip to content
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
80 changes: 44 additions & 36 deletions cranelift/codegen/src/machinst/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,49 +354,57 @@ impl<T: CompilePhase> CompiledCodeBase<T> {

let relocs = self.buffer.relocs();
let traps = self.buffer.traps();
let labels = self.bb_starts.as_slice();

let insns = cs.disasm_all(self.buffer.data(), 0x0).map_err(map_caperr)?;
for i in insns.iter() {
if let Some((n, off)) = labels
.iter()
.copied()
.enumerate()
.find(|(_, val)| *val == i.address() as u32)
{
writeln!(buf, "block{}: ; offset 0x{:x}", n, off)?;
}

write!(buf, " ")?;

let op_str = i.op_str().unwrap_or("");
if let Some(s) = i.mnemonic() {
write!(buf, "{}", s)?;
if !op_str.is_empty() {
write!(buf, " ")?;
// Normalize the block starts to include an initial block of offset 0.
let mut block_starts = Vec::new();
if self.bb_starts.first().copied() != Some(0) {
block_starts.push(0);
}
block_starts.extend_from_slice(&self.bb_starts);
block_starts.push(self.buffer.data().len() as u32);

// Iterate over block regions, to ensure that we always produce block labels
for (n, (&start, &end)) in block_starts
.iter()
.zip(block_starts.iter().skip(1))
.enumerate()
{
writeln!(buf, "block{}: ; offset 0x{:x}", n, start)?;

let buffer = &self.buffer.data()[start as usize..end as usize];
let insns = cs.disasm_all(buffer, start as u64).map_err(map_caperr)?;
for i in insns.iter() {
write!(buf, " ")?;

let op_str = i.op_str().unwrap_or("");
if let Some(s) = i.mnemonic() {
write!(buf, "{}", s)?;
if !op_str.is_empty() {
write!(buf, " ")?;
}
}
}

write!(buf, "{}", op_str)?;
write!(buf, "{}", op_str)?;

let end = i.address() + i.bytes().len() as u64;
let contains = |off| i.address() <= off && off < end;
let end = i.address() + i.bytes().len() as u64;
let contains = |off| i.address() <= off && off < end;

if let Some(reloc) = relocs.iter().find(|reloc| contains(reloc.offset as u64)) {
write!(
buf,
" ; reloc_external {} {} {}",
reloc.kind,
reloc.name.display(params),
reloc.addend,
)?;
}
if let Some(reloc) = relocs.iter().find(|reloc| contains(reloc.offset as u64)) {
write!(
buf,
" ; reloc_external {} {} {}",
reloc.kind,
reloc.name.display(params),
reloc.addend,
)?;
}

if let Some(trap) = traps.iter().find(|trap| contains(trap.offset as u64)) {
write!(buf, " ; trap: {}", trap.code)?;
}
if let Some(trap) = traps.iter().find(|trap| contains(trap.offset as u64)) {
write!(buf, " ; trap: {}", trap.code)?;
}

writeln!(buf)?;
writeln!(buf)?;
}
}

return Ok(buf);
Expand Down
3 changes: 2 additions & 1 deletion cranelift/filetests/filetests/egraph/multivalue.clif
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ function u0:359(i64) -> i8, i8 system_v {
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block0: ; offset 0x4
; block1: ; offset 0x4
; callq 9 ; reloc_external CallPCRel4 u0:521 -4
; movq %rbp, %rsp
; popq %rbp
Expand Down
3 changes: 2 additions & 1 deletion cranelift/filetests/filetests/egraph/not_a_load.clif
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ function u0:1302(i64) -> i64 system_v {
; ret
;
; Disassembled:
; block0: ; offset 0x0
; pushq %rbp
; movq %rsp, %rbp
; block0: ; offset 0x4
; block1: ; offset 0x4
; movq (%rdi), %rax ; trap: heap_oob
; movq %rax, %rcx
; addq %rdi, %rcx
Expand Down
3 changes: 2 additions & 1 deletion cranelift/filetests/filetests/isa/aarch64/atomic-cas.clif
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,13 @@ block0(v0: i64, v1: i32, v2: i32):
; ret
;
; Disassembled:
; block0: ; offset 0x0
; stp x29, x30, [sp, #-0x10]!
; mov x29, sp
; str x28, [sp, #-0x10]!
; stp x26, x27, [sp, #-0x10]!
; stp x24, x25, [sp, #-0x10]!
; block0: ; offset 0x14
; block1: ; offset 0x14
; mov x25, x0
; mov x26, x1
; mov x28, x2
Expand Down
12 changes: 8 additions & 4 deletions cranelift/filetests/filetests/isa/aarch64/atomic-rmw-lse.clif
Original file line number Diff line number Diff line change
Expand Up @@ -232,12 +232,13 @@ block0(v0: i64, v1: i64):
; ret
;
; Disassembled:
; block0: ; offset 0x0
; stp x29, x30, [sp, #-0x10]!
; mov x29, sp
; str x28, [sp, #-0x10]!
; stp x26, x27, [sp, #-0x10]!
; stp x24, x25, [sp, #-0x10]!
; block0: ; offset 0x14
; block1: ; offset 0x14
; mov x25, x0
; mov x26, x1
; ldaxr x27, [x25]
Expand Down Expand Up @@ -274,12 +275,13 @@ block0(v0: i64, v1: i32):
; ret
;
; Disassembled:
; block0: ; offset 0x0
; stp x29, x30, [sp, #-0x10]!
; mov x29, sp
; str x28, [sp, #-0x10]!
; stp x26, x27, [sp, #-0x10]!
; stp x24, x25, [sp, #-0x10]!
; block0: ; offset 0x14
; block1: ; offset 0x14
; mov x25, x0
; mov x26, x1
; ldaxr w27, [x25]
Expand Down Expand Up @@ -316,12 +318,13 @@ block0(v0: i64, v1: i16):
; ret
;
; Disassembled:
; block0: ; offset 0x0
; stp x29, x30, [sp, #-0x10]!
; mov x29, sp
; str x28, [sp, #-0x10]!
; stp x26, x27, [sp, #-0x10]!
; stp x24, x25, [sp, #-0x10]!
; block0: ; offset 0x14
; block1: ; offset 0x14
; mov x25, x0
; mov x26, x1
; ldaxrh w27, [x25]
Expand Down Expand Up @@ -358,12 +361,13 @@ block0(v0: i64, v1: i8):
; ret
;
; Disassembled:
; block0: ; offset 0x0
; stp x29, x30, [sp, #-0x10]!
; mov x29, sp
; str x28, [sp, #-0x10]!
; stp x26, x27, [sp, #-0x10]!
; stp x24, x25, [sp, #-0x10]!
; block0: ; offset 0x14
; block1: ; offset 0x14
; mov x25, x0
; mov x26, x1
; ldaxrb w27, [x25]
Expand Down
Loading