From 7f42677a34921b2084a3df8a16e1ecf8d981e1cd Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 2 Oct 2023 21:38:16 +0900 Subject: [PATCH] [qfcc] Clean up the last general uses of expr's next It's now meant only for ALLOC. Interestingly, when DEBUG_QF_MEMORY is defined in expr.c, something breaks badly with vkgen (no sniffles out of valgrind, though), but everything is fine with it not defined. It seems there may be some unpleasant UB going on somewhere. --- tools/qfcc/include/expr.h | 4 ++-- tools/qfcc/source/dot_expr.c | 14 +++----------- tools/qfcc/source/expr.c | 7 ------- tools/qfcc/source/expr_assign.c | 26 +++++++++++++++----------- tools/qfcc/source/expr_vector.c | 7 +------ tools/qfcc/source/statements.c | 7 ++----- 6 files changed, 23 insertions(+), 42 deletions(-) diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 4fb859faf..a1650cbed 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -129,7 +129,7 @@ typedef struct { typedef struct { type_t *type; ///< Type of vector (vector/quaternion) - const expr_t *list; ///< Linked list of element expressions. + ex_list_t list; ///< Linked list of element expressions. } ex_vector_t; typedef struct { @@ -310,7 +310,7 @@ typedef struct { #define POINTER_VAL(p) (((p).def ? (p).def->offset : 0) + (p).val) typedef struct expr_s { - expr_t *next; + expr_t *next; expr_type type; ///< the type of the result of this expression int line; ///< source line that generated this expression pr_string_t file; ///< source file that generated this expression diff --git a/tools/qfcc/source/dot_expr.c b/tools/qfcc/source/dot_expr.c index 9e774a5ff..672e49848 100644 --- a/tools/qfcc/source/dot_expr.c +++ b/tools/qfcc/source/dot_expr.c @@ -178,8 +178,6 @@ print_bool (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t *n i); dasprintf (dstr, "%*s\n", indent + 2, ""); dasprintf (dstr, "%*s>];\n", indent, ""); - if (e->next) - next = e->next; _print_expr (dstr, e->boolean.e, level, id, next); for (i = 0; i < tl_count; i++) dasprintf (dstr, "%*se_%p:t%d -> e_%p;\n", indent, "", e, i, @@ -195,8 +193,6 @@ print_label (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t * { int indent = level * 2 + 2; - if (e->next) - next = e->next; if (next) dasprintf (dstr, "%*se_%p -> e_%p [constraint=true,style=dashed];\n", indent, "", e, next); @@ -209,8 +205,6 @@ print_labelref (dstring_t *dstr, const expr_t *e, int level, int id, const expr_ { int indent = level * 2 + 2; - if (e->next) - next = e->next; if (next) dasprintf (dstr, "%*se_%p -> e_%p [constraint=true,style=dashed];\n", indent, "", e, next); @@ -227,7 +221,7 @@ print_block (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t *exprs[num_exprs + 1]; list_scatter (&e->block.list, exprs); - exprs[num_exprs] = 0; + exprs[num_exprs] = next; int colspan = num_exprs ? num_exprs : 1; @@ -397,9 +391,6 @@ print_conditional (dstring_t *dstr, const expr_t *e, int level, int id, const ex e->branch.test); dasprintf (dstr, "%*se_%p -> \"e_%p\" [label=\"g\"];\n", indent, "", e, e->branch.target); - if (e->next) { - next = e->next; - } if (next) { dasprintf (dstr, "%*se_%p -> e_%p [constraint=true," "style=dashed];\n", indent, "", e, next); @@ -520,7 +511,8 @@ print_vector (dstring_t *dstr, const expr_t *e, int level, int id, const expr_t { int indent = level * 2 + 2; - for (const expr_t *ele = e->vector.list; ele; ele = ele->next) { + for (auto li = e->vector.list.head; li; li = li->next) { + auto ele = li->expr; _print_expr (dstr, ele, level, id, next); dasprintf (dstr, "%*se_%p -> \"e_%p\";\n", indent, "", e, ele); } diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 2e192159f..d58a681fc 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -1384,9 +1384,6 @@ append_expr (expr_t *block, const expr_t *e) if (!e || e->type == ex_error) return block; - if (e->next) - internal_error (e, "append_expr: expr loop detected"); - auto li = new_listitem (e); *block->block.tail = li; block->block.tail = &li->next; @@ -1403,9 +1400,6 @@ prepend_expr (expr_t *block, const expr_t *e) if (!e || e->type == ex_error) return block; - if (e->next) - internal_error (e, "append_expr: expr loop detected"); - auto li = new_listitem (e); li->next = block->block.head; block->block.head = li; @@ -1591,7 +1585,6 @@ convert_from_bool (const expr_t *e, type_t *type) } auto cond = new_expr (); *cond = *e; - cond->next = 0; return conditional_expr (cond, one, zero); } diff --git a/tools/qfcc/source/expr_assign.c b/tools/qfcc/source/expr_assign.c index 43e9029e9..6892fd465 100644 --- a/tools/qfcc/source/expr_assign.c +++ b/tools/qfcc/source/expr_assign.c @@ -230,12 +230,15 @@ copy_qv_elements (expr_t *block, const expr_t *dst, const expr_t *src) const expr_t *dw, *sw; const expr_t *ds, *ss; const expr_t *dv, *sv; + int count = list_count (&src->vector.list); + const expr_t *components[count]; + list_scatter (&src->vector.list, components); if (is_vector (src->vector.type)) { // guaranteed to have three elements - sx = src->vector.list; - sy = sx->next; - sz = sy->next; + sx = components[0]; + sy = components[1]; + sz = components[2]; dx = field_expr (dst, new_name_expr ("x")); dy = field_expr (dst, new_name_expr ("y")); dz = field_expr (dst, new_name_expr ("z")); @@ -244,12 +247,12 @@ copy_qv_elements (expr_t *block, const expr_t *dst, const expr_t *src) append_expr (block, assign_expr (dz, sz)); } else { // guaranteed to have two or four elements - if (src->vector.list->next->next) { + if (count == 4) { // four vals: x, y, z, w - sx = src->vector.list; - sy = sx->next; - sz = sy->next; - sw = sz->next; + sx = components[0]; + sy = components[1]; + sz = components[2]; + sw = components[3]; dx = field_expr (dst, new_name_expr ("x")); dy = field_expr (dst, new_name_expr ("y")); dz = field_expr (dst, new_name_expr ("z")); @@ -260,8 +263,8 @@ copy_qv_elements (expr_t *block, const expr_t *dst, const expr_t *src) append_expr (block, assign_expr (dw, sw)); } else { // v, s - sv = src->vector.list; - ss = sv->next; + sv = components[0]; + ss = components[1]; dv = field_expr (dst, new_name_expr ("v")); ds = field_expr (dst, new_name_expr ("s")); append_expr (block, assign_expr (dv, sv)); @@ -274,7 +277,8 @@ static int copy_elements (expr_t *block, const expr_t *dst, const expr_t *src, int base) { int index = 0; - for (const expr_t *e = src->vector.list; e; e = e->next) { + for (auto li = src->vector.list.head; li; li = li->next) { + auto e = li->expr; if (e->type == ex_vector) { index += copy_elements (block, dst, e, index + base); } else { diff --git a/tools/qfcc/source/expr_vector.c b/tools/qfcc/source/expr_vector.c index 1dced7ec1..76a512994 100644 --- a/tools/qfcc/source/expr_vector.c +++ b/tools/qfcc/source/expr_vector.c @@ -132,14 +132,9 @@ new_vector_list (const expr_t *expr_list) return vec; } - for (int i = 0; i < count; i++) { - //FIXME this should use ex_list - ((expr_t *) elements[i])->next = (expr_t *) elements[i + 1]; - } - expr_t *vec = new_expr (); vec->type = ex_vector; vec->vector.type = vector_type (ele_type, width); - vec->vector.list = elements[0]; + list_gather (&vec->vector.list, elements, count); return vec; } diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index c529f37e6..52364bebd 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -1926,7 +1926,8 @@ static int statement_copy_elements (sblock_t **sblock, const expr_t *dst, const expr_t *src, int base) { int index = 0; - for (const expr_t *e = src->vector.list; e; e = e->next) { + for (auto li = src->vector.list.head; li; li = li->next) { + auto e = li->expr; if (e->type == ex_vector) { index += statement_copy_elements (sblock, dst, e, index + base); } else { @@ -2073,15 +2074,12 @@ build_bool_block (expr_t *block, expr_t *e) build_bool_block (block, (expr_t *) e->boolean.e); return; case ex_label: - e->next = 0; append_expr (block, e); return; case ex_assign: - e->next = 0; append_expr (block, e); return; case ex_branch: - e->next = 0; append_expr (block, e); return; case ex_expr: @@ -2089,7 +2087,6 @@ build_bool_block (expr_t *block, expr_t *e) build_bool_block (block, (expr_t *) e->expr.e1); build_bool_block (block, (expr_t *) e->expr.e2); } else { - e->next = 0; append_expr (block, e); } return;