expr.h revision 302408
116239Sjkh/* expr.h -> header file for expr.c
24Srgrimes   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3509Srgrimes   2002, 2003 Free Software Foundation, Inc.
450477Speter
54Srgrimes   This file is part of GAS, the GNU Assembler.
6509Srgrimes
7509Srgrimes   GAS is free software; you can redistribute it and/or modify
84Srgrimes   it under the terms of the GNU General Public License as published by
94Srgrimes   the Free Software Foundation; either version 2, or (at your option)
104Srgrimes   any later version.
114Srgrimes
124Srgrimes   GAS is distributed in the hope that it will be useful,
134Srgrimes   but WITHOUT ANY WARRANTY; without even the implied warranty of
144Srgrimes   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1585532Sru   GNU General Public License for more details.
164Srgrimes
174Srgrimes   You should have received a copy of the GNU General Public License
184Srgrimes   along with GAS; see the file COPYING.  If not, write to the Free
1930640Speter   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20169612Swkoszek   02110-1301, USA.  */
2130640Speter
2227674Sphk/*
2327674Sphk * By popular demand, we define a struct to represent an expression.
2452651Smarcel * This will no doubt mutate as expressions become baroque.
252056Swollman *
262056Swollman * Currently, we support expressions like "foo OP bar + 42".  In other
272056Swollman * words we permit a (possibly undefined) symbol, a (possibly
2879014Simp * undefined) symbol and the operation used to combine the symbols,
292056Swollman * and an (absolute) augend.  RMS says this is so we can have 1-pass
3052651Smarcel * assembly for any compiler emissions, and a 'case' statement might
3185909Simp * emit 'undefined1 - undefined2'.
324Srgrimes *
33250840Smarcel * The type of an expression used to be stored as a segment.  That got
34250840Smarcel * confusing because it overloaded the concept of a segment.  I added
35154975Snyan * an operator field, instead.
3689345Snyan */
37154975Snyan
38154975Snyan/* This is the type of an expression.  The operator types are also
39218893Sdim   used while parsing an expression.
40232263Sdim
41232263Sdim   NOTE: This enumeration must match the op_rank array in expr.c.  */
42232263Sdim
43218893Sdimtypedef enum {
445327Sgibbs  /* An illegal expression.  */
455327Sgibbs  O_illegal,
464Srgrimes  /* A nonexistent expression.  */
474Srgrimes  O_absent,
4869135Speter  /* X_add_number (a constant expression).  */
494Srgrimes  O_constant,
5069135Speter  /* X_add_symbol + X_add_number.  */
5111918Sdg  O_symbol,
5269135Speter  /* X_add_symbol + X_add_number - the base address of the image.  */
5338778Snsouch  O_symbol_rva,
546802Sgibbs  /* A register (X_add_number is register number).  */
556802Sgibbs  O_register,
5686273Simp  /* A big value.  If X_add_number is negative or 0, the value is in
5786273Simp     generic_floating_point_number.  Otherwise the value is in
5885909Simp     generic_bignum, and X_add_number is the number of LITTLENUMs in
59     the value.  */
60  O_big,
61  /* (- X_add_symbol) + X_add_number.  */
62  O_uminus,
63  /* (~ X_add_symbol) + X_add_number.  */
64  O_bit_not,
65  /* (! X_add_symbol) + X_add_number.  */
66  O_logical_not,
67  /* (X_add_symbol * X_op_symbol) + X_add_number.  */
68  O_multiply,
69  /* (X_add_symbol / X_op_symbol) + X_add_number.  */
70  O_divide,
71  /* (X_add_symbol % X_op_symbol) + X_add_number.  */
72  O_modulus,
73  /* (X_add_symbol << X_op_symbol) + X_add_number.  */
74  O_left_shift,
75  /* (X_add_symbol >> X_op_symbol) + X_add_number.  */
76  O_right_shift,
77  /* (X_add_symbol | X_op_symbol) + X_add_number.  */
78  O_bit_inclusive_or,
79  /* (X_add_symbol |~ X_op_symbol) + X_add_number.  */
80  O_bit_or_not,
81  /* (X_add_symbol ^ X_op_symbol) + X_add_number.  */
82  O_bit_exclusive_or,
83  /* (X_add_symbol & X_op_symbol) + X_add_number.  */
84  O_bit_and,
85  /* (X_add_symbol + X_op_symbol) + X_add_number.  */
86  O_add,
87  /* (X_add_symbol - X_op_symbol) + X_add_number.  */
88  O_subtract,
89  /* (X_add_symbol == X_op_symbol) + X_add_number.  */
90  O_eq,
91  /* (X_add_symbol != X_op_symbol) + X_add_number.  */
92  O_ne,
93  /* (X_add_symbol < X_op_symbol) + X_add_number.  */
94  O_lt,
95  /* (X_add_symbol <= X_op_symbol) + X_add_number.  */
96  O_le,
97  /* (X_add_symbol >= X_op_symbol) + X_add_number.  */
98  O_ge,
99  /* (X_add_symbol > X_op_symbol) + X_add_number.  */
100  O_gt,
101  /* (X_add_symbol && X_op_symbol) + X_add_number.  */
102  O_logical_and,
103  /* (X_add_symbol || X_op_symbol) + X_add_number.  */
104  O_logical_or,
105  /* X_op_symbol [ X_add_symbol ] */
106  O_index,
107  /* machine dependent operators */
108  O_md1,  O_md2,  O_md3,  O_md4,  O_md5,  O_md6,  O_md7,  O_md8,
109  O_md9,  O_md10, O_md11, O_md12, O_md13, O_md14, O_md15, O_md16,
110  O_md17, O_md18, O_md19, O_md20, O_md21, O_md22, O_md23, O_md24,
111  O_md25, O_md26, O_md27, O_md28, O_md29, O_md30, O_md31, O_md32,
112  /* this must be the largest value */
113  O_max
114} operatorT;
115
116typedef struct expressionS {
117  /* The main symbol.  */
118  symbolS *X_add_symbol;
119  /* The second symbol, if needed.  */
120  symbolS *X_op_symbol;
121  /* A number to add.  */
122  offsetT X_add_number;
123
124  /* The type of the expression.  We can't assume that an arbitrary
125     compiler can handle a bitfield of enum type.  FIXME: We could
126     check this using autoconf.  */
127#ifdef __GNUC__
128  operatorT X_op : 8;
129#else
130  unsigned char X_op;
131#endif
132
133  /* Non-zero if X_add_number should be regarded as unsigned.  This is
134     only valid for O_constant expressions.  It is only used when an
135     O_constant must be extended into a bignum (i.e., it is not used
136     when performing arithmetic on these values).
137     FIXME: This field is not set very reliably.  */
138  unsigned int X_unsigned : 1;
139
140  /* 7 additional bits can be defined if needed.  */
141
142  /* Machine dependent field */
143  unsigned short X_md;
144} expressionS;
145
146enum expr_mode
147{
148  expr_evaluate,
149  expr_normal,
150  expr_defer
151};
152
153/* "result" should be type (expressionS *).  */
154#define expression(result) expr (0, result, expr_normal)
155#define expression_and_evaluate(result) expr (0, result, expr_evaluate)
156#define deferred_expression(result) expr (0, result, expr_defer)
157
158/* If an expression is O_big, look here for its value. These common
159   data may be clobbered whenever expr() is called.  */
160/* Flonums returned here.  Big enough to hold most precise flonum.  */
161extern FLONUM_TYPE generic_floating_point_number;
162/* Bignums returned here.  */
163extern LITTLENUM_TYPE generic_bignum[];
164/* Number of littlenums in above.  */
165#define SIZE_OF_LARGE_NUMBER (20)
166
167typedef char operator_rankT;
168
169extern char get_symbol_end (void);
170extern void expr_begin (void);
171extern void expr_set_precedence (void);
172extern segT expr (int, expressionS *, enum expr_mode);
173extern unsigned int get_single_number (void);
174extern symbolS *make_expr_symbol (expressionS * expressionP);
175extern int expr_symbol_where (symbolS *, char **, unsigned int *);
176
177extern symbolS *expr_build_uconstant (offsetT);
178extern symbolS *expr_build_dot (void);
179
180int resolve_expression (expressionS *);
181