1*f3e7f55eSRobert Mustacchi /* 2*f3e7f55eSRobert Mustacchi 3*f3e7f55eSRobert Mustacchi Copyright (C) 2000,2002,2004 Silicon Graphics, Inc. All Rights Reserved. 4*f3e7f55eSRobert Mustacchi Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved. 5*f3e7f55eSRobert Mustacchi 6*f3e7f55eSRobert Mustacchi This program is free software; you can redistribute it and/or modify it 7*f3e7f55eSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License 8*f3e7f55eSRobert Mustacchi as published by the Free Software Foundation. 9*f3e7f55eSRobert Mustacchi 10*f3e7f55eSRobert Mustacchi This program is distributed in the hope that it would be useful, but 11*f3e7f55eSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of 12*f3e7f55eSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 13*f3e7f55eSRobert Mustacchi 14*f3e7f55eSRobert Mustacchi Further, this software is distributed without any warranty that it is 15*f3e7f55eSRobert Mustacchi free of the rightful claim of any third person regarding infringement 16*f3e7f55eSRobert Mustacchi or the like. Any license provided herein, whether implied or 17*f3e7f55eSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if 18*f3e7f55eSRobert Mustacchi any, provided herein do not apply to combinations of this program with 19*f3e7f55eSRobert Mustacchi other software, or any other product whatsoever. 20*f3e7f55eSRobert Mustacchi 21*f3e7f55eSRobert Mustacchi You should have received a copy of the GNU Lesser General Public 22*f3e7f55eSRobert Mustacchi License along with this program; if not, write the Free Software 23*f3e7f55eSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 24*f3e7f55eSRobert Mustacchi USA. 25*f3e7f55eSRobert Mustacchi 26*f3e7f55eSRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 27*f3e7f55eSRobert Mustacchi Mountain View, CA 94043, or: 28*f3e7f55eSRobert Mustacchi 29*f3e7f55eSRobert Mustacchi http://www.sgi.com 30*f3e7f55eSRobert Mustacchi 31*f3e7f55eSRobert Mustacchi For further information regarding this notice, see: 32*f3e7f55eSRobert Mustacchi 33*f3e7f55eSRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan 34*f3e7f55eSRobert Mustacchi 35*f3e7f55eSRobert Mustacchi */ 36*f3e7f55eSRobert Mustacchi 37*f3e7f55eSRobert Mustacchi 38*f3e7f55eSRobert Mustacchi #include <stddef.h> 39*f3e7f55eSRobert Mustacchi 40*f3e7f55eSRobert Mustacchi /* 41*f3e7f55eSRobert Mustacchi Sgidefs included to define __uint32_t, 42*f3e7f55eSRobert Mustacchi a guaranteed 4-byte quantity. 43*f3e7f55eSRobert Mustacchi */ 44*f3e7f55eSRobert Mustacchi #include "libdwarfdefs.h" 45*f3e7f55eSRobert Mustacchi 46*f3e7f55eSRobert Mustacchi #define true 1 47*f3e7f55eSRobert Mustacchi #define false 0 48*f3e7f55eSRobert Mustacchi 49*f3e7f55eSRobert Mustacchi /* to identify a cie */ 50*f3e7f55eSRobert Mustacchi #define DW_CIE_ID ~(0x0) 51*f3e7f55eSRobert Mustacchi #define DW_CIE_VERSION 1 52*f3e7f55eSRobert Mustacchi 53*f3e7f55eSRobert Mustacchi /*Dwarf_Word is unsigned word usable for index, count in memory */ 54*f3e7f55eSRobert Mustacchi /*Dwarf_Sword is signed word usable for index, count in memory */ 55*f3e7f55eSRobert Mustacchi /* The are 32 or 64 bits depending if 64 bit longs or not, which 56*f3e7f55eSRobert Mustacchi ** fits the ILP32 and LP64 models 57*f3e7f55eSRobert Mustacchi ** These work equally well with ILP64. 58*f3e7f55eSRobert Mustacchi */ 59*f3e7f55eSRobert Mustacchi 60*f3e7f55eSRobert Mustacchi typedef unsigned long Dwarf_Word; 61*f3e7f55eSRobert Mustacchi typedef long Dwarf_Sword; 62*f3e7f55eSRobert Mustacchi 63*f3e7f55eSRobert Mustacchi 64*f3e7f55eSRobert Mustacchi typedef signed char Dwarf_Sbyte; 65*f3e7f55eSRobert Mustacchi typedef unsigned char Dwarf_Ubyte; 66*f3e7f55eSRobert Mustacchi typedef signed short Dwarf_Shalf; 67*f3e7f55eSRobert Mustacchi 68*f3e7f55eSRobert Mustacchi /* 69*f3e7f55eSRobert Mustacchi On any change that makes libdwarf producer 70*f3e7f55eSRobert Mustacchi incompatible, increment this number. 71*f3e7f55eSRobert Mustacchi 1->2->3 ... 72*f3e7f55eSRobert Mustacchi 73*f3e7f55eSRobert Mustacchi */ 74*f3e7f55eSRobert Mustacchi #define PRO_VERSION_MAGIC 0xdead1 75*f3e7f55eSRobert Mustacchi 76*f3e7f55eSRobert Mustacchi 77*f3e7f55eSRobert Mustacchi /* these 2 are fixed sizes which must not vary with the 78*f3e7f55eSRobert Mustacchi ** ILP32/LP64 model. These two stay at 32 bit. 79*f3e7f55eSRobert Mustacchi */ 80*f3e7f55eSRobert Mustacchi typedef __uint32_t Dwarf_ufixed; 81*f3e7f55eSRobert Mustacchi typedef __int32_t Dwarf_sfixed; 82*f3e7f55eSRobert Mustacchi 83*f3e7f55eSRobert Mustacchi /* 84*f3e7f55eSRobert Mustacchi producer: 85*f3e7f55eSRobert Mustacchi This struct is used to hold information about all 86*f3e7f55eSRobert Mustacchi debug* sections. On creating a new section, section 87*f3e7f55eSRobert Mustacchi names and indices are added to this struct 88*f3e7f55eSRobert Mustacchi definition in pro_section.h 89*f3e7f55eSRobert Mustacchi */ 90*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Section_Data_s *Dwarf_P_Section_Data; 91*f3e7f55eSRobert Mustacchi 92*f3e7f55eSRobert Mustacchi /* 93*f3e7f55eSRobert Mustacchi producer: 94*f3e7f55eSRobert Mustacchi This struct is used to hold entries in the include directories 95*f3e7f55eSRobert Mustacchi part of statement prologue. Definition in pro_line.h 96*f3e7f55eSRobert Mustacchi */ 97*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Inc_Dir_s *Dwarf_P_Inc_Dir; 98*f3e7f55eSRobert Mustacchi 99*f3e7f55eSRobert Mustacchi /* 100*f3e7f55eSRobert Mustacchi producer: 101*f3e7f55eSRobert Mustacchi This struct holds file entries for the statement prologue. 102*f3e7f55eSRobert Mustacchi Defined in pro_line.h 103*f3e7f55eSRobert Mustacchi */ 104*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_F_Entry_s *Dwarf_P_F_Entry; 105*f3e7f55eSRobert Mustacchi 106*f3e7f55eSRobert Mustacchi /* 107*f3e7f55eSRobert Mustacchi producer: 108*f3e7f55eSRobert Mustacchi This struct holds information for each cie. Defn in pro_frame.h 109*f3e7f55eSRobert Mustacchi */ 110*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Cie_s *Dwarf_P_Cie; 111*f3e7f55eSRobert Mustacchi 112*f3e7f55eSRobert Mustacchi /* 113*f3e7f55eSRobert Mustacchi producer: 114*f3e7f55eSRobert Mustacchi Struct to hold line number information, different from 115*f3e7f55eSRobert Mustacchi Dwarf_Line opaque type. 116*f3e7f55eSRobert Mustacchi */ 117*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Line_s *Dwarf_P_Line; 118*f3e7f55eSRobert Mustacchi 119*f3e7f55eSRobert Mustacchi /* 120*f3e7f55eSRobert Mustacchi producer: 121*f3e7f55eSRobert Mustacchi Struct to hold information about address ranges. 122*f3e7f55eSRobert Mustacchi */ 123*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Simple_nameentry_s *Dwarf_P_Simple_nameentry; 124*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Simple_name_header_s *Dwarf_P_Simple_name_header; 125*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Arange_s *Dwarf_P_Arange; 126*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Per_Reloc_Sect_s *Dwarf_P_Per_Reloc_Sect; 127*f3e7f55eSRobert Mustacchi typedef struct Dwarf_P_Per_Sect_String_Attrs_s *Dwarf_P_Per_Sect_String_Attrs; 128*f3e7f55eSRobert Mustacchi 129*f3e7f55eSRobert Mustacchi /* Defined to get at the elf section numbers and section name 130*f3e7f55eSRobert Mustacchi indices in symtab for the dwarf sections 131*f3e7f55eSRobert Mustacchi Must match .rel.* names in _dwarf_rel_section_names 132*f3e7f55eSRobert Mustacchi exactly. 133*f3e7f55eSRobert Mustacchi */ 134*f3e7f55eSRobert Mustacchi #define DEBUG_INFO 0 135*f3e7f55eSRobert Mustacchi #define DEBUG_LINE 1 136*f3e7f55eSRobert Mustacchi #define DEBUG_ABBREV 2 137*f3e7f55eSRobert Mustacchi #define DEBUG_FRAME 3 138*f3e7f55eSRobert Mustacchi #define DEBUG_ARANGES 4 139*f3e7f55eSRobert Mustacchi #define DEBUG_PUBNAMES 5 140*f3e7f55eSRobert Mustacchi #define DEBUG_STR 6 141*f3e7f55eSRobert Mustacchi #define DEBUG_FUNCNAMES 7 142*f3e7f55eSRobert Mustacchi #define DEBUG_TYPENAMES 8 143*f3e7f55eSRobert Mustacchi #define DEBUG_VARNAMES 9 144*f3e7f55eSRobert Mustacchi #define DEBUG_WEAKNAMES 10 145*f3e7f55eSRobert Mustacchi #define DEBUG_MACINFO 11 146*f3e7f55eSRobert Mustacchi #define DEBUG_LOC 12 147*f3e7f55eSRobert Mustacchi 148*f3e7f55eSRobert Mustacchi /* number of debug_* sections not including the relocations */ 149*f3e7f55eSRobert Mustacchi #define NUM_DEBUG_SECTIONS DEBUG_LOC + 1 150*f3e7f55eSRobert Mustacchi 151*f3e7f55eSRobert Mustacchi 152*f3e7f55eSRobert Mustacchi struct Dwarf_P_Die_s { 153*f3e7f55eSRobert Mustacchi Dwarf_Unsigned di_offset; /* offset in debug info */ 154*f3e7f55eSRobert Mustacchi char *di_abbrev; /* abbreviation */ 155*f3e7f55eSRobert Mustacchi Dwarf_Word di_abbrev_nbytes; /* # of bytes in abbrev */ 156*f3e7f55eSRobert Mustacchi Dwarf_Tag di_tag; 157*f3e7f55eSRobert Mustacchi Dwarf_P_Die di_parent; /* parent of current die */ 158*f3e7f55eSRobert Mustacchi Dwarf_P_Die di_child; /* first child */ 159*f3e7f55eSRobert Mustacchi /* The last child field makes linking up children an O(1) operation, 160*f3e7f55eSRobert Mustacchi See pro_die.c. */ 161*f3e7f55eSRobert Mustacchi Dwarf_P_Die di_last_child; 162*f3e7f55eSRobert Mustacchi Dwarf_P_Die di_left; /* left sibling */ 163*f3e7f55eSRobert Mustacchi Dwarf_P_Die di_right; /* right sibling */ 164*f3e7f55eSRobert Mustacchi Dwarf_P_Attribute di_attrs; /* list of attributes */ 165*f3e7f55eSRobert Mustacchi Dwarf_P_Attribute di_last_attr; /* last attribute */ 166*f3e7f55eSRobert Mustacchi int di_n_attr; /* number of attributes */ 167*f3e7f55eSRobert Mustacchi Dwarf_P_Debug di_dbg; /* For memory management */ 168*f3e7f55eSRobert Mustacchi Dwarf_Unsigned di_marker; /* used to attach symbols to dies */ 169*f3e7f55eSRobert Mustacchi }; 170*f3e7f55eSRobert Mustacchi 171*f3e7f55eSRobert Mustacchi 172*f3e7f55eSRobert Mustacchi /* producer fields */ 173*f3e7f55eSRobert Mustacchi struct Dwarf_P_Attribute_s { 174*f3e7f55eSRobert Mustacchi Dwarf_Half ar_attribute; /* Attribute Value. */ 175*f3e7f55eSRobert Mustacchi Dwarf_Half ar_attribute_form; /* Attribute Form. */ 176*f3e7f55eSRobert Mustacchi Dwarf_P_Die ar_ref_die; /* die pointer if form ref */ 177*f3e7f55eSRobert Mustacchi char *ar_data; /* data, format given by form */ 178*f3e7f55eSRobert Mustacchi Dwarf_Unsigned ar_nbytes; /* no. of bytes of data */ 179*f3e7f55eSRobert Mustacchi Dwarf_Unsigned ar_rel_symidx; /* when attribute has a 180*f3e7f55eSRobert Mustacchi relocatable value, holds 181*f3e7f55eSRobert Mustacchi index of symbol in SYMTAB */ 182*f3e7f55eSRobert Mustacchi Dwarf_Ubyte ar_rel_type; /* relocation type */ 183*f3e7f55eSRobert Mustacchi Dwarf_Word ar_rel_offset; /* Offset of relocation within block */ 184*f3e7f55eSRobert Mustacchi char ar_reloc_len; /* Number of bytes that relocation 185*f3e7f55eSRobert Mustacchi applies to. 4 or 8. Unused and may 186*f3e7f55eSRobert Mustacchi be 0 if if ar_rel_type is 187*f3e7f55eSRobert Mustacchi R_MIPS_NONE */ 188*f3e7f55eSRobert Mustacchi Dwarf_P_Attribute ar_next; 189*f3e7f55eSRobert Mustacchi }; 190*f3e7f55eSRobert Mustacchi 191*f3e7f55eSRobert Mustacchi /* A block of .debug_macinfo data: this forms a series of blocks. 192*f3e7f55eSRobert Mustacchi ** Each macinfo input is compressed immediately and put into 193*f3e7f55eSRobert Mustacchi ** the current block if room, else a newblock allocated. 194*f3e7f55eSRobert Mustacchi ** The space allocation is such that the block and the macinfo 195*f3e7f55eSRobert Mustacchi ** data are one malloc block: free with a pointer to this and the 196*f3e7f55eSRobert Mustacchi ** mb_data is freed automatically. 197*f3e7f55eSRobert Mustacchi ** Like the struct hack, but legal ANSI C. 198*f3e7f55eSRobert Mustacchi */ 199*f3e7f55eSRobert Mustacchi struct dw_macinfo_block_s { 200*f3e7f55eSRobert Mustacchi struct dw_macinfo_block_s *mb_next; 201*f3e7f55eSRobert Mustacchi unsigned long mb_avail_len; 202*f3e7f55eSRobert Mustacchi unsigned long mb_used_len; 203*f3e7f55eSRobert Mustacchi unsigned long mb_macinfo_data_space_len; 204*f3e7f55eSRobert Mustacchi char *mb_data; /* original malloc ptr. */ 205*f3e7f55eSRobert Mustacchi }; 206*f3e7f55eSRobert Mustacchi 207*f3e7f55eSRobert Mustacchi /* dwarf_sn_kind is for the array of similarly-treated 208*f3e7f55eSRobert Mustacchi name -> cu ties 209*f3e7f55eSRobert Mustacchi */ 210*f3e7f55eSRobert Mustacchi enum dwarf_sn_kind { dwarf_snk_pubname, dwarf_snk_funcname, 211*f3e7f55eSRobert Mustacchi dwarf_snk_weakname, dwarf_snk_typename, 212*f3e7f55eSRobert Mustacchi dwarf_snk_varname, 213*f3e7f55eSRobert Mustacchi dwarf_snk_entrycount /* this one must be last */ 214*f3e7f55eSRobert Mustacchi }; 215*f3e7f55eSRobert Mustacchi 216*f3e7f55eSRobert Mustacchi 217*f3e7f55eSRobert Mustacchi 218*f3e7f55eSRobert Mustacchi /* The calls to add a varname etc use a list of 219*f3e7f55eSRobert Mustacchi these as the list. 220*f3e7f55eSRobert Mustacchi */ 221*f3e7f55eSRobert Mustacchi struct Dwarf_P_Simple_nameentry_s { 222*f3e7f55eSRobert Mustacchi Dwarf_P_Die sne_die; 223*f3e7f55eSRobert Mustacchi char *sne_name; 224*f3e7f55eSRobert Mustacchi int sne_name_len; 225*f3e7f55eSRobert Mustacchi Dwarf_P_Simple_nameentry sne_next; 226*f3e7f55eSRobert Mustacchi }; 227*f3e7f55eSRobert Mustacchi 228*f3e7f55eSRobert Mustacchi /* An array of these, each of which heads a list 229*f3e7f55eSRobert Mustacchi of Dwarf_P_Simple_nameentry 230*f3e7f55eSRobert Mustacchi */ 231*f3e7f55eSRobert Mustacchi struct Dwarf_P_Simple_name_header_s { 232*f3e7f55eSRobert Mustacchi Dwarf_P_Simple_nameentry sn_head; 233*f3e7f55eSRobert Mustacchi Dwarf_P_Simple_nameentry sn_tail; 234*f3e7f55eSRobert Mustacchi Dwarf_Signed sn_count; 235*f3e7f55eSRobert Mustacchi 236*f3e7f55eSRobert Mustacchi /* length that will be generated, not counting fixed header or 237*f3e7f55eSRobert Mustacchi trailer */ 238*f3e7f55eSRobert Mustacchi Dwarf_Signed sn_net_len; 239*f3e7f55eSRobert Mustacchi }; 240*f3e7f55eSRobert Mustacchi typedef int (*_dwarf_pro_reloc_name_func_ptr) (Dwarf_P_Debug dbg, 241*f3e7f55eSRobert Mustacchi int sec_index, 242*f3e7f55eSRobert Mustacchi Dwarf_Unsigned offset,/* r_offset */ 243*f3e7f55eSRobert Mustacchi Dwarf_Unsigned symidx, 244*f3e7f55eSRobert Mustacchi enum Dwarf_Rel_Type type, 245*f3e7f55eSRobert Mustacchi int reltarget_length); 246*f3e7f55eSRobert Mustacchi 247*f3e7f55eSRobert Mustacchi typedef int (*_dwarf_pro_reloc_length_func_ptr) (Dwarf_P_Debug dbg, 248*f3e7f55eSRobert Mustacchi int sec_index, Dwarf_Unsigned offset,/* r_offset */ 249*f3e7f55eSRobert Mustacchi Dwarf_Unsigned start_symidx, 250*f3e7f55eSRobert Mustacchi Dwarf_Unsigned end_symidx, 251*f3e7f55eSRobert Mustacchi enum Dwarf_Rel_Type type, 252*f3e7f55eSRobert Mustacchi int reltarget_length); 253*f3e7f55eSRobert Mustacchi typedef int (*_dwarf_pro_transform_relocs_func_ptr) (Dwarf_P_Debug dbg, 254*f3e7f55eSRobert Mustacchi Dwarf_Signed * 255*f3e7f55eSRobert Mustacchi new_sec_count); 256*f3e7f55eSRobert Mustacchi 257*f3e7f55eSRobert Mustacchi /* 258*f3e7f55eSRobert Mustacchi Each slot in a block of slots could be: 259*f3e7f55eSRobert Mustacchi a binary stream relocation entry (32 or 64bit relocation data) 260*f3e7f55eSRobert Mustacchi a SYMBOLIC relocation entry. 261*f3e7f55eSRobert Mustacchi During creation sometimes we create multiple chained blocks, 262*f3e7f55eSRobert Mustacchi but sometimes we create a single long block. 263*f3e7f55eSRobert Mustacchi Before returning reloc data to caller, 264*f3e7f55eSRobert Mustacchi we switch to a single, long-enough, 265*f3e7f55eSRobert Mustacchi block. 266*f3e7f55eSRobert Mustacchi 267*f3e7f55eSRobert Mustacchi We make counters here Dwarf_Unsigned so that we 268*f3e7f55eSRobert Mustacchi get sufficient alignment. Since we use space after 269*f3e7f55eSRobert Mustacchi the struct (at malloc time) for user data which 270*f3e7f55eSRobert Mustacchi must have Dwarf_Unsigned alignment, this 271*f3e7f55eSRobert Mustacchi struct must have that alignment too. 272*f3e7f55eSRobert Mustacchi */ 273*f3e7f55eSRobert Mustacchi struct Dwarf_P_Relocation_Block_s { 274*f3e7f55eSRobert Mustacchi Dwarf_Unsigned rb_slots_in_block; /* slots in block, as created */ 275*f3e7f55eSRobert Mustacchi Dwarf_Unsigned rb_next_slot_to_use; /* counter, start at 0. */ 276*f3e7f55eSRobert Mustacchi struct Dwarf_P_Relocation_Block_s *rb_next; 277*f3e7f55eSRobert Mustacchi char *rb_where_to_add_next; /* pointer to next slot (might be past 278*f3e7f55eSRobert Mustacchi end, depending on 279*f3e7f55eSRobert Mustacchi rb_next_slot_to_use) */ 280*f3e7f55eSRobert Mustacchi char *rb_data; /* data area */ 281*f3e7f55eSRobert Mustacchi }; 282*f3e7f55eSRobert Mustacchi 283*f3e7f55eSRobert Mustacchi /* One of these per potential relocation section 284*f3e7f55eSRobert Mustacchi So one per actual dwarf section. 285*f3e7f55eSRobert Mustacchi Left zeroed when not used (some sections have 286*f3e7f55eSRobert Mustacchi no relocations). 287*f3e7f55eSRobert Mustacchi */ 288*f3e7f55eSRobert Mustacchi struct Dwarf_P_Per_Reloc_Sect_s { 289*f3e7f55eSRobert Mustacchi unsigned long pr_reloc_total_count; /* total number of entries 290*f3e7f55eSRobert Mustacchi across all blocks */ 291*f3e7f55eSRobert Mustacchi 292*f3e7f55eSRobert Mustacchi unsigned long pr_slots_per_block_to_alloc; /* at Block alloc, this 293*f3e7f55eSRobert Mustacchi is the default number of slots to use */ 294*f3e7f55eSRobert Mustacchi 295*f3e7f55eSRobert Mustacchi int pr_sect_num_of_reloc_sect; /* sect number returned by 296*f3e7f55eSRobert Mustacchi de_callback_func() or de_callback_func_b() call, this is the sect 297*f3e7f55eSRobert Mustacchi number of the relocation section. */ 298*f3e7f55eSRobert Mustacchi 299*f3e7f55eSRobert Mustacchi /* singly-linked list. add at and ('last') with count of blocks */ 300*f3e7f55eSRobert Mustacchi struct Dwarf_P_Relocation_Block_s *pr_first_block; 301*f3e7f55eSRobert Mustacchi struct Dwarf_P_Relocation_Block_s *pr_last_block; 302*f3e7f55eSRobert Mustacchi unsigned long pr_block_count; 303*f3e7f55eSRobert Mustacchi }; 304*f3e7f55eSRobert Mustacchi 305*f3e7f55eSRobert Mustacchi #define DEFAULT_SLOTS_PER_BLOCK 3 306*f3e7f55eSRobert Mustacchi 307*f3e7f55eSRobert Mustacchi typedef struct memory_list_s { 308*f3e7f55eSRobert Mustacchi struct memory_list_s *prev; 309*f3e7f55eSRobert Mustacchi struct memory_list_s *next; 310*f3e7f55eSRobert Mustacchi } memory_list_t; 311*f3e7f55eSRobert Mustacchi 312*f3e7f55eSRobert Mustacchi struct Dwarf_P_Per_Sect_String_Attrs_s { 313*f3e7f55eSRobert Mustacchi int sect_sa_section_number; 314*f3e7f55eSRobert Mustacchi unsigned sect_sa_n_alloc; 315*f3e7f55eSRobert Mustacchi unsigned sect_sa_n_used; 316*f3e7f55eSRobert Mustacchi Dwarf_P_String_Attr sect_sa_list; 317*f3e7f55eSRobert Mustacchi }; 318*f3e7f55eSRobert Mustacchi 319*f3e7f55eSRobert Mustacchi /* Fields used by producer */ 320*f3e7f55eSRobert Mustacchi struct Dwarf_P_Debug_s { 321*f3e7f55eSRobert Mustacchi /* used to catch dso passing dbg to another DSO with incompatible 322*f3e7f55eSRobert Mustacchi version of libdwarf See PRO_VERSION_MAGIC */ 323*f3e7f55eSRobert Mustacchi int de_version_magic_number; 324*f3e7f55eSRobert Mustacchi 325*f3e7f55eSRobert Mustacchi Dwarf_Handler de_errhand; 326*f3e7f55eSRobert Mustacchi Dwarf_Ptr de_errarg; 327*f3e7f55eSRobert Mustacchi 328*f3e7f55eSRobert Mustacchi /* Call back function, used to create .debug* sections. Provided 329*f3e7f55eSRobert Mustacchi by user. Only of these used per dbg. */ 330*f3e7f55eSRobert Mustacchi Dwarf_Callback_Func de_callback_func; 331*f3e7f55eSRobert Mustacchi Dwarf_Callback_Func_b de_callback_func_b; 332*f3e7f55eSRobert Mustacchi 333*f3e7f55eSRobert Mustacchi /* Flags from producer_init call */ 334*f3e7f55eSRobert Mustacchi Dwarf_Unsigned de_flags; 335*f3e7f55eSRobert Mustacchi 336*f3e7f55eSRobert Mustacchi /* This holds information on debug section stream output, including 337*f3e7f55eSRobert Mustacchi the stream data */ 338*f3e7f55eSRobert Mustacchi Dwarf_P_Section_Data de_debug_sects; 339*f3e7f55eSRobert Mustacchi 340*f3e7f55eSRobert Mustacchi /* Pointer to the 'current active' section */ 341*f3e7f55eSRobert Mustacchi Dwarf_P_Section_Data de_current_active_section; 342*f3e7f55eSRobert Mustacchi 343*f3e7f55eSRobert Mustacchi /* Number of debug data streams globs. */ 344*f3e7f55eSRobert Mustacchi Dwarf_Word de_n_debug_sect; 345*f3e7f55eSRobert Mustacchi 346*f3e7f55eSRobert Mustacchi /* File entry information, null terminated singly-linked list */ 347*f3e7f55eSRobert Mustacchi Dwarf_P_F_Entry de_file_entries; 348*f3e7f55eSRobert Mustacchi Dwarf_P_F_Entry de_last_file_entry; 349*f3e7f55eSRobert Mustacchi Dwarf_Unsigned de_n_file_entries; 350*f3e7f55eSRobert Mustacchi 351*f3e7f55eSRobert Mustacchi /* Has the directories used to search for source files */ 352*f3e7f55eSRobert Mustacchi Dwarf_P_Inc_Dir de_inc_dirs; 353*f3e7f55eSRobert Mustacchi Dwarf_P_Inc_Dir de_last_inc_dir; 354*f3e7f55eSRobert Mustacchi Dwarf_Unsigned de_n_inc_dirs; 355*f3e7f55eSRobert Mustacchi 356*f3e7f55eSRobert Mustacchi /* Has all the line number info for the stmt program */ 357*f3e7f55eSRobert Mustacchi Dwarf_P_Line de_lines; 358*f3e7f55eSRobert Mustacchi Dwarf_P_Line de_last_line; 359*f3e7f55eSRobert Mustacchi 360*f3e7f55eSRobert Mustacchi /* List of cie's for the debug unit */ 361*f3e7f55eSRobert Mustacchi Dwarf_P_Cie de_frame_cies; 362*f3e7f55eSRobert Mustacchi Dwarf_P_Cie de_last_cie; 363*f3e7f55eSRobert Mustacchi Dwarf_Unsigned de_n_cie; 364*f3e7f55eSRobert Mustacchi 365*f3e7f55eSRobert Mustacchi /* Singly-linked list of fde's for the debug unit */ 366*f3e7f55eSRobert Mustacchi Dwarf_P_Fde de_frame_fdes; 367*f3e7f55eSRobert Mustacchi Dwarf_P_Fde de_last_fde; 368*f3e7f55eSRobert Mustacchi Dwarf_Unsigned de_n_fde; 369*f3e7f55eSRobert Mustacchi 370*f3e7f55eSRobert Mustacchi /* First die, leads to all others */ 371*f3e7f55eSRobert Mustacchi Dwarf_P_Die de_dies; 372*f3e7f55eSRobert Mustacchi 373*f3e7f55eSRobert Mustacchi /* Pointer to list of strings */ 374*f3e7f55eSRobert Mustacchi char *de_strings; 375*f3e7f55eSRobert Mustacchi 376*f3e7f55eSRobert Mustacchi /* Pointer to chain of aranges */ 377*f3e7f55eSRobert Mustacchi Dwarf_P_Arange de_arange; 378*f3e7f55eSRobert Mustacchi Dwarf_P_Arange de_last_arange; 379*f3e7f55eSRobert Mustacchi Dwarf_Sword de_arange_count; 380*f3e7f55eSRobert Mustacchi 381*f3e7f55eSRobert Mustacchi /* macinfo controls. */ 382*f3e7f55eSRobert Mustacchi /* first points to beginning of the list during creation */ 383*f3e7f55eSRobert Mustacchi struct dw_macinfo_block_s *de_first_macinfo; 384*f3e7f55eSRobert Mustacchi 385*f3e7f55eSRobert Mustacchi /* current points to the current, unfilled, block */ 386*f3e7f55eSRobert Mustacchi struct dw_macinfo_block_s *de_current_macinfo; 387*f3e7f55eSRobert Mustacchi 388*f3e7f55eSRobert Mustacchi /* Pointer to the first section, to support reset_section_bytes */ 389*f3e7f55eSRobert Mustacchi Dwarf_P_Section_Data de_first_debug_sect; 390*f3e7f55eSRobert Mustacchi 391*f3e7f55eSRobert Mustacchi /* handles pubnames, weaknames, etc. See dwarf_sn_kind in 392*f3e7f55eSRobert Mustacchi pro_opaque.h */ 393*f3e7f55eSRobert Mustacchi struct Dwarf_P_Simple_name_header_s 394*f3e7f55eSRobert Mustacchi de_simple_name_headers[dwarf_snk_entrycount]; 395*f3e7f55eSRobert Mustacchi 396*f3e7f55eSRobert Mustacchi /* relocation data. not all sections will actally have relocation 397*f3e7f55eSRobert Mustacchi info, of course */ 398*f3e7f55eSRobert Mustacchi struct Dwarf_P_Per_Reloc_Sect_s de_reloc_sect[NUM_DEBUG_SECTIONS]; 399*f3e7f55eSRobert Mustacchi int de_reloc_next_to_return; /* iterator on reloc sections 400*f3e7f55eSRobert Mustacchi (SYMBOLIC output) */ 401*f3e7f55eSRobert Mustacchi 402*f3e7f55eSRobert Mustacchi /* used in remembering sections */ 403*f3e7f55eSRobert Mustacchi int de_elf_sects[NUM_DEBUG_SECTIONS]; /* elf sect number of 404*f3e7f55eSRobert Mustacchi the section itself, DEBUG_LINE for example */ 405*f3e7f55eSRobert Mustacchi 406*f3e7f55eSRobert Mustacchi Dwarf_Unsigned de_sect_name_idx[NUM_DEBUG_SECTIONS]; /* section 407*f3e7f55eSRobert Mustacchi name index or handle for the name of the symbol for 408*f3e7f55eSRobert Mustacchi DEBUG_LINE for example */ 409*f3e7f55eSRobert Mustacchi 410*f3e7f55eSRobert Mustacchi int de_offset_reloc; /* offset reloc type, R_MIPS_32 for 411*f3e7f55eSRobert Mustacchi example. Specific to the ABI being 412*f3e7f55eSRobert Mustacchi produced. Relocates offset size 413*f3e7f55eSRobert Mustacchi field */ 414*f3e7f55eSRobert Mustacchi int de_exc_reloc; /* reloc type specific to exception 415*f3e7f55eSRobert Mustacchi table relocs. */ 416*f3e7f55eSRobert Mustacchi int de_ptr_reloc; /* standard reloc type, R_MIPS_32 for 417*f3e7f55eSRobert Mustacchi example. Specific to the ABI being 418*f3e7f55eSRobert Mustacchi produced. relocates pointer size 419*f3e7f55eSRobert Mustacchi field */ 420*f3e7f55eSRobert Mustacchi 421*f3e7f55eSRobert Mustacchi unsigned char de_offset_size; /* section offset. Here to 422*f3e7f55eSRobert Mustacchi avoid test of abi in macro 423*f3e7f55eSRobert Mustacchi at run time MIPS -n32 4, 424*f3e7f55eSRobert Mustacchi -64 8. */ 425*f3e7f55eSRobert Mustacchi 426*f3e7f55eSRobert Mustacchi unsigned char de_pointer_size; /* size of pointer in target. 427*f3e7f55eSRobert Mustacchi Here to avoid test of abi in 428*f3e7f55eSRobert Mustacchi macro at run time MIPS -n32 429*f3e7f55eSRobert Mustacchi 4, -64 is 8. */ 430*f3e7f55eSRobert Mustacchi 431*f3e7f55eSRobert Mustacchi unsigned char de_is_64bit; /* non-zero if is 64bit. Else 32 bit: 432*f3e7f55eSRobert Mustacchi used for passing this info as a flag 433*f3e7f55eSRobert Mustacchi */ 434*f3e7f55eSRobert Mustacchi unsigned char de_relocation_record_size; /* reloc record size 435*f3e7f55eSRobert Mustacchi varies by ABI and 436*f3e7f55eSRobert Mustacchi relocation-output 437*f3e7f55eSRobert Mustacchi method (stream or 438*f3e7f55eSRobert Mustacchi symbolic) */ 439*f3e7f55eSRobert Mustacchi 440*f3e7f55eSRobert Mustacchi unsigned char de_64bit_extension; /* non-zero if creating 64 bit 441*f3e7f55eSRobert Mustacchi offsets using dwarf2-99 442*f3e7f55eSRobert Mustacchi extension proposal */ 443*f3e7f55eSRobert Mustacchi 444*f3e7f55eSRobert Mustacchi int de_ar_data_attribute_form; /* data8, data4 abi dependent */ 445*f3e7f55eSRobert Mustacchi int de_ar_ref_attr_form; /* ref8 ref4 , abi dependent */ 446*f3e7f55eSRobert Mustacchi 447*f3e7f55eSRobert Mustacchi /* simple name relocations */ 448*f3e7f55eSRobert Mustacchi _dwarf_pro_reloc_name_func_ptr de_reloc_name; 449*f3e7f55eSRobert Mustacchi 450*f3e7f55eSRobert Mustacchi /* relocations for a length, requiring a pair of symbols */ 451*f3e7f55eSRobert Mustacchi _dwarf_pro_reloc_length_func_ptr de_reloc_pair; 452*f3e7f55eSRobert Mustacchi 453*f3e7f55eSRobert Mustacchi _dwarf_pro_transform_relocs_func_ptr de_transform_relocs_to_disk; 454*f3e7f55eSRobert Mustacchi 455*f3e7f55eSRobert Mustacchi /* following used for macro buffers */ 456*f3e7f55eSRobert Mustacchi unsigned long de_compose_avail; 457*f3e7f55eSRobert Mustacchi unsigned long de_compose_used_len; 458*f3e7f55eSRobert Mustacchi 459*f3e7f55eSRobert Mustacchi unsigned char de_same_endian; 460*f3e7f55eSRobert Mustacchi void *(*de_copy_word) (void *, const void *, size_t); 461*f3e7f55eSRobert Mustacchi 462*f3e7f55eSRobert Mustacchi /* Add new fields at the END of this struct to preserve some hope 463*f3e7f55eSRobert Mustacchi of sensible behavior on dbg passing between DSOs linked with 464*f3e7f55eSRobert Mustacchi mismatched libdwarf producer versions. */ 465*f3e7f55eSRobert Mustacchi 466*f3e7f55eSRobert Mustacchi Dwarf_P_Marker de_markers; /* pointer to array of markers */ 467*f3e7f55eSRobert Mustacchi unsigned de_marker_n_alloc; 468*f3e7f55eSRobert Mustacchi unsigned de_marker_n_used; 469*f3e7f55eSRobert Mustacchi int de_sect_sa_next_to_return; /* Iterator on sring attrib sects */ 470*f3e7f55eSRobert Mustacchi /* String attributes data of each section. */ 471*f3e7f55eSRobert Mustacchi struct Dwarf_P_Per_Sect_String_Attrs_s de_sect_string_attr[NUM_DEBUG_SECTIONS]; 472*f3e7f55eSRobert Mustacchi }; 473*f3e7f55eSRobert Mustacchi 474*f3e7f55eSRobert Mustacchi #define CURRENT_VERSION_STAMP 2 475*f3e7f55eSRobert Mustacchi 476*f3e7f55eSRobert Mustacchi Dwarf_Unsigned _dwarf_add_simple_name_entry(Dwarf_P_Debug dbg, 477*f3e7f55eSRobert Mustacchi Dwarf_P_Die die, 478*f3e7f55eSRobert Mustacchi char *entry_name, 479*f3e7f55eSRobert Mustacchi enum dwarf_sn_kind 480*f3e7f55eSRobert Mustacchi entrykind, 481*f3e7f55eSRobert Mustacchi Dwarf_Error * error); 482*f3e7f55eSRobert Mustacchi 483*f3e7f55eSRobert Mustacchi 484*f3e7f55eSRobert Mustacchi #define DISTINGUISHED_VALUE 0xffffffff /* 64bit extension flag */ 485