]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/expr.h
Switch to GPLv3
[thirdparty/binutils-gdb.git] / gas / expr.h
CommitLineData
252b5132 1/* expr.h -> header file for expr.c
2da5c037 2 Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
ec2655a6 3 2002, 2003, 2007 Free Software Foundation, Inc.
252b5132
RH
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
ec2655a6 9 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
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
4b4da160
NC
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
252b5132
RH
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
e6c774b4 43typedef enum {
252b5132
RH
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,
7f31df7c 71 /* (X_add_symbol % X_op_symbol) + X_add_number. */
252b5132 72 O_modulus,
7f31df7c 73 /* (X_add_symbol << X_op_symbol) + X_add_number. */
252b5132 74 O_left_shift,
7f31df7c 75 /* (X_add_symbol >> X_op_symbol) + X_add_number. */
252b5132 76 O_right_shift,
7f31df7c 77 /* (X_add_symbol | X_op_symbol) + X_add_number. */
252b5132 78 O_bit_inclusive_or,
7f31df7c 79 /* (X_add_symbol |~ X_op_symbol) + X_add_number. */
252b5132 80 O_bit_or_not,
7f31df7c 81 /* (X_add_symbol ^ X_op_symbol) + X_add_number. */
252b5132 82 O_bit_exclusive_or,
7f31df7c 83 /* (X_add_symbol & X_op_symbol) + X_add_number. */
252b5132 84 O_bit_and,
7f31df7c 85 /* (X_add_symbol + X_op_symbol) + X_add_number. */
252b5132 86 O_add,
7f31df7c 87 /* (X_add_symbol - X_op_symbol) + X_add_number. */
252b5132
RH
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,
b585bc2c
RH
105 /* X_op_symbol [ X_add_symbol ] */
106 O_index,
dd33dc0f
MM
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,
3765b1be
RH
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,
252b5132
RH
112 /* this must be the largest value */
113 O_max
114} operatorT;
115
e6c774b4 116typedef struct expressionS {
252b5132 117 /* The main symbol. */
49309057 118 symbolS *X_add_symbol;
252b5132 119 /* The second symbol, if needed. */
49309057 120 symbolS *X_op_symbol;
252b5132
RH
121 /* A number to add. */
122 offsetT X_add_number;
446a06c9 123
bf29b231
RH
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__
446a06c9 128 operatorT X_op : 8;
bf29b231 129#else
446a06c9 130 unsigned char X_op;
bf29b231 131#endif
446a06c9 132
252b5132
RH
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;
446a06c9
MM
139
140 /* 7 additional bits can be defined if needed. */
141
142 /* Machine dependent field */
143 unsigned short X_md;
252b5132
RH
144} expressionS;
145
9497f5ac
NC
146enum expr_mode
147{
148 expr_evaluate,
149 expr_normal,
150 expr_defer
151};
152
a01b9fa4 153/* "result" should be type (expressionS *). */
9497f5ac
NC
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)
252b5132
RH
157
158/* If an expression is O_big, look here for its value. These common
a01b9fa4
KH
159 data may be clobbered whenever expr() is called. */
160/* Flonums returned here. Big enough to hold most precise flonum. */
252b5132 161extern FLONUM_TYPE generic_floating_point_number;
a01b9fa4 162/* Bignums returned here. */
252b5132 163extern LITTLENUM_TYPE generic_bignum[];
a01b9fa4 164/* Number of littlenums in above. */
252b5132
RH
165#define SIZE_OF_LARGE_NUMBER (20)
166
167typedef char operator_rankT;
168
dd625418
KH
169extern char get_symbol_end (void);
170extern void expr_begin (void);
171extern void expr_set_precedence (void);
9497f5ac 172extern segT expr (int, expressionS *, enum expr_mode);
dd625418
KH
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);
dd625418 178extern symbolS *expr_build_dot (void);
9497f5ac
NC
179
180int resolve_expression (expressionS *);