summaryrefslogtreecommitdiff
path: root/chapter18/src/main/java/com/seaofnodes/simple/IRPrinter.java
blob: c7ca8cf471b43507d65b02bd54a266d41e6e66ca (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 n.label(); }
    @Override public String signature(Node n) {
        FunNode fun=(FunNode)n;
        return 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);
    }
}