diff options
Diffstat (limited to 'chapter25/src/main/java')
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; } |
