expr.h revision 302408
116239Sjkh/* expr.h -> header file for expr.c 24Srgrimes Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 3509Srgrimes 2002, 2003 Free Software Foundation, Inc. 450477Speter 54Srgrimes This file is part of GAS, the GNU Assembler. 6509Srgrimes 7509Srgrimes GAS is free software; you can redistribute it and/or modify 84Srgrimes it under the terms of the GNU General Public License as published by 94Srgrimes the Free Software Foundation; either version 2, or (at your option) 104Srgrimes any later version. 114Srgrimes 124Srgrimes GAS is distributed in the hope that it will be useful, 134Srgrimes but WITHOUT ANY WARRANTY; without even the implied warranty of 144Srgrimes MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1585532Sru GNU General Public License for more details. 164Srgrimes 174Srgrimes You should have received a copy of the GNU General Public License 184Srgrimes along with GAS; see the file COPYING. If not, write to the Free 1930640Speter Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 20169612Swkoszek 02110-1301, USA. */ 2130640Speter 2227674Sphk/* 2327674Sphk * By popular demand, we define a struct to represent an expression. 2452651Smarcel * This will no doubt mutate as expressions become baroque. 252056Swollman * 262056Swollman * Currently, we support expressions like "foo OP bar + 42". In other 272056Swollman * words we permit a (possibly undefined) symbol, a (possibly 2879014Simp * undefined) symbol and the operation used to combine the symbols, 292056Swollman * and an (absolute) augend. RMS says this is so we can have 1-pass 3052651Smarcel * assembly for any compiler emissions, and a 'case' statement might 3185909Simp * emit 'undefined1 - undefined2'. 324Srgrimes * 33250840Smarcel * The type of an expression used to be stored as a segment. That got 34250840Smarcel * confusing because it overloaded the concept of a segment. I added 35154975Snyan * an operator field, instead. 3689345Snyan */ 37154975Snyan 38154975Snyan/* This is the type of an expression. The operator types are also 39218893Sdim used while parsing an expression. 40232263Sdim 41232263Sdim NOTE: This enumeration must match the op_rank array in expr.c. */ 42232263Sdim 43218893Sdimtypedef enum { 445327Sgibbs /* An illegal expression. */ 455327Sgibbs O_illegal, 464Srgrimes /* A nonexistent expression. */ 474Srgrimes O_absent, 4869135Speter /* X_add_number (a constant expression). */ 494Srgrimes O_constant, 5069135Speter /* X_add_symbol + X_add_number. */ 5111918Sdg O_symbol, 5269135Speter /* X_add_symbol + X_add_number - the base address of the image. */ 5338778Snsouch O_symbol_rva, 546802Sgibbs /* A register (X_add_number is register number). */ 556802Sgibbs O_register, 5686273Simp /* A big value. If X_add_number is negative or 0, the value is in 5786273Simp generic_floating_point_number. Otherwise the value is in 5885909Simp 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 146enum expr_mode 147{ 148 expr_evaluate, 149 expr_normal, 150 expr_defer 151}; 152 153/* "result" should be type (expressionS *). */ 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) 157 158/* If an expression is O_big, look here for its value. These common 159 data may be clobbered whenever expr() is called. */ 160/* Flonums returned here. Big enough to hold most precise flonum. */ 161extern FLONUM_TYPE generic_floating_point_number; 162/* Bignums returned here. */ 163extern LITTLENUM_TYPE generic_bignum[]; 164/* Number of littlenums in above. */ 165#define SIZE_OF_LARGE_NUMBER (20) 166 167typedef char operator_rankT; 168 169extern char get_symbol_end (void); 170extern void expr_begin (void); 171extern void expr_set_precedence (void); 172extern segT expr (int, expressionS *, enum expr_mode); 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); 178extern symbolS *expr_build_dot (void); 179 180int resolve_expression (expressionS *); 181