Fixed the non-ansi attempts to pass a union member casted as the union

type.

svn path=/trunk/yasm/; revision=113
0.3
Michael Urman 24 years ago
parent daf5c6fd03
commit 0cb10aa577
  1. 19
      include/expr.h
  2. 4
      libyasm/bytecode.c
  3. 16
      libyasm/expr.c
  4. 19
      libyasm/expr.h
  5. 16
      modules/arch/x86/expr.c
  6. 16
      modules/arch/x86/x86expr.c
  7. 6
      modules/parsers/nasm/bison.y.in
  8. 6
      modules/parsers/nasm/nasm-bison.y
  9. 16
      src/arch/x86/expr.c
  10. 16
      src/arch/x86/x86expr.c
  11. 6
      src/bison.y.in
  12. 4
      src/bytecode.c
  13. 16
      src/expr.c
  14. 19
      src/expr.h
  15. 6
      src/parsers/nasm/bison.y.in
  16. 6
      src/parsers/nasm/nasm-bison.y

@ -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 */

@ -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;

@ -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;

@ -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 */

@ -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;

@ -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;

@ -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); }

@ -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); }

@ -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;

@ -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;

@ -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); }

@ -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;

@ -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;

@ -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 */

@ -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); }

@ -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); }

Loading…
Cancel
Save