1*a9fa9459Szrj /* dwarf.h - DWARF support header file 2*a9fa9459Szrj Copyright (C) 2005-2016 Free Software Foundation, Inc. 3*a9fa9459Szrj 4*a9fa9459Szrj This file is part of GNU Binutils. 5*a9fa9459Szrj 6*a9fa9459Szrj This program is free software; you can redistribute it and/or modify 7*a9fa9459Szrj it under the terms of the GNU General Public License as published by 8*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or 9*a9fa9459Szrj (at your option) any later version. 10*a9fa9459Szrj 11*a9fa9459Szrj This program is distributed in the hope that it will be useful, 12*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 13*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*a9fa9459Szrj GNU General Public License for more details. 15*a9fa9459Szrj 16*a9fa9459Szrj You should have received a copy of the GNU General Public License 17*a9fa9459Szrj along with this program; if not, write to the Free Software 18*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19*a9fa9459Szrj MA 02110-1301, USA. */ 20*a9fa9459Szrj 21*a9fa9459Szrj typedef unsigned HOST_WIDEST_INT dwarf_vma; 22*a9fa9459Szrj typedef HOST_WIDEST_INT dwarf_signed_vma; 23*a9fa9459Szrj typedef unsigned HOST_WIDEST_INT dwarf_size_type; 24*a9fa9459Szrj 25*a9fa9459Szrj /* Structure found in the .debug_line section. */ 26*a9fa9459Szrj typedef struct 27*a9fa9459Szrj { 28*a9fa9459Szrj dwarf_vma li_length; 29*a9fa9459Szrj unsigned short li_version; 30*a9fa9459Szrj dwarf_vma li_prologue_length; 31*a9fa9459Szrj unsigned char li_min_insn_length; 32*a9fa9459Szrj unsigned char li_max_ops_per_insn; 33*a9fa9459Szrj unsigned char li_default_is_stmt; 34*a9fa9459Szrj int li_line_base; 35*a9fa9459Szrj unsigned char li_line_range; 36*a9fa9459Szrj unsigned char li_opcode_base; 37*a9fa9459Szrj } 38*a9fa9459Szrj DWARF2_Internal_LineInfo; 39*a9fa9459Szrj 40*a9fa9459Szrj /* Structure found in .debug_pubnames section. */ 41*a9fa9459Szrj typedef struct 42*a9fa9459Szrj { 43*a9fa9459Szrj dwarf_vma pn_length; 44*a9fa9459Szrj unsigned short pn_version; 45*a9fa9459Szrj dwarf_vma pn_offset; 46*a9fa9459Szrj dwarf_vma pn_size; 47*a9fa9459Szrj } 48*a9fa9459Szrj DWARF2_Internal_PubNames; 49*a9fa9459Szrj 50*a9fa9459Szrj /* Structure found in .debug_info section. */ 51*a9fa9459Szrj typedef struct 52*a9fa9459Szrj { 53*a9fa9459Szrj dwarf_vma cu_length; 54*a9fa9459Szrj unsigned short cu_version; 55*a9fa9459Szrj dwarf_vma cu_abbrev_offset; 56*a9fa9459Szrj unsigned char cu_pointer_size; 57*a9fa9459Szrj } 58*a9fa9459Szrj DWARF2_Internal_CompUnit; 59*a9fa9459Szrj 60*a9fa9459Szrj /* Structure found in .debug_aranges section. */ 61*a9fa9459Szrj typedef struct 62*a9fa9459Szrj { 63*a9fa9459Szrj dwarf_vma ar_length; 64*a9fa9459Szrj unsigned short ar_version; 65*a9fa9459Szrj dwarf_vma ar_info_offset; 66*a9fa9459Szrj unsigned char ar_pointer_size; 67*a9fa9459Szrj unsigned char ar_segment_size; 68*a9fa9459Szrj } 69*a9fa9459Szrj DWARF2_Internal_ARange; 70*a9fa9459Szrj 71*a9fa9459Szrj /* N.B. The order here must match the order in debug_displays. */ 72*a9fa9459Szrj 73*a9fa9459Szrj enum dwarf_section_display_enum 74*a9fa9459Szrj { 75*a9fa9459Szrj abbrev = 0, 76*a9fa9459Szrj aranges, 77*a9fa9459Szrj frame, 78*a9fa9459Szrj info, 79*a9fa9459Szrj line, 80*a9fa9459Szrj pubnames, 81*a9fa9459Szrj gnu_pubnames, 82*a9fa9459Szrj eh_frame, 83*a9fa9459Szrj macinfo, 84*a9fa9459Szrj macro, 85*a9fa9459Szrj str, 86*a9fa9459Szrj loc, 87*a9fa9459Szrj pubtypes, 88*a9fa9459Szrj gnu_pubtypes, 89*a9fa9459Szrj ranges, 90*a9fa9459Szrj static_func, 91*a9fa9459Szrj static_vars, 92*a9fa9459Szrj types, 93*a9fa9459Szrj weaknames, 94*a9fa9459Szrj gdb_index, 95*a9fa9459Szrj trace_info, 96*a9fa9459Szrj trace_abbrev, 97*a9fa9459Szrj trace_aranges, 98*a9fa9459Szrj info_dwo, 99*a9fa9459Szrj abbrev_dwo, 100*a9fa9459Szrj types_dwo, 101*a9fa9459Szrj line_dwo, 102*a9fa9459Szrj loc_dwo, 103*a9fa9459Szrj macro_dwo, 104*a9fa9459Szrj macinfo_dwo, 105*a9fa9459Szrj str_dwo, 106*a9fa9459Szrj str_index, 107*a9fa9459Szrj str_index_dwo, 108*a9fa9459Szrj debug_addr, 109*a9fa9459Szrj dwp_cu_index, 110*a9fa9459Szrj dwp_tu_index, 111*a9fa9459Szrj max 112*a9fa9459Szrj }; 113*a9fa9459Szrj 114*a9fa9459Szrj struct dwarf_section 115*a9fa9459Szrj { 116*a9fa9459Szrj /* A debug section has a different name when it's stored compressed 117*a9fa9459Szrj or not. COMPRESSED_NAME and UNCOMPRESSED_NAME are the two 118*a9fa9459Szrj possibilities. NAME is set to whichever one is used for this 119*a9fa9459Szrj input file, as determined by load_debug_section(). */ 120*a9fa9459Szrj const char *uncompressed_name; 121*a9fa9459Szrj const char *compressed_name; 122*a9fa9459Szrj const char *name; 123*a9fa9459Szrj unsigned char *start; 124*a9fa9459Szrj dwarf_vma address; 125*a9fa9459Szrj dwarf_size_type size; 126*a9fa9459Szrj enum dwarf_section_display_enum abbrev_sec; 127*a9fa9459Szrj 128*a9fa9459Szrj /* Used by clients to help them implement the reloc_at callback. */ 129*a9fa9459Szrj void * reloc_info; 130*a9fa9459Szrj unsigned long num_relocs; 131*a9fa9459Szrj 132*a9fa9459Szrj /* A spare field for random use. */ 133*a9fa9459Szrj void *user_data; 134*a9fa9459Szrj }; 135*a9fa9459Szrj 136*a9fa9459Szrj /* A structure containing the name of a debug section 137*a9fa9459Szrj and a pointer to a function that can decode it. */ 138*a9fa9459Szrj struct dwarf_section_display 139*a9fa9459Szrj { 140*a9fa9459Szrj struct dwarf_section section; 141*a9fa9459Szrj int (*display) (struct dwarf_section *, void *); 142*a9fa9459Szrj int *enabled; 143*a9fa9459Szrj bfd_boolean relocate; 144*a9fa9459Szrj }; 145*a9fa9459Szrj 146*a9fa9459Szrj extern struct dwarf_section_display debug_displays []; 147*a9fa9459Szrj 148*a9fa9459Szrj /* This structure records the information that 149*a9fa9459Szrj we extract from the.debug_info section. */ 150*a9fa9459Szrj typedef struct 151*a9fa9459Szrj { 152*a9fa9459Szrj unsigned int pointer_size; 153*a9fa9459Szrj unsigned int offset_size; 154*a9fa9459Szrj int dwarf_version; 155*a9fa9459Szrj dwarf_vma cu_offset; 156*a9fa9459Szrj dwarf_vma base_address; 157*a9fa9459Szrj /* This field is filled in when reading the attribute DW_AT_GNU_addr_base and 158*a9fa9459Szrj is used with the form DW_AT_GNU_FORM_addr_index. */ 159*a9fa9459Szrj dwarf_vma addr_base; 160*a9fa9459Szrj /* This field is filled in when reading the attribute DW_AT_GNU_ranges_base and 161*a9fa9459Szrj is used when calculating ranges. */ 162*a9fa9459Szrj dwarf_vma ranges_base; 163*a9fa9459Szrj /* This is an array of offsets to the location list table. */ 164*a9fa9459Szrj dwarf_vma * loc_offsets; 165*a9fa9459Szrj int * have_frame_base; 166*a9fa9459Szrj unsigned int num_loc_offsets; 167*a9fa9459Szrj unsigned int max_loc_offsets; 168*a9fa9459Szrj /* List of .debug_ranges offsets seen in this .debug_info. */ 169*a9fa9459Szrj dwarf_vma * range_lists; 170*a9fa9459Szrj unsigned int num_range_lists; 171*a9fa9459Szrj unsigned int max_range_lists; 172*a9fa9459Szrj } 173*a9fa9459Szrj debug_info; 174*a9fa9459Szrj 175*a9fa9459Szrj extern unsigned int eh_addr_size; 176*a9fa9459Szrj 177*a9fa9459Szrj extern int do_debug_info; 178*a9fa9459Szrj extern int do_debug_abbrevs; 179*a9fa9459Szrj extern int do_debug_lines; 180*a9fa9459Szrj extern int do_debug_pubnames; 181*a9fa9459Szrj extern int do_debug_pubtypes; 182*a9fa9459Szrj extern int do_debug_aranges; 183*a9fa9459Szrj extern int do_debug_ranges; 184*a9fa9459Szrj extern int do_debug_frames; 185*a9fa9459Szrj extern int do_debug_frames_interp; 186*a9fa9459Szrj extern int do_debug_macinfo; 187*a9fa9459Szrj extern int do_debug_str; 188*a9fa9459Szrj extern int do_debug_loc; 189*a9fa9459Szrj extern int do_gdb_index; 190*a9fa9459Szrj extern int do_trace_info; 191*a9fa9459Szrj extern int do_trace_abbrevs; 192*a9fa9459Szrj extern int do_trace_aranges; 193*a9fa9459Szrj extern int do_debug_addr; 194*a9fa9459Szrj extern int do_debug_cu_index; 195*a9fa9459Szrj extern int do_wide; 196*a9fa9459Szrj 197*a9fa9459Szrj extern int dwarf_cutoff_level; 198*a9fa9459Szrj extern unsigned long dwarf_start_die; 199*a9fa9459Szrj 200*a9fa9459Szrj extern int dwarf_check; 201*a9fa9459Szrj 202*a9fa9459Szrj extern void init_dwarf_regnames (unsigned int); 203*a9fa9459Szrj extern void init_dwarf_regnames_i386 (void); 204*a9fa9459Szrj extern void init_dwarf_regnames_iamcu (void); 205*a9fa9459Szrj extern void init_dwarf_regnames_x86_64 (void); 206*a9fa9459Szrj extern void init_dwarf_regnames_aarch64 (void); 207*a9fa9459Szrj extern void init_dwarf_regnames_s390 (void); 208*a9fa9459Szrj 209*a9fa9459Szrj extern int load_debug_section (enum dwarf_section_display_enum, void *); 210*a9fa9459Szrj extern void free_debug_section (enum dwarf_section_display_enum); 211*a9fa9459Szrj 212*a9fa9459Szrj extern void free_debug_memory (void); 213*a9fa9459Szrj 214*a9fa9459Szrj extern void dwarf_select_sections_by_names (const char *); 215*a9fa9459Szrj extern void dwarf_select_sections_by_letters (const char *); 216*a9fa9459Szrj extern void dwarf_select_sections_all (void); 217*a9fa9459Szrj 218*a9fa9459Szrj extern unsigned int * find_cu_tu_set (void *, unsigned int); 219*a9fa9459Szrj 220*a9fa9459Szrj extern void * cmalloc (size_t, size_t); 221*a9fa9459Szrj extern void * xcalloc2 (size_t, size_t); 222*a9fa9459Szrj extern void * xcmalloc (size_t, size_t); 223*a9fa9459Szrj extern void * xcrealloc (void *, size_t, size_t); 224*a9fa9459Szrj 225*a9fa9459Szrj extern dwarf_vma read_leb128 (unsigned char *, unsigned int *, bfd_boolean, const unsigned char * const); 226*a9fa9459Szrj 227*a9fa9459Szrj /* A callback into the client. Retuns TRUE if there is a 228*a9fa9459Szrj relocation against the given debug section at the given 229*a9fa9459Szrj offset. */ 230*a9fa9459Szrj extern bfd_boolean reloc_at (struct dwarf_section *, dwarf_vma); 231