summaryrefslogtreecommitdiff
path: root/chapter25/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-23 16:35:50 -0700
committerCliff Click <cliffc@acm.org>2026-09-23 16:35:50 -0700
commit0f32001b466def0cee753557ad6e296cf15e2504 (patch)
tree9e16038c574407bbd3f5c21f469c2df71e6835f8 /chapter25/src/main/java/com/seaofnodes
parent695429df954b084d2226fe2a6c1a47e1861bcc01 (diff)
downloadSimple-0f32001b466def0cee753557ad6e296cf15e2504.tar.gz
Simple-0f32001b466def0cee753557ad6e296cf15e2504.zip
Keyboard shortcuts
Fast forward/reverse, pick-a-frame. Shorter type names.
Diffstat (limited to 'chapter25/src/main/java/com/seaofnodes')
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java12
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java8
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/type/TypeMem.java4
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java6
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/type/TypeStruct.java8
5 files changed, 33 insertions, 5 deletions
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
index 506ac3e2..e0c87682 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
@@ -3,6 +3,7 @@ package com.seaofnodes.simple.print;
import com.seaofnodes.graph.GraphAdapter;
import com.seaofnodes.graph.GraphSnapshot;
import com.seaofnodes.graph.GraphSnapshot.*;
+import com.seaofnodes.simple.codegen.CodeGen;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.node.Node;
import com.seaofnodes.simple.type.TypeMem;
@@ -19,6 +20,13 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
@Override protected int nOuts(Node n) { return n.nOuts(); }
@Override protected Node out(Node n, int idx) { return n.out(idx); }
+ @Override protected boolean show(Node n) {
+ if( n != CodeGen.CODE.ZERO && n != CodeGen.CODE.XCTRL ) return true;
+ for( int i=0; i<n.nOuts(); i++ )
+ if( n.out(i) != null ) return true;
+ return false; // The parser's keep is not a graph use.
+ }
+
private ArrayList<Edge> edges(Node n) {
var edges = new ArrayList<Edge>();
for( int i = 0; i < n.nIns(); i++ ) {
@@ -43,7 +51,7 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
if( n instanceof StartCUNode ) return Kind.UNIT;
if( n instanceof FunNode ) return Kind.FUN;
// Start inherits Loop for whole-program analysis, but is not a source loop.
- if( n instanceof StartNode ) return Kind.CTRL;
+ if( n instanceof StartNode ) return Kind.START;
if( n instanceof LoopNode ) return Kind.LOOP;
if( n instanceof RegionNode ) return Kind.REGION;
if( n instanceof PhiNode ) return Kind.PHI;
@@ -59,6 +67,8 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
return i == 0 ? Role.ASSOC : isMem(n) ? Role.MEM : Role.DATA;
if( n instanceof Proj )
return n instanceof CFGNode ? Role.CTRL : isMem(n) ? Role.MEM : Role.DATA;
+ // StartCU inherits Region, but slot 0 really connects it to Start.
+ if( n instanceof StartCUNode && i == 0 ) return Role.CTRL;
if( n instanceof RegionNode && i == 0 ) return Role.ASSOC;
// Preserve known slot roles even when an input is not attached/typed yet.
if( i == 0 || n instanceof RegionNode || n instanceof StopNode ) return Role.CTRL;
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java
index a553f90e..56f47bff 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeFunPtr.java
@@ -310,10 +310,16 @@ public class TypeFunPtr extends TypeNil {
return true;
}
- @Override public String str() { return "{"+printFIDX()+"}"; }
+ @Override public String str() {
+ if( this==BOT ) return "FunBot";
+ if( this==BOT.dual() ) return "FunTop";
+ return "{"+printFIDX()+"}";
+ }
@Override
SB _print(SB sb, BitSet visit, boolean html ) {
+ if( this==BOT ) return sb.p("FunBot");
+ if( this==BOT.dual() ) return sb.p("FunTop");
sb.p(x()).p("{ ");
if( _sig!=null )
for( Type t : _sig )
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMem.java b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMem.java
index dbcc9056..9ae68bcf 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMem.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMem.java
@@ -200,6 +200,8 @@ public class TypeMem extends Type {
}
@Override public SB _print(SB sb, BitSet visit, boolean html) {
+ if( this==BOT ) return sb.p("MemBot");
+ if( this==TOP ) return sb.p("MemTop");
sb.p('#');
if( !_final ) sb.p('!'); // Mutable memory
if( _one ) sb.p(_clz ? 'z' : '-');
@@ -211,6 +213,8 @@ public class TypeMem extends Type {
}
@Override public String str() {
+ if( this==BOT ) return "MemBot";
+ if( this==TOP ) return "MemTop";
SB sb = new SB().p('#');
if( !_final ) sb.p('!'); // Mutable memory
if( _one ) sb.p(_clz ? 'z' : '-');
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
index 5b9cf7e1..540f36ff 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
@@ -150,14 +150,16 @@ public class TypeMemPtr extends TypeNil {
}
@Override public String str() {
+ if( this==BOT ) return "PtrBot";
+ if( this==TOP ) return "PtrTop";
if( this== NOTBOT) return "*void";
- if( this== BOT) return "*void?";
return x()+"*"+(_obj==null?"---":_obj.str())+q();
}
@Override SB _print(SB sb, BitSet visit, boolean html ) {
+ if( this==BOT ) return sb.p("PtrBot");
+ if( this==TOP ) return sb.p("PtrTop");
if( this== NOTBOT) return sb.p("*void");
- if( this== BOT) return sb.p("*void?");
return _obj.print(sb.p(x()).p("*"),visit,html).p(q());
}
}
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeStruct.java b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeStruct.java
index a32e812c..0d6700b9 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/type/TypeStruct.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/type/TypeStruct.java
@@ -546,6 +546,8 @@ public class TypeStruct extends Type {
@Override
SB _print(SB sb, BitSet visit, boolean html ) {
+ if( this==BOT ) return sb.p("StructBot");
+ if( this==TOP ) return sb.p("StructTop");
if( isFree() ) return sb.p("FREE:").p(_name);
if( isAry() && field("[]")._t instanceof TypeConAry con )
return sb.p(con.str());
@@ -564,7 +566,11 @@ public class TypeStruct extends Type {
return sb.p("}");
}
- @Override public String str() { return (isFree() ? "FREE:":"")+_name; }
+ @Override public String str() {
+ if( this==BOT ) return "StructBot";
+ if( this==TOP ) return "StructTop";
+ return (isFree() ? "FREE:":"")+_name;
+ }
public boolean isAry() { return find("[]")!=-1; }