diff options
| author | Cliff Click <cliffc@acm.org> | 2026-09-19 14:41:56 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-09-19 14:41:56 -0700 |
| commit | 628d94039c38f9d13df661da66df69943ccb2061 (patch) | |
| tree | 883bcbb1e0af08479b74fd58d6e97b3379bc5c43 /chapter25/src/main/java/com | |
| parent | a78b1bd06f79652e268b1a530d579b0faf665031 (diff) | |
| download | Simple-628d94039c38f9d13df661da66df69943ccb2061.tar.gz Simple-628d94039c38f9d13df661da66df69943ccb2061.zip | |
Handle r/w <clinit> sections
Diffstat (limited to 'chapter25/src/main/java/com')
4 files changed, 10 insertions, 8 deletions
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<Relo>[] 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<Relo> 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<Relo>[] 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<Relo> relos = raligns[align]==null ? (raligns[align]=new Ary<>( Relo.class)) : raligns[align]; |
