From: Shamus Hammons Date: Sat, 24 Feb 2018 16:27:31 +0000 (-0600) Subject: Fix for subtle bug in the expression analyzer. X-Git-Tag: v2.1.0~79 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=ae528e6fdb8bd5c41ed9690bec03402ccbb4ecae Fix for subtle bug in the expression analyzer. Turns out if you blindly promote arithmetic expressions to ABS + DEFINED, it causes things to assemble wrong. This crept in around v1.9.1; Now at version 1.12.5. --- diff --git a/.gitignore b/.gitignore index a89b4bf..be2b8f8 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,8 @@ bugs8/ *.zip features/ patches/ +tmp/ +elf/ +tests/ +regression-tests/ +rmac-* diff --git a/expr.c b/expr.c index 1d6ce38..74b68c9 100644 --- a/expr.c +++ b/expr.c @@ -900,11 +900,10 @@ printf("EVEXPR (-): sym1 = %X, sym2 = %X\n", attr, sattr[1]); // All other binary operators must have two ABS items to work with. // They all produce an ABS value. + // Shamus: Is this true? There's at least one counterexample of legit + // code where this assumption fails to produce correct code. default: //printf("evexpr(): default\n"); - // GH - Removed for v1.0.15 as part of the fix for indexed loads. - //if ((*sattr & (TEXT|DATA|BSS)) || (*--sattr & (TEXT|DATA|BSS))) - //error(seg_error); switch ((int)tk.u32[-1]) { @@ -936,7 +935,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It } //printf("%i\n", *sval); - *sattr = ABS | DEFINED | attr; // Expr becomes absolute +//no *sattr = ABS | DEFINED | attr; // Expr becomes absolute break; case '/': @@ -974,7 +973,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It } //printf("%i\n", *sval); - *sattr = ABS | DEFINED | attr; // Expr becomes absolute +//no *sattr = ABS | DEFINED | attr; // Expr becomes absolute break; case '%': @@ -988,7 +987,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It return error("mod (%) by zero"); *sval %= sval[1]; - *sattr = ABS | DEFINED; // Expr becomes absolute +//no *sattr = ABS | DEFINED; // Expr becomes absolute break; case SHL: @@ -999,7 +998,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It return error("floating point numbers not allowed with operator '<<'."); *sval <<= sval[1]; - *sattr = ABS | DEFINED; // Expr becomes absolute +//no *sattr = ABS | DEFINED; // Expr becomes absolute break; case SHR: @@ -1010,7 +1009,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It return error("floating point numbers not allowed with operator '>>'."); *sval >>= sval[1]; - *sattr = ABS | DEFINED; // Expr becomes absolute +//no *sattr = ABS | DEFINED; // Expr becomes absolute break; case '&': @@ -1021,7 +1020,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It return error("floating point numbers not allowed with operator '&'."); *sval &= sval[1]; - *sattr = ABS | DEFINED; // Expr becomes absolute +//no *sattr = ABS | DEFINED; // Expr becomes absolute break; case '^': @@ -1032,7 +1031,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It return error("floating point numbers not allowed with operator '^'."); *sval ^= sval[1]; - *sattr = ABS | DEFINED; // Expr becomes absolute +//no *sattr = ABS | DEFINED; // Expr becomes absolute break; case '|': @@ -1043,7 +1042,7 @@ An open question here is do we promote ints to floats as signed or unsigned? It return error("floating point numbers not allowed with operator '|'."); *sval |= sval[1]; - *sattr = ABS | DEFINED; // Expr becomes absolute +//no *sattr = ABS | DEFINED; // Expr becomes absolute break; default: diff --git a/version.h b/version.h index e80f72d..b56b49a 100644 --- a/version.h +++ b/version.h @@ -15,7 +15,7 @@ #define MAJOR 1 // Major version number #define MINOR 12 // Minor version number -#define PATCH 4 // Patch release number +#define PATCH 5 // Patch release number #endif // __VERSION_H__