From 628d94039c38f9d13df661da66df69943ccb2061 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sat, 19 Sep 2026 14:41:56 -0700 Subject: Handle r/w sections --- .../src/main/java/com/seaofnodes/simple/codegen/ElfWriter.java | 3 +-- .../src/main/java/com/seaofnodes/simple/codegen/Encoding.java | 9 +++++++-- .../src/main/java/com/seaofnodes/simple/codegen/LinkMem.java | 3 +-- .../src/main/java/com/seaofnodes/simple/print/ASMPrinter.java | 3 +-- 4 files changed, 10 insertions(+), 8 deletions(-) (limited to 'chapter25/src/main/java/com') diff --git a/chapter25/src/main/java/com/seaofnodes/simple/codegen/ElfWriter.java b/chapter25/src/main/java/com/seaofnodes/simple/codegen/ElfWriter.java index 7af7e5f1..a74303e6 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/codegen/ElfWriter.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/codegen/ElfWriter.java @@ -319,8 +319,7 @@ public class ElfWriter { // Write relocations for the constant pool String cpoolPrefix = _code.entryClinitName().replaceAll("[^A-Za-z0-9_$]", "_") + "$CPOOL$"; for( Encoding.Relo relo : enc._bigCons.values() ) { - boolean ro = !(relo._t instanceof TypeStruct ts) || ts.isConstant(); - DataSection data = ro ? rodata : rwdata; + DataSection data = relo.readOnly() ? rodata : rwdata; int symidx = symbols.symbol(cpoolPrefix+symbols.gidx(), data._index, SYM_BIND_GLOBAL, SYM_TYPE_FUNC, relo._target, relo._t.size()); relocations.writeReloOffPlus(relo._opStart+relo._off, symidx, relo._elf ); } diff --git a/chapter25/src/main/java/com/seaofnodes/simple/codegen/Encoding.java b/chapter25/src/main/java/com/seaofnodes/simple/codegen/Encoding.java index 4c7475fd..48ca4335 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/codegen/Encoding.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/codegen/Encoding.java @@ -53,6 +53,12 @@ public class Encoding { Relo( Node op, Type t, byte off, byte elf ) { _op=op; _t=t; _off=off; _elf=elf; } + public boolean readOnly() { + // Class initializers still write their fields, even when every + // final value is constant. Their storage must remain writable. + return !(_t instanceof TypeStruct ts) || + (!Parser.startsClzPrefix(ts._name) && ts.isConstant()); + } } Encoding( CodeGen code ) { @@ -510,8 +516,7 @@ public class Encoding { Ary[] raligns = new Ary[5]; for( Node op : _bigCons.keySet() ) { Relo relo = _bigCons.get(op); - // non-constant structs in the r/w data, everything else in r/o data - if( (relo._t instanceof TypeStruct ts && !ts.isConstant()) == ro ) + if( relo.readOnly() != ro ) continue; int align = relo._t.alignment(); Ary relos = raligns[align]==null ? (raligns[align]=new Ary<>(Relo.class)) : raligns[align]; diff --git a/chapter25/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java b/chapter25/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java index e0b59395..d249b80c 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java @@ -23,8 +23,7 @@ public class LinkMem { // Patch local ops, e.g. loading float constants from the constant pool for( Node op : enc._bigCons.keySet() ) { Encoding.Relo relo = enc._bigCons.get(op); - boolean ro = !(relo._t instanceof TypeStruct ts) || ts.isConstant(); - int target = relo._target+(ro ? cpool : sdata); + int target = relo._target+(relo.readOnly() ? cpool : sdata); ((RIPRelSize)relo._op).patch(enc, relo._opStart, enc.opLen(relo._op), target - relo._opStart); } diff --git a/chapter25/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java b/chapter25/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java index e15d7dbe..7f9f3ad9 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java @@ -45,8 +45,7 @@ public abstract class ASMPrinter { Ary[] raligns = new Ary[5]; for( Node op : bigCons.keySet() ) { Relo relo = bigCons.get(op); - // non-constant structs in the r/w data, everything else in r/o data - if( (relo._t instanceof TypeStruct ts && !ts.isConstant()) == ro ) + if( relo.readOnly() != ro ) continue; int align = relo._t.alignment(); Ary relos = raligns[align]==null ? (raligns[align]=new Ary<>( Relo.class)) : raligns[align]; -- cgit v1.2.3