Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
85 changes: 51 additions & 34 deletions cranelift/codegen/src/machinst/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,49 +354,66 @@ 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)?;
// Normalize the block starts to include an initial block of offset 0.
let block_starts = if let Some(start) = self.bb_starts.first() {
let mut starts = Vec::new();
if *start != 0 {
starts.push(0);
}
starts.extend_from_slice(&self.bb_starts);
starts
} else {
vec![0]
};
Comment thread
elliottt marked this conversation as resolved.
Outdated

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, " ")?;
// Iterate over block regions, to ensure that we always produce block labels
let end = self.buffer.data().len();
for (n, start) in block_starts.iter().enumerate() {
let start = *start as usize;
let end = if let Some(next) = block_starts.get(n + 1) {
*next as usize
} else {
end
};
Comment thread
elliottt marked this conversation as resolved.
Outdated

writeln!(buf, "block{}: ; offset 0x{:x}", n, start)?;

let insns = cs
.disasm_all(&self.buffer.data()[start..end], 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