source: trunk/src/binutils/gas/expr.h@ 610

Last change on this file since 610 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 6.1 KB
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 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
146/* "result" should be type (expressionS *). */
147#define expression(result) expr (0, result)
148
149/* If an expression is O_big, look here for its value. These common
150 data may be clobbered whenever expr() is called. */
151/* Flonums returned here. Big enough to hold most precise flonum. */
152extern FLONUM_TYPE generic_floating_point_number;
153/* Bignums returned here. */
154extern LITTLENUM_TYPE generic_bignum[];
155/* Number of littlenums in above. */
156#define SIZE_OF_LARGE_NUMBER (20)
157
158typedef char operator_rankT;
159
160extern char get_symbol_end PARAMS ((void));
161extern void expr_begin PARAMS ((void));
162extern void expr_set_precedence PARAMS ((void));
163extern segT expr PARAMS ((int rank, expressionS * resultP));
164extern unsigned int get_single_number PARAMS ((void));
165extern symbolS *make_expr_symbol PARAMS ((expressionS * expressionP));
166extern int expr_symbol_where
167 PARAMS ((symbolS *, char **, unsigned int *));
168
169extern symbolS *expr_build_uconstant PARAMS ((offsetT));
170extern symbolS *expr_build_unary PARAMS ((operatorT, symbolS *));
171extern symbolS *expr_build_binary PARAMS ((operatorT, symbolS *, symbolS *));
172extern symbolS *expr_build_dot PARAMS ((void));
Note: See TracBrowser for help on using the repository browser.