Skip to content

Commit e47c806

Browse files
committed
Add backend shape budgets
1 parent 51cf59c commit e47c806

2 files changed

Lines changed: 34 additions & 20 deletions

File tree

‎src/codegen/mod.rs‎

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2266,8 +2266,7 @@ impl CodeGenerator {
22662266
self.emit("sub t2, t0, t1");
22672267
let ok_label = self.fresh_label("mutate_preserved_byte_ok");
22682268
self.emit(format!("beqz t2, {}", ok_label));
2269-
self.emit("li a0, 13");
2270-
self.emit_epilogue();
2269+
self.emit_fail(13);
22712270
self.emit_label(&ok_label);
22722271
}
22732272
}
@@ -2436,8 +2435,7 @@ impl CodeGenerator {
24362435
self.emit("sub t2, t0, t1");
24372436
let ok_label = self.fresh_label("mutate_transition_ok");
24382437
self.emit(format!("beqz t2, {}", ok_label));
2439-
self.emit("li a0, 14");
2440-
self.emit_epilogue();
2438+
self.emit_fail(14);
24412439
self.emit_label(&ok_label);
24422440
}
24432441
}
@@ -2478,8 +2476,7 @@ impl CodeGenerator {
24782476
&transition.operand,
24792477
&format!("{} set.{}", pattern.ty, transition.field),
24802478
) {
2481-
self.emit("li a0, 14");
2482-
self.emit_epilogue();
2479+
self.emit_fail(14);
24832480
}
24842481
}
24852482
}
@@ -2594,8 +2591,7 @@ impl CodeGenerator {
25942591
self.emit("sub t1, t3, t6"); // diff_hi = actual_hi - expected_hi
25952592
self.emit("or t2, t2, t1"); // combined diff = diff_lo | diff_hi
25962593
self.emit(format!("beqz t2, {}", ok_label));
2597-
self.emit("li a0, 14");
2598-
self.emit_epilogue();
2594+
self.emit_fail(14);
25992595
self.emit_label(&ok_label);
26002596
}
26012597
}
@@ -2619,8 +2615,7 @@ impl CodeGenerator {
26192615
self.emit("sub t2, t0, t1");
26202616
let ok_label = self.fresh_label("output_field_ok");
26212617
self.emit(format!("beqz t2, {}", ok_label));
2622-
self.emit("li a0, 3");
2623-
self.emit_epilogue();
2618+
self.emit_fail(3);
26242619
self.emit_label(&ok_label);
26252620
}
26262621

@@ -2668,8 +2663,7 @@ impl CodeGenerator {
26682663
self.emit("sub t2, t0, t1");
26692664
let ok_label = self.fresh_label("output_byte_ok");
26702665
self.emit(format!("beqz t2, {}", ok_label));
2671-
self.emit("li a0, 3");
2672-
self.emit_epilogue();
2666+
self.emit_fail(3);
26732667
self.emit_label(&ok_label);
26742668
}
26752669
}
@@ -2685,8 +2679,7 @@ impl CodeGenerator {
26852679
self.emit("sub t2, t0, t1");
26862680
let ok_label = self.fresh_label("output_byte_ok");
26872681
self.emit(format!("beqz t2, {}", ok_label));
2688-
self.emit("li a0, 3");
2689-
self.emit_epilogue();
2682+
self.emit_fail(3);
26902683
self.emit_label(&ok_label);
26912684
}
26922685
}
@@ -2703,8 +2696,7 @@ impl CodeGenerator {
27032696
self.emit("sub t2, t0, t1");
27042697
let ok_label = self.fresh_label("output_byte_ok");
27052698
self.emit(format!("beqz t2, {}", ok_label));
2706-
self.emit("li a0, 3");
2707-
self.emit_epilogue();
2699+
self.emit_fail(3);
27082700
self.emit_label(&ok_label);
27092701
}
27102702
}
@@ -2722,8 +2714,7 @@ impl CodeGenerator {
27222714
self.emit("sub t2, t0, t1");
27232715
let ok_label = self.fresh_label("output_byte_ok");
27242716
self.emit(format!("beqz t2, {}", ok_label));
2725-
self.emit("li a0, 3");
2726-
self.emit_epilogue();
2717+
self.emit_fail(3);
27272718
self.emit_label(&ok_label);
27282719
}
27292720
}
@@ -2741,8 +2732,7 @@ impl CodeGenerator {
27412732
self.emit("sub t2, t0, t1");
27422733
let ok_label = self.fresh_label("output_byte_ok");
27432734
self.emit(format!("beqz t2, {}", ok_label));
2744-
self.emit("li a0, 3");
2745-
self.emit_epilogue();
2735+
self.emit_fail(3);
27462736
self.emit_label(&ok_label);
27472737
}
27482738
}

‎tests/examples.rs‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,27 @@ use cellscript::{compile_file, ArtifactFormat, CompileOptions, PoolPrimitiveMeta
44
const BUNDLED_EXAMPLES: [&str; 7] =
55
["amm_pool.cell", "launch.cell", "multisig.cell", "nft.cell", "timelock.cell", "token.cell", "vesting.cell"];
66

7+
const BUNDLED_EXAMPLE_ELF_SIZE_BUDGETS: [(&str, usize); 7] = [
8+
("amm_pool.cell", 56 * 1024),
9+
("launch.cell", 48 * 1024),
10+
("multisig.cell", 40 * 1024),
11+
("nft.cell", 64 * 1024),
12+
("timelock.cell", 40 * 1024),
13+
("token.cell", 24 * 1024),
14+
("vesting.cell", 36 * 1024),
15+
];
16+
717
fn example_path(name: &str) -> Utf8PathBuf {
818
Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("examples").join(name)
919
}
1020

21+
fn bundled_example_elf_size_budget(name: &str) -> usize {
22+
BUNDLED_EXAMPLE_ELF_SIZE_BUDGETS
23+
.iter()
24+
.find_map(|(example, budget)| (*example == name).then_some(*budget))
25+
.expect("missing bundled example ELF size budget")
26+
}
27+
1128
#[allow(dead_code)]
1229
struct SchedulerAccessWitness {
1330
operation: u8,
@@ -293,6 +310,13 @@ fn bundled_examples_compile_to_elf() {
293310
.unwrap_or_else(|e| panic!("{} should compile to ELF: {}", example, e.message));
294311

295312
assert!(!result.artifact_bytes.is_empty(), "ELF artifact for {} should be non-empty", example);
313+
assert!(
314+
result.artifact_bytes.len() <= bundled_example_elf_size_budget(example),
315+
"ELF artifact for {} grew past its backend shape budget: {} > {} bytes",
316+
example,
317+
result.artifact_bytes.len(),
318+
bundled_example_elf_size_budget(example)
319+
);
296320
}
297321
}
298322

0 commit comments

Comments
 (0)