| 1 | /* struct_symbol.h - Internal symbol structure |
| 2 | Copyright (C) 1987, 1992 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 2, 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 | #ifndef __struc_symbol_h__ |
| 21 | #define __struc_symbol_h__ |
| 22 | |
| 23 | #ifdef BFD_ASSEMBLER |
| 24 | /* The BFD code wants to walk the list in both directions. */ |
| 25 | #undef SYMBOLS_NEED_BACKPOINTERS |
| 26 | #define SYMBOLS_NEED_BACKPOINTERS |
| 27 | #endif |
| 28 | |
| 29 | /* our version of an nlist node */ |
| 30 | struct symbol |
| 31 | { |
| 32 | #ifndef BFD_ASSEMBLER |
| 33 | /* The (4-origin) position of sy_name in the symbol table of the object |
| 34 | file. This will be 0 for (nameless) .stabd symbols. |
| 35 | |
| 36 | Not used until write_object_file() time. */ |
| 37 | unsigned long sy_name_offset; |
| 38 | |
| 39 | /* What we write in .o file (if permitted). */ |
| 40 | obj_symbol_type sy_symbol; |
| 41 | |
| 42 | /* The 24 bit symbol number. Symbol numbers start at 0 and are unsigned. */ |
| 43 | long sy_number; |
| 44 | #else |
| 45 | /* BFD symbol */ |
| 46 | asymbol *bsym; |
| 47 | #endif |
| 48 | |
| 49 | /* The value of the symbol. */ |
| 50 | expressionS sy_value; |
| 51 | |
| 52 | struct symbol *sy_next; /* forward chain, or NULL */ |
| 53 | #ifdef SYMBOLS_NEED_BACKPOINTERS |
| 54 | struct symbol *sy_previous; /* backward chain, or NULL */ |
| 55 | #endif /* SYMBOLS_NEED_BACKPOINTERS */ |
| 56 | |
| 57 | struct frag *sy_frag; /* NULL or -> frag this symbol attaches to. */ |
| 58 | |
| 59 | struct symbol *sy_forward; /* value is really that of this other symbol */ |
| 60 | |
| 61 | int written : 1; |
| 62 | |
| 63 | #ifdef TARGET_SYMBOL_FIELDS |
| 64 | TARGET_SYMBOL_FIELDS |
| 65 | #endif |
| 66 | }; |
| 67 | |
| 68 | typedef struct symbol symbolS; |
| 69 | |
| 70 | #ifndef WORKING_DOT_WORD |
| 71 | struct broken_word |
| 72 | { |
| 73 | struct broken_word *next_broken_word; /* One of these strucs per .word x-y */ |
| 74 | fragS *frag; /* Which frag its in */ |
| 75 | char *word_goes_here; /* Where in the frag it is */ |
| 76 | fragS *dispfrag; /* where to add the break */ |
| 77 | symbolS *add; /* symbol_x */ |
| 78 | symbolS *sub; /* - symbol_y */ |
| 79 | offsetT addnum; /* + addnum */ |
| 80 | int added; /* nasty thing happend yet? */ |
| 81 | /* 1: added and has a long-jump */ |
| 82 | /* 2: added but uses someone elses long-jump */ |
| 83 | struct broken_word *use_jump; /* points to broken_word with a similar |
| 84 | long-jump */ |
| 85 | }; |
| 86 | extern struct broken_word *broken_words; |
| 87 | #endif /* ndef WORKING_DOT_WORD */ |
| 88 | |
| 89 | /* |
| 90 | * Current means for getting from symbols to segments and vice verse. |
| 91 | * This will change for infinite-segments support (e.g. COFF). |
| 92 | */ |
| 93 | /* #define SYMBOL_TYPE_TO_SEGMENT(symP) ( N_TYPE_seg [(int) (symP)->sy_type & N_TYPE] ) */ |
| 94 | extern const segT N_TYPE_seg[]; /* subseg.c */ |
| 95 | |
| 96 | #define SEGMENT_TO_SYMBOL_TYPE(seg) ( seg_N_TYPE [(int) (seg)] ) |
| 97 | extern const short seg_N_TYPE[];/* subseg.c */ |
| 98 | |
| 99 | #define N_REGISTER 30 /* Fake N_TYPE value for SEG_REGISTER */ |
| 100 | |
| 101 | #ifdef SYMBOLS_NEED_BACKPOINTERS |
| 102 | |
| 103 | void symbol_clear_list_pointers PARAMS ((symbolS * symbolP)); |
| 104 | void symbol_insert PARAMS ((symbolS * addme, symbolS * target, |
| 105 | symbolS ** rootP, symbolS ** lastP)); |
| 106 | void symbol_remove PARAMS ((symbolS * symbolP, symbolS ** rootP, |
| 107 | symbolS ** lastP)); |
| 108 | void verify_symbol_chain PARAMS ((symbolS * rootP, symbolS * lastP)); |
| 109 | |
| 110 | #define symbol_previous(s) ((s)->sy_previous) |
| 111 | |
| 112 | #else /* SYMBOLS_NEED_BACKPOINTERS */ |
| 113 | |
| 114 | #define symbol_clear_list_pointers(clearme) {clearme->sy_next = NULL;} |
| 115 | |
| 116 | #endif /* SYMBOLS_NEED_BACKPOINTERS */ |
| 117 | |
| 118 | void symbol_append PARAMS ((symbolS * addme, symbolS * target, |
| 119 | symbolS ** rootP, symbolS ** lastP)); |
| 120 | |
| 121 | #define symbol_next(s) ((s)->sy_next) |
| 122 | |
| 123 | #endif /* __struc_symbol_h__ */ |
| 124 | |
| 125 | /* end of struc-symbol.h */ |