pub mod builder;
pub mod graph;
pub mod slot;
use std::collections::HashMap;
use crate::verify::def_use::PlaceKey;
#[derive(Clone, Debug, Default)]
pub struct PointsToGraph {
edges: HashMap<PlaceKey, PlaceKey>,
}
impl PointsToGraph {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, pointer: PlaceKey, source: PlaceKey) {
self.edges.insert(pointer, source);
}
pub fn resolve(&self, place: &PlaceKey) -> PlaceKey {
let mut cur = place.clone();
let mut seen: Vec<PlaceKey> = vec![cur.clone()];
loop {
let Some(next) = self.get_source(&cur) else {
break;
};
if seen.iter().any(|p| p == next) {
break;
}
seen.push(next.clone());
cur = next.clone();
}
cur
}
pub fn edges(&self) -> &HashMap<PlaceKey, PlaceKey> {
&self.edges
}
pub fn get_source(&self, place: &PlaceKey) -> Option<&PlaceKey> {
if let Some(source) = self.edges.get(place) {
return Some(source);
}
if !place.fields.is_empty() {
let base = PlaceKey {
base: place.base.clone(),
fields: Vec::new(),
};
return self.edges.get(&base);
}
None
}
}