|
|
1.1 ! root 1: /* expr.h -> header file for expr.c ! 2: Copyright (C) 1987 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GAS, the GNU Assembler. ! 5: ! 6: GAS is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 1, or (at your option) ! 9: any later version. ! 10: ! 11: GAS is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GAS; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: #import "struc-symbol.h" ! 21: #import "bignum.h" ! 22: #import "flonum.h" ! 23: ! 24: /* ! 25: * This table describes the use of segments as EXPRESSION types. ! 26: * ! 27: * X_seg X_add_symbol X_subtract_symbol X_add_number ! 28: * SEG_NONE no (legal) expression ! 29: * SEG_BIG * > 32 bits const. ! 30: * SEG_ABSOLUTE 0 ! 31: * SEG_SECT * 0 ! 32: * SEG_UNKNOWN * 0 ! 33: * SEG_DIFFSECT 0 * 0 ! 34: * ! 35: * The blank fields MUST be 0, and are nugatory. ! 36: * The '0' fields MAY be 0. The '*' fields MAY NOT be 0. ! 37: * ! 38: * SEG_BIG: A floating point number or an integer larger than 32 bits. ! 39: * For a floating point number: ! 40: * X_add_number is < 0 ! 41: * The result is in the global variable generic_floating_point_number. ! 42: * The value in X_add_number is -'c' where c is the character that ! 43: * introduced the constant. e.g. "0f6.9" will have -'f' as a ! 44: * X_add_number value. ! 45: * For an integer larger than 32 bits: ! 46: * X_add_number > 0 ! 47: * The result is in the global variable generic_bignum. ! 48: * The value in X_add_number is a count of how many littlenums it ! 49: * took to represent the bignum. ! 50: */ ! 51: typedef enum { ! 52: SEG_ABSOLUTE, /* absolute */ ! 53: SEG_SECT, /* normal defined section */ ! 54: SEG_DIFFSECT, /* difference between symbols in sections */ ! 55: SEG_UNKNOWN, /* expression involving an undefined symbol */ ! 56: SEG_NONE, /* no expression */ ! 57: SEG_BIG /* bigger than 32 bits constant */ ! 58: } segT; ! 59: ! 60: extern char *seg_name[]; ! 61: extern segT N_TYPE_seg[]; ! 62: ! 63: /* ! 64: * When an expression is SEG_BIG, it is in these globals (see comments above ! 65: * about SEG_BIG). This data may be clobbered whenever expr() is called. ! 66: */ ! 67: extern FLONUM_TYPE generic_floating_point_number; ! 68: extern LITTLENUM_TYPE generic_bignum[]; ! 69: #define SIZE_OF_LARGE_NUMBER (20) /* Number of littlenums in above */ ! 70: /* generic_bignum which is enough to */ ! 71: /* hold most precise flonum. */ ! 72: ! 73: /* ! 74: * Abbreviations (mnemonics). ! 75: * ! 76: * O operator ! 77: * Q quantity, operand ! 78: * X eXpression ! 79: */ ! 80: ! 81: /* ! 82: * By popular demand, we define a struct to represent an expression. ! 83: * This will no doubt mutate as expressions become baroque. ! 84: * ! 85: * Currently, we support expressions like "foo-bar+42". ! 86: * In other words we permit a (possibly undefined) minuend, a ! 87: * (possibly undefined) subtrahend and an (absolute) augend. ! 88: * RMS says this is so we can have 1-pass assembly for any compiler ! 89: * emmissions, and a 'case' statement might emit 'undefined1 - undefined2'. ! 90: * ! 91: * To simplify table-driven dispatch, we also have a "segment" for the ! 92: * entire expression. That way we don't require complex reasoning about ! 93: * whether particular components are defined; and we can change component ! 94: * semantics without re-working all the dispatch tables in the assembler. ! 95: * In other words the "type" of an expression is its segment. ! 96: */ ! 97: ! 98: typedef struct { ! 99: symbolS *X_add_symbol; /* foo */ ! 100: symbolS *X_subtract_symbol; /* bar */ ! 101: long X_add_number; /* 42 (must be signed) */ ! 102: segT X_seg; /* What segment (expr type) */ ! 103: } expressionS; ! 104: ! 105: extern segT expression( ! 106: expressionS *resultP); ! 107: extern char get_symbol_end( ! 108: void); ! 109: extern segT try_to_make_absolute( ! 110: expressionS *expressionP);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.