1 /* coffgrok.h 2 Copyright (C) 2001-2016 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 unsigned 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 { 73 int low; 74 int high; 75 int init; 76 struct coff_section *parent; 77 }; 78 79 struct coff_sfile 80 { 81 char *name; 82 struct coff_scope *scope; 83 struct coff_sfile *next; 84 85 /* Vector which maps where in each output section 86 the input file has it's data. */ 87 struct coff_isection *section; 88 }; 89 90 struct coff_type 91 { 92 int size; 93 enum 94 { 95 coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type, 96 coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type 97 } type; 98 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 } astructdef; 113 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 125 struct 126 { 127 struct coff_symbol *ref; 128 } aenumref; 129 130 struct 131 { 132 struct coff_type *points_to; 133 } pointer; 134 135 struct 136 { 137 int dim; 138 struct coff_type *array_of; 139 } array; 140 141 struct 142 { 143 struct coff_type * function_returns; 144 struct coff_scope * parameters; 145 struct coff_scope * code; 146 struct coff_line * lines; 147 } function; 148 149 int basic; /* One of T_VOID.. T_UINT */ 150 } u; 151 }; 152 153 struct coff_line 154 { 155 int nlines; 156 int * lines; 157 int * addresses; 158 }; 159 160 struct coff_scope 161 { 162 struct coff_section * sec; /* Which section. */ 163 int offset; /* Where. */ 164 int size; /* How big. */ 165 struct coff_scope * parent; /* One up. */ 166 struct coff_scope * next; /* Next along. */ 167 int nvars; 168 struct coff_symbol * vars_head; /* Symbols. */ 169 struct coff_symbol * vars_tail; 170 struct coff_scope * list_head; /* Children. */ 171 struct coff_scope * list_tail; 172 }; 173 174 struct coff_visible 175 { 176 enum coff_vis_type 177 { 178 coff_vis_ext_def, 179 coff_vis_ext_ref, 180 coff_vis_int_def, 181 coff_vis_common, 182 coff_vis_auto, 183 coff_vis_register, 184 coff_vis_tag, 185 coff_vis_member_of_struct, 186 coff_vis_member_of_enum, 187 coff_vis_autoparam, 188 coff_vis_regparam, 189 } type; 190 }; 191 192 struct coff_where 193 { 194 enum 195 { 196 coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown, 197 coff_where_strtag, coff_where_member_of_struct, 198 coff_where_member_of_enum, coff_where_entag, coff_where_typedef 199 } where; 200 201 int offset; 202 int bitoffset; 203 int bitsize; 204 struct coff_section *section; 205 }; 206 207 struct coff_symbol 208 { 209 char * name; 210 int tag; 211 struct coff_type * type; 212 struct coff_where * where; 213 struct coff_visible * visible; 214 struct coff_symbol * next; 215 struct coff_symbol * next_in_ofile_list; /* For the ofile list. */ 216 int number; 217 int er_number; 218 struct coff_sfile * sfile; 219 }; 220 221 struct coff_ofile * coff_grok (bfd *); 222