* scripttempl/armbpabi.sc: Replace DWARF sections with an
[deliverable/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,
aa820537 3 2002, 2003, 2005, 2007, 2009 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;
956a6ba3
JB
139 /* This is used to implement "word size + 1 bit" arithmetic, so that e.g.
140 expressions used with .sleb128 directives can use the full range available
141 for an unsigned word, but can also properly represent all values of a
142 signed word. */
143 unsigned int X_extrabit : 1;
446a06c9
MM
144
145 /* 7 additional bits can be defined if needed. */
146
147 /* Machine dependent field */
148 unsigned short X_md;
252b5132
RH
149} expressionS;
150
9497f5ac
NC
151enum expr_mode
152{
153 expr_evaluate,
154 expr_normal,
155 expr_defer
156};
157
a01b9fa4 158/* "result" should be type (expressionS *). */
9497f5ac
NC
159#define expression(result) expr (0, result, expr_normal)
160#define expression_and_evaluate(result) expr (0, result, expr_evaluate)
161#define deferred_expression(result) expr (0, result, expr_defer)
252b5132
RH
162
163/* If an expression is O_big, look here for its value. These common
a01b9fa4
KH
164 data may be clobbered whenever expr() is called. */
165/* Flonums returned here. Big enough to hold most precise flonum. */
252b5132 166extern FLONUM_TYPE generic_floating_point_number;
a01b9fa4 167/* Bignums returned here. */
252b5132 168extern LITTLENUM_TYPE generic_bignum[];
a01b9fa4 169/* Number of littlenums in above. */
252b5132
RH
170#define SIZE_OF_LARGE_NUMBER (20)
171
172typedef char operator_rankT;
173
dd625418
KH
174extern char get_symbol_end (void);
175extern void expr_begin (void);
176extern void expr_set_precedence (void);
fcaed75e 177extern void expr_set_rank (operatorT, operator_rankT);
9497f5ac 178extern segT expr (int, expressionS *, enum expr_mode);
dd625418
KH
179extern unsigned int get_single_number (void);
180extern symbolS *make_expr_symbol (expressionS * expressionP);
181extern int expr_symbol_where (symbolS *, char **, unsigned int *);
b7adb16d 182extern void current_location (expressionS *);
dd625418
KH
183
184extern symbolS *expr_build_uconstant (offsetT);
dd625418 185extern symbolS *expr_build_dot (void);
9497f5ac
NC
186
187int resolve_expression (expressionS *);
This page took 0.535675 seconds and 4 git commands to generate.