]> granicus.if.org Git - yasm/commitdiff
Fixed the non-ansi attempts to pass a union member casted as the union
authorMichael Urman <mu@tortall.net>
Thu, 5 Jul 2001 09:32:58 +0000 (09:32 -0000)
committerMichael Urman <mu@tortall.net>
Thu, 5 Jul 2001 09:32:58 +0000 (09:32 -0000)
type.

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

16 files changed:
include/expr.h
libyasm/bytecode.c
libyasm/expr.c
libyasm/expr.h
modules/arch/x86/expr.c
modules/arch/x86/x86expr.c
modules/parsers/nasm/bison.y.in
modules/parsers/nasm/nasm-bison.y
src/arch/x86/expr.c
src/arch/x86/x86expr.c
src/bison.y.in
src/bytecode.c
src/expr.c
src/expr.h
src/parsers/nasm/bison.y.in
src/parsers/nasm/nasm-bison.y

index 3ca1ec683ba8ab77a4b16c6a88f8b6c142377176..8878d71d8de3190f1ea81d874645b0015078c756 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.h,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.h,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling header file
  *
  *  Copyright (C) 2001  Michael Urman
@@ -67,17 +67,20 @@ typedef struct expr_s {
 } expr;
 
 expr *expr_new (ExprType, ExprItem, ExprOp, ExprType, ExprItem);
-/*expr *expr_new_tree (ExprItem, ExprOp, ExprItem);
-expr *expr_new_branch (ExprOp, ExprItem);
-expr *expr_new_ident (ExprType, ExprItem);*/
+
+ExprItem ExprSym (struct symrec_s *);
+ExprItem ExprExpr (expr *);
+ExprItem ExprNum (unsigned long);
+ExprItem ExprNone ();
+
 #define expr_new_tree(l,o,r) \
-    expr_new (EXPR_EXPR, (ExprItem)(l), (ExprOp)(o), EXPR_EXPR, (ExprItem)(r))
+    expr_new (EXPR_EXPR, ExprExpr(l), (o), EXPR_EXPR, ExprExpr(r))
 #define expr_new_branch(o,r) \
-    expr_new (EXPR_NONE, (ExprItem)0UL, (ExprOp)(o), EXPR_EXPR, (ExprItem)(r))
+    expr_new (EXPR_NONE, ExprNone(), (o), EXPR_EXPR, ExprExpr(r))
 #define expr_new_ident(t,r) \
-    expr_new (EXPR_NONE, (ExprItem)0UL, EXPR_IDENT, (ExprType)(t), (ExprItem)(r))
-int expr_simplify (expr *);
+    expr_new (EXPR_NONE, ExprNone(), EXPR_IDENT, (ExprType)(t), (r))
 
+int expr_simplify (expr *);
 void expr_print (expr *);
 
 /* get the value if possible.  return value is IF POSSIBLE, not the val */
index 5812dbd29dffc24f9a70cd2d8158d6b6c6fe416f..cec7f61d4ab1a841fa4593d5169872928edf0e6d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.c,v 1.9 2001/07/05 08:37:59 mu Exp $
+/* $Id: bytecode.c,v 1.10 2001/07/05 09:32:58 mu Exp $
  * Bytecode utility functions
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -95,7 +95,7 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val)
        ptr = &im_static;
 
     /* FIXME: this will leak expr's if static is used */
-    ptr->val = expr_new_ident(EXPR_NUM, int_val);
+    ptr->val = expr_new_ident(EXPR_NUM, ExprNum(int_val));
 
     if((int_val & 0xFF) == int_val)
        ptr->len = 1;
index 0d7f722123ae2c1deb1d5e01dfcf10c2188c2b67..ceece7a7b94c4039bbc3fdf4d35d18efa29a7683 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling
  *
  *  Copyright (C) 2001  Michael Urman
@@ -21,6 +21,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 #include "expr.h"
 #include "symrec.h"
 #include "globals.h"
@@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype,
     return ptr;
 }
 
+/* helpers */
+ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; }
+ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; }
+ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; }
+ExprItem ExprNone () { ExprItem e; e.num = 0; return e; }
+
 /* get rid of unnecessary branches if possible.  report. */
 int expr_simplify (expr *e)
 {
@@ -208,7 +215,7 @@ void expr_print (expr *e)
 {
     if (e->op != EXPR_IDENT) {
        switch (e->ltype) {
-           case EXPR_NUM: printf ("%d", e->left.num); break;
+           case EXPR_NUM: printf ("%lu", e->left.num); break;
            case EXPR_SYM: printf ("%s", e->left.sym->name); break;
            case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")");
            case EXPR_NONE: break;
@@ -219,7 +226,7 @@ void expr_print (expr *e)
        case EXPR_SUB: printf ("-"); break;
        case EXPR_MUL: printf ("*"); break;
        case EXPR_DIV: printf ("/"); break;
-       case EXPR_MOD: printf ("%"); break;
+       case EXPR_MOD: printf ("%%"); break;
        case EXPR_NEG: printf ("-"); break;
        case EXPR_NOT: printf ("~"); break;
        case EXPR_OR: printf ("|"); break;
@@ -235,10 +242,11 @@ void expr_print (expr *e)
        case EXPR_LE: printf ("<="); break;
        case EXPR_GE: printf (">="); break;
        case EXPR_NE: printf ("!="); break;
+       case EXPR_EQ: printf ("=="); break;
        case EXPR_IDENT: break;
     }
     switch (e->rtype) {
-       case EXPR_NUM: printf ("%d", e->right.num); break;
+       case EXPR_NUM: printf ("%lu", e->right.num); break;
        case EXPR_SYM: printf ("%s", e->right.sym->name); break;
        case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")");
        case EXPR_NONE: break;
index 3ca1ec683ba8ab77a4b16c6a88f8b6c142377176..8878d71d8de3190f1ea81d874645b0015078c756 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.h,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.h,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling header file
  *
  *  Copyright (C) 2001  Michael Urman
@@ -67,17 +67,20 @@ typedef struct expr_s {
 } expr;
 
 expr *expr_new (ExprType, ExprItem, ExprOp, ExprType, ExprItem);
-/*expr *expr_new_tree (ExprItem, ExprOp, ExprItem);
-expr *expr_new_branch (ExprOp, ExprItem);
-expr *expr_new_ident (ExprType, ExprItem);*/
+
+ExprItem ExprSym (struct symrec_s *);
+ExprItem ExprExpr (expr *);
+ExprItem ExprNum (unsigned long);
+ExprItem ExprNone ();
+
 #define expr_new_tree(l,o,r) \
-    expr_new (EXPR_EXPR, (ExprItem)(l), (ExprOp)(o), EXPR_EXPR, (ExprItem)(r))
+    expr_new (EXPR_EXPR, ExprExpr(l), (o), EXPR_EXPR, ExprExpr(r))
 #define expr_new_branch(o,r) \
-    expr_new (EXPR_NONE, (ExprItem)0UL, (ExprOp)(o), EXPR_EXPR, (ExprItem)(r))
+    expr_new (EXPR_NONE, ExprNone(), (o), EXPR_EXPR, ExprExpr(r))
 #define expr_new_ident(t,r) \
-    expr_new (EXPR_NONE, (ExprItem)0UL, EXPR_IDENT, (ExprType)(t), (ExprItem)(r))
-int expr_simplify (expr *);
+    expr_new (EXPR_NONE, ExprNone(), EXPR_IDENT, (ExprType)(t), (r))
 
+int expr_simplify (expr *);
 void expr_print (expr *);
 
 /* get the value if possible.  return value is IF POSSIBLE, not the val */
index 0d7f722123ae2c1deb1d5e01dfcf10c2188c2b67..ceece7a7b94c4039bbc3fdf4d35d18efa29a7683 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling
  *
  *  Copyright (C) 2001  Michael Urman
@@ -21,6 +21,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 #include "expr.h"
 #include "symrec.h"
 #include "globals.h"
@@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype,
     return ptr;
 }
 
+/* helpers */
+ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; }
+ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; }
+ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; }
+ExprItem ExprNone () { ExprItem e; e.num = 0; return e; }
+
 /* get rid of unnecessary branches if possible.  report. */
 int expr_simplify (expr *e)
 {
@@ -208,7 +215,7 @@ void expr_print (expr *e)
 {
     if (e->op != EXPR_IDENT) {
        switch (e->ltype) {
-           case EXPR_NUM: printf ("%d", e->left.num); break;
+           case EXPR_NUM: printf ("%lu", e->left.num); break;
            case EXPR_SYM: printf ("%s", e->left.sym->name); break;
            case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")");
            case EXPR_NONE: break;
@@ -219,7 +226,7 @@ void expr_print (expr *e)
        case EXPR_SUB: printf ("-"); break;
        case EXPR_MUL: printf ("*"); break;
        case EXPR_DIV: printf ("/"); break;
-       case EXPR_MOD: printf ("%"); break;
+       case EXPR_MOD: printf ("%%"); break;
        case EXPR_NEG: printf ("-"); break;
        case EXPR_NOT: printf ("~"); break;
        case EXPR_OR: printf ("|"); break;
@@ -235,10 +242,11 @@ void expr_print (expr *e)
        case EXPR_LE: printf ("<="); break;
        case EXPR_GE: printf (">="); break;
        case EXPR_NE: printf ("!="); break;
+       case EXPR_EQ: printf ("=="); break;
        case EXPR_IDENT: break;
     }
     switch (e->rtype) {
-       case EXPR_NUM: printf ("%d", e->right.num); break;
+       case EXPR_NUM: printf ("%lu", e->right.num); break;
        case EXPR_SYM: printf ("%s", e->right.sym->name); break;
        case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")");
        case EXPR_NONE: break;
index 1bf3c8845180b52c7e5757f0faa924efeaf59639..abb8ef2ce8484d55d99a575b2e758705e3f534e0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: x86expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: x86expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling
  *
  *  Copyright (C) 2001  Michael Urman
@@ -21,6 +21,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 #include "expr.h"
 #include "symrec.h"
 #include "globals.h"
@@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype,
     return ptr;
 }
 
+/* helpers */
+ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; }
+ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; }
+ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; }
+ExprItem ExprNone () { ExprItem e; e.num = 0; return e; }
+
 /* get rid of unnecessary branches if possible.  report. */
 int expr_simplify (expr *e)
 {
@@ -208,7 +215,7 @@ void expr_print (expr *e)
 {
     if (e->op != EXPR_IDENT) {
        switch (e->ltype) {
-           case EXPR_NUM: printf ("%d", e->left.num); break;
+           case EXPR_NUM: printf ("%lu", e->left.num); break;
            case EXPR_SYM: printf ("%s", e->left.sym->name); break;
            case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")");
            case EXPR_NONE: break;
@@ -219,7 +226,7 @@ void expr_print (expr *e)
        case EXPR_SUB: printf ("-"); break;
        case EXPR_MUL: printf ("*"); break;
        case EXPR_DIV: printf ("/"); break;
-       case EXPR_MOD: printf ("%"); break;
+       case EXPR_MOD: printf ("%%"); break;
        case EXPR_NEG: printf ("-"); break;
        case EXPR_NOT: printf ("~"); break;
        case EXPR_OR: printf ("|"); break;
@@ -235,10 +242,11 @@ void expr_print (expr *e)
        case EXPR_LE: printf ("<="); break;
        case EXPR_GE: printf (">="); break;
        case EXPR_NE: printf ("!="); break;
+       case EXPR_EQ: printf ("=="); break;
        case EXPR_IDENT: break;
     }
     switch (e->rtype) {
-       case EXPR_NUM: printf ("%d", e->right.num); break;
+       case EXPR_NUM: printf ("%lu", e->right.num); break;
        case EXPR_SYM: printf ("%s", e->right.sym->name); break;
        case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")");
        case EXPR_NONE: break;
index f1644f07ecd8620e2ba802002d85728520d0ffe0..f282e8b51cde7b40140064073889246b15f82d99 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.16 2001/07/05 08:37:59 mu Exp $
+/* $Id: bison.y.in,v 1.17 2001/07/05 09:32:58 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -276,8 +276,8 @@ rm128: XMMREG       { (void)ConvertRegToEA(&$$, $1); }
 /* immediate values */
 /* TODO: formula expansion */
 immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, $1); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); }
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
     /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
     | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
     | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
index 6c1a66bb314ba185bb6eb6818119c70c9d47701c..5dbfced1ceadc0fa342ee66ef1bdff511171452a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.16 2001/07/05 08:37:59 mu Exp $
+/* $Id: nasm-bison.y,v 1.17 2001/07/05 09:32:58 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -276,8 +276,8 @@ rm128: XMMREG       { (void)ConvertRegToEA(&$$, $1); }
 /* immediate values */
 /* TODO: formula expansion */
 immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, $1); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); }
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
     /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
     | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
     | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
index 0d7f722123ae2c1deb1d5e01dfcf10c2188c2b67..ceece7a7b94c4039bbc3fdf4d35d18efa29a7683 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling
  *
  *  Copyright (C) 2001  Michael Urman
@@ -21,6 +21,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 #include "expr.h"
 #include "symrec.h"
 #include "globals.h"
@@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype,
     return ptr;
 }
 
+/* helpers */
+ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; }
+ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; }
+ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; }
+ExprItem ExprNone () { ExprItem e; e.num = 0; return e; }
+
 /* get rid of unnecessary branches if possible.  report. */
 int expr_simplify (expr *e)
 {
@@ -208,7 +215,7 @@ void expr_print (expr *e)
 {
     if (e->op != EXPR_IDENT) {
        switch (e->ltype) {
-           case EXPR_NUM: printf ("%d", e->left.num); break;
+           case EXPR_NUM: printf ("%lu", e->left.num); break;
            case EXPR_SYM: printf ("%s", e->left.sym->name); break;
            case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")");
            case EXPR_NONE: break;
@@ -219,7 +226,7 @@ void expr_print (expr *e)
        case EXPR_SUB: printf ("-"); break;
        case EXPR_MUL: printf ("*"); break;
        case EXPR_DIV: printf ("/"); break;
-       case EXPR_MOD: printf ("%"); break;
+       case EXPR_MOD: printf ("%%"); break;
        case EXPR_NEG: printf ("-"); break;
        case EXPR_NOT: printf ("~"); break;
        case EXPR_OR: printf ("|"); break;
@@ -235,10 +242,11 @@ void expr_print (expr *e)
        case EXPR_LE: printf ("<="); break;
        case EXPR_GE: printf (">="); break;
        case EXPR_NE: printf ("!="); break;
+       case EXPR_EQ: printf ("=="); break;
        case EXPR_IDENT: break;
     }
     switch (e->rtype) {
-       case EXPR_NUM: printf ("%d", e->right.num); break;
+       case EXPR_NUM: printf ("%lu", e->right.num); break;
        case EXPR_SYM: printf ("%s", e->right.sym->name); break;
        case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")");
        case EXPR_NONE: break;
index 1bf3c8845180b52c7e5757f0faa924efeaf59639..abb8ef2ce8484d55d99a575b2e758705e3f534e0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: x86expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: x86expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling
  *
  *  Copyright (C) 2001  Michael Urman
@@ -21,6 +21,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 #include "expr.h"
 #include "symrec.h"
 #include "globals.h"
@@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype,
     return ptr;
 }
 
+/* helpers */
+ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; }
+ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; }
+ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; }
+ExprItem ExprNone () { ExprItem e; e.num = 0; return e; }
+
 /* get rid of unnecessary branches if possible.  report. */
 int expr_simplify (expr *e)
 {
@@ -208,7 +215,7 @@ void expr_print (expr *e)
 {
     if (e->op != EXPR_IDENT) {
        switch (e->ltype) {
-           case EXPR_NUM: printf ("%d", e->left.num); break;
+           case EXPR_NUM: printf ("%lu", e->left.num); break;
            case EXPR_SYM: printf ("%s", e->left.sym->name); break;
            case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")");
            case EXPR_NONE: break;
@@ -219,7 +226,7 @@ void expr_print (expr *e)
        case EXPR_SUB: printf ("-"); break;
        case EXPR_MUL: printf ("*"); break;
        case EXPR_DIV: printf ("/"); break;
-       case EXPR_MOD: printf ("%"); break;
+       case EXPR_MOD: printf ("%%"); break;
        case EXPR_NEG: printf ("-"); break;
        case EXPR_NOT: printf ("~"); break;
        case EXPR_OR: printf ("|"); break;
@@ -235,10 +242,11 @@ void expr_print (expr *e)
        case EXPR_LE: printf ("<="); break;
        case EXPR_GE: printf (">="); break;
        case EXPR_NE: printf ("!="); break;
+       case EXPR_EQ: printf ("=="); break;
        case EXPR_IDENT: break;
     }
     switch (e->rtype) {
-       case EXPR_NUM: printf ("%d", e->right.num); break;
+       case EXPR_NUM: printf ("%lu", e->right.num); break;
        case EXPR_SYM: printf ("%s", e->right.sym->name); break;
        case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")");
        case EXPR_NONE: break;
index f1644f07ecd8620e2ba802002d85728520d0ffe0..f282e8b51cde7b40140064073889246b15f82d99 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.16 2001/07/05 08:37:59 mu Exp $
+/* $Id: bison.y.in,v 1.17 2001/07/05 09:32:58 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -276,8 +276,8 @@ rm128: XMMREG       { (void)ConvertRegToEA(&$$, $1); }
 /* immediate values */
 /* TODO: formula expansion */
 immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, $1); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); }
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
     /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
     | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
     | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
index 5812dbd29dffc24f9a70cd2d8158d6b6c6fe416f..cec7f61d4ab1a841fa4593d5169872928edf0e6d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.c,v 1.9 2001/07/05 08:37:59 mu Exp $
+/* $Id: bytecode.c,v 1.10 2001/07/05 09:32:58 mu Exp $
  * Bytecode utility functions
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -95,7 +95,7 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val)
        ptr = &im_static;
 
     /* FIXME: this will leak expr's if static is used */
-    ptr->val = expr_new_ident(EXPR_NUM, int_val);
+    ptr->val = expr_new_ident(EXPR_NUM, ExprNum(int_val));
 
     if((int_val & 0xFF) == int_val)
        ptr->len = 1;
index 0d7f722123ae2c1deb1d5e01dfcf10c2188c2b67..ceece7a7b94c4039bbc3fdf4d35d18efa29a7683 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling
  *
  *  Copyright (C) 2001  Michael Urman
@@ -21,6 +21,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 #include "expr.h"
 #include "symrec.h"
 #include "globals.h"
@@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype,
     return ptr;
 }
 
+/* helpers */
+ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; }
+ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; }
+ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; }
+ExprItem ExprNone () { ExprItem e; e.num = 0; return e; }
+
 /* get rid of unnecessary branches if possible.  report. */
 int expr_simplify (expr *e)
 {
@@ -208,7 +215,7 @@ void expr_print (expr *e)
 {
     if (e->op != EXPR_IDENT) {
        switch (e->ltype) {
-           case EXPR_NUM: printf ("%d", e->left.num); break;
+           case EXPR_NUM: printf ("%lu", e->left.num); break;
            case EXPR_SYM: printf ("%s", e->left.sym->name); break;
            case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")");
            case EXPR_NONE: break;
@@ -219,7 +226,7 @@ void expr_print (expr *e)
        case EXPR_SUB: printf ("-"); break;
        case EXPR_MUL: printf ("*"); break;
        case EXPR_DIV: printf ("/"); break;
-       case EXPR_MOD: printf ("%"); break;
+       case EXPR_MOD: printf ("%%"); break;
        case EXPR_NEG: printf ("-"); break;
        case EXPR_NOT: printf ("~"); break;
        case EXPR_OR: printf ("|"); break;
@@ -235,10 +242,11 @@ void expr_print (expr *e)
        case EXPR_LE: printf ("<="); break;
        case EXPR_GE: printf (">="); break;
        case EXPR_NE: printf ("!="); break;
+       case EXPR_EQ: printf ("=="); break;
        case EXPR_IDENT: break;
     }
     switch (e->rtype) {
-       case EXPR_NUM: printf ("%d", e->right.num); break;
+       case EXPR_NUM: printf ("%lu", e->right.num); break;
        case EXPR_SYM: printf ("%s", e->right.sym->name); break;
        case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")");
        case EXPR_NONE: break;
index 3ca1ec683ba8ab77a4b16c6a88f8b6c142377176..8878d71d8de3190f1ea81d874645b0015078c756 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: expr.h,v 1.2 2001/07/05 08:37:59 mu Exp $
+/* $Id: expr.h,v 1.3 2001/07/05 09:32:58 mu Exp $
  * Expression handling header file
  *
  *  Copyright (C) 2001  Michael Urman
@@ -67,17 +67,20 @@ typedef struct expr_s {
 } expr;
 
 expr *expr_new (ExprType, ExprItem, ExprOp, ExprType, ExprItem);
-/*expr *expr_new_tree (ExprItem, ExprOp, ExprItem);
-expr *expr_new_branch (ExprOp, ExprItem);
-expr *expr_new_ident (ExprType, ExprItem);*/
+
+ExprItem ExprSym (struct symrec_s *);
+ExprItem ExprExpr (expr *);
+ExprItem ExprNum (unsigned long);
+ExprItem ExprNone ();
+
 #define expr_new_tree(l,o,r) \
-    expr_new (EXPR_EXPR, (ExprItem)(l), (ExprOp)(o), EXPR_EXPR, (ExprItem)(r))
+    expr_new (EXPR_EXPR, ExprExpr(l), (o), EXPR_EXPR, ExprExpr(r))
 #define expr_new_branch(o,r) \
-    expr_new (EXPR_NONE, (ExprItem)0UL, (ExprOp)(o), EXPR_EXPR, (ExprItem)(r))
+    expr_new (EXPR_NONE, ExprNone(), (o), EXPR_EXPR, ExprExpr(r))
 #define expr_new_ident(t,r) \
-    expr_new (EXPR_NONE, (ExprItem)0UL, EXPR_IDENT, (ExprType)(t), (ExprItem)(r))
-int expr_simplify (expr *);
+    expr_new (EXPR_NONE, ExprNone(), EXPR_IDENT, (ExprType)(t), (r))
 
+int expr_simplify (expr *);
 void expr_print (expr *);
 
 /* get the value if possible.  return value is IF POSSIBLE, not the val */
index f1644f07ecd8620e2ba802002d85728520d0ffe0..f282e8b51cde7b40140064073889246b15f82d99 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.16 2001/07/05 08:37:59 mu Exp $
+/* $Id: bison.y.in,v 1.17 2001/07/05 09:32:58 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -276,8 +276,8 @@ rm128: XMMREG       { (void)ConvertRegToEA(&$$, $1); }
 /* immediate values */
 /* TODO: formula expansion */
 immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, $1); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); }
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
     /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
     | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
     | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
index 6c1a66bb314ba185bb6eb6818119c70c9d47701c..5dbfced1ceadc0fa342ee66ef1bdff511171452a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.16 2001/07/05 08:37:59 mu Exp $
+/* $Id: nasm-bison.y,v 1.17 2001/07/05 09:32:58 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -276,8 +276,8 @@ rm128: XMMREG       { (void)ConvertRegToEA(&$$, $1); }
 /* immediate values */
 /* TODO: formula expansion */
 immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, $1); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); }
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
     /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
     | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
     | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }