Skip to content

Commit 5fe6e2b

Browse files
committed
Add EffectPrinter, start adding tests, plan interference function
1 parent da6aded commit 5fe6e2b

File tree

1 file changed

+80
-29
lines changed

1 file changed

+80
-29
lines changed

zjit/src/hir_effect/mod.rs

Lines changed: 80 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub struct EffectSet {
3131
// TODO(Jacob): Add tests for Effect
3232
// TODO(Jacob): Modify ruby generation of effects to include nice labels for Effects instead of just EffectSets
3333
// TODO(Jacob): Modify these labels to be callected effect_sets in the inc.rs, and create others called effects
34+
#[derive(Clone, Copy, Debug)]
3435
pub struct Effect {
3536
/// Unlike ZJIT's type system, effects do not have a notion of subclasses.
3637
/// Instead of specializations, the Effect struct contains two EffectSet bitsets.
@@ -50,7 +51,7 @@ pub struct Effect {
5051
include!("hir_effect.inc.rs");
5152

5253

53-
/// Print adaptor for [`Effect`]. See [`PtrPrintMap`].
54+
/// Print adaptor for [`EffectSet`]. See [`PtrPrintMap`].
5455
pub struct EffectSetPrinter<'a> {
5556
inner: EffectSet,
5657
ptr_map: &'a PtrPrintMap,
@@ -87,6 +88,27 @@ impl std::fmt::Display for EffectSet {
8788
}
8889
}
8990

91+
/// Print adaptor for [`Effect`]. See [`PtrPrintMap`].
92+
pub struct EffectPrinter<'a> {
93+
inner: Effect,
94+
ptr_map: &'a PtrPrintMap,
95+
}
96+
97+
impl<'a> std::fmt::Display for EffectPrinter<'a> {
98+
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
99+
let read = format!("{}", self.inner.read);
100+
let write = format!("{}", self.inner.write);
101+
write!(f, "{read}, {write}")?;
102+
Ok(())
103+
}
104+
}
105+
106+
impl std::fmt::Display for Effect {
107+
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
108+
self.print(&PtrPrintMap::identity()).fmt(f)
109+
}
110+
}
111+
90112
impl EffectSet {
91113
const fn from_bits(bits: EffectBits) -> Self {
92114
Self { bits }
@@ -127,6 +149,7 @@ impl EffectSet {
127149
}
128150
}
129151

152+
// TODO(Jacob): Add interferes function
130153
impl Effect {
131154
pub fn from_sets(read: EffectSet, write: EffectSet) -> Effect {
132155
Effect { read, write }
@@ -183,6 +206,10 @@ impl Effect {
183206
self.intersect(other)
184207
)
185208
}
209+
210+
pub fn print(self, ptr_map: &PtrPrintMap) -> EffectPrinter<'_> {
211+
EffectPrinter { inner: self, ptr_map }
212+
}
186213
}
187214

188215
#[cfg(test)]
@@ -195,35 +222,45 @@ mod tests {
195222
}
196223

197224
#[track_caller]
198-
fn assert_subeffect(left: EffectSet, right: EffectSet) {
225+
fn assert_subeffect_set(left: EffectSet, right: EffectSet) {
226+
assert!(right.includes(left), "{left} is not a subeffect set of {right}");
227+
}
228+
229+
#[track_caller]
230+
fn assert_not_subeffect_set(left: EffectSet, right: EffectSet) {
231+
assert!(!right.includes(left), "{left} is a subeffect set of {right}");
232+
}
233+
234+
#[track_caller]
235+
fn assert_subeffect(left: Effect, right: Effect) {
199236
assert!(right.includes(left), "{left} is not a subeffect of {right}");
200237
}
201238

202239
#[track_caller]
203-
fn assert_not_subeffect(left: EffectSet, right: EffectSet) {
240+
fn assert_not_subeffect(left: Effect, right: Effect) {
204241
assert!(!right.includes(left), "{left} is a subeffect of {right}");
205242
}
206243

207244
#[test]
208245
fn none_is_subeffect_of_everything() {
209-
assert_subeffect(effect_sets::Empty, effect_sets::Empty);
210-
assert_subeffect(effect_sets::Empty, effect_sets::Any);
211-
assert_subeffect(effect_sets::Empty, effect_sets::Control);
212-
assert_subeffect(effect_sets::Empty, effect_sets::Frame);
213-
assert_subeffect(effect_sets::Empty, effect_sets::Stack);
214-
assert_subeffect(effect_sets::Empty, effect_sets::Locals);
215-
assert_subeffect(effect_sets::Empty, effect_sets::Allocator);
246+
assert_subeffect_set(effect_sets::Empty, effect_sets::Empty);
247+
assert_subeffect_set(effect_sets::Empty, effect_sets::Any);
248+
assert_subeffect_set(effect_sets::Empty, effect_sets::Control);
249+
assert_subeffect_set(effect_sets::Empty, effect_sets::Frame);
250+
assert_subeffect_set(effect_sets::Empty, effect_sets::Stack);
251+
assert_subeffect_set(effect_sets::Empty, effect_sets::Locals);
252+
assert_subeffect_set(effect_sets::Empty, effect_sets::Allocator);
216253
}
217254

218255
#[test]
219256
fn everything_is_subeffect_of_any() {
220-
assert_subeffect(effect_sets::Empty, effect_sets::Any);
221-
assert_subeffect(effect_sets::Any, effect_sets::Any);
222-
assert_subeffect(effect_sets::Control, effect_sets::Any);
223-
assert_subeffect(effect_sets::Frame, effect_sets::Any);
224-
assert_subeffect(effect_sets::Memory, effect_sets::Any);
225-
assert_subeffect(effect_sets::Locals, effect_sets::Any);
226-
assert_subeffect(effect_sets::PC, effect_sets::Any);
257+
assert_subeffect_set(effect_sets::Empty, effect_sets::Any);
258+
assert_subeffect_set(effect_sets::Any, effect_sets::Any);
259+
assert_subeffect_set(effect_sets::Control, effect_sets::Any);
260+
assert_subeffect_set(effect_sets::Frame, effect_sets::Any);
261+
assert_subeffect_set(effect_sets::Memory, effect_sets::Any);
262+
assert_subeffect_set(effect_sets::Locals, effect_sets::Any);
263+
assert_subeffect_set(effect_sets::PC, effect_sets::Any);
227264
}
228265

229266
#[test]
@@ -232,9 +269,9 @@ mod tests {
232269
for i in [0, 1, 4, 6, 10, 15] {
233270
let e = EffectSet::from_bits(i);
234271
// Testing on bottom, top, and some arbitrary element in the middle
235-
assert_subeffect(effect_sets::Empty, effect_sets::Empty.union(e));
236-
assert_subeffect(effect_sets::Any, effect_sets::Any.union(e));
237-
assert_subeffect(effect_sets::Frame, effect_sets::Frame.union(e));
272+
assert_subeffect_set(effect_sets::Empty, effect_sets::Empty.union(e));
273+
assert_subeffect_set(effect_sets::Any, effect_sets::Any.union(e));
274+
assert_subeffect_set(effect_sets::Frame, effect_sets::Frame.union(e));
238275
}
239276
}
240277

@@ -244,9 +281,9 @@ mod tests {
244281
for i in [0, 3, 6, 8, 15] {
245282
let e = EffectSet::from_bits(i);
246283
// Testing on bottom, top, and some arbitrary element in the middle
247-
assert_subeffect(effect_sets::Empty.intersect(e), effect_sets::Empty);
248-
assert_subeffect(effect_sets::Any.intersect(e), effect_sets::Any);
249-
assert_subeffect(effect_sets::Frame.intersect(e), effect_sets::Frame);
284+
assert_subeffect_set(effect_sets::Empty.intersect(e), effect_sets::Empty);
285+
assert_subeffect_set(effect_sets::Any.intersect(e), effect_sets::Any);
286+
assert_subeffect_set(effect_sets::Frame.intersect(e), effect_sets::Frame);
250287
}
251288
}
252289

@@ -259,9 +296,9 @@ mod tests {
259296

260297
#[test]
261298
fn frame_includes_stack_locals_and_pc() {
262-
assert_subeffect(effect_sets::Stack, effect_sets::Frame);
263-
assert_subeffect(effect_sets::Locals, effect_sets::Frame);
264-
assert_subeffect(effect_sets::PC, effect_sets::Frame);
299+
assert_subeffect_set(effect_sets::Stack, effect_sets::Frame);
300+
assert_subeffect_set(effect_sets::Locals, effect_sets::Frame);
301+
assert_subeffect_set(effect_sets::PC, effect_sets::Frame);
265302
}
266303

267304
#[test]
@@ -272,11 +309,25 @@ mod tests {
272309

273310
#[test]
274311
fn any_includes_some_subeffects() {
275-
assert_subeffect(effect_sets::Allocator, effect_sets::Any);
276-
assert_subeffect(effect_sets::Frame, effect_sets::Any);
277-
assert_subeffect(effect_sets::Memory, effect_sets::Any);
312+
assert_subeffect_set(effect_sets::Allocator, effect_sets::Any);
313+
assert_subeffect_set(effect_sets::Frame, effect_sets::Any);
314+
assert_subeffect_set(effect_sets::Memory, effect_sets::Any);
278315
}
279316

317+
// TODO(Jacob): Fill In
318+
#[test]
319+
fn any_includes_everything() {
320+
}
321+
322+
// TODO(Jacob): Test the following
323+
// union
324+
// intersect
325+
// includes
326+
// exclude
327+
// bit_equal
328+
// overlaps
329+
// print
330+
280331
#[test]
281332
fn display_exact_bits_match() {
282333
assert_eq!(format!("{}", effect_sets::Empty), "Empty");

0 commit comments

Comments
 (0)