source: trunk/third/binutils/gas/expr.h @ 16965

Revision 16965, 6.0 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r16964, which included commits to RCS files with non-trunk default branches.
Line 
1/* expr.h -> header file for expr.c
2   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
3   Free Software Foundation, Inc.
4
5   This file is part of GAS, the GNU Assembler.
6
7   GAS is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12   GAS is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with GAS; see the file COPYING.  If not, write to the Free
19   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20   02111-1307, USA.  */
21
22/*
23 * By popular demand, we define a struct to represent an expression.
24 * This will no doubt mutate as expressions become baroque.
25 *
26 * Currently, we support expressions like "foo OP bar + 42".  In other
27 * words we permit a (possibly undefined) symbol, a (possibly
28 * undefined) symbol and the operation used to combine the symbols,
29 * and an (absolute) augend.  RMS says this is so we can have 1-pass
30 * assembly for any compiler emissions, and a 'case' statement might
31 * emit 'undefined1 - undefined2'.
32 *
33 * The type of an expression used to be stored as a segment.  That got
34 * confusing because it overloaded the concept of a segment.  I added
35 * an operator field, instead.
36 */
37
38/* This is the type of an expression.  The operator types are also
39   used while parsing an expression.
40
41   NOTE: This enumeration must match the op_rank array in expr.c.  */
42
43typedef enum {
44  /* An illegal expression.  */
45  O_illegal,
46  /* A nonexistent expression.  */
47  O_absent,
48  /* X_add_number (a constant expression).  */
49  O_constant,
50  /* X_add_symbol + X_add_number.  */
51  O_symbol,
52  /* X_add_symbol + X_add_number - the base address of the image.  */
53  O_symbol_rva,
54  /* A register (X_add_number is register number).  */
55  O_register,
56  /* A big value.  If X_add_number is negative or 0, the value is in
57     generic_floating_point_number.  Otherwise the value is in
58     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  /* this must be the largest value */
111  O_max
112} operatorT;
113
114typedef struct expressionS {
115  /* The main symbol.  */
116  symbolS *X_add_symbol;
117  /* The second symbol, if needed.  */
118  symbolS *X_op_symbol;
119  /* A number to add.  */
120  offsetT X_add_number;
121
122  /* The type of the expression.  We can't assume that an arbitrary
123     compiler can handle a bitfield of enum type.  FIXME: We could
124     check this using autoconf.  */
125#ifdef __GNUC__
126  operatorT X_op : 8;
127#else
128  unsigned char X_op;
129#endif
130
131  /* Non-zero if X_add_number should be regarded as unsigned.  This is
132     only valid for O_constant expressions.  It is only used when an
133     O_constant must be extended into a bignum (i.e., it is not used
134     when performing arithmetic on these values).
135     FIXME: This field is not set very reliably.  */
136  unsigned int X_unsigned : 1;
137
138  /* 7 additional bits can be defined if needed.  */
139
140  /* Machine dependent field */
141  unsigned short X_md;
142} expressionS;
143
144/* "result" should be type (expressionS *).  */
145#define expression(result) expr (0, result)
146
147/* If an expression is O_big, look here for its value. These common
148   data may be clobbered whenever expr() is called.  */
149/* Flonums returned here.  Big enough to hold most precise flonum.  */
150extern FLONUM_TYPE generic_floating_point_number;
151/* Bignums returned here.  */
152extern LITTLENUM_TYPE generic_bignum[];
153/* Number of littlenums in above.  */
154#define SIZE_OF_LARGE_NUMBER (20)
155
156typedef char operator_rankT;
157
158extern char get_symbol_end PARAMS ((void));
159extern void expr_begin PARAMS ((void));
160extern void expr_set_precedence PARAMS ((void));
161extern segT expr PARAMS ((int rank, expressionS * resultP));
162extern unsigned int get_single_number PARAMS ((void));
163extern symbolS *make_expr_symbol PARAMS ((expressionS * expressionP));
164extern int expr_symbol_where
165  PARAMS ((symbolS *, char **, unsigned int *));
166
167extern symbolS *expr_build_uconstant PARAMS ((offsetT));
168extern symbolS *expr_build_unary PARAMS ((operatorT, symbolS *));
169extern symbolS *expr_build_binary PARAMS ((operatorT, symbolS *, symbolS *));
170extern symbolS *expr_build_dot PARAMS ((void));
Note: See TracBrowser for help on using the repository browser.