1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
3bc1f688bSRobert Mustacchi   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.
6bc1f688bSRobert 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.
11bc1f688bSRobert 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.
16bc1f688bSRobert 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.
24bc1f688bSRobert 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.
29bc1f688bSRobert Mustacchi 
30bc1f688bSRobert Mustacchi */
31bc1f688bSRobert Mustacchi 
32bc1f688bSRobert Mustacchi #include "config.h"
33bc1f688bSRobert Mustacchi #include "libdwarfdefs.h"
34bc1f688bSRobert Mustacchi #include <stdio.h>
35bc1f688bSRobert Mustacchi #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 */
40bc1f688bSRobert Mustacchi #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"
49bc1f688bSRobert Mustacchi #include "pro_section.h"        /* for MAGIC_SECT_NO */
50bc1f688bSRobert Mustacchi #include "pro_reloc_symbolic.h"
51bc1f688bSRobert Mustacchi #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
133*4d9fdb46SRobert Mustacchi 
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 };
148bc1f688bSRobert Mustacchi 
149bc1f688bSRobert Mustacchi 
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);
154bc1f688bSRobert Mustacchi 
155*4d9fdb46SRobert Mustacchi /*  This function sets up a new dwarf producing region.
156bc1f688bSRobert Mustacchi     flags: Indicates type of access method, one of DW_DLC* macros
157bc1f688bSRobert Mustacchi     func(): Used to create a new object file, a call back function
158bc1f688bSRobert Mustacchi     errhand(): Error Handler provided by user
159bc1f688bSRobert Mustacchi     errarg: Argument to errhand()
160*4d9fdb46SRobert Mustacchi     error: returned error value */
161bc1f688bSRobert Mustacchi     /*  We want the following to have an elf section number that matches
162bc1f688bSRobert Mustacchi         'nothing' */
163bc1f688bSRobert Mustacchi static struct Dwarf_P_Section_Data_s init_sect = {
164bc1f688bSRobert Mustacchi     MAGIC_SECT_NO, 0, 0, 0, 0
165bc1f688bSRobert Mustacchi };
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 };
172bc1f688bSRobert Mustacchi 
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.
185bc1f688bSRobert 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)196bc1f688bSRobert Mustacchi dwarf_producer_init(Dwarf_Unsigned flags,
197bc1f688bSRobert Mustacchi     Dwarf_Callback_Func func,
198bc1f688bSRobert 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)
206bc1f688bSRobert Mustacchi {
207*4d9fdb46SRobert Mustacchi     Dwarf_P_Debug dbg = 0;
208*4d9fdb46SRobert Mustacchi     int res = 0;
209*4d9fdb46SRobert Mustacchi     int err_ret = 0;
210bc1f688bSRobert Mustacchi     dbg = (Dwarf_P_Debug) _dwarf_p_get_alloc(NULL,
211*4d9fdb46SRobert Mustacchi         sizeof(struct Dwarf_P_Debug_s));
212bc1f688bSRobert Mustacchi     if (dbg == NULL) {
213bc1f688bSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC,
214*4d9fdb46SRobert Mustacchi             DW_DLV_ERROR);
215bc1f688bSRobert Mustacchi     }
216bc1f688bSRobert Mustacchi     memset((void *) dbg, 0, sizeof(struct Dwarf_P_Debug_s));
217bc1f688bSRobert Mustacchi     /* For the time being */
218bc1f688bSRobert Mustacchi     if (func == NULL) {
219bc1f688bSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_NO_CALLBACK_FUNC,
220*4d9fdb46SRobert Mustacchi             DW_DLV_ERROR);
221bc1f688bSRobert Mustacchi     }
222bc1f688bSRobert Mustacchi     dbg->de_callback_func = func;
223bc1f688bSRobert Mustacchi     dbg->de_errhand = errhand;
224bc1f688bSRobert Mustacchi     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);
230bc1f688bSRobert Mustacchi     }
231*4d9fdb46SRobert Mustacchi     *dbg_returned = dbg;
232*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
233*4d9fdb46SRobert Mustacchi }
234bc1f688bSRobert Mustacchi 
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)
239*4d9fdb46SRobert Mustacchi {
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 }
248*4d9fdb46SRobert Mustacchi 
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 }
282*4d9fdb46SRobert Mustacchi 
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;
295*4d9fdb46SRobert Mustacchi 
296*4d9fdb46SRobert Mustacchi     /*  Extra parens suppress warning about assign in test. */
297*4d9fdb46SRobert Mustacchi     while ((c = *str++)) {
298*4d9fdb46SRobert Mustacchi         hash = hash * 33 + c ;
299*4d9fdb46SRobert Mustacchi     }
300*4d9fdb46SRobert Mustacchi     up = hash;
301*4d9fdb46SRobert Mustacchi     return up;
302*4d9fdb46SRobert Mustacchi }
303*4d9fdb46SRobert Mustacchi static DW_TSHASHTYPE
key_simple_string_hashfunc(const void * keyp)304*4d9fdb46SRobert Mustacchi key_simple_string_hashfunc(const void *keyp)
305*4d9fdb46SRobert Mustacchi {
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 
321*4d9fdb46SRobert Mustacchi 
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;
332bc1f688bSRobert Mustacchi 
333bc1f688bSRobert Mustacchi     dbg->de_version_magic_number = PRO_VERSION_MAGIC;
334bc1f688bSRobert Mustacchi     dbg->de_n_debug_sect = 0;
335bc1f688bSRobert Mustacchi     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;
338bc1f688bSRobert Mustacchi     dbg->de_current_active_section = &init_sect;
339bc1f688bSRobert Mustacchi     dbg->de_flags = flags;
340bc1f688bSRobert Mustacchi 
341bc1f688bSRobert Mustacchi 
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;
347bc1f688bSRobert Mustacchi     dbg->de_64bit_extension = 0;
348bc1f688bSRobert 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;
354bc1f688bSRobert 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;
358*4d9fdb46SRobert Mustacchi         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         }
371*4d9fdb46SRobert Mustacchi     }
372bc1f688bSRobert Mustacchi 
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     }
408bc1f688bSRobert Mustacchi 
409bc1f688bSRobert Mustacchi     if (flags & DW_DLC_SYMBOLIC_RELOCATIONS) {
410bc1f688bSRobert Mustacchi         dbg->de_relocation_record_size =
411bc1f688bSRobert Mustacchi             sizeof(struct Dwarf_Relocation_Data_s);
412bc1f688bSRobert Mustacchi     } 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
416bc1f688bSRobert Mustacchi #if HAVE_ELF64_GETEHDR
417bc1f688bSRobert Mustacchi         dbg->de_relocation_record_size =
418*4d9fdb46SRobert Mustacchi             ((dbg->de_pointer_size == 8)?
419*4d9fdb46SRobert Mustacchi             sizeof(REL64) : sizeof(REL32));
420bc1f688bSRobert Mustacchi #else
421bc1f688bSRobert Mustacchi         dbg->de_relocation_record_size = sizeof(REL32);
422bc1f688bSRobert Mustacchi #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 */
427bc1f688bSRobert Mustacchi     }
428bc1f688bSRobert Mustacchi 
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) {
438bc1f688bSRobert 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         }
442bc1f688bSRobert Mustacchi         dbg->de_ar_ref_attr_form = DW_FORM_ref8;
443bc1f688bSRobert Mustacchi     } else {
444*4d9fdb46SRobert Mustacchi         if (dbg->de_output_version <= 3) {
445bc1f688bSRobert 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         }
449bc1f688bSRobert Mustacchi         dbg->de_ar_ref_attr_form = DW_FORM_ref4;
450bc1f688bSRobert Mustacchi     }
451bc1f688bSRobert Mustacchi 
452bc1f688bSRobert Mustacchi     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;
457bc1f688bSRobert Mustacchi         dbg->de_transform_relocs_to_disk =
458bc1f688bSRobert Mustacchi             _dwarf_symbolic_relocs_to_disk;
459bc1f688bSRobert Mustacchi     } 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;
464bc1f688bSRobert Mustacchi         } else {
465*4d9fdb46SRobert Mustacchi             dbg->de_relocate_by_name_symbol =
466*4d9fdb46SRobert Mustacchi                 _dwarf_pro_reloc_name_stream32;
467bc1f688bSRobert Mustacchi         }
468*4d9fdb46SRobert Mustacchi         dbg->de_relocate_pair_by_symbol = 0;
469bc1f688bSRobert Mustacchi         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 */
474bc1f688bSRobert Mustacchi     }
475bc1f688bSRobert Mustacchi     for (k = 0; k < NUM_DEBUG_SECTIONS; ++k) {
476bc1f688bSRobert Mustacchi 
477bc1f688bSRobert Mustacchi         Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[k];
478bc1f688bSRobert Mustacchi 
479bc1f688bSRobert Mustacchi         prel->pr_slots_per_block_to_alloc = DEFAULT_SLOTS_PER_BLOCK;
480bc1f688bSRobert Mustacchi     }
481*4d9fdb46SRobert Mustacchi     /* First assume host, target same endianness  FIXME */
482bc1f688bSRobert Mustacchi     dbg->de_same_endian = 1;
483*4d9fdb46SRobert Mustacchi     dbg->de_copy_word =  _dwarf_memcpy_noswap_bytes;
484bc1f688bSRobert Mustacchi #ifdef WORDS_BIGENDIAN
485bc1f688bSRobert Mustacchi     /* host is big endian, so what endian is target? */
486bc1f688bSRobert Mustacchi     if (flags & DW_DLC_TARGET_LITTLEENDIAN) {
487bc1f688bSRobert Mustacchi         dbg->de_same_endian = 0;
488bc1f688bSRobert Mustacchi         dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
489bc1f688bSRobert Mustacchi     }
490bc1f688bSRobert Mustacchi #else /* little endian */
491bc1f688bSRobert Mustacchi     /* host is little endian, so what endian is target? */
492bc1f688bSRobert Mustacchi     if (flags & DW_DLC_TARGET_BIGENDIAN) {
493bc1f688bSRobert Mustacchi         dbg->de_same_endian = 0;
494bc1f688bSRobert Mustacchi         dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
495bc1f688bSRobert Mustacchi     }
496bc1f688bSRobert Mustacchi #endif /* !WORDS_BIGENDIAN */
497*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
498bc1f688bSRobert Mustacchi }
499