mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 13:11:00 +00:00
[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:
parent
60730a5b12
commit
f7bf77c2b7
2 changed files with 39 additions and 2 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue