]> granicus.if.org Git - yasm/commitdiff
Fix expr simplification bug.
authorPeter Johnson <peter@tortall.net>
Tue, 30 Sep 2008 03:56:37 +0000 (03:56 -0000)
committerPeter Johnson <peter@tortall.net>
Tue, 30 Sep 2008 03:56:37 +0000 (03:56 -0000)
If an expression of the form INT+(a+b)+INT was simplified, constant folding
would combine the ints, but then the level stage (to make INT+a+b) would
start reading from the second (deleted due to folding) INT rather than the
new end of the expression.

Reported by: Samuel Thibault (on yasm-devel@)

svn path=/trunk/yasm/; revision=2123

libyasm/expr.c
libyasm/tests/Makefile.inc
libyasm/tests/expr-fold-level.asm [new file with mode: 0644]
libyasm/tests/expr-fold-level.hex [new file with mode: 0644]

index 14a52264d56bb84e7c14f1e22529dc5461873755..20e524732525f0a078312da97ebdfe8fa1faf780 100644 (file)
@@ -741,7 +741,7 @@ expr_level_op(/*@returned@*/ /*@only@*/ yasm_expr *e, int fold_const,
      * ordering as was present originally.
      * Combine integer terms as necessary.
      */
-    for (i=e->numterms-1, o=level_numterms-1; i>=0; i--) {
+    for (i=fold_numterms-1, o=level_numterms-1; i>=0; i--) {
         if (e->terms[i].type == YASM_EXPR_EXPR &&
             e->terms[i].data.expn->op == e->op) {
             /* bring up subexpression */
index ad65464a9fa2461a2658b3af0d0b9c7fbf1a532b..23f422bf59198dee2beb42e89b398442bd9d5a91 100644 (file)
@@ -23,6 +23,8 @@ EXTRA_DIST += libyasm/tests/emptydata.asm
 EXTRA_DIST += libyasm/tests/emptydata.hex
 EXTRA_DIST += libyasm/tests/equ-expand.asm
 EXTRA_DIST += libyasm/tests/equ-expand.hex
+EXTRA_DIST += libyasm/tests/expr-fold-level.asm
+EXTRA_DIST += libyasm/tests/expr-fold-level.hex
 EXTRA_DIST += libyasm/tests/expr-wide-ident.asm
 EXTRA_DIST += libyasm/tests/expr-wide-ident.hex
 EXTRA_DIST += libyasm/tests/externdef.asm
diff --git a/libyasm/tests/expr-fold-level.asm b/libyasm/tests/expr-fold-level.asm
new file mode 100644 (file)
index 0000000..814a62c
--- /dev/null
@@ -0,0 +1,4 @@
+begin
+A equ 09000h
+a dd (A+(end-begin)+3)
+end
diff --git a/libyasm/tests/expr-fold-level.hex b/libyasm/tests/expr-fold-level.hex
new file mode 100644 (file)
index 0000000..aba10f6
--- /dev/null
@@ -0,0 +1,4 @@
+07 
+90 
+00 
+00