Changeset: d01d05a28dc2 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d01d05a28dc2 Modified Files: sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c Branch: graph0 Log Message:
Fix SEGV in MAL codegen At least now we know why in existing code the instr ptr is reassigned in every API call of the codegen. diffs (124 lines): diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -2824,25 +2824,25 @@ static int // let's start with the first join jr1 = newTmpVariable(mb, TYPE_any); join = newStmt(mb, algebraRef, "subsemijoin"); - pushReturn(mb, join, jr1); - pushArgument(mb, join, ref_left); - pushArgument(mb, join, ref_domain); - pushNil(mb, join, TYPE_bat); - pushNil(mb, join, TYPE_bat); - pushBit(mb, join, FALSE); - pushLng(mb, q, getDestVar(cnt1)); + join = pushReturn(mb, join, jr1); + join = pushArgument(mb, join, ref_left); + join = pushArgument(mb, join, ref_domain); + join = pushNil(mb, join, TYPE_bat); + join = pushNil(mb, join, TYPE_bat); + join = pushBit(mb, join, FALSE); + join = pushArgument(mb, join, getDestVar(cnt1)); // jl1 = getDestVar(join); // second join jr2 = newTmpVariable(mb, TYPE_any); join = newStmt(mb, algebraRef, "subsemijoin"); - pushReturn(mb, join, jr2); - pushArgument(mb, join, ref_right); - pushArgument(mb, join, ref_domain); - pushArgument(mb, join, jr1); - pushNil(mb, join, TYPE_bat); - pushBit(mb, join, FALSE); - pushLng(mb, q, getDestVar(cnt1)); + join = pushReturn(mb, join, jr2); + join = pushArgument(mb, join, ref_right); + join = pushArgument(mb, join, ref_domain); + join = pushArgument(mb, join, jr1); + join = pushNil(mb, join, TYPE_bat); + join = pushBit(mb, join, FALSE); + join = pushArgument(mb, join, getDestVar(cnt1)); jl2 = getDestVar(join); // qtemp = newTmpVariable(mb, TYPE_bat); // qfrom @@ -2856,8 +2856,8 @@ static int // if |jr1| > |jr2| cmp = newStmt(mb, "calc", "=="); - pushArgument(mb, cmp, getDestVar(cnt1)); - pushArgument(mb, cmp, getDestVar(cnt2)); + cmp = pushArgument(mb, cmp, getDestVar(cnt1)); + cmp = pushArgument(mb, cmp, getDestVar(cnt2)); stmt_if = newAssignment(mb); stmt_if->barrier = BARRIERsymbol; stmt_if = pushArgument(mb, stmt_if, getDestVar(cmp)); @@ -2865,13 +2865,13 @@ static int // third join jr3 = newTmpVariable(mb, TYPE_any); join = newStmt(mb, algebraRef, "subsemijoin"); - pushReturn(mb, join, jr3); - pushArgument(mb, join, ref_left); - pushArgument(mb, join, ref_domain); - pushArgument(mb, join, jl2); // candidate list for ref_left - pushNil(mb, join, TYPE_bat); - pushBit(mb, join, FALSE); - pushArgument(mb, join, getDestVar(cnt2)); + join = pushReturn(mb, join, jr3); + join = pushArgument(mb, join, ref_left); + join = pushArgument(mb, join, ref_domain); + join = pushArgument(mb, join, jl2); // candidate list for ref_left + join = pushNil(mb, join, TYPE_bat); + join = pushBit(mb, join, FALSE); + join = pushArgument(mb, join, getDestVar(cnt2)); // jl3 = getDestVar(join); qfrom_oid = newAssignment(mb); @@ -2884,7 +2884,7 @@ static int // else |jr1| == |jr2| cmp_not = newStmt(mb, calcRef, notRef); - pushArgument(mb, cmp_not, getDestVar(cmp)); + cmp_not = pushArgument(mb, cmp_not, getDestVar(cmp)); stmt_else = newAssignment(mb); stmt_else->barrier = BARRIERsymbol; stmt_else = pushArgument(mb, stmt_else, getDestVar(cmp_not)); @@ -2952,13 +2952,13 @@ static int // spfw(V:bat[:oid], E:bat[:oid], W:bat[:lng], qf:bat[:oid], qt:bat[:oid]) q = newStmt(mb, graphRef, "spfw"); - pushReturn(mb, q, newTmpVariable(mb, TYPE_bat)); - pushReturn(mb, q, newTmpVariable(mb, TYPE_bat)); - pushArgument(mb, q, qfrom); - pushArgument(mb, q, qto); - pushNil(mb, q, TYPE_bat); - pushArgument(mb, q, left); - pushArgument(mb, q, right); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_bat)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_bat)); + q = pushArgument(mb, q, qfrom); + q = pushArgument(mb, q, qto); + q = pushNil(mb, q, TYPE_bat); + q = pushArgument(mb, q, left); + q = pushArgument(mb, q, right); // abi convention for st_result s->nr = getDestVar(q); // qfrom diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -1714,6 +1714,7 @@ static void stack_push_children(sql_stack *stk, stmt *s) { switch (s->type) { + case st_concat: case st_list: stack_push_list(stk, s->op4.lval); break; @@ -1786,6 +1787,7 @@ print_stmt(sql_allocator *sa, stmt *s) case st_atom: printf("z%d := '%s':%s\n", s->nr, atom2string(sa, s->op4.aval), s->op4.aval->tpe.type->base.name); break; + case st_concat: case st_list:{ node *n; printf("z%d := %s(", s->nr, st_type2string(s->type)); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list