[qfcc] Support type expressions in dot output

The graph isn't great, but it's better than invalid expression nodes.
This commit is contained in:
Bill Currie 2024-04-30 11:02:04 +09:00
parent 60730a5b12
commit f7bf77c2b7
2 changed files with 39 additions and 2 deletions

View file

@ -310,6 +310,7 @@ typedef struct {
int op; ///< type "function"
const expr_t *params; ///< if dynamic
const type_t *type;
const symbol_t *sym;
} ex_type_t;
#define POINTER_VAL(p) (((p).def ? (p).def->offset : 0) + (p).val)

View file

@ -92,13 +92,29 @@ get_op_string (int op)
case QC_SHR: return ">>";
case '.': return ".";
case 'C': return "<cast>";
case QC_SCALE: return "@scale";
case QC_GEOMETRIC: return "@geometric";
case QC_QMUL: return "@qmul";
case QC_QVMUL: return "@qvmul";
case QC_VQMUL: return "@vqmul";
case QC_HADAMARD: return "@hadamard";
case QC_CROSS: return "@cross";
case QC_DOT: return "@dot";
case QC_WEDGE: return "@wedge";
case QC_REGRESSIVE: return "@regressive";
case QC_GEOMETRIC: return "@geometric";
case QC_SCALE: return "@scale";
case QC_AT_FIELD: return "@field";
case QC_AT_POINTER: return "@pointer";
case QC_AT_ARRAY: return "@array";
case QC_AT_BASE: return "@base";
case QC_AT_WIDTH: return "@width";
case QC_AT_VECTOR: return "@vector";
case QC_AT_ROWS: return "@rows";
case QC_AT_COLS: return "@cols";
case QC_AT_MATRIX: return "@matrix";
case QC_AT_INT: return "@int";
case QC_AT_UINT: return "@uint";
case QC_AT_BOOL: return "@bool";
case QC_AT_FLOAT: return "@float";
default:
return "unknown";
}
@ -311,6 +327,25 @@ print_list (dstring_t *dstr, const expr_t *e, int level, int id,
}
}
static void
print_type_expr (dstring_t *dstr, const expr_t *e, int level, int id,
const expr_t *next)
{
int indent = level * 2 + 2;
const char *str = "(null)";
if (e->typ.op) {
_print_expr (dstr, e->typ.params, level + 1, id, nullptr);
dasprintf (dstr, "%*se_%p -> e_%p;\n", indent, "", e, e->typ.params);
str = get_op_string (e->typ.op);
} else if (e->typ.type) {
str = e->typ.type->encoding;
} else if (e->typ.sym) {
str = e->typ.sym->name;
}
dasprintf (dstr, "%*se_%p [label=\"%s\\n%d\"];\n", indent, "", e,
str, e->loc.line);
}
static void
print_subexpr (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t *next)
{
@ -743,6 +778,7 @@ _print_expr (dstring_t *dstr, const expr_t *e, int level, int id,
[ex_extend] = print_extend,
[ex_multivec] = print_multivec,
[ex_list] = print_list,
[ex_type] = print_type_expr,
};
int indent = level * 2 + 2;