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