1*f3e7f55eSRobert Mustacchi /*
2*f3e7f55eSRobert Mustacchi
3*f3e7f55eSRobert Mustacchi Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
4*f3e7f55eSRobert Mustacchi
5*f3e7f55eSRobert Mustacchi This program is free software; you can redistribute it and/or modify it
6*f3e7f55eSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
7*f3e7f55eSRobert Mustacchi as published by the Free Software Foundation.
8*f3e7f55eSRobert Mustacchi
9*f3e7f55eSRobert Mustacchi This program is distributed in the hope that it would be useful, but
10*f3e7f55eSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
11*f3e7f55eSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*f3e7f55eSRobert Mustacchi
13*f3e7f55eSRobert Mustacchi Further, this software is distributed without any warranty that it is
14*f3e7f55eSRobert Mustacchi free of the rightful claim of any third person regarding infringement
15*f3e7f55eSRobert Mustacchi or the like. Any license provided herein, whether implied or
16*f3e7f55eSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
17*f3e7f55eSRobert Mustacchi any, provided herein do not apply to combinations of this program with
18*f3e7f55eSRobert Mustacchi other software, or any other product whatsoever.
19*f3e7f55eSRobert Mustacchi
20*f3e7f55eSRobert Mustacchi You should have received a copy of the GNU Lesser General Public
21*f3e7f55eSRobert Mustacchi License along with this program; if not, write the Free Software
22*f3e7f55eSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23*f3e7f55eSRobert Mustacchi USA.
24*f3e7f55eSRobert Mustacchi
25*f3e7f55eSRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
26*f3e7f55eSRobert Mustacchi Mountain View, CA 94043, or:
27*f3e7f55eSRobert Mustacchi
28*f3e7f55eSRobert Mustacchi http://www.sgi.com
29*f3e7f55eSRobert Mustacchi
30*f3e7f55eSRobert Mustacchi For further information regarding this notice, see:
31*f3e7f55eSRobert Mustacchi
32*f3e7f55eSRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan
33*f3e7f55eSRobert Mustacchi
34*f3e7f55eSRobert Mustacchi */
35*f3e7f55eSRobert Mustacchi
36*f3e7f55eSRobert Mustacchi
37*f3e7f55eSRobert Mustacchi
38*f3e7f55eSRobert Mustacchi #include "config.h"
39*f3e7f55eSRobert Mustacchi #include "libdwarfdefs.h"
40*f3e7f55eSRobert Mustacchi #include <stdio.h>
41*f3e7f55eSRobert Mustacchi #include <string.h>
42*f3e7f55eSRobert Mustacchi #include <limits.h>
43*f3e7f55eSRobert Mustacchi #include "pro_incl.h"
44*f3e7f55eSRobert Mustacchi #include "pro_frame.h"
45*f3e7f55eSRobert Mustacchi
46*f3e7f55eSRobert Mustacchi static void _dwarf_pro_add_to_fde(Dwarf_P_Fde fde,
47*f3e7f55eSRobert Mustacchi Dwarf_P_Frame_Pgm inst);
48*f3e7f55eSRobert Mustacchi
49*f3e7f55eSRobert Mustacchi /*-------------------------------------------------------------------------
50*f3e7f55eSRobert Mustacchi This function adds a cie struct to the debug pointer. Its in the
51*f3e7f55eSRobert Mustacchi form of a linked list.
52*f3e7f55eSRobert Mustacchi augmenter: string reps augmentation (implementation defined)
53*f3e7f55eSRobert Mustacchi code_align: alignment of code
54*f3e7f55eSRobert Mustacchi data_align: alignment of data
55*f3e7f55eSRobert Mustacchi init_bytes: byts having initial instructions
56*f3e7f55eSRobert Mustacchi init_n_bytes: number of bytes of initial instructions
57*f3e7f55eSRobert Mustacchi --------------------------------------------------------------------------*/
58*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_frame_cie(Dwarf_P_Debug dbg,char * augmenter,Dwarf_Small code_align,Dwarf_Small data_align,Dwarf_Small return_reg,Dwarf_Ptr init_bytes,Dwarf_Unsigned init_n_bytes,Dwarf_Error * error)59*f3e7f55eSRobert Mustacchi dwarf_add_frame_cie(Dwarf_P_Debug dbg,
60*f3e7f55eSRobert Mustacchi char *augmenter,
61*f3e7f55eSRobert Mustacchi Dwarf_Small code_align,
62*f3e7f55eSRobert Mustacchi Dwarf_Small data_align,
63*f3e7f55eSRobert Mustacchi Dwarf_Small return_reg,
64*f3e7f55eSRobert Mustacchi Dwarf_Ptr init_bytes,
65*f3e7f55eSRobert Mustacchi Dwarf_Unsigned init_n_bytes, Dwarf_Error * error)
66*f3e7f55eSRobert Mustacchi {
67*f3e7f55eSRobert Mustacchi Dwarf_P_Cie curcie;
68*f3e7f55eSRobert Mustacchi
69*f3e7f55eSRobert Mustacchi if (dbg->de_frame_cies == NULL) {
70*f3e7f55eSRobert Mustacchi dbg->de_frame_cies = (Dwarf_P_Cie)
71*f3e7f55eSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
72*f3e7f55eSRobert Mustacchi if (dbg->de_frame_cies == NULL) {
73*f3e7f55eSRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT);
74*f3e7f55eSRobert Mustacchi }
75*f3e7f55eSRobert Mustacchi curcie = dbg->de_frame_cies;
76*f3e7f55eSRobert Mustacchi dbg->de_n_cie = 1;
77*f3e7f55eSRobert Mustacchi dbg->de_last_cie = curcie;
78*f3e7f55eSRobert Mustacchi } else {
79*f3e7f55eSRobert Mustacchi curcie = dbg->de_last_cie;
80*f3e7f55eSRobert Mustacchi curcie->cie_next = (Dwarf_P_Cie)
81*f3e7f55eSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Cie_s));
82*f3e7f55eSRobert Mustacchi if (curcie->cie_next == NULL) {
83*f3e7f55eSRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_CIE_ALLOC, DW_DLV_NOCOUNT);
84*f3e7f55eSRobert Mustacchi }
85*f3e7f55eSRobert Mustacchi curcie = curcie->cie_next;
86*f3e7f55eSRobert Mustacchi dbg->de_n_cie++;
87*f3e7f55eSRobert Mustacchi dbg->de_last_cie = curcie;
88*f3e7f55eSRobert Mustacchi }
89*f3e7f55eSRobert Mustacchi curcie->cie_version = DW_CIE_VERSION;
90*f3e7f55eSRobert Mustacchi curcie->cie_aug = augmenter;
91*f3e7f55eSRobert Mustacchi curcie->cie_code_align = code_align;
92*f3e7f55eSRobert Mustacchi curcie->cie_data_align = data_align;
93*f3e7f55eSRobert Mustacchi curcie->cie_ret_reg = return_reg;
94*f3e7f55eSRobert Mustacchi curcie->cie_inst = (char *) init_bytes;
95*f3e7f55eSRobert Mustacchi curcie->cie_inst_bytes = (long) init_n_bytes;
96*f3e7f55eSRobert Mustacchi curcie->cie_next = NULL;
97*f3e7f55eSRobert Mustacchi return dbg->de_n_cie;
98*f3e7f55eSRobert Mustacchi }
99*f3e7f55eSRobert Mustacchi
100*f3e7f55eSRobert Mustacchi
101*f3e7f55eSRobert Mustacchi /*-------------------------------------------------------------------------
102*f3e7f55eSRobert Mustacchi This functions adds a fde struct to the debug pointer. Its in the
103*f3e7f55eSRobert Mustacchi form of a linked list.
104*f3e7f55eSRobert Mustacchi die: subprogram/function die corresponding to this fde
105*f3e7f55eSRobert Mustacchi cie: cie referred to by this fde, obtained from call to
106*f3e7f55eSRobert Mustacchi add_frame_cie() routine.
107*f3e7f55eSRobert Mustacchi virt_addr: beginning address
108*f3e7f55eSRobert Mustacchi code_len: length of code reps by the fde
109*f3e7f55eSRobert Mustacchi --------------------------------------------------------------------------*/
110*f3e7f55eSRobert Mustacchi /*ARGSUSED*/ /* pretend all args used */
111*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_frame_fde(Dwarf_P_Debug dbg,Dwarf_P_Fde fde,Dwarf_P_Die die,Dwarf_Unsigned cie,Dwarf_Unsigned virt_addr,Dwarf_Unsigned code_len,Dwarf_Unsigned symidx,Dwarf_Error * error)112*f3e7f55eSRobert Mustacchi dwarf_add_frame_fde(Dwarf_P_Debug dbg,
113*f3e7f55eSRobert Mustacchi Dwarf_P_Fde fde,
114*f3e7f55eSRobert Mustacchi Dwarf_P_Die die,
115*f3e7f55eSRobert Mustacchi Dwarf_Unsigned cie,
116*f3e7f55eSRobert Mustacchi Dwarf_Unsigned virt_addr,
117*f3e7f55eSRobert Mustacchi Dwarf_Unsigned code_len,
118*f3e7f55eSRobert Mustacchi Dwarf_Unsigned symidx, Dwarf_Error * error)
119*f3e7f55eSRobert Mustacchi {
120*f3e7f55eSRobert Mustacchi return dwarf_add_frame_fde_b(dbg, fde, die, cie, virt_addr,
121*f3e7f55eSRobert Mustacchi code_len, symidx, 0, 0, error);
122*f3e7f55eSRobert Mustacchi }
123*f3e7f55eSRobert Mustacchi
124*f3e7f55eSRobert Mustacchi /*ARGSUSED10*/
125*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_frame_fde_b(Dwarf_P_Debug dbg,Dwarf_P_Fde fde,Dwarf_P_Die die,Dwarf_Unsigned cie,Dwarf_Unsigned virt_addr,Dwarf_Unsigned code_len,Dwarf_Unsigned symidx,Dwarf_Unsigned symidx_of_end,Dwarf_Addr offset_from_end_sym,Dwarf_Error * error)126*f3e7f55eSRobert Mustacchi dwarf_add_frame_fde_b(Dwarf_P_Debug dbg,
127*f3e7f55eSRobert Mustacchi Dwarf_P_Fde fde,
128*f3e7f55eSRobert Mustacchi Dwarf_P_Die die,
129*f3e7f55eSRobert Mustacchi Dwarf_Unsigned cie,
130*f3e7f55eSRobert Mustacchi Dwarf_Unsigned virt_addr,
131*f3e7f55eSRobert Mustacchi Dwarf_Unsigned code_len,
132*f3e7f55eSRobert Mustacchi Dwarf_Unsigned symidx,
133*f3e7f55eSRobert Mustacchi Dwarf_Unsigned symidx_of_end,
134*f3e7f55eSRobert Mustacchi Dwarf_Addr offset_from_end_sym,
135*f3e7f55eSRobert Mustacchi Dwarf_Error * error)
136*f3e7f55eSRobert Mustacchi {
137*f3e7f55eSRobert Mustacchi Dwarf_P_Fde curfde;
138*f3e7f55eSRobert Mustacchi
139*f3e7f55eSRobert Mustacchi fde->fde_die = die;
140*f3e7f55eSRobert Mustacchi fde->fde_cie = (long) cie;
141*f3e7f55eSRobert Mustacchi fde->fde_initloc = virt_addr;
142*f3e7f55eSRobert Mustacchi fde->fde_r_symidx = symidx;
143*f3e7f55eSRobert Mustacchi fde->fde_addr_range = code_len;
144*f3e7f55eSRobert Mustacchi fde->fde_offset_into_exception_tables = DW_DLX_NO_EH_OFFSET;
145*f3e7f55eSRobert Mustacchi fde->fde_exception_table_symbol = 0;
146*f3e7f55eSRobert Mustacchi fde->fde_end_symbol_offset = offset_from_end_sym;
147*f3e7f55eSRobert Mustacchi fde->fde_end_symbol = symidx_of_end;
148*f3e7f55eSRobert Mustacchi fde->fde_dbg = dbg;
149*f3e7f55eSRobert Mustacchi
150*f3e7f55eSRobert Mustacchi curfde = dbg->de_last_fde;
151*f3e7f55eSRobert Mustacchi if (curfde == NULL) {
152*f3e7f55eSRobert Mustacchi dbg->de_frame_fdes = fde;
153*f3e7f55eSRobert Mustacchi dbg->de_last_fde = fde;
154*f3e7f55eSRobert Mustacchi dbg->de_n_fde = 1;
155*f3e7f55eSRobert Mustacchi } else {
156*f3e7f55eSRobert Mustacchi curfde->fde_next = fde;
157*f3e7f55eSRobert Mustacchi dbg->de_last_fde = fde;
158*f3e7f55eSRobert Mustacchi dbg->de_n_fde++;
159*f3e7f55eSRobert Mustacchi }
160*f3e7f55eSRobert Mustacchi return dbg->de_n_fde;
161*f3e7f55eSRobert Mustacchi }
162*f3e7f55eSRobert Mustacchi
163*f3e7f55eSRobert Mustacchi /*-------------------------------------------------------------------------
164*f3e7f55eSRobert Mustacchi This functions adds information to an fde. The fde is
165*f3e7f55eSRobert Mustacchi linked into the linked list of fde's maintained in the Dwarf_P_Debug
166*f3e7f55eSRobert Mustacchi structure.
167*f3e7f55eSRobert Mustacchi dbg: The debug descriptor.
168*f3e7f55eSRobert Mustacchi fde: The fde to be added.
169*f3e7f55eSRobert Mustacchi die: subprogram/function die corresponding to this fde
170*f3e7f55eSRobert Mustacchi cie: cie referred to by this fde, obtained from call to
171*f3e7f55eSRobert Mustacchi add_frame_cie() routine.
172*f3e7f55eSRobert Mustacchi virt_addr: beginning address
173*f3e7f55eSRobert Mustacchi code_len: length of code reps by the fde
174*f3e7f55eSRobert Mustacchi symidx: The symbol id of the symbol wrt to which relocation needs
175*f3e7f55eSRobert Mustacchi to be performed for 'virt_addr'.
176*f3e7f55eSRobert Mustacchi offset_into_exception_tables: The start of exception tables for
177*f3e7f55eSRobert Mustacchi this function (indicated as an offset into the exception
178*f3e7f55eSRobert Mustacchi tables). A value of -1 indicates that there is no exception
179*f3e7f55eSRobert Mustacchi table entries associated with this function.
180*f3e7f55eSRobert Mustacchi exception_table_symbol: The symbol id of the section for exception
181*f3e7f55eSRobert Mustacchi tables wrt to which the offset_into_exception_tables will
182*f3e7f55eSRobert Mustacchi be relocated.
183*f3e7f55eSRobert Mustacchi --------------------------------------------------------------------------*/
184*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_frame_info(Dwarf_P_Debug dbg,Dwarf_P_Fde fde,Dwarf_P_Die die,Dwarf_Unsigned cie,Dwarf_Unsigned virt_addr,Dwarf_Unsigned code_len,Dwarf_Unsigned symidx,Dwarf_Signed offset_into_exception_tables,Dwarf_Unsigned exception_table_symbol,Dwarf_Error * error)185*f3e7f55eSRobert Mustacchi dwarf_add_frame_info(Dwarf_P_Debug dbg,
186*f3e7f55eSRobert Mustacchi Dwarf_P_Fde fde,
187*f3e7f55eSRobert Mustacchi Dwarf_P_Die die,
188*f3e7f55eSRobert Mustacchi Dwarf_Unsigned cie,
189*f3e7f55eSRobert Mustacchi Dwarf_Unsigned virt_addr,
190*f3e7f55eSRobert Mustacchi Dwarf_Unsigned code_len,
191*f3e7f55eSRobert Mustacchi Dwarf_Unsigned symidx,
192*f3e7f55eSRobert Mustacchi Dwarf_Signed offset_into_exception_tables,
193*f3e7f55eSRobert Mustacchi Dwarf_Unsigned exception_table_symbol,
194*f3e7f55eSRobert Mustacchi Dwarf_Error * error)
195*f3e7f55eSRobert Mustacchi {
196*f3e7f55eSRobert Mustacchi
197*f3e7f55eSRobert Mustacchi return dwarf_add_frame_info_b(dbg, fde, die, cie, virt_addr,
198*f3e7f55eSRobert Mustacchi code_len, symidx,
199*f3e7f55eSRobert Mustacchi /* end_symbol */ 0,
200*f3e7f55eSRobert Mustacchi /* offset_from_end */ 0,
201*f3e7f55eSRobert Mustacchi offset_into_exception_tables,
202*f3e7f55eSRobert Mustacchi exception_table_symbol, error);
203*f3e7f55eSRobert Mustacchi
204*f3e7f55eSRobert Mustacchi }
205*f3e7f55eSRobert Mustacchi
206*f3e7f55eSRobert Mustacchi /*ARGSUSED*/ /* pretend all args used */
207*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_frame_info_b(Dwarf_P_Debug dbg,Dwarf_P_Fde fde,Dwarf_P_Die die,Dwarf_Unsigned cie,Dwarf_Unsigned virt_addr,Dwarf_Unsigned code_len,Dwarf_Unsigned symidx,Dwarf_Unsigned end_symidx,Dwarf_Unsigned offset_from_end_symbol,Dwarf_Signed offset_into_exception_tables,Dwarf_Unsigned exception_table_symbol,Dwarf_Error * error)208*f3e7f55eSRobert Mustacchi dwarf_add_frame_info_b(Dwarf_P_Debug dbg,
209*f3e7f55eSRobert Mustacchi Dwarf_P_Fde fde,
210*f3e7f55eSRobert Mustacchi Dwarf_P_Die die,
211*f3e7f55eSRobert Mustacchi Dwarf_Unsigned cie,
212*f3e7f55eSRobert Mustacchi Dwarf_Unsigned virt_addr,
213*f3e7f55eSRobert Mustacchi Dwarf_Unsigned code_len,
214*f3e7f55eSRobert Mustacchi Dwarf_Unsigned symidx,
215*f3e7f55eSRobert Mustacchi Dwarf_Unsigned end_symidx,
216*f3e7f55eSRobert Mustacchi Dwarf_Unsigned offset_from_end_symbol,
217*f3e7f55eSRobert Mustacchi Dwarf_Signed offset_into_exception_tables,
218*f3e7f55eSRobert Mustacchi Dwarf_Unsigned exception_table_symbol,
219*f3e7f55eSRobert Mustacchi Dwarf_Error * error)
220*f3e7f55eSRobert Mustacchi {
221*f3e7f55eSRobert Mustacchi Dwarf_P_Fde curfde;
222*f3e7f55eSRobert Mustacchi
223*f3e7f55eSRobert Mustacchi fde->fde_die = die;
224*f3e7f55eSRobert Mustacchi fde->fde_cie = (long) cie;
225*f3e7f55eSRobert Mustacchi fde->fde_initloc = virt_addr;
226*f3e7f55eSRobert Mustacchi fde->fde_r_symidx = symidx;
227*f3e7f55eSRobert Mustacchi fde->fde_addr_range = code_len;
228*f3e7f55eSRobert Mustacchi fde->fde_offset_into_exception_tables =
229*f3e7f55eSRobert Mustacchi offset_into_exception_tables;
230*f3e7f55eSRobert Mustacchi fde->fde_exception_table_symbol = exception_table_symbol;
231*f3e7f55eSRobert Mustacchi fde->fde_end_symbol_offset = offset_from_end_symbol;
232*f3e7f55eSRobert Mustacchi fde->fde_end_symbol = end_symidx;
233*f3e7f55eSRobert Mustacchi fde->fde_dbg = dbg;
234*f3e7f55eSRobert Mustacchi
235*f3e7f55eSRobert Mustacchi curfde = dbg->de_last_fde;
236*f3e7f55eSRobert Mustacchi if (curfde == NULL) {
237*f3e7f55eSRobert Mustacchi dbg->de_frame_fdes = fde;
238*f3e7f55eSRobert Mustacchi dbg->de_last_fde = fde;
239*f3e7f55eSRobert Mustacchi dbg->de_n_fde = 1;
240*f3e7f55eSRobert Mustacchi } else {
241*f3e7f55eSRobert Mustacchi curfde->fde_next = fde;
242*f3e7f55eSRobert Mustacchi dbg->de_last_fde = fde;
243*f3e7f55eSRobert Mustacchi dbg->de_n_fde++;
244*f3e7f55eSRobert Mustacchi }
245*f3e7f55eSRobert Mustacchi return dbg->de_n_fde;
246*f3e7f55eSRobert Mustacchi }
247*f3e7f55eSRobert Mustacchi
248*f3e7f55eSRobert Mustacchi /* This is an alternate to inserting frame instructions
249*f3e7f55eSRobert Mustacchi one instruction at a time. But use either this
250*f3e7f55eSRobert Mustacchi or instruction level, not both in one fde. */
251*f3e7f55eSRobert Mustacchi int
dwarf_insert_fde_inst_bytes(Dwarf_P_Debug dbg,Dwarf_P_Fde fde,Dwarf_Unsigned len,Dwarf_Ptr ibytes,Dwarf_Error * error)252*f3e7f55eSRobert Mustacchi dwarf_insert_fde_inst_bytes(Dwarf_P_Debug dbg,
253*f3e7f55eSRobert Mustacchi Dwarf_P_Fde fde,Dwarf_Unsigned len, Dwarf_Ptr ibytes,
254*f3e7f55eSRobert Mustacchi Dwarf_Error *error)
255*f3e7f55eSRobert Mustacchi {
256*f3e7f55eSRobert Mustacchi if( len == 0) {
257*f3e7f55eSRobert Mustacchi return DW_DLV_OK;
258*f3e7f55eSRobert Mustacchi }
259*f3e7f55eSRobert Mustacchi if(fde->fde_block || fde->fde_inst) {
260*f3e7f55eSRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_DUPLICATE_INST_BLOCK,
261*f3e7f55eSRobert Mustacchi (int)DW_DLV_BADADDR);
262*f3e7f55eSRobert Mustacchi }
263*f3e7f55eSRobert Mustacchi fde->fde_block = (Dwarf_Ptr)_dwarf_p_get_alloc(dbg, len);
264*f3e7f55eSRobert Mustacchi memcpy(fde->fde_block,ibytes,len);
265*f3e7f55eSRobert Mustacchi fde->fde_inst_block_size = len;
266*f3e7f55eSRobert Mustacchi fde->fde_n_bytes += len;
267*f3e7f55eSRobert Mustacchi return DW_DLV_OK;
268*f3e7f55eSRobert Mustacchi }
269*f3e7f55eSRobert Mustacchi
270*f3e7f55eSRobert Mustacchi
271*f3e7f55eSRobert Mustacchi
272*f3e7f55eSRobert Mustacchi /*-------------------------------------------------------------------
273*f3e7f55eSRobert Mustacchi Create a new fde.
274*f3e7f55eSRobert Mustacchi ---------------------------------------------------------------------*/
275*f3e7f55eSRobert Mustacchi Dwarf_P_Fde
dwarf_new_fde(Dwarf_P_Debug dbg,Dwarf_Error * error)276*f3e7f55eSRobert Mustacchi dwarf_new_fde(Dwarf_P_Debug dbg, Dwarf_Error * error)
277*f3e7f55eSRobert Mustacchi {
278*f3e7f55eSRobert Mustacchi Dwarf_P_Fde fde;
279*f3e7f55eSRobert Mustacchi
280*f3e7f55eSRobert Mustacchi fde = (Dwarf_P_Fde)
281*f3e7f55eSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Fde_s));
282*f3e7f55eSRobert Mustacchi if (fde == NULL) {
283*f3e7f55eSRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_FDE_ALLOC,
284*f3e7f55eSRobert Mustacchi (Dwarf_P_Fde) DW_DLV_BADADDR);
285*f3e7f55eSRobert Mustacchi }
286*f3e7f55eSRobert Mustacchi
287*f3e7f55eSRobert Mustacchi fde->fde_uwordb_size = dbg->de_offset_size;
288*f3e7f55eSRobert Mustacchi
289*f3e7f55eSRobert Mustacchi return fde;
290*f3e7f55eSRobert Mustacchi }
291*f3e7f55eSRobert Mustacchi
292*f3e7f55eSRobert Mustacchi
293*f3e7f55eSRobert Mustacchi /*------------------------------------------------------------------------
294*f3e7f55eSRobert Mustacchi Add a cfe_offset instruction to the fde passed in.
295*f3e7f55eSRobert Mustacchi -------------------------------------------------------------------------*/
296*f3e7f55eSRobert Mustacchi Dwarf_P_Fde
dwarf_fde_cfa_offset(Dwarf_P_Fde fde,Dwarf_Unsigned reg,Dwarf_Signed offset,Dwarf_Error * error)297*f3e7f55eSRobert Mustacchi dwarf_fde_cfa_offset(Dwarf_P_Fde fde,
298*f3e7f55eSRobert Mustacchi Dwarf_Unsigned reg,
299*f3e7f55eSRobert Mustacchi Dwarf_Signed offset, Dwarf_Error * error)
300*f3e7f55eSRobert Mustacchi {
301*f3e7f55eSRobert Mustacchi Dwarf_Ubyte opc, regno;
302*f3e7f55eSRobert Mustacchi char *ptr;
303*f3e7f55eSRobert Mustacchi Dwarf_P_Frame_Pgm curinst;
304*f3e7f55eSRobert Mustacchi int nbytes;
305*f3e7f55eSRobert Mustacchi int res;
306*f3e7f55eSRobert Mustacchi char buff1[ENCODE_SPACE_NEEDED];
307*f3e7f55eSRobert Mustacchi Dwarf_P_Debug dbg = fde->fde_dbg;
308*f3e7f55eSRobert Mustacchi
309*f3e7f55eSRobert Mustacchi curinst = (Dwarf_P_Frame_Pgm)
310*f3e7f55eSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s));
311*f3e7f55eSRobert Mustacchi if (curinst == NULL) {
312*f3e7f55eSRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_FPGM_ALLOC,
313*f3e7f55eSRobert Mustacchi (Dwarf_P_Fde) DW_DLV_BADADDR);
314*f3e7f55eSRobert Mustacchi }
315*f3e7f55eSRobert Mustacchi opc = DW_CFA_offset;
316*f3e7f55eSRobert Mustacchi regno = reg;
317*f3e7f55eSRobert Mustacchi if (regno & 0xc0) {
318*f3e7f55eSRobert Mustacchi DWARF_P_DBG_ERROR(dbg, DW_DLE_REGNO_OVFL,
319*f3e7f55eSRobert Mustacchi (Dwarf_P_Fde) DW_DLV_BADADDR);
320*f3e7f55eSRobert Mustacchi }
321*f3e7f55eSRobert Mustacchi opc = opc | regno; /* lower 6 bits are register number */
322*f3e7f55eSRobert Mustacchi curinst->dfp_opcode = opc;
323*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(offset, &nbytes,
324*f3e7f55eSRobert Mustacchi buff1, sizeof(buff1));
325*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
326*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
327*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
328*f3e7f55eSRobert Mustacchi }
329*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
330*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
331*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
332*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
333*f3e7f55eSRobert Mustacchi }
334*f3e7f55eSRobert Mustacchi memcpy(ptr, buff1, nbytes);
335*f3e7f55eSRobert Mustacchi
336*f3e7f55eSRobert Mustacchi curinst->dfp_args = ptr;
337*f3e7f55eSRobert Mustacchi curinst->dfp_nbytes = nbytes;
338*f3e7f55eSRobert Mustacchi curinst->dfp_next = NULL;
339*f3e7f55eSRobert Mustacchi
340*f3e7f55eSRobert Mustacchi _dwarf_pro_add_to_fde(fde, curinst);
341*f3e7f55eSRobert Mustacchi return fde;
342*f3e7f55eSRobert Mustacchi }
343*f3e7f55eSRobert Mustacchi
344*f3e7f55eSRobert Mustacchi /*
345*f3e7f55eSRobert Mustacchi Generic routine to add opcode to fde instructions. val1 and
346*f3e7f55eSRobert Mustacchi val2 are parameters whose interpretation depends on the 'op'.
347*f3e7f55eSRobert Mustacchi
348*f3e7f55eSRobert Mustacchi This does not work properly for DW_DLC_SYMBOLIC_RELOCATIONS
349*f3e7f55eSRobert Mustacchi for DW_CFA_set_loc or DW_DVA_advance_loc* 'op', as
350*f3e7f55eSRobert Mustacchi these ops normally are addresses or (DW_CFA_set_loc)
351*f3e7f55eSRobert Mustacchi or code lengths (DW_DVA_advance_loc*) and such must be
352*f3e7f55eSRobert Mustacchi represented with relocations and symbol indices for
353*f3e7f55eSRobert Mustacchi DW_DLC_SYMBOLIC_RELOCATIONS.
354*f3e7f55eSRobert Mustacchi
355*f3e7f55eSRobert Mustacchi This does not treat all DW_CFA instructions yet.
356*f3e7f55eSRobert Mustacchi
357*f3e7f55eSRobert Mustacchi For certain operations a val? value must be
358*f3e7f55eSRobert Mustacchi signed (though passed in as unsigned here).
359*f3e7f55eSRobert Mustacchi
360*f3e7f55eSRobert Mustacchi Currently this does not check that the frame
361*f3e7f55eSRobert Mustacchi version is 3(for dwarf3) or 4 (for dwarf4)
362*f3e7f55eSRobert Mustacchi when applying operations that are only valid for
363*f3e7f55eSRobert Mustacchi dwarf3 or dwarf4.
364*f3e7f55eSRobert Mustacchi
365*f3e7f55eSRobert Mustacchi */
366*f3e7f55eSRobert Mustacchi Dwarf_P_Fde
dwarf_add_fde_inst(Dwarf_P_Fde fde,Dwarf_Small op,Dwarf_Unsigned val1,Dwarf_Unsigned val2,Dwarf_Error * error)367*f3e7f55eSRobert Mustacchi dwarf_add_fde_inst(Dwarf_P_Fde fde,
368*f3e7f55eSRobert Mustacchi Dwarf_Small op,
369*f3e7f55eSRobert Mustacchi Dwarf_Unsigned val1,
370*f3e7f55eSRobert Mustacchi Dwarf_Unsigned val2, Dwarf_Error * error)
371*f3e7f55eSRobert Mustacchi {
372*f3e7f55eSRobert Mustacchi Dwarf_P_Frame_Pgm curinst;
373*f3e7f55eSRobert Mustacchi int nbytes, nbytes1, nbytes2;
374*f3e7f55eSRobert Mustacchi Dwarf_Ubyte db;
375*f3e7f55eSRobert Mustacchi Dwarf_Half dh;
376*f3e7f55eSRobert Mustacchi Dwarf_Word dw;
377*f3e7f55eSRobert Mustacchi Dwarf_Unsigned du;
378*f3e7f55eSRobert Mustacchi char *ptr;
379*f3e7f55eSRobert Mustacchi int res;
380*f3e7f55eSRobert Mustacchi char buff1[ENCODE_SPACE_NEEDED];
381*f3e7f55eSRobert Mustacchi char buff2[ENCODE_SPACE_NEEDED];
382*f3e7f55eSRobert Mustacchi Dwarf_P_Debug dbg = fde->fde_dbg;
383*f3e7f55eSRobert Mustacchi /* This is a hack telling the code when to transform
384*f3e7f55eSRobert Mustacchi a value to a signed leb number. */
385*f3e7f55eSRobert Mustacchi int signed_second = 0;
386*f3e7f55eSRobert Mustacchi int signed_first = 0;
387*f3e7f55eSRobert Mustacchi
388*f3e7f55eSRobert Mustacchi
389*f3e7f55eSRobert Mustacchi nbytes = 0;
390*f3e7f55eSRobert Mustacchi ptr = NULL;
391*f3e7f55eSRobert Mustacchi curinst = (Dwarf_P_Frame_Pgm)
392*f3e7f55eSRobert Mustacchi _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Frame_Pgm_s));
393*f3e7f55eSRobert Mustacchi if (curinst == NULL) {
394*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_FPGM_ALLOC);
395*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
396*f3e7f55eSRobert Mustacchi }
397*f3e7f55eSRobert Mustacchi
398*f3e7f55eSRobert Mustacchi switch (op) {
399*f3e7f55eSRobert Mustacchi
400*f3e7f55eSRobert Mustacchi case DW_CFA_advance_loc:
401*f3e7f55eSRobert Mustacchi if (val1 <= 0x3f) {
402*f3e7f55eSRobert Mustacchi db = val1;
403*f3e7f55eSRobert Mustacchi op |= db;
404*f3e7f55eSRobert Mustacchi }
405*f3e7f55eSRobert Mustacchi /* test not portable FIX */
406*f3e7f55eSRobert Mustacchi else if (val1 <= UCHAR_MAX) {
407*f3e7f55eSRobert Mustacchi op = DW_CFA_advance_loc1;
408*f3e7f55eSRobert Mustacchi db = val1;
409*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, 1);
410*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
411*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
412*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
413*f3e7f55eSRobert Mustacchi }
414*f3e7f55eSRobert Mustacchi memcpy((void *) ptr, (const void *) &db, 1);
415*f3e7f55eSRobert Mustacchi nbytes = 1;
416*f3e7f55eSRobert Mustacchi }
417*f3e7f55eSRobert Mustacchi /* test not portable FIX */
418*f3e7f55eSRobert Mustacchi else if (val1 <= USHRT_MAX) {
419*f3e7f55eSRobert Mustacchi op = DW_CFA_advance_loc2;
420*f3e7f55eSRobert Mustacchi dh = val1;
421*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, 2);
422*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
423*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
424*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
425*f3e7f55eSRobert Mustacchi }
426*f3e7f55eSRobert Mustacchi memcpy((void *) ptr, (const void *) &dh, 2);
427*f3e7f55eSRobert Mustacchi nbytes = 2;
428*f3e7f55eSRobert Mustacchi }
429*f3e7f55eSRobert Mustacchi /* test not portable FIX */
430*f3e7f55eSRobert Mustacchi else if (val1 <= ULONG_MAX) {
431*f3e7f55eSRobert Mustacchi op = DW_CFA_advance_loc4;
432*f3e7f55eSRobert Mustacchi dw = (Dwarf_Word) val1;
433*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, 4);
434*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
435*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
436*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
437*f3e7f55eSRobert Mustacchi }
438*f3e7f55eSRobert Mustacchi memcpy((void *) ptr, (const void *) &dw, 4);
439*f3e7f55eSRobert Mustacchi nbytes = 4;
440*f3e7f55eSRobert Mustacchi } else {
441*f3e7f55eSRobert Mustacchi op = DW_CFA_MIPS_advance_loc8;
442*f3e7f55eSRobert Mustacchi du = val1;
443*f3e7f55eSRobert Mustacchi ptr =
444*f3e7f55eSRobert Mustacchi (char *) _dwarf_p_get_alloc(dbg,
445*f3e7f55eSRobert Mustacchi sizeof(Dwarf_Unsigned));
446*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
447*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
448*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
449*f3e7f55eSRobert Mustacchi }
450*f3e7f55eSRobert Mustacchi memcpy((void *) ptr, (const void *) &du, 8);
451*f3e7f55eSRobert Mustacchi nbytes = 8;
452*f3e7f55eSRobert Mustacchi }
453*f3e7f55eSRobert Mustacchi break;
454*f3e7f55eSRobert Mustacchi
455*f3e7f55eSRobert Mustacchi case DW_CFA_offset:
456*f3e7f55eSRobert Mustacchi if (val1 <= MAX_6_BIT_VALUE) {
457*f3e7f55eSRobert Mustacchi db = val1;
458*f3e7f55eSRobert Mustacchi op |= db;
459*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(val2, &nbytes,
460*f3e7f55eSRobert Mustacchi buff1, sizeof(buff1));
461*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
462*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
463*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
464*f3e7f55eSRobert Mustacchi }
465*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
466*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
467*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
468*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
469*f3e7f55eSRobert Mustacchi }
470*f3e7f55eSRobert Mustacchi memcpy(ptr, buff1, nbytes);
471*f3e7f55eSRobert Mustacchi
472*f3e7f55eSRobert Mustacchi } else {
473*f3e7f55eSRobert Mustacchi op = DW_CFA_offset_extended;
474*f3e7f55eSRobert Mustacchi goto two_leb;
475*f3e7f55eSRobert Mustacchi }
476*f3e7f55eSRobert Mustacchi break;
477*f3e7f55eSRobert Mustacchi case DW_CFA_offset_extended_sf: /* DWARF3 */
478*f3e7f55eSRobert Mustacchi signed_second = 1;
479*f3e7f55eSRobert Mustacchi goto two_leb;
480*f3e7f55eSRobert Mustacchi case DW_CFA_offset_extended:
481*f3e7f55eSRobert Mustacchi goto two_leb;
482*f3e7f55eSRobert Mustacchi
483*f3e7f55eSRobert Mustacchi case DW_CFA_undefined:
484*f3e7f55eSRobert Mustacchi case DW_CFA_same_value:
485*f3e7f55eSRobert Mustacchi goto one_leb;
486*f3e7f55eSRobert Mustacchi
487*f3e7f55eSRobert Mustacchi case DW_CFA_val_offset:
488*f3e7f55eSRobert Mustacchi goto two_leb;
489*f3e7f55eSRobert Mustacchi case DW_CFA_val_offset_sf:
490*f3e7f55eSRobert Mustacchi signed_second = 1;
491*f3e7f55eSRobert Mustacchi goto two_leb;
492*f3e7f55eSRobert Mustacchi case DW_CFA_def_cfa_sf:
493*f3e7f55eSRobert Mustacchi signed_second = 1;
494*f3e7f55eSRobert Mustacchi goto two_leb;
495*f3e7f55eSRobert Mustacchi case DW_CFA_register:
496*f3e7f55eSRobert Mustacchi case DW_CFA_def_cfa:
497*f3e7f55eSRobert Mustacchi two_leb:
498*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(val1, &nbytes1,
499*f3e7f55eSRobert Mustacchi buff1, sizeof(buff1));
500*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
501*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
502*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
503*f3e7f55eSRobert Mustacchi }
504*f3e7f55eSRobert Mustacchi if (!signed_second) {
505*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2,
506*f3e7f55eSRobert Mustacchi buff2, sizeof(buff2));
507*f3e7f55eSRobert Mustacchi } else {
508*f3e7f55eSRobert Mustacchi Dwarf_Signed val2s = val2;
509*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_signed_leb128_nm(val2s, &nbytes2,
510*f3e7f55eSRobert Mustacchi buff2, sizeof(buff2));
511*f3e7f55eSRobert Mustacchi }
512*f3e7f55eSRobert Mustacchi
513*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(val2, &nbytes2,
514*f3e7f55eSRobert Mustacchi buff2, sizeof(buff2));
515*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
516*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
517*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
518*f3e7f55eSRobert Mustacchi }
519*f3e7f55eSRobert Mustacchi
520*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes1 + nbytes2);
521*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
522*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
523*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
524*f3e7f55eSRobert Mustacchi }
525*f3e7f55eSRobert Mustacchi memcpy(ptr, buff1, nbytes1);
526*f3e7f55eSRobert Mustacchi memcpy(ptr + nbytes1, buff2, nbytes2);
527*f3e7f55eSRobert Mustacchi nbytes = nbytes1 + nbytes2;
528*f3e7f55eSRobert Mustacchi break;
529*f3e7f55eSRobert Mustacchi
530*f3e7f55eSRobert Mustacchi case DW_CFA_def_cfa_offset_sf: /* DWARF3 */
531*f3e7f55eSRobert Mustacchi signed_first = 1;
532*f3e7f55eSRobert Mustacchi goto one_leb;
533*f3e7f55eSRobert Mustacchi case DW_CFA_def_cfa_register:
534*f3e7f55eSRobert Mustacchi case DW_CFA_def_cfa_offset:
535*f3e7f55eSRobert Mustacchi one_leb:
536*f3e7f55eSRobert Mustacchi if(!signed_first) {
537*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_leb128_nm(val1, &nbytes,
538*f3e7f55eSRobert Mustacchi buff1, sizeof(buff1));
539*f3e7f55eSRobert Mustacchi } else {
540*f3e7f55eSRobert Mustacchi Dwarf_Signed val1s = val1;
541*f3e7f55eSRobert Mustacchi res = _dwarf_pro_encode_signed_leb128_nm(val1s, &nbytes,
542*f3e7f55eSRobert Mustacchi buff1, sizeof(buff1));
543*f3e7f55eSRobert Mustacchi }
544*f3e7f55eSRobert Mustacchi if (res != DW_DLV_OK) {
545*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
546*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
547*f3e7f55eSRobert Mustacchi }
548*f3e7f55eSRobert Mustacchi ptr = (char *) _dwarf_p_get_alloc(dbg, nbytes);
549*f3e7f55eSRobert Mustacchi if (ptr == NULL) {
550*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_STRING_ALLOC);
551*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
552*f3e7f55eSRobert Mustacchi }
553*f3e7f55eSRobert Mustacchi memcpy(ptr, buff1, nbytes);
554*f3e7f55eSRobert Mustacchi break;
555*f3e7f55eSRobert Mustacchi case DW_CFA_def_cfa_expression: /* DWARF3 */
556*f3e7f55eSRobert Mustacchi /* FIXME: argument is dwarf expr, not handled yet. */
557*f3e7f55eSRobert Mustacchi case DW_CFA_expression: /* DWARF3 */
558*f3e7f55eSRobert Mustacchi /* First arg: ULEB reg num. 2nd arg dwarf expr in form block.
559*f3e7f55eSRobert Mustacchi FIXME: not handled yet. */
560*f3e7f55eSRobert Mustacchi case DW_CFA_val_expression: /* DWARF3f */
561*f3e7f55eSRobert Mustacchi /* First arg: ULEB reg num. 2nd arg dwarf expr in form block.
562*f3e7f55eSRobert Mustacchi FIXME: not handled yet. */
563*f3e7f55eSRobert Mustacchi default:
564*f3e7f55eSRobert Mustacchi _dwarf_p_error(dbg, error, DW_DLE_DEBUGFRAME_ERROR);
565*f3e7f55eSRobert Mustacchi return ((Dwarf_P_Fde) DW_DLV_BADADDR);
566*f3e7f55eSRobert Mustacchi }
567*f3e7f55eSRobert Mustacchi
568*f3e7f55eSRobert Mustacchi curinst->dfp_opcode = op;
569*f3e7f55eSRobert Mustacchi curinst->dfp_args = ptr;
570*f3e7f55eSRobert Mustacchi curinst->dfp_nbytes = nbytes;
571*f3e7f55eSRobert Mustacchi curinst->dfp_next = NULL;
572*f3e7f55eSRobert Mustacchi
573*f3e7f55eSRobert Mustacchi _dwarf_pro_add_to_fde(fde, curinst);
574*f3e7f55eSRobert Mustacchi return fde;
575*f3e7f55eSRobert Mustacchi }
576*f3e7f55eSRobert Mustacchi
577*f3e7f55eSRobert Mustacchi
578*f3e7f55eSRobert Mustacchi /*------------------------------------------------------------------------
579*f3e7f55eSRobert Mustacchi Instructions are added to an fde in the form of a linked
580*f3e7f55eSRobert Mustacchi list. This function manages the linked list.
581*f3e7f55eSRobert Mustacchi -------------------------------------------------------------------------*/
582*f3e7f55eSRobert Mustacchi void
_dwarf_pro_add_to_fde(Dwarf_P_Fde fde,Dwarf_P_Frame_Pgm curinst)583*f3e7f55eSRobert Mustacchi _dwarf_pro_add_to_fde(Dwarf_P_Fde fde, Dwarf_P_Frame_Pgm curinst)
584*f3e7f55eSRobert Mustacchi {
585*f3e7f55eSRobert Mustacchi if (fde->fde_last_inst) {
586*f3e7f55eSRobert Mustacchi fde->fde_last_inst->dfp_next = curinst;
587*f3e7f55eSRobert Mustacchi fde->fde_last_inst = curinst;
588*f3e7f55eSRobert Mustacchi fde->fde_n_inst++;
589*f3e7f55eSRobert Mustacchi fde->fde_n_bytes +=
590*f3e7f55eSRobert Mustacchi (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte));
591*f3e7f55eSRobert Mustacchi } else {
592*f3e7f55eSRobert Mustacchi fde->fde_last_inst = curinst;
593*f3e7f55eSRobert Mustacchi fde->fde_inst = curinst;
594*f3e7f55eSRobert Mustacchi fde->fde_n_inst = 1;
595*f3e7f55eSRobert Mustacchi fde->fde_n_bytes =
596*f3e7f55eSRobert Mustacchi (long) (curinst->dfp_nbytes + sizeof(Dwarf_Ubyte));
597*f3e7f55eSRobert Mustacchi }
598*f3e7f55eSRobert Mustacchi }
599