Skip to content

Commit

Permalink
Chore: Ordering of modules now deterministic in compiled code
Browse files Browse the repository at this point in the history
Previously, the order of modules depended on the ordering of the hashes of instances of ModuleDefinition, which likely depended on run-time addresses. To ensure we generate code deterministically irrespective of run-time addresses, I sort the module definitions by their full name before iterative over them.
  • Loading branch information
MikaelMayer committed Aug 12, 2024
1 parent d38be44 commit d956ed7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Source/DafnyCore/Backends/Dafny/DafnyCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2961,6 +2961,12 @@ protected override void EmitSingleValueGenerator(Expression e, bool inLetExprBod
AddUnsupportedFeature(e.Tok, Feature.ExactBoundedPool);
}

protected override void OrganizeModules(Program program, out List<ModuleDefinition> modules) {
modules = program.CompileModules.ToList();
modules.Sort((a, b) =>
String.Compare(a.FullDafnyName, b.FullDafnyName, StringComparison.Ordinal));
}

protected override void EmitHaltRecoveryStmt(Statement body, string haltMessageVarName, Statement recoveryBody, ConcreteSyntaxTree wr) {
TrStmt(body, wr);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// NONUNIFORM: Test of the Rust compiler to ensure it emits modules in a deterministic order.
// RUN: %baredafny translate rs "%s" > "%t"
// RUN: %OutputCheck --file-to-check "%S/moduleordering-rust/src/moduleordering.rs" "%s"
// CHECK-L: pub mod A {
// CHECK-L: pub mod B {
// CHECK-L: pub mod C {
// CHECK-L: pub mod D {
// CHECK-L: pub mod E {
// CHECK-L: pub mod F {
// CHECK-L: pub mod G {
// CHECK-L: pub mod H {

module B { const X := "B" }
module D { import B const X := B.X }
module C { import A const X := A.X }
module E { import C const X := C.X }
module A { import G const X := G.X }
module G { const X := "G" }
module F { const X := "F" }
module H { const X := "H" }

0 comments on commit d956ed7

Please sign in to comment.