OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gas/] [expr.h] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* expr.h -> header file for expr.c
/* expr.h -> header file for expr.c
   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
   2002, 2003, 2007 Free Software Foundation, Inc.
   2002, 2003, 2007 Free Software Foundation, Inc.
 
 
   This file is part of GAS, the GNU Assembler.
   This file is part of GAS, the GNU Assembler.
 
 
   GAS is free software; you can redistribute it and/or modify
   GAS is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   the Free Software Foundation; either version 3, or (at your option)
   any later version.
   any later version.
 
 
   GAS is distributed in the hope that it will be useful,
   GAS is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with GAS; see the file COPYING.  If not, write to the Free
   along with GAS; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */
   02110-1301, USA.  */
 
 
/*
/*
 * By popular demand, we define a struct to represent an expression.
 * By popular demand, we define a struct to represent an expression.
 * This will no doubt mutate as expressions become baroque.
 * This will no doubt mutate as expressions become baroque.
 *
 *
 * Currently, we support expressions like "foo OP bar + 42".  In other
 * Currently, we support expressions like "foo OP bar + 42".  In other
 * words we permit a (possibly undefined) symbol, a (possibly
 * words we permit a (possibly undefined) symbol, a (possibly
 * undefined) symbol and the operation used to combine the symbols,
 * undefined) symbol and the operation used to combine the symbols,
 * and an (absolute) augend.  RMS says this is so we can have 1-pass
 * and an (absolute) augend.  RMS says this is so we can have 1-pass
 * assembly for any compiler emissions, and a 'case' statement might
 * assembly for any compiler emissions, and a 'case' statement might
 * emit 'undefined1 - undefined2'.
 * emit 'undefined1 - undefined2'.
 *
 *
 * The type of an expression used to be stored as a segment.  That got
 * The type of an expression used to be stored as a segment.  That got
 * confusing because it overloaded the concept of a segment.  I added
 * confusing because it overloaded the concept of a segment.  I added
 * an operator field, instead.
 * an operator field, instead.
 */
 */
 
 
/* This is the type of an expression.  The operator types are also
/* This is the type of an expression.  The operator types are also
   used while parsing an expression.
   used while parsing an expression.
 
 
   NOTE: This enumeration must match the op_rank array in expr.c.  */
   NOTE: This enumeration must match the op_rank array in expr.c.  */
 
 
typedef enum {
typedef enum {
  /* An illegal expression.  */
  /* An illegal expression.  */
  O_illegal,
  O_illegal,
  /* A nonexistent expression.  */
  /* A nonexistent expression.  */
  O_absent,
  O_absent,
  /* X_add_number (a constant expression).  */
  /* X_add_number (a constant expression).  */
  O_constant,
  O_constant,
  /* X_add_symbol + X_add_number.  */
  /* X_add_symbol + X_add_number.  */
  O_symbol,
  O_symbol,
  /* X_add_symbol + X_add_number - the base address of the image.  */
  /* X_add_symbol + X_add_number - the base address of the image.  */
  O_symbol_rva,
  O_symbol_rva,
  /* A register (X_add_number is register number).  */
  /* A register (X_add_number is register number).  */
  O_register,
  O_register,
  /* A big value.  If X_add_number is negative or 0, the value is in
  /* A big value.  If X_add_number is negative or 0, the value is in
     generic_floating_point_number.  Otherwise the value is in
     generic_floating_point_number.  Otherwise the value is in
     generic_bignum, and X_add_number is the number of LITTLENUMs in
     generic_bignum, and X_add_number is the number of LITTLENUMs in
     the value.  */
     the value.  */
  O_big,
  O_big,
  /* (- X_add_symbol) + X_add_number.  */
  /* (- X_add_symbol) + X_add_number.  */
  O_uminus,
  O_uminus,
  /* (~ X_add_symbol) + X_add_number.  */
  /* (~ X_add_symbol) + X_add_number.  */
  O_bit_not,
  O_bit_not,
  /* (! X_add_symbol) + X_add_number.  */
  /* (! X_add_symbol) + X_add_number.  */
  O_logical_not,
  O_logical_not,
  /* (X_add_symbol * X_op_symbol) + X_add_number.  */
  /* (X_add_symbol * X_op_symbol) + X_add_number.  */
  O_multiply,
  O_multiply,
  /* (X_add_symbol / X_op_symbol) + X_add_number.  */
  /* (X_add_symbol / X_op_symbol) + X_add_number.  */
  O_divide,
  O_divide,
  /* (X_add_symbol % X_op_symbol) + X_add_number.  */
  /* (X_add_symbol % X_op_symbol) + X_add_number.  */
  O_modulus,
  O_modulus,
  /* (X_add_symbol << X_op_symbol) + X_add_number.  */
  /* (X_add_symbol << X_op_symbol) + X_add_number.  */
  O_left_shift,
  O_left_shift,
  /* (X_add_symbol >> X_op_symbol) + X_add_number.  */
  /* (X_add_symbol >> X_op_symbol) + X_add_number.  */
  O_right_shift,
  O_right_shift,
  /* (X_add_symbol | X_op_symbol) + X_add_number.  */
  /* (X_add_symbol | X_op_symbol) + X_add_number.  */
  O_bit_inclusive_or,
  O_bit_inclusive_or,
  /* (X_add_symbol |~ X_op_symbol) + X_add_number.  */
  /* (X_add_symbol |~ X_op_symbol) + X_add_number.  */
  O_bit_or_not,
  O_bit_or_not,
  /* (X_add_symbol ^ X_op_symbol) + X_add_number.  */
  /* (X_add_symbol ^ X_op_symbol) + X_add_number.  */
  O_bit_exclusive_or,
  O_bit_exclusive_or,
  /* (X_add_symbol & X_op_symbol) + X_add_number.  */
  /* (X_add_symbol & X_op_symbol) + X_add_number.  */
  O_bit_and,
  O_bit_and,
  /* (X_add_symbol + X_op_symbol) + X_add_number.  */
  /* (X_add_symbol + X_op_symbol) + X_add_number.  */
  O_add,
  O_add,
  /* (X_add_symbol - X_op_symbol) + X_add_number.  */
  /* (X_add_symbol - X_op_symbol) + X_add_number.  */
  O_subtract,
  O_subtract,
  /* (X_add_symbol == X_op_symbol) + X_add_number.  */
  /* (X_add_symbol == X_op_symbol) + X_add_number.  */
  O_eq,
  O_eq,
  /* (X_add_symbol != X_op_symbol) + X_add_number.  */
  /* (X_add_symbol != X_op_symbol) + X_add_number.  */
  O_ne,
  O_ne,
  /* (X_add_symbol < X_op_symbol) + X_add_number.  */
  /* (X_add_symbol < X_op_symbol) + X_add_number.  */
  O_lt,
  O_lt,
  /* (X_add_symbol <= X_op_symbol) + X_add_number.  */
  /* (X_add_symbol <= X_op_symbol) + X_add_number.  */
  O_le,
  O_le,
  /* (X_add_symbol >= X_op_symbol) + X_add_number.  */
  /* (X_add_symbol >= X_op_symbol) + X_add_number.  */
  O_ge,
  O_ge,
  /* (X_add_symbol > X_op_symbol) + X_add_number.  */
  /* (X_add_symbol > X_op_symbol) + X_add_number.  */
  O_gt,
  O_gt,
  /* (X_add_symbol && X_op_symbol) + X_add_number.  */
  /* (X_add_symbol && X_op_symbol) + X_add_number.  */
  O_logical_and,
  O_logical_and,
  /* (X_add_symbol || X_op_symbol) + X_add_number.  */
  /* (X_add_symbol || X_op_symbol) + X_add_number.  */
  O_logical_or,
  O_logical_or,
  /* X_op_symbol [ X_add_symbol ] */
  /* X_op_symbol [ X_add_symbol ] */
  O_index,
  O_index,
  /* machine dependent operators */
  /* machine dependent operators */
  O_md1,  O_md2,  O_md3,  O_md4,  O_md5,  O_md6,  O_md7,  O_md8,
  O_md1,  O_md2,  O_md3,  O_md4,  O_md5,  O_md6,  O_md7,  O_md8,
  O_md9,  O_md10, O_md11, O_md12, O_md13, O_md14, O_md15, O_md16,
  O_md9,  O_md10, O_md11, O_md12, O_md13, O_md14, O_md15, O_md16,
  O_md17, O_md18, O_md19, O_md20, O_md21, O_md22, O_md23, O_md24,
  O_md17, O_md18, O_md19, O_md20, O_md21, O_md22, O_md23, O_md24,
  O_md25, O_md26, O_md27, O_md28, O_md29, O_md30, O_md31, O_md32,
  O_md25, O_md26, O_md27, O_md28, O_md29, O_md30, O_md31, O_md32,
  /* this must be the largest value */
  /* this must be the largest value */
  O_max
  O_max
} operatorT;
} operatorT;
 
 
typedef struct expressionS {
typedef struct expressionS {
  /* The main symbol.  */
  /* The main symbol.  */
  symbolS *X_add_symbol;
  symbolS *X_add_symbol;
  /* The second symbol, if needed.  */
  /* The second symbol, if needed.  */
  symbolS *X_op_symbol;
  symbolS *X_op_symbol;
  /* A number to add.  */
  /* A number to add.  */
  offsetT X_add_number;
  offsetT X_add_number;
 
 
  /* The type of the expression.  We can't assume that an arbitrary
  /* The type of the expression.  We can't assume that an arbitrary
     compiler can handle a bitfield of enum type.  FIXME: We could
     compiler can handle a bitfield of enum type.  FIXME: We could
     check this using autoconf.  */
     check this using autoconf.  */
#ifdef __GNUC__
#ifdef __GNUC__
  operatorT X_op : 8;
  operatorT X_op : 8;
#else
#else
  unsigned char X_op;
  unsigned char X_op;
#endif
#endif
 
 
  /* Non-zero if X_add_number should be regarded as unsigned.  This is
  /* Non-zero if X_add_number should be regarded as unsigned.  This is
     only valid for O_constant expressions.  It is only used when an
     only valid for O_constant expressions.  It is only used when an
     O_constant must be extended into a bignum (i.e., it is not used
     O_constant must be extended into a bignum (i.e., it is not used
     when performing arithmetic on these values).
     when performing arithmetic on these values).
     FIXME: This field is not set very reliably.  */
     FIXME: This field is not set very reliably.  */
  unsigned int X_unsigned : 1;
  unsigned int X_unsigned : 1;
 
 
  /* 7 additional bits can be defined if needed.  */
  /* 7 additional bits can be defined if needed.  */
 
 
  /* Machine dependent field */
  /* Machine dependent field */
  unsigned short X_md;
  unsigned short X_md;
} expressionS;
} expressionS;
 
 
enum expr_mode
enum expr_mode
{
{
  expr_evaluate,
  expr_evaluate,
  expr_normal,
  expr_normal,
  expr_defer
  expr_defer
};
};
 
 
/* "result" should be type (expressionS *).  */
/* "result" should be type (expressionS *).  */
#define expression(result) expr (0, result, expr_normal)
#define expression(result) expr (0, result, expr_normal)
#define expression_and_evaluate(result) expr (0, result, expr_evaluate)
#define expression_and_evaluate(result) expr (0, result, expr_evaluate)
#define deferred_expression(result) expr (0, result, expr_defer)
#define deferred_expression(result) expr (0, result, expr_defer)
 
 
/* If an expression is O_big, look here for its value. These common
/* If an expression is O_big, look here for its value. These common
   data may be clobbered whenever expr() is called.  */
   data may be clobbered whenever expr() is called.  */
/* Flonums returned here.  Big enough to hold most precise flonum.  */
/* Flonums returned here.  Big enough to hold most precise flonum.  */
extern FLONUM_TYPE generic_floating_point_number;
extern FLONUM_TYPE generic_floating_point_number;
/* Bignums returned here.  */
/* Bignums returned here.  */
extern LITTLENUM_TYPE generic_bignum[];
extern LITTLENUM_TYPE generic_bignum[];
/* Number of littlenums in above.  */
/* Number of littlenums in above.  */
#define SIZE_OF_LARGE_NUMBER (20)
#define SIZE_OF_LARGE_NUMBER (20)
 
 
typedef char operator_rankT;
typedef char operator_rankT;
 
 
extern char get_symbol_end (void);
extern char get_symbol_end (void);
extern void expr_begin (void);
extern void expr_begin (void);
extern void expr_set_precedence (void);
extern void expr_set_precedence (void);
extern segT expr (int, expressionS *, enum expr_mode);
extern segT expr (int, expressionS *, enum expr_mode);
extern unsigned int get_single_number (void);
extern unsigned int get_single_number (void);
extern symbolS *make_expr_symbol (expressionS * expressionP);
extern symbolS *make_expr_symbol (expressionS * expressionP);
extern int expr_symbol_where (symbolS *, char **, unsigned int *);
extern int expr_symbol_where (symbolS *, char **, unsigned int *);
 
 
extern symbolS *expr_build_uconstant (offsetT);
extern symbolS *expr_build_uconstant (offsetT);
extern symbolS *expr_build_dot (void);
extern symbolS *expr_build_dot (void);
 
 
int resolve_expression (expressionS *);
int resolve_expression (expressionS *);
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.