MachInst backend: attach SourceLoc span information to all ranges.
Previously, the SourceLoc information transferred in `VCode` only included PC-spans for non-default SourceLocs. I realized that the invariant we're supposed to keep here is that every PC is covered; if no source information, just use `SourceLoc::default()`. This was spurred by @bjorn3's comment in #1575 (thanks!).
This commit is contained in:
@@ -550,7 +550,7 @@ impl<I: VCodeInst> VCode<I> {
|
|||||||
let code_section = sections.get_section(code_idx);
|
let code_section = sections.get_section(code_idx);
|
||||||
|
|
||||||
let flags = self.abi.flags();
|
let flags = self.abi.flags();
|
||||||
let mut cur_srcloc = SourceLoc::default();
|
let mut cur_srcloc = None;
|
||||||
for &block in &self.final_block_order {
|
for &block in &self.final_block_order {
|
||||||
let new_offset = I::align_basic_block(code_section.cur_offset_from_start());
|
let new_offset = I::align_basic_block(code_section.cur_offset_from_start());
|
||||||
while new_offset > code_section.cur_offset_from_start() {
|
while new_offset > code_section.cur_offset_from_start() {
|
||||||
@@ -563,22 +563,20 @@ impl<I: VCodeInst> VCode<I> {
|
|||||||
let (start, end) = self.block_ranges[block as usize];
|
let (start, end) = self.block_ranges[block as usize];
|
||||||
for iix in start..end {
|
for iix in start..end {
|
||||||
let srcloc = self.srclocs[iix as usize];
|
let srcloc = self.srclocs[iix as usize];
|
||||||
if srcloc != cur_srcloc {
|
if cur_srcloc != Some(srcloc) {
|
||||||
if !cur_srcloc.is_default() {
|
if cur_srcloc.is_some() {
|
||||||
code_section.end_srcloc();
|
code_section.end_srcloc();
|
||||||
}
|
}
|
||||||
if !srcloc.is_default() {
|
code_section.start_srcloc(srcloc);
|
||||||
code_section.start_srcloc(srcloc);
|
cur_srcloc = Some(srcloc);
|
||||||
}
|
|
||||||
cur_srcloc = srcloc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.insts[iix as usize].emit(code_section, flags);
|
self.insts[iix as usize].emit(code_section, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !cur_srcloc.is_default() {
|
if cur_srcloc.is_some() {
|
||||||
code_section.end_srcloc();
|
code_section.end_srcloc();
|
||||||
cur_srcloc = SourceLoc::default();
|
cur_srcloc = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -94,11 +94,7 @@ impl GlobalFrameInfo {
|
|||||||
// the function, because otherwise something is buggy along the way and
|
// the function, because otherwise something is buggy along the way and
|
||||||
// not accounting for all the instructions. This isn't super critical
|
// not accounting for all the instructions. This isn't super critical
|
||||||
// though so we can omit this check in release mode.
|
// though so we can omit this check in release mode.
|
||||||
//
|
debug_assert!(pos.is_some(), "failed to find instruction for {:x}", pc);
|
||||||
// FIXME(#1521) aarch64 instruction info isn't quite up-to-par yet.
|
|
||||||
if !cfg!(target_arch = "aarch64") {
|
|
||||||
debug_assert!(pos.is_some(), "failed to find instruction for {:x}", pc);
|
|
||||||
}
|
|
||||||
|
|
||||||
let instr = match pos {
|
let instr = match pos {
|
||||||
Some(pos) => func.instr_map.instructions[pos].srcloc,
|
Some(pos) => func.instr_map.instructions[pos].srcloc,
|
||||||
|
|||||||
Reference in New Issue
Block a user