149d3bc91SRichard Lowe /*
249d3bc91SRichard Lowe   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
307dc1947SRichard Lowe   Portions Copyright 2002-2010 Sun Microsystems, Inc. All rights reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright 2008-2017 David Anderson, Inc. All rights reserved.
5*4d9fdb46SRobert Mustacchi   Portions Copyright 2012 SN Systems Ltd. All rights reserved.
6*4d9fdb46SRobert Mustacchi 
7*4d9fdb46SRobert Mustacchi   This program is free software; you can redistribute it
8*4d9fdb46SRobert Mustacchi   and/or modify it under the terms of version 2.1 of the
9*4d9fdb46SRobert Mustacchi   GNU Lesser General Public License as published by the Free
10*4d9fdb46SRobert Mustacchi   Software Foundation.
11*4d9fdb46SRobert Mustacchi 
12*4d9fdb46SRobert Mustacchi   This program is distributed in the hope that it would be
13*4d9fdb46SRobert Mustacchi   useful, but WITHOUT ANY WARRANTY; without even the implied
14*4d9fdb46SRobert Mustacchi   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15*4d9fdb46SRobert Mustacchi   PURPOSE.
16*4d9fdb46SRobert Mustacchi 
17*4d9fdb46SRobert Mustacchi   Further, this software is distributed without any warranty
18*4d9fdb46SRobert Mustacchi   that it is free of the rightful claim of any third person
19*4d9fdb46SRobert Mustacchi   regarding infringement or the like.  Any license provided
20*4d9fdb46SRobert Mustacchi   herein, whether implied or otherwise, applies only to this
21*4d9fdb46SRobert Mustacchi   software file.  Patent licenses, if any, provided herein
22*4d9fdb46SRobert Mustacchi   do not apply to combinations of this program with other
23*4d9fdb46SRobert Mustacchi   software, or any other product whatsoever.
24*4d9fdb46SRobert Mustacchi 
25*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General
26*4d9fdb46SRobert Mustacchi   Public License along with this program; if not, write the
27*4d9fdb46SRobert Mustacchi   Free Software Foundation, Inc., 51 Franklin Street - Fifth
28*4d9fdb46SRobert Mustacchi   Floor, Boston MA 02110-1301, USA.
2949d3bc91SRichard Lowe 
3049d3bc91SRichard Lowe */
3149d3bc91SRichard Lowe 
3249d3bc91SRichard Lowe #include "config.h"
3349d3bc91SRichard Lowe #include "libdwarfdefs.h"
3449d3bc91SRichard Lowe #include <stdio.h>
3549d3bc91SRichard Lowe #include <string.h>
36*4d9fdb46SRobert Mustacchi #include <stddef.h>
37*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDINT_H
38*4d9fdb46SRobert Mustacchi #include <stdint.h> /* For uintptr_t */
39*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDINT_H */
4049d3bc91SRichard Lowe #include "pro_incl.h"
41*4d9fdb46SRobert Mustacchi #include "dwarf.h"
42*4d9fdb46SRobert Mustacchi #include "libdwarf.h"
43*4d9fdb46SRobert Mustacchi #include "pro_opaque.h"
44*4d9fdb46SRobert Mustacchi #include "pro_error.h"
45*4d9fdb46SRobert Mustacchi #include "pro_encode_nm.h"
46*4d9fdb46SRobert Mustacchi #include "pro_alloc.h"
47*4d9fdb46SRobert Mustacchi #include "pro_line.h"
48*4d9fdb46SRobert Mustacchi #include "memcpy_swap.h"
4907dc1947SRichard Lowe #include "pro_section.h"        /* for MAGIC_SECT_NO */
5049d3bc91SRichard Lowe #include "pro_reloc_symbolic.h"
5149d3bc91SRichard Lowe #include "pro_reloc_stream.h"
52*4d9fdb46SRobert Mustacchi #include "dwarf_tsearch.h"
53*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
54*4d9fdb46SRobert Mustacchi 
55*4d9fdb46SRobert Mustacchi #define IS_64BITPTR(dbg) ((dbg)->de_flags & DW_DLC_POINTER64 ? 1 : 0)
56*4d9fdb46SRobert Mustacchi #define ISA_IA64(dbg) ((dbg)->de_flags & DW_DLC_ISA_IA64 ? 1 : 0)
57*4d9fdb46SRobert Mustacchi 
58*4d9fdb46SRobert Mustacchi struct isa_relocs_s {
59*4d9fdb46SRobert Mustacchi    const char *name_;
60*4d9fdb46SRobert Mustacchi    int         reloc32_;
61*4d9fdb46SRobert Mustacchi    int         reloc64_;
62*4d9fdb46SRobert Mustacchi    int         segrel_; /* only used if IRIX */
63*4d9fdb46SRobert Mustacchi };
64*4d9fdb46SRobert Mustacchi 
65*4d9fdb46SRobert Mustacchi #ifndef TRUE
66*4d9fdb46SRobert Mustacchi #define TRUE 1
67*4d9fdb46SRobert Mustacchi #endif /*TRUE*/
68*4d9fdb46SRobert Mustacchi #ifndef FALSE
69*4d9fdb46SRobert Mustacchi #define FALSE 0
70*4d9fdb46SRobert Mustacchi #endif /*FALSE*/
71*4d9fdb46SRobert Mustacchi 
72*4d9fdb46SRobert Mustacchi /*  Some of these may be the wrong relocation for DWARF
73*4d9fdb46SRobert Mustacchi     relocations. FIXME. Most will be unusable without
74*4d9fdb46SRobert Mustacchi     additional effort as they have not been tested.
75*4d9fdb46SRobert Mustacchi */
76*4d9fdb46SRobert Mustacchi #ifndef	R_MIPS_32
77*4d9fdb46SRobert Mustacchi #define R_MIPS_32		2
78*4d9fdb46SRobert Mustacchi #endif
79*4d9fdb46SRobert Mustacchi #ifndef	R_MIPS_64
80*4d9fdb46SRobert Mustacchi #define R_MIPS_64		18
81*4d9fdb46SRobert Mustacchi #endif
82*4d9fdb46SRobert Mustacchi #ifndef R_MIPS_SCN_DISP
83*4d9fdb46SRobert Mustacchi #define R_MIPS_SCN_DISP		32
84*4d9fdb46SRobert Mustacchi #endif
85*4d9fdb46SRobert Mustacchi #ifndef	R_386_32
86*4d9fdb46SRobert Mustacchi #define R_386_32                 1
87*4d9fdb46SRobert Mustacchi #endif
88*4d9fdb46SRobert Mustacchi #ifndef	R_386_64
89*4d9fdb46SRobert Mustacchi #define R_386_64                 0  /* impossible */
90*4d9fdb46SRobert Mustacchi #endif
91*4d9fdb46SRobert Mustacchi #ifndef	R_X86_64_32
92*4d9fdb46SRobert Mustacchi #define R_X86_64_32             10
93*4d9fdb46SRobert Mustacchi #endif
94*4d9fdb46SRobert Mustacchi #ifndef R_X86_64_64
95*4d9fdb46SRobert Mustacchi #define R_X86_64_64              1
96*4d9fdb46SRobert Mustacchi #endif
97*4d9fdb46SRobert Mustacchi #ifndef	R_SPARC_UA32
98*4d9fdb46SRobert Mustacchi #define R_SPARC_UA32            23
99*4d9fdb46SRobert Mustacchi #endif
100*4d9fdb46SRobert Mustacchi #ifndef	R_SPARC_UA64
101*4d9fdb46SRobert Mustacchi #define R_SPARC_UA64            54
102*4d9fdb46SRobert Mustacchi #endif
103*4d9fdb46SRobert Mustacchi #ifndef	R_ARM_ABS32
104*4d9fdb46SRobert Mustacchi #define R_ARM_ABS32              2
105*4d9fdb46SRobert Mustacchi #endif
106*4d9fdb46SRobert Mustacchi #ifndef	R_ARM_ABS64
107*4d9fdb46SRobert Mustacchi #define R_ARM_ABS64              0 /* impossible */
108*4d9fdb46SRobert Mustacchi #endif
109*4d9fdb46SRobert Mustacchi #ifndef	R_AARCH64_ABS32
110*4d9fdb46SRobert Mustacchi #define R_AARCH64_ABS32        258
111*4d9fdb46SRobert Mustacchi #endif
112*4d9fdb46SRobert Mustacchi #ifndef	R_AARCH64_ABS64
113*4d9fdb46SRobert Mustacchi #define R_AARCH64_ABS64        257
114*4d9fdb46SRobert Mustacchi #endif
115*4d9fdb46SRobert Mustacchi #ifndef	R_IA64_DIR32LSB
116*4d9fdb46SRobert Mustacchi #define R_IA64_DIR32LSB       0x25
117*4d9fdb46SRobert Mustacchi #endif
118*4d9fdb46SRobert Mustacchi #ifndef	R_IA64_DIR64LSB
119*4d9fdb46SRobert Mustacchi #define R_IA64_DIR64LSB       0x27
120*4d9fdb46SRobert Mustacchi #endif
121*4d9fdb46SRobert Mustacchi #ifndef	R_PPC_REL32
122*4d9fdb46SRobert Mustacchi #define R_PPC_REL32             26
123*4d9fdb46SRobert Mustacchi #endif
124*4d9fdb46SRobert Mustacchi #ifndef	R_PPC_REL64
125*4d9fdb46SRobert Mustacchi #define R_PPC_REL64             44
126*4d9fdb46SRobert Mustacchi #endif
127*4d9fdb46SRobert Mustacchi #ifndef	R_PPC64_REL32
128*4d9fdb46SRobert Mustacchi #define R_PPC64_REL32         R_PPC_REL32
129*4d9fdb46SRobert Mustacchi #endif
130*4d9fdb46SRobert Mustacchi #ifndef	R_PPC64_REL64
131*4d9fdb46SRobert Mustacchi #define R_PPC64_REL64           44
132*4d9fdb46SRobert Mustacchi #endif
13349d3bc91SRichard Lowe 
134*4d9fdb46SRobert Mustacchi static struct isa_relocs_s isa_relocs[] = {
135*4d9fdb46SRobert Mustacchi {"irix",  R_MIPS_32,R_MIPS_64,R_MIPS_SCN_DISP},
136*4d9fdb46SRobert Mustacchi {"mips",  R_MIPS_32,R_MIPS_64,0},
137*4d9fdb46SRobert Mustacchi {"x86",   R_386_32, R_386_64,0},
138*4d9fdb46SRobert Mustacchi {"x86_64",R_X86_64_32,R_X86_64_64,0},
139*4d9fdb46SRobert Mustacchi {"ia64",  R_IA64_DIR32LSB,R_IA64_DIR64LSB,0},
140*4d9fdb46SRobert Mustacchi {"arm64", R_AARCH64_ABS32,R_AARCH64_ABS64,0},
141*4d9fdb46SRobert Mustacchi {"arm",   R_ARM_ABS32,R_ARM_ABS64,0},
142*4d9fdb46SRobert Mustacchi {"ppc",   R_PPC_REL32,R_PPC_REL64,0},
143*4d9fdb46SRobert Mustacchi {"ppc64", R_PPC64_REL32,R_PPC64_REL64,0},
144*4d9fdb46SRobert Mustacchi {"sparc", R_SPARC_UA32,R_SPARC_UA64,0},
145*4d9fdb46SRobert Mustacchi /*  The last entry MUST be all zeros. */
146*4d9fdb46SRobert Mustacchi {0,0,0,0}
147*4d9fdb46SRobert Mustacchi };
14849d3bc91SRichard Lowe 
14949d3bc91SRichard Lowe 
150*4d9fdb46SRobert Mustacchi static int common_init(Dwarf_P_Debug dbg, Dwarf_Unsigned flags,
151*4d9fdb46SRobert Mustacchi     const char *abiname, const char *dwarf_version,
152*4d9fdb46SRobert Mustacchi     const char *extrainfo,
153*4d9fdb46SRobert Mustacchi     int *error_ret);
15449d3bc91SRichard Lowe 
155*4d9fdb46SRobert Mustacchi /*  This function sets up a new dwarf producing region.
156*4d9fdb46SRobert Mustacchi     flags: Indicates type of access method, one of DW_DLC* macros
157*4d9fdb46SRobert Mustacchi     func(): Used to create a new object file, a call back function
158*4d9fdb46SRobert Mustacchi     errhand(): Error Handler provided by user
159*4d9fdb46SRobert Mustacchi     errarg: Argument to errhand()
160*4d9fdb46SRobert Mustacchi     error: returned error value */
161*4d9fdb46SRobert Mustacchi     /*  We want the following to have an elf section number that matches
162*4d9fdb46SRobert Mustacchi         'nothing' */
16349d3bc91SRichard Lowe static struct Dwarf_P_Section_Data_s init_sect = {
16449d3bc91SRichard Lowe     MAGIC_SECT_NO, 0, 0, 0, 0
16549d3bc91SRichard Lowe };
166*4d9fdb46SRobert Mustacchi static struct Dwarf_P_Section_Data_s init_sect_debug_str = {
167*4d9fdb46SRobert Mustacchi     MAGIC_SECT_NO, 0, 0, 0, 0
168*4d9fdb46SRobert Mustacchi };
169*4d9fdb46SRobert Mustacchi static struct Dwarf_P_Section_Data_s init_sect_debug_line_str = {
170*4d9fdb46SRobert Mustacchi     MAGIC_SECT_NO, 0, 0, 0, 0
171*4d9fdb46SRobert Mustacchi };
17249d3bc91SRichard Lowe 
173*4d9fdb46SRobert Mustacchi /*  New April 2014.
174*4d9fdb46SRobert Mustacchi     Replaces all previous producer init functions.
175*4d9fdb46SRobert Mustacchi     It adds a string to select the relevant ABI/ISA and
176*4d9fdb46SRobert Mustacchi     a string defining the selected DWARF version to
177*4d9fdb46SRobert Mustacchi     output.
178*4d9fdb46SRobert Mustacchi     There are some overlaps between the flags and the ISA/ABI
179*4d9fdb46SRobert Mustacchi     string choices. ( it is neither strictly ABI nor strictly
180*4d9fdb46SRobert Mustacchi     ISA name, but a useful name for both.)
181*4d9fdb46SRobert Mustacchi     Generally, the function inteprets these
182*4d9fdb46SRobert Mustacchi     in a tolerant fashion, so inconsistencies in the
183*4d9fdb46SRobert Mustacchi     selections are not noticed...but they may have a surprising
184*4d9fdb46SRobert Mustacchi     effect.
185*4d9fdb46SRobert Mustacchi 
186*4d9fdb46SRobert Mustacchi     The extra string is a way to allow new options without
187*4d9fdb46SRobert Mustacchi     changing the interface. The idea is the caller might
188*4d9fdb46SRobert Mustacchi     supply a list of such things as one string, comma-separated.
189*4d9fdb46SRobert Mustacchi     The interface is not intended to allow spaces or tabs in the
190*4d9fdb46SRobert Mustacchi     names, so don't do that  :-)
191*4d9fdb46SRobert Mustacchi     If no extra strings are needed (none are defined initially)
192*4d9fdb46SRobert Mustacchi     then pass a NULL pointer or an empty string as the 'extra'
193*4d9fdb46SRobert Mustacchi     parameter.
194*4d9fdb46SRobert Mustacchi     */
195*4d9fdb46SRobert Mustacchi int
dwarf_producer_init(Dwarf_Unsigned flags,Dwarf_Callback_Func func,Dwarf_Handler errhand,Dwarf_Ptr errarg,void * user_data,const char * isa_name,const char * dwarf_version,const char * extra,Dwarf_P_Debug * dbg_returned,Dwarf_Error * error)196*4d9fdb46SRobert Mustacchi dwarf_producer_init(Dwarf_Unsigned flags,
197*4d9fdb46SRobert Mustacchi     Dwarf_Callback_Func func,
198*4d9fdb46SRobert Mustacchi     Dwarf_Handler errhand,
199*4d9fdb46SRobert Mustacchi     Dwarf_Ptr errarg,
200*4d9fdb46SRobert Mustacchi     void * user_data,
201*4d9fdb46SRobert Mustacchi     const char *isa_name, /* See isa_reloc_s. */
202*4d9fdb46SRobert Mustacchi     const char *dwarf_version, /* V2 V3 V4 or V5. */
203*4d9fdb46SRobert Mustacchi     const char *extra, /* Extra input strings, comma separated. */
204*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug *dbg_returned,
205*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
20649d3bc91SRichard Lowe {
207*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
208*4d9fdb46SRobert Mustacchi     int res = 0;
209*4d9fdb46SRobert Mustacchi     int err_ret = 0;
21049d3bc91SRichard Lowe     dbg = (Dwarf_P_Debug) _dwarf_p_get_alloc(NULL,
211*4d9fdb46SRobert Mustacchi         sizeof(struct Dwarf_P_Debug_s));
21249d3bc91SRichard Lowe     if (dbg == NULL) {
21307dc1947SRichard Lowe         DWARF_P_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC,
214*4d9fdb46SRobert Mustacchi             DW_DLV_ERROR);
21549d3bc91SRichard Lowe     }
21607dc1947SRichard Lowe     memset((void *) dbg, 0, sizeof(struct Dwarf_P_Debug_s));
21749d3bc91SRichard Lowe     /* For the time being */
21849d3bc91SRichard Lowe     if (func == NULL) {
21907dc1947SRichard Lowe         DWARF_P_DBG_ERROR(dbg, DW_DLE_NO_CALLBACK_FUNC,
220*4d9fdb46SRobert Mustacchi             DW_DLV_ERROR);
22149d3bc91SRichard Lowe     }
222*4d9fdb46SRobert Mustacchi     dbg->de_callback_func = func;
22349d3bc91SRichard Lowe     dbg->de_errhand = errhand;
22449d3bc91SRichard Lowe     dbg->de_errarg = errarg;
225*4d9fdb46SRobert Mustacchi     dbg->de_user_data = user_data;
226*4d9fdb46SRobert Mustacchi     res = common_init(dbg, flags,isa_name,dwarf_version,
227*4d9fdb46SRobert Mustacchi         extra,&err_ret);
228*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
229*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, err_ret, DW_DLV_ERROR);
230*4d9fdb46SRobert Mustacchi     }
231*4d9fdb46SRobert Mustacchi     *dbg_returned = dbg;
232*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
23349d3bc91SRichard Lowe }
23449d3bc91SRichard Lowe 
235*4d9fdb46SRobert Mustacchi int
dwarf_pro_set_default_string_form(Dwarf_P_Debug dbg,int form,UNUSEDARG Dwarf_Error * error)236*4d9fdb46SRobert Mustacchi dwarf_pro_set_default_string_form(Dwarf_P_Debug dbg,
237*4d9fdb46SRobert Mustacchi    int form,
238*4d9fdb46SRobert Mustacchi    UNUSEDARG Dwarf_Error * error)
23949d3bc91SRichard Lowe {
240*4d9fdb46SRobert Mustacchi     if (form != DW_FORM_string &&
241*4d9fdb46SRobert Mustacchi         form != DW_FORM_strp) {
242*4d9fdb46SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_BAD_STRING_FORM);
243*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
244*4d9fdb46SRobert Mustacchi     }
245*4d9fdb46SRobert Mustacchi     dbg->de_debug_default_str_form = form;
246*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
247*4d9fdb46SRobert Mustacchi }
24849d3bc91SRichard Lowe 
249*4d9fdb46SRobert Mustacchi static int
set_reloc_numbers(Dwarf_P_Debug dbg,UNUSEDARG Dwarf_Unsigned flags,const char * abiname)250*4d9fdb46SRobert Mustacchi set_reloc_numbers(Dwarf_P_Debug dbg,
251*4d9fdb46SRobert Mustacchi     UNUSEDARG Dwarf_Unsigned flags,
252*4d9fdb46SRobert Mustacchi     const char *abiname)
253*4d9fdb46SRobert Mustacchi {
254*4d9fdb46SRobert Mustacchi     struct isa_relocs_s *isap = 0;
255*4d9fdb46SRobert Mustacchi     if (!abiname) {
256*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
257*4d9fdb46SRobert Mustacchi     }
258*4d9fdb46SRobert Mustacchi     for(isap = &isa_relocs[0];  ;isap++) {
259*4d9fdb46SRobert Mustacchi         if (!isap->name_) {
260*4d9fdb46SRobert Mustacchi             /* No more names known. Never found the one we wanted. */
261*4d9fdb46SRobert Mustacchi             return DW_DLV_NO_ENTRY;
262*4d9fdb46SRobert Mustacchi         }
263*4d9fdb46SRobert Mustacchi         if (!strcmp(abiname,isap->name_)) {
264*4d9fdb46SRobert Mustacchi             if (dbg->de_pointer_size == 4) {
265*4d9fdb46SRobert Mustacchi                 dbg->de_ptr_reloc = isap->reloc32_;
266*4d9fdb46SRobert Mustacchi             } else {
267*4d9fdb46SRobert Mustacchi                 dbg->de_ptr_reloc = isap->reloc64_;
268*4d9fdb46SRobert Mustacchi             }
269*4d9fdb46SRobert Mustacchi             if (dbg->de_dwarf_offset_size == 4) {
270*4d9fdb46SRobert Mustacchi                 dbg->de_offset_reloc = isap->reloc32_;
271*4d9fdb46SRobert Mustacchi             } else {
272*4d9fdb46SRobert Mustacchi                 dbg->de_offset_reloc = isap->reloc64_;
273*4d9fdb46SRobert Mustacchi             }
274*4d9fdb46SRobert Mustacchi             /*  segrel only meaningful for IRIX, otherwise
275*4d9fdb46SRobert Mustacchi                 harmless, unused. */
276*4d9fdb46SRobert Mustacchi             dbg->de_exc_reloc = isap->segrel_;
277*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
278*4d9fdb46SRobert Mustacchi         }
279*4d9fdb46SRobert Mustacchi     }
280*4d9fdb46SRobert Mustacchi     /* UNREACHED */
281*4d9fdb46SRobert Mustacchi }
28249d3bc91SRichard Lowe 
283*4d9fdb46SRobert Mustacchi /*  This is the Daniel J Bernstein hash function
284*4d9fdb46SRobert Mustacchi     originally posted to Usenet news.
285*4d9fdb46SRobert Mustacchi     http://en.wikipedia.org/wiki/List_of_hash_functions or
286*4d9fdb46SRobert Mustacchi     http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function).
287*4d9fdb46SRobert Mustacchi     See Also DWARF5 Section 7.33
288*4d9fdb46SRobert Mustacchi */
289*4d9fdb46SRobert Mustacchi static DW_TSHASHTYPE
_dwarf_string_hashfunc(const char * str)290*4d9fdb46SRobert Mustacchi _dwarf_string_hashfunc(const char *str)
291*4d9fdb46SRobert Mustacchi {
292*4d9fdb46SRobert Mustacchi     DW_TSHASHTYPE up = 0;
293*4d9fdb46SRobert Mustacchi     DW_TSHASHTYPE hash = 5381;
294*4d9fdb46SRobert Mustacchi     int c  = 0;
29549d3bc91SRichard Lowe 
296*4d9fdb46SRobert Mustacchi     /*  Extra parens suppress warning about assign in test. */
297*4d9fdb46SRobert Mustacchi     while ((c = *str++)) {
298*4d9fdb46SRobert Mustacchi         hash = hash * 33 + c ;
29949d3bc91SRichard Lowe     }
300*4d9fdb46SRobert Mustacchi     up = hash;
301*4d9fdb46SRobert Mustacchi     return up;
30249d3bc91SRichard Lowe }
303*4d9fdb46SRobert Mustacchi static DW_TSHASHTYPE
key_simple_string_hashfunc(const void * keyp)304*4d9fdb46SRobert Mustacchi key_simple_string_hashfunc(const void *keyp)
30549d3bc91SRichard Lowe {
306*4d9fdb46SRobert Mustacchi     struct Dwarf_P_debug_str_entry_s* mt =
307*4d9fdb46SRobert Mustacchi         (struct Dwarf_P_debug_str_entry_s*) keyp;
308*4d9fdb46SRobert Mustacchi     const char *str = 0;
309*4d9fdb46SRobert Mustacchi 
310*4d9fdb46SRobert Mustacchi     if (mt->dse_has_table_offset) {
311*4d9fdb46SRobert Mustacchi         /*  ASSERT: mt->dse_dbg->de_debug_str->ds_data not zero. */
312*4d9fdb46SRobert Mustacchi         str = (const char *)mt->dse_dbg->de_debug_str->ds_data +
313*4d9fdb46SRobert Mustacchi             mt->dse_table_offset;
314*4d9fdb46SRobert Mustacchi     } else {
315*4d9fdb46SRobert Mustacchi         /*  ASSERT: dse_name != 0 */
316*4d9fdb46SRobert Mustacchi         str = (const char *)mt->dse_name;
317*4d9fdb46SRobert Mustacchi     }
318*4d9fdb46SRobert Mustacchi     return _dwarf_string_hashfunc(str);
319*4d9fdb46SRobert Mustacchi }
320*4d9fdb46SRobert Mustacchi 
32149d3bc91SRichard Lowe 
322*4d9fdb46SRobert Mustacchi static int
common_init(Dwarf_P_Debug dbg,Dwarf_Unsigned flags,const char * abiname,const char * dwarf_version,const char * extra,int * err_ret)323*4d9fdb46SRobert Mustacchi common_init(Dwarf_P_Debug dbg,
324*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned flags,
325*4d9fdb46SRobert Mustacchi     const char *abiname,
326*4d9fdb46SRobert Mustacchi     const char *dwarf_version,
327*4d9fdb46SRobert Mustacchi     const char *extra,
328*4d9fdb46SRobert Mustacchi     int *err_ret)
329*4d9fdb46SRobert Mustacchi {
330*4d9fdb46SRobert Mustacchi     unsigned int k = 0;
331*4d9fdb46SRobert Mustacchi     int res = 0;
33249d3bc91SRichard Lowe 
33349d3bc91SRichard Lowe     dbg->de_version_magic_number = PRO_VERSION_MAGIC;
33449d3bc91SRichard Lowe     dbg->de_n_debug_sect = 0;
33549d3bc91SRichard Lowe     dbg->de_debug_sects = &init_sect;
336*4d9fdb46SRobert Mustacchi     dbg->de_debug_str = &init_sect_debug_str;
337*4d9fdb46SRobert Mustacchi     dbg->de_debug_line_str = &init_sect_debug_line_str;
33849d3bc91SRichard Lowe     dbg->de_current_active_section = &init_sect;
33949d3bc91SRichard Lowe     dbg->de_flags = flags;
34049d3bc91SRichard Lowe 
34149d3bc91SRichard Lowe 
342*4d9fdb46SRobert Mustacchi     /* DW_DLC_POINTER32 assumed. */
343*4d9fdb46SRobert Mustacchi     dbg->de_pointer_size = 4;
344*4d9fdb46SRobert Mustacchi     /* Standard DWARF 64bit offset, length field 12 bytes */
345*4d9fdb46SRobert Mustacchi     dbg->de_dwarf_offset_size = 4;
346*4d9fdb46SRobert Mustacchi     dbg->de_elf_offset_size = 4;
34749d3bc91SRichard Lowe     dbg->de_64bit_extension = 0;
348*4d9fdb46SRobert Mustacchi 
349*4d9fdb46SRobert Mustacchi     dbg->de_big_endian = (dbg->de_flags&DW_DLC_TARGET_BIGENDIAN)?
350*4d9fdb46SRobert Mustacchi         TRUE:FALSE;
351*4d9fdb46SRobert Mustacchi     /*  DW_DLC_POINTER64 is identical to DW_DLC_SIZE_64 */
352*4d9fdb46SRobert Mustacchi     if(dbg->de_flags & DW_DLC_POINTER64) {
353*4d9fdb46SRobert Mustacchi         dbg->de_pointer_size = 8;
354*4d9fdb46SRobert Mustacchi     }
355*4d9fdb46SRobert Mustacchi     if(dbg->de_flags & DW_DLC_OFFSET64) {
356*4d9fdb46SRobert Mustacchi         dbg->de_pointer_size = 8;
357*4d9fdb46SRobert Mustacchi         dbg->de_dwarf_offset_size = 4;
35807dc1947SRichard Lowe         dbg->de_64bit_extension = 0;
359*4d9fdb46SRobert Mustacchi         /*  When dwarf_offset_size == 8 then for
360*4d9fdb46SRobert Mustacchi             standard dwarf set
361*4d9fdb46SRobert Mustacchi             de_64bit_extension to 1. */
362*4d9fdb46SRobert Mustacchi         dbg->de_elf_offset_size = 8;
363*4d9fdb46SRobert Mustacchi     } else {
364*4d9fdb46SRobert Mustacchi         if(dbg->de_flags & DW_DLC_IRIX_OFFSET64) {
365*4d9fdb46SRobert Mustacchi             dbg->de_pointer_size = 8;
366*4d9fdb46SRobert Mustacchi             dbg->de_big_endian = TRUE;
367*4d9fdb46SRobert Mustacchi             dbg->de_dwarf_offset_size = 8;
368*4d9fdb46SRobert Mustacchi             dbg->de_64bit_extension = 0;
369*4d9fdb46SRobert Mustacchi             dbg->de_elf_offset_size = 8;
370*4d9fdb46SRobert Mustacchi         }
37107dc1947SRichard Lowe     }
37249d3bc91SRichard Lowe 
373*4d9fdb46SRobert Mustacchi     if(abiname && (!strcmp(abiname,"irix"))) {
374*4d9fdb46SRobert Mustacchi         dbg->de_irix_exc_augmentation = 1;
375*4d9fdb46SRobert Mustacchi     } else {
376*4d9fdb46SRobert Mustacchi         dbg->de_irix_exc_augmentation = 0;
377*4d9fdb46SRobert Mustacchi     }
378*4d9fdb46SRobert Mustacchi     /*  We must set reloc numbers even if doing symbolic
379*4d9fdb46SRobert Mustacchi         relocations because we use the numbers up until
380*4d9fdb46SRobert Mustacchi         we are generating debug.  A zero is interpreted
381*4d9fdb46SRobert Mustacchi         as no relocations.  So ensure we have real
382*4d9fdb46SRobert Mustacchi         relocations. */
383*4d9fdb46SRobert Mustacchi     res = set_reloc_numbers(dbg,flags,abiname);
384*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
385*4d9fdb46SRobert Mustacchi         *err_ret = DW_DLE_BAD_ABINAME;
386*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
387*4d9fdb46SRobert Mustacchi     }
388*4d9fdb46SRobert Mustacchi     dbg->de_output_version = 2;
389*4d9fdb46SRobert Mustacchi     if(dwarf_version) {
390*4d9fdb46SRobert Mustacchi         if (!strcmp(dwarf_version,"V2")) {
391*4d9fdb46SRobert Mustacchi             dbg->de_output_version = 2;
392*4d9fdb46SRobert Mustacchi         } else if (!strcmp(dwarf_version,"V3")) {
393*4d9fdb46SRobert Mustacchi             dbg->de_output_version = 3;
394*4d9fdb46SRobert Mustacchi         } else if (!strcmp(dwarf_version,"V4")) {
395*4d9fdb46SRobert Mustacchi             dbg->de_output_version = 4;
396*4d9fdb46SRobert Mustacchi         } else if (!strcmp(dwarf_version,"V5")) {
397*4d9fdb46SRobert Mustacchi             dbg->de_output_version = 5;
398*4d9fdb46SRobert Mustacchi         } else {
399*4d9fdb46SRobert Mustacchi             *err_ret = DW_DLE_VERSION_STAMP_ERROR;
400*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
401*4d9fdb46SRobert Mustacchi         }
402*4d9fdb46SRobert Mustacchi     }
403*4d9fdb46SRobert Mustacchi     _dwarf_init_default_line_header_vals(dbg);
404*4d9fdb46SRobert Mustacchi     res = _dwarf_log_extra_flagstrings(dbg,extra,err_ret);
405*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_ERROR) {
406*4d9fdb46SRobert Mustacchi         return res;
407*4d9fdb46SRobert Mustacchi     }
40849d3bc91SRichard Lowe 
40949d3bc91SRichard Lowe     if (flags & DW_DLC_SYMBOLIC_RELOCATIONS) {
41007dc1947SRichard Lowe         dbg->de_relocation_record_size =
41107dc1947SRichard Lowe             sizeof(struct Dwarf_Relocation_Data_s);
41249d3bc91SRichard Lowe     } else {
413*4d9fdb46SRobert Mustacchi         /*  This is only going to work when the HOST == TARGET,
414*4d9fdb46SRobert Mustacchi             surely? */
415*4d9fdb46SRobert Mustacchi #ifdef DWARF_WITH_LIBELF
41649d3bc91SRichard Lowe #if HAVE_ELF64_GETEHDR
41707dc1947SRichard Lowe         dbg->de_relocation_record_size =
418*4d9fdb46SRobert Mustacchi             ((dbg->de_pointer_size == 8)?
419*4d9fdb46SRobert Mustacchi             sizeof(REL64) : sizeof(REL32));
42049d3bc91SRichard Lowe #else
42107dc1947SRichard Lowe         dbg->de_relocation_record_size = sizeof(REL32);
42249d3bc91SRichard Lowe #endif
423*4d9fdb46SRobert Mustacchi #else /* DWARF_WITH_LIBELF */
424*4d9fdb46SRobert Mustacchi         *err_ret = DW_DLE_NO_STREAM_RELOC_SUPPORT;
425*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
426*4d9fdb46SRobert Mustacchi #endif /* DWARF_WITH_LIBELF */
42749d3bc91SRichard Lowe     }
42849d3bc91SRichard Lowe 
429*4d9fdb46SRobert Mustacchi     /* For .debug_str creation. */
430*4d9fdb46SRobert Mustacchi     dwarf_initialize_search_hash(&dbg->de_debug_str_hashtab,
431*4d9fdb46SRobert Mustacchi         key_simple_string_hashfunc,0);
432*4d9fdb46SRobert Mustacchi     dbg->de_debug_default_str_form = DW_FORM_string;
433*4d9fdb46SRobert Mustacchi     dwarf_initialize_search_hash(&dbg->de_debug_line_str_hashtab,
434*4d9fdb46SRobert Mustacchi         key_simple_string_hashfunc,0);
435*4d9fdb46SRobert Mustacchi 
436*4d9fdb46SRobert Mustacchi     if (dbg->de_dwarf_offset_size == 8) {
437*4d9fdb46SRobert Mustacchi         if (dbg->de_output_version <= 3) {
438*4d9fdb46SRobert Mustacchi             dbg->de_ar_data_attribute_form = DW_FORM_data8;
439*4d9fdb46SRobert Mustacchi         } else {
440*4d9fdb46SRobert Mustacchi             dbg->de_ar_data_attribute_form = DW_FORM_sec_offset;
441*4d9fdb46SRobert Mustacchi         }
44207dc1947SRichard Lowe         dbg->de_ar_ref_attr_form = DW_FORM_ref8;
44349d3bc91SRichard Lowe     } else {
444*4d9fdb46SRobert Mustacchi         if (dbg->de_output_version <= 3) {
445*4d9fdb46SRobert Mustacchi             dbg->de_ar_data_attribute_form = DW_FORM_data4;
446*4d9fdb46SRobert Mustacchi         } else {
447*4d9fdb46SRobert Mustacchi             dbg->de_ar_data_attribute_form = DW_FORM_sec_offset;
448*4d9fdb46SRobert Mustacchi         }
44907dc1947SRichard Lowe         dbg->de_ar_ref_attr_form = DW_FORM_ref4;
45049d3bc91SRichard Lowe     }
45149d3bc91SRichard Lowe 
45249d3bc91SRichard Lowe     if (flags & DW_DLC_SYMBOLIC_RELOCATIONS) {
453*4d9fdb46SRobert Mustacchi         dbg->de_relocate_by_name_symbol =
454*4d9fdb46SRobert Mustacchi             _dwarf_pro_reloc_name_symbolic;
455*4d9fdb46SRobert Mustacchi         dbg->de_relocate_pair_by_symbol =
456*4d9fdb46SRobert Mustacchi             _dwarf_pro_reloc_length_symbolic;
45707dc1947SRichard Lowe         dbg->de_transform_relocs_to_disk =
45807dc1947SRichard Lowe             _dwarf_symbolic_relocs_to_disk;
45949d3bc91SRichard Lowe     } else {
460*4d9fdb46SRobert Mustacchi #ifdef DWARF_WITH_LIBELF
461*4d9fdb46SRobert Mustacchi         if (IS_64BITPTR(dbg)) {
462*4d9fdb46SRobert Mustacchi             dbg->de_relocate_by_name_symbol =
463*4d9fdb46SRobert Mustacchi                 _dwarf_pro_reloc_name_stream64;
46407dc1947SRichard Lowe         } else {
465*4d9fdb46SRobert Mustacchi             dbg->de_relocate_by_name_symbol =
466*4d9fdb46SRobert Mustacchi                 _dwarf_pro_reloc_name_stream32;
46707dc1947SRichard Lowe         }
468*4d9fdb46SRobert Mustacchi         dbg->de_relocate_pair_by_symbol = 0;
46907dc1947SRichard Lowe         dbg->de_transform_relocs_to_disk = _dwarf_stream_relocs_to_disk;
470*4d9fdb46SRobert Mustacchi #else /* DWARF_WITH_LIBELF */
471*4d9fdb46SRobert Mustacchi         *err_ret = DW_DLE_NO_STREAM_RELOC_SUPPORT;
472*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
473*4d9fdb46SRobert Mustacchi #endif /* DWARF_WITH_LIBELF */
47449d3bc91SRichard Lowe     }
47549d3bc91SRichard Lowe     for (k = 0; k < NUM_DEBUG_SECTIONS; ++k) {
47649d3bc91SRichard Lowe 
47707dc1947SRichard Lowe         Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[k];
47849d3bc91SRichard Lowe 
47907dc1947SRichard Lowe         prel->pr_slots_per_block_to_alloc = DEFAULT_SLOTS_PER_BLOCK;
48049d3bc91SRichard Lowe     }
481*4d9fdb46SRobert Mustacchi     /* First assume host, target same endianness  FIXME */
48249d3bc91SRichard Lowe     dbg->de_same_endian = 1;
483*4d9fdb46SRobert Mustacchi     dbg->de_copy_word =  _dwarf_memcpy_noswap_bytes;
48449d3bc91SRichard Lowe #ifdef WORDS_BIGENDIAN
48549d3bc91SRichard Lowe     /* host is big endian, so what endian is target? */
48649d3bc91SRichard Lowe     if (flags & DW_DLC_TARGET_LITTLEENDIAN) {
48707dc1947SRichard Lowe         dbg->de_same_endian = 0;
48807dc1947SRichard Lowe         dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
48949d3bc91SRichard Lowe     }
49049d3bc91SRichard Lowe #else /* little endian */
49149d3bc91SRichard Lowe     /* host is little endian, so what endian is target? */
49249d3bc91SRichard Lowe     if (flags & DW_DLC_TARGET_BIGENDIAN) {
49307dc1947SRichard Lowe         dbg->de_same_endian = 0;
49407dc1947SRichard Lowe         dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
49549d3bc91SRichard Lowe     }
49649d3bc91SRichard Lowe #endif /* !WORDS_BIGENDIAN */
497*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
49849d3bc91SRichard Lowe }
499