blob: f0ac717a30ff9223e80ebfc9955ae01d1f9f502d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package com.seaofnodes.simple;
import com.seaofnodes.print.IRAdapter;
import com.seaofnodes.simple.node.*;
import java.util.ArrayList;
import com.seaofnodes.simple.SB;
import com.seaofnodes.simple.CodeGen;
/** This chapter's read-only IR facts and the familiar debugger entry points. */
public final class IRPrinter extends IRAdapter<Node> {
private static final com.seaofnodes.print.IRPrinter<Node> PRINT =
new com.seaofnodes.print.IRPrinter<>(new IRPrinter());
@Override public String type(Node n) { return n._type==null ? "" : n._type.str(); }
@Override public String inputMark(Node n, Node def) { return n instanceof MemMergeNode && def instanceof MemMergeNode ? "^" : " "; }
@Override public Kind kind(Node n) {
if( n instanceof StartNode ) return Kind.START;
if( n instanceof StopNode ) return Kind.STOP;
if( n instanceof FunNode ) return Kind.FUN;
if( n instanceof LoopNode ) return Kind.LOOP;
if( n instanceof RegionNode ) return Kind.REGION;
if( n instanceof ParmNode ) return Kind.PARM;
if( n instanceof PhiNode ) return Kind.PHI;
if( n instanceof CallEndNode ) return Kind.CALL_END;
if( n instanceof CallNode ) return Kind.CALL;
if( n instanceof ReturnNode ) return Kind.RETURN;
if( n instanceof ConstantNode ) return Kind.CONSTANT;
if( n instanceof CProjNode ) return Kind.CPROJ;
if( n instanceof ProjNode ) return n instanceof CFGNode ? Kind.CPROJ : Kind.PROJ;
if( n instanceof CFGNode ) return Kind.CTRL;
if( n instanceof MultiNode ) return Kind.MULTI;
return Kind.DATA;
}
@Override public int index(Node n) {
if( n instanceof ProjNode p ) return p._idx;
if( n instanceof CProjNode p ) return p._idx;
return n._nid;
}
@Override public String functionName(Node n) { return ((FunNode)n)._name==null ? "" : ((FunNode)n)._name; }
@Override public String signature(Node n) {
FunNode fun=(FunNode)n;
return (fun._name==null ? "" : fun._name)+" "+fun.sig().str();
}
public static String prettyPrint(Node n, int depth) { return PRINT.prettyPrint(n,depth); }
public static SB printLine(Node n, SB sb) { return sb.p(PRINT.line(n)); }
public static String prettyPrint(CodeGen code) {
var units=new ArrayList<com.seaofnodes.print.IRPrinter.Unit<Node>>();
var funs=new ArrayList<Node>();
for( Node n : code._start._outputs ) if( n instanceof FunNode ) funs.add(n);
units.add(new com.seaofnodes.print.IRPrinter.Unit<>(null,null,null,funs));
return PRINT.program(code._start,code._stop,units);
}
}
|