Add SMIR visitor for Places and projections
This commit is contained in:
parent
998aa383ba
commit
d517a1cbda
@ -406,7 +406,7 @@ pub struct Place {
|
|||||||
// ProjectionElem<Local, Ty>) and user-provided type annotations (for which the projection elements
|
// ProjectionElem<Local, Ty>) and user-provided type annotations (for which the projection elements
|
||||||
// are of type ProjectionElem<(), ()>). In SMIR we don't need this generality, so we just use
|
// are of type ProjectionElem<(), ()>). In SMIR we don't need this generality, so we just use
|
||||||
// ProjectionElem for Places.
|
// ProjectionElem for Places.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub enum ProjectionElem {
|
pub enum ProjectionElem {
|
||||||
/// Dereference projections (e.g. `*_1`) project to the address referenced by the base place.
|
/// Dereference projections (e.g. `*_1`) project to the address referenced by the base place.
|
||||||
Deref,
|
Deref,
|
||||||
|
@ -76,6 +76,15 @@ fn visit_place(&mut self, place: &Place, ptx: PlaceContext, location: Location)
|
|||||||
self.super_place(place, ptx, location)
|
self.super_place(place, ptx, location)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_projection_elem(
|
||||||
|
&mut self,
|
||||||
|
elem: &ProjectionElem,
|
||||||
|
ptx: PlaceContext,
|
||||||
|
location: Location,
|
||||||
|
) {
|
||||||
|
self.super_projection_elem(elem, ptx, location);
|
||||||
|
}
|
||||||
|
|
||||||
fn visit_local(&mut self, local: &Local, ptx: PlaceContext, location: Location) {
|
fn visit_local(&mut self, local: &Local, ptx: PlaceContext, location: Location) {
|
||||||
let _ = (local, ptx, location);
|
let _ = (local, ptx, location);
|
||||||
}
|
}
|
||||||
@ -264,7 +273,29 @@ fn super_span(&mut self, span: &Span) {
|
|||||||
fn super_place(&mut self, place: &Place, ptx: PlaceContext, location: Location) {
|
fn super_place(&mut self, place: &Place, ptx: PlaceContext, location: Location) {
|
||||||
let _ = location;
|
let _ = location;
|
||||||
let _ = ptx;
|
let _ = ptx;
|
||||||
visit_opaque(&Opaque(place.projection.clone()));
|
self.visit_local(&place.local, ptx, location);
|
||||||
|
|
||||||
|
for elem in &place.projection {
|
||||||
|
self.visit_projection_elem(elem, ptx, location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn super_projection_elem(
|
||||||
|
&mut self,
|
||||||
|
elem: &ProjectionElem,
|
||||||
|
ptx: PlaceContext,
|
||||||
|
location: Location,
|
||||||
|
) {
|
||||||
|
match elem {
|
||||||
|
ProjectionElem::Deref => {}
|
||||||
|
ProjectionElem::Field(_idx, ty) => self.visit_ty(ty, location),
|
||||||
|
ProjectionElem::Index(local) => self.visit_local(local, ptx, location),
|
||||||
|
ProjectionElem::ConstantIndex { offset: _, min_length: _, from_end: _ } => {}
|
||||||
|
ProjectionElem::Subslice { from: _, to: _, from_end: _ } => {}
|
||||||
|
ProjectionElem::Downcast(_idx) => {}
|
||||||
|
ProjectionElem::OpaqueCast(ty) => self.visit_ty(ty, location),
|
||||||
|
ProjectionElem::Subtype(ty) => self.visit_ty(ty, location),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn super_rvalue(&mut self, rvalue: &Rvalue, location: Location) {
|
fn super_rvalue(&mut self, rvalue: &Rvalue, location: Location) {
|
||||||
|
Loading…
Reference in New Issue
Block a user