ISLE: Common accessors for some insn data fields (#3781)
Add accessors to prelude.isle to access data fields of
`func_addr` and `symbol_value` instructions.
These are based on similar versions I had added to the s390x
back-end, but are a bit more straightforward to use.
- func_ref_data: Extract SigRef, ExternalName, and RelocDistance
fields given a FuncRef.
- symbol_value_data: Extract ExternalName, RelocDistance, and
offset fields given a GlobalValue representing a Symbol.
- reloc_distance_near: Test for RelocDistance::Near.
The s390x back-end is changed to use these common versions.
Note that this exposed a bug in common isle code: This extractor:
(extractor (load_sym inst)
(and inst
(load _ (def_inst (symbol_value
(symbol_value_data _
(reloc_distance_near) offset)))
(i64_from_offset
(memarg_symbol_offset_sum <offset _)))))
would raise an assertion in sema.rs due to a supposed cycle in
extractor definitions. But there was no actual cycle, it was
simply that the extractor tree refers twice to the `insn_data`
extractor (once via the `load` and once via the `symbol_value`
extractor). Fixed by checking for pre-existing definitions only
along one path in the tree, not across the whole tree.
This commit is contained in:
@@ -6,8 +6,9 @@ use regalloc::{Reg, Writable};
|
||||
use smallvec::SmallVec;
|
||||
|
||||
pub use super::MachLabel;
|
||||
pub use crate::ir::ExternalName;
|
||||
pub use crate::ir::{ExternalName, FuncRef, GlobalValue, SigRef};
|
||||
pub use crate::isa::unwind::UnwindInst;
|
||||
pub use crate::machinst::RelocDistance;
|
||||
|
||||
pub type Unit = ();
|
||||
pub type ValueSlice<'a> = &'a [Value];
|
||||
@@ -282,6 +283,34 @@ macro_rules! isle_prelude_methods {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn func_ref_data(&mut self, func_ref: FuncRef) -> (SigRef, ExternalName, RelocDistance) {
|
||||
let funcdata = &self.lower_ctx.dfg().ext_funcs[func_ref];
|
||||
(
|
||||
funcdata.signature,
|
||||
funcdata.name.clone(),
|
||||
funcdata.reloc_distance(),
|
||||
)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn symbol_value_data(
|
||||
&mut self,
|
||||
global_value: GlobalValue,
|
||||
) -> Option<(ExternalName, RelocDistance, i64)> {
|
||||
let (name, reloc, offset) = self.lower_ctx.symbol_value_data(global_value)?;
|
||||
Some((name.clone(), reloc, offset))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn reloc_distance_near(&mut self, dist: RelocDistance) -> Option<()> {
|
||||
if dist == RelocDistance::Near {
|
||||
Some(())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn nonzero_u64_from_imm64(&mut self, val: Imm64) -> Option<u64> {
|
||||
match val.bits() {
|
||||
0 => None,
|
||||
|
||||
Reference in New Issue
Block a user