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