diff options
| author | Cliff Click <cliffc@acm.org> | 2026-10-22 10:45:43 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-10-22 10:45:43 -0700 |
| commit | dbcaebdefff26658debc29cae284ad4aa0da4c65 (patch) | |
| tree | 27821f9692d7e59bdb22aba855ff577b59fc6fd0 /chapter22/src/main/java/com | |
| parent | 7edca9823ec8ef0aed10c88fa07ef969792aab77 (diff) | |
| download | Simple-dbcaebdefff26658debc29cae284ad4aa0da4c65.tar.gz Simple-dbcaebdefff26658debc29cae284ad4aa0da4c65.zip | |
Split out incomplete type analysis
Diffstat (limited to 'chapter22/src/main/java/com')
4 files changed, 18 insertions, 3 deletions
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java index e5ad596d..3695c6fc 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java @@ -168,6 +168,12 @@ public class CodeGen { // the return is not part of the match). private final HashMap<TypeFunPtr,FunNode> _linker = new HashMap<>(); + // Native symbols belong to function identities, not to one ExternNode. + // Selection and spill copies can turn that node into an ordinary constant. + private final HashMap<TypeFunPtr,String> _externs = new HashMap<>(); + public void externFunc(TypeFunPtr tfp, String name) { _externs.put(tfp.makeFrom(Type.BOTTOM),name); } + public String externFunc(TypeFunPtr tfp) { return _externs.get(tfp.makeFrom(Type.BOTTOM)); } + // Parser object public final Parser P; diff --git a/chapter22/src/main/java/com/seaofnodes/simple/codegen/Encoding.java b/chapter22/src/main/java/com/seaofnodes/simple/codegen/Encoding.java index aad19090..1ed2ed30 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/codegen/Encoding.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/codegen/Encoding.java @@ -135,6 +135,10 @@ public class Encoding implements com.seaofnodes.isa.CodeSink { } public Encoding relo( ConstantNode con ) { TypeFunPtr tfp = (TypeFunPtr)con._con; + // A native address has no local FunNode. Keep its symbol even after + // selection or a spill copy has replaced the original ExternNode. + String name = _code.externFunc(tfp); + if( name!=null ) return external(con,name); _internals.put(con,_code.link(tfp)); return this; } diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/ExternNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/ExternNode.java index 093cc2cb..bfd637dd 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/node/ExternNode.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/node/ExternNode.java @@ -13,7 +13,11 @@ import java.util.BitSet; public class ExternNode extends ConstantNode { public final String _extern; - public ExternNode(Type t, String ex) { super(t); _extern = ex; } + public ExternNode(Type t, String ex) { + super(t); + _extern = ex; + if( t instanceof TypeFunPtr tfp ) CodeGen.CODE.externFunc(tfp,ex); + } @Override public String label() { return "#"+_con+":"+_extern; } diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java index 720a14c1..62b50cef 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/node/cpus/arm/TFPARM.java @@ -38,8 +38,9 @@ public class TFPARM extends ConstantNode implements MachNode, RIPRelSize { int base = opStart & ~0xFFF; delta = target-base; int adrp_delta = delta >> 12; - // patch upper 20 bits via adrp - enc.patch4(opStart, Arm64.adrp(1, adrp_delta & 0b11, 0b10000, adrp_delta >> 2, rpc)); + // ADRP splits a signed page offset into two unsigned bit fields. + // Mask the high field too, including for an address below this PC. + enc.patch4(opStart, Arm64.adrp(1, adrp_delta & 0b11, 0b10000, (adrp_delta >> 2) & 0x7FFFF, rpc)); // low 12 bits via add enc.patch4(opStart+4, Arm64.imm_inst_l(Arm64.OPI_ADD, delta & 0xfff, rpc)); } else { |
