summaryrefslogtreecommitdiff
path: root/chapter25/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter25/src/main/java/com')
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/codegen/ElfWriter.java3
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/codegen/Encoding.java9
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/codegen/LinkMem.java3
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/print/ASMPrinter.java3
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];