summaryrefslogtreecommitdiff
path: root/chapter16/src/main/java/com/seaofnodes/simple/IRPrinter.java
blob: 7e93e9dac79a42412b63e32352d424af22ae611e (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
package com.seaofnodes.simple;

import com.seaofnodes.print.IRAdapter;
import com.seaofnodes.simple.node.*;

/** 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 LoopNode ) return Kind.LOOP;
        if( n instanceof RegionNode ) return Kind.REGION;
        if( n instanceof PhiNode ) return Kind.PHI;
        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;
    }

    public static String prettyPrint(Node n, int depth) { return PRINT.prettyPrint(n,depth); }
}