expr.h revision 78828
1223637Sbz/* expr.h -> header file for expr.c
2126353Smlaier   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
3126353Smlaier   Free Software Foundation, Inc.
4126353Smlaier
5130617Smlaier   This file is part of GAS, the GNU Assembler.
6126353Smlaier
7126353Smlaier   GAS is free software; you can redistribute it and/or modify
8126353Smlaier   it under the terms of the GNU General Public License as published by
9126353Smlaier   the Free Software Foundation; either version 2, or (at your option)
10126353Smlaier   any later version.
11126353Smlaier
12126353Smlaier   GAS is distributed in the hope that it will be useful,
13126353Smlaier   but WITHOUT ANY WARRANTY; without even the implied warranty of
14126353Smlaier   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15126353Smlaier   GNU General Public License for more details.
16126353Smlaier
17126353Smlaier   You should have received a copy of the GNU General Public License
18126353Smlaier   along with GAS; see the file COPYING.  If not, write to the Free
19126353Smlaier   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20126353Smlaier   02111-1307, USA.  */
21126353Smlaier
22126353Smlaier/*
23126353Smlaier * By popular demand, we define a struct to represent an expression.
24126353Smlaier * This will no doubt mutate as expressions become baroque.
25126353Smlaier *
26126353Smlaier * Currently, we support expressions like "foo OP bar + 42".  In other
27126353Smlaier * words we permit a (possibly undefined) symbol, a (possibly
28126353Smlaier * undefined) symbol and the operation used to combine the symbols,
29126353Smlaier * and an (absolute) augend.  RMS says this is so we can have 1-pass
30126353Smlaier * assembly for any compiler emissions, and a 'case' statement might
31126353Smlaier * emit 'undefined1 - undefined2'.
32126353Smlaier *
33126353Smlaier * The type of an expression used to be stored as a segment.  That got
34127082Sobrien * confusing because it overloaded the concept of a segment.  I added
35127082Sobrien * an operator field, instead.
36127082Sobrien */
37126353Smlaier
38126353Smlaier/* This is the type of an expression.  The operator types are also
39126353Smlaier   used while parsing an expression.
40145840Smlaier
41126353Smlaier   NOTE: This enumeration must match the op_rank array in expr.c.  */
42223637Sbz
43223637Sbztypedef enum {
44223637Sbz  /* An illegal expression.  */
45223637Sbz  O_illegal,
46126353Smlaier  /* A nonexistent expression.  */
47126353Smlaier  O_absent,
48126353Smlaier  /* X_add_number (a constant expression).  */
49126353Smlaier  O_constant,
50126353Smlaier  /* X_add_symbol + X_add_number.  */
51171172Smlaier  O_symbol,
52126353Smlaier  /* X_add_symbol + X_add_number - the base address of the image.  */
53126353Smlaier  O_symbol_rva,
54126353Smlaier  /* A register (X_add_number is register number).  */
55126353Smlaier  O_register,
56126353Smlaier  /* A big value.  If X_add_number is negative or 0, the value is in
57126353Smlaier     generic_floating_point_number.  Otherwise the value is in
58126353Smlaier     generic_bignum, and X_add_number is the number of LITTLENUMs in
59126353Smlaier     the value.  */
60126353Smlaier  O_big,
61126353Smlaier  /* (- X_add_symbol) + X_add_number.  */
62126353Smlaier  O_uminus,
63126353Smlaier  /* (~ X_add_symbol) + X_add_number.  */
64126353Smlaier  O_bit_not,
65126353Smlaier  /* (! X_add_symbol) + X_add_number.  */
66126353Smlaier  O_logical_not,
67126353Smlaier  /* (X_add_symbol * X_op_symbol) + X_add_number.  */
68126353Smlaier  O_multiply,
69126353Smlaier  /* (X_add_symbol / X_op_symbol) + X_add_number.  */
70145840Smlaier  O_divide,
71145840Smlaier  /* X_add_symbol % X_op_symbol) + X_add_number.  */
72145840Smlaier  O_modulus,
73126353Smlaier  /* X_add_symbol << X_op_symbol) + X_add_number.  */
74130617Smlaier  O_left_shift,
75130617Smlaier  /* X_add_symbol >> X_op_symbol) + X_add_number.  */
76171172Smlaier  O_right_shift,
77171172Smlaier  /* X_add_symbol | X_op_symbol) + X_add_number.  */
78223637Sbz  O_bit_inclusive_or,
79223637Sbz  /* X_add_symbol |~ X_op_symbol) + X_add_number.  */
80223637Sbz  O_bit_or_not,
81145840Smlaier  /* X_add_symbol ^ X_op_symbol) + X_add_number.  */
82145840Smlaier  O_bit_exclusive_or,
83145840Smlaier  /* X_add_symbol & X_op_symbol) + X_add_number.  */
84145840Smlaier  O_bit_and,
85145840Smlaier  /* X_add_symbol + X_op_symbol) + X_add_number.  */
86145840Smlaier  O_add,
87145840Smlaier  /* X_add_symbol - X_op_symbol) + X_add_number.  */
88126353Smlaier  O_subtract,
89145840Smlaier  /* (X_add_symbol == X_op_symbol) + X_add_number.  */
90126353Smlaier  O_eq,
91171172Smlaier  /* (X_add_symbol != X_op_symbol) + X_add_number.  */
92145840Smlaier  O_ne,
93130617Smlaier  /* (X_add_symbol < X_op_symbol) + X_add_number.  */
94130617Smlaier  O_lt,
95130617Smlaier  /* (X_add_symbol <= X_op_symbol) + X_add_number.  */
96130617Smlaier  O_le,
97130617Smlaier  /* (X_add_symbol >= X_op_symbol) + X_add_number.  */
98145840Smlaier  O_ge,
99126353Smlaier  /* (X_add_symbol > X_op_symbol) + X_add_number.  */
100126353Smlaier  O_gt,
101171172Smlaier  /* (X_add_symbol && X_op_symbol) + X_add_number.  */
102171172Smlaier  O_logical_and,
103171172Smlaier  /* (X_add_symbol || X_op_symbol) + X_add_number.  */
104171172Smlaier  O_logical_or,
105126353Smlaier  /* X_op_symbol [ X_add_symbol ] */
106126353Smlaier  O_index,
107171172Smlaier  /* machine dependent operators */
108171172Smlaier  O_md1,  O_md2,  O_md3,  O_md4,  O_md5,  O_md6,  O_md7,  O_md8,
109171172Smlaier  O_md9,  O_md10, O_md11, O_md12, O_md13, O_md14, O_md15, O_md16,
110126353Smlaier  /* this must be the largest value */
111126353Smlaier  O_max
112126353Smlaier} operatorT;
113126353Smlaier
114126353Smlaiertypedef struct expressionS {
115171172Smlaier  /* The main symbol.  */
116130617Smlaier  symbolS *X_add_symbol;
117130617Smlaier  /* The second symbol, if needed.  */
118126353Smlaier  symbolS *X_op_symbol;
119126353Smlaier  /* A number to add.  */
120171172Smlaier  offsetT X_add_number;
121171172Smlaier
122126353Smlaier  /* The type of the expression.  We can't assume that an arbitrary
123126353Smlaier     compiler can handle a bitfield of enum type.  FIXME: We could
124126353Smlaier     check this using autoconf.  */
125126353Smlaier#ifdef __GNUC__
126126353Smlaier  operatorT X_op : 8;
127126353Smlaier#else
128130617Smlaier  unsigned char X_op;
129130617Smlaier#endif
130126353Smlaier
131171172Smlaier  /* Non-zero if X_add_number should be regarded as unsigned.  This is
132171172Smlaier     only valid for O_constant expressions.  It is only used when an
133171172Smlaier     O_constant must be extended into a bignum (i.e., it is not used
134171172Smlaier     when performing arithmetic on these values).
135171172Smlaier     FIXME: This field is not set very reliably.  */
136171172Smlaier  unsigned int X_unsigned : 1;
137171172Smlaier
138171172Smlaier  /* 7 additional bits can be defined if needed.  */
139171172Smlaier
140126353Smlaier  /* Machine dependent field */
141126353Smlaier  unsigned short X_md;
142126353Smlaier} expressionS;
143126353Smlaier
144171172Smlaier/* "result" should be type (expressionS *).  */
145171172Smlaier#define expression(result) expr (0, result)
146171172Smlaier
147171172Smlaier/* If an expression is O_big, look here for its value. These common
148171172Smlaier   data may be clobbered whenever expr() is called.  */
149171172Smlaier/* Flonums returned here.  Big enough to hold most precise flonum.  */
150126353Smlaierextern FLONUM_TYPE generic_floating_point_number;
151126353Smlaier/* Bignums returned here.  */
152126353Smlaierextern LITTLENUM_TYPE generic_bignum[];
153126353Smlaier/* Number of littlenums in above.  */
154126353Smlaier#define SIZE_OF_LARGE_NUMBER (20)
155126353Smlaier
156126353Smlaiertypedef char operator_rankT;
157126353Smlaier
158126353Smlaierextern char get_symbol_end PARAMS ((void));
159126353Smlaierextern void expr_begin PARAMS ((void));
160126353Smlaierextern void expr_set_precedence PARAMS ((void));
161126353Smlaierextern segT expr PARAMS ((int rank, expressionS * resultP));
162126353Smlaierextern unsigned int get_single_number PARAMS ((void));
163145840Smlaierextern symbolS *make_expr_symbol PARAMS ((expressionS * expressionP));
164126353Smlaierextern int expr_symbol_where
165126353Smlaier  PARAMS ((symbolS *, char **, unsigned int *));
166126353Smlaier
167126353Smlaierextern symbolS *expr_build_uconstant PARAMS ((offsetT));
168126353Smlaierextern symbolS *expr_build_unary PARAMS ((operatorT, symbolS *));
169126353Smlaierextern symbolS *expr_build_binary PARAMS ((operatorT, symbolS *, symbolS *));
170126353Smlaierextern symbolS *expr_build_dot PARAMS ((void));
171126353Smlaier