1 /* coffgrok.h 2 Copyright (C) 2001-2014 Free Software Foundation, Inc. 3 4 This file is part of GNU Binutils. 5 6 This program 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 3 of the License, or 9 (at your option) any later version. 10 11 This program 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 this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 #define T_NULL 0 22 #define T_VOID 1 /* function argument (only used by compiler) */ 23 #define T_CHAR 2 /* character */ 24 #define T_SHORT 3 /* short integer */ 25 #define T_INT 4 /* integer */ 26 #define T_LONG 5 /* long integer */ 27 #define T_FLOAT 6 /* floating point */ 28 #define T_DOUBLE 7 /* double word */ 29 #define T_STRUCT 8 /* structure */ 30 #define T_UNION 9 /* union */ 31 #define T_ENUM 10 /* enumeration */ 32 #define T_MOE 11 /* member of enumeration*/ 33 #define T_UCHAR 12 /* unsigned character */ 34 #define T_USHORT 13 /* unsigned short */ 35 #define T_UINT 14 /* unsigned integer */ 36 #define T_ULONG 15 /* unsigned long */ 37 #define T_LNGDBL 16 /* long double */ 38 39 40 struct coff_reloc 41 { 42 int offset; 43 struct coff_symbol *symbol; 44 int addend; 45 }; 46 47 struct coff_section 48 { 49 char *name; 50 int code; 51 int data; 52 int address; 53 int number; /* 0..n, .text = 0 */ 54 int nrelocs; 55 int size; 56 struct coff_reloc *relocs; 57 struct bfd_section *bfd_section; 58 }; 59 60 struct coff_ofile 61 { 62 int nsources; 63 struct coff_sfile *source_head; 64 struct coff_sfile *source_tail; 65 int nsections; 66 struct coff_section *sections; 67 struct coff_symbol *symbol_list_head; 68 struct coff_symbol *symbol_list_tail; 69 }; 70 71 struct coff_isection { 72 int low; 73 int high; 74 int init; 75 struct coff_section *parent; 76 }; 77 78 struct coff_sfile 79 { 80 char *name; 81 struct coff_scope *scope; 82 struct coff_sfile *next; 83 84 /* Vector which maps where in each output section 85 the input file has it's data */ 86 struct coff_isection *section; 87 88 }; 89 90 91 struct coff_type 92 { 93 int size; 94 enum 95 { 96 coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type, 97 coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type 98 } type; 99 union 100 { 101 struct 102 { 103 int address; 104 int size; 105 } asecdef; 106 107 struct 108 { 109 int isstruct; 110 struct coff_scope *elements; 111 int idx; 112 } 113 astructdef; 114 struct 115 { 116 struct coff_symbol *ref; 117 } astructref; 118 119 struct 120 { 121 struct coff_scope *elements; 122 int idx; 123 } aenumdef; 124 struct 125 { 126 struct coff_symbol *ref; 127 } aenumref; 128 129 struct 130 { 131 struct coff_type *points_to; 132 } pointer; 133 struct 134 { 135 int dim; 136 struct coff_type *array_of; 137 } array; 138 139 struct 140 { 141 struct coff_type *function_returns; 142 struct coff_scope *parameters; 143 struct coff_scope *code; 144 struct coff_line *lines; 145 } function; 146 int basic; /* One of T_VOID.. T_UINT */ 147 } u; 148 }; 149 150 151 struct coff_line 152 { 153 int nlines; 154 int *lines; 155 int *addresses; 156 }; 157 158 159 struct coff_scope 160 { 161 struct coff_section *sec; /* What section */ 162 int offset; /* where */ 163 int size; /* How big */ 164 struct coff_scope *parent; /* one up */ 165 166 struct coff_scope *next; /*next along */ 167 168 int nvars; 169 170 struct coff_symbol *vars_head; /* symbols */ 171 struct coff_symbol *vars_tail; 172 173 struct coff_scope *list_head; /* children */ 174 struct coff_scope *list_tail; 175 176 }; 177 178 179 struct coff_visible 180 { 181 enum coff_vis_type 182 { 183 coff_vis_ext_def, 184 coff_vis_ext_ref, 185 coff_vis_int_def, 186 coff_vis_common, 187 coff_vis_auto, 188 coff_vis_register, 189 coff_vis_tag, 190 coff_vis_member_of_struct, 191 coff_vis_member_of_enum, 192 coff_vis_autoparam, 193 coff_vis_regparam, 194 } type; 195 }; 196 197 struct coff_where 198 { 199 enum 200 { 201 coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown, 202 coff_where_strtag, coff_where_member_of_struct, 203 coff_where_member_of_enum, coff_where_entag, coff_where_typedef 204 205 } where; 206 int offset; 207 int bitoffset; 208 int bitsize; 209 struct coff_section *section; 210 }; 211 212 struct coff_symbol 213 { 214 char *name; 215 int tag; 216 struct coff_type *type; 217 struct coff_where *where; 218 struct coff_visible *visible; 219 struct coff_symbol *next; 220 struct coff_symbol *next_in_ofile_list; /* For the ofile list */ 221 int number; 222 int er_number; 223 struct coff_sfile *sfile; 224 }; 225 226 struct coff_ofile *coff_grok (bfd *); 227