xref: /titanic_50/usr/src/lib/libdwarf/common/pro_line.c (revision f3e7f55e73a39377d55a030f124cc86b3b66a9cc)
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 #ifdef HAVE_ELF_H
43*f3e7f55eSRobert Mustacchi #include <elf.h>
44*f3e7f55eSRobert Mustacchi #endif
45*f3e7f55eSRobert Mustacchi #include "pro_incl.h"
46*f3e7f55eSRobert Mustacchi #include "pro_line.h"
47*f3e7f55eSRobert Mustacchi 
48*f3e7f55eSRobert Mustacchi Dwarf_Unsigned _dwarf_pro_add_line_entry(Dwarf_P_Debug,
49*f3e7f55eSRobert Mustacchi                                          Dwarf_Unsigned file_index,
50*f3e7f55eSRobert Mustacchi                                          Dwarf_Addr code_address,
51*f3e7f55eSRobert Mustacchi                                          Dwarf_Unsigned symidx,
52*f3e7f55eSRobert Mustacchi                                          Dwarf_Unsigned line_no,
53*f3e7f55eSRobert Mustacchi                                          Dwarf_Signed col_no,
54*f3e7f55eSRobert Mustacchi                                          Dwarf_Bool is_stmt_begin,
55*f3e7f55eSRobert Mustacchi                                          Dwarf_Bool is_bb_begin,
56*f3e7f55eSRobert Mustacchi                                          Dwarf_Ubyte opc,
57*f3e7f55eSRobert Mustacchi                                          Dwarf_Error * error);
58*f3e7f55eSRobert Mustacchi 
59*f3e7f55eSRobert Mustacchi /*-------------------------------------------------------------------------
60*f3e7f55eSRobert Mustacchi         Add a entry to the line information section
61*f3e7f55eSRobert Mustacchi         file_index: index of file in file entries, obtained from
62*f3e7f55eSRobert Mustacchi         add_file_entry() call.
63*f3e7f55eSRobert Mustacchi 
64*f3e7f55eSRobert Mustacchi         This function actually calls _dwarf_pro_add_line_entry(), with
65*f3e7f55eSRobert Mustacchi         an extra parameter, the opcode. Done so that interface calls
66*f3e7f55eSRobert Mustacchi         dwarf_lne_set_address() and dwarf_lne_end_sequence() can use
67*f3e7f55eSRobert Mustacchi         this internal routine.
68*f3e7f55eSRobert Mustacchi ---------------------------------------------------------------------------*/
69*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_line_entry(Dwarf_P_Debug dbg,Dwarf_Unsigned file_index,Dwarf_Addr code_address,Dwarf_Unsigned line_no,Dwarf_Signed col_no,Dwarf_Bool is_stmt_begin,Dwarf_Bool is_bb_begin,Dwarf_Error * error)70*f3e7f55eSRobert Mustacchi dwarf_add_line_entry(Dwarf_P_Debug dbg,
71*f3e7f55eSRobert Mustacchi                      Dwarf_Unsigned file_index,
72*f3e7f55eSRobert Mustacchi                      Dwarf_Addr code_address,
73*f3e7f55eSRobert Mustacchi                      Dwarf_Unsigned line_no,
74*f3e7f55eSRobert Mustacchi                      Dwarf_Signed col_no,
75*f3e7f55eSRobert Mustacchi                      Dwarf_Bool is_stmt_begin,
76*f3e7f55eSRobert Mustacchi                      Dwarf_Bool is_bb_begin, Dwarf_Error * error)
77*f3e7f55eSRobert Mustacchi {
78*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned retval;
79*f3e7f55eSRobert Mustacchi 
80*f3e7f55eSRobert Mustacchi     retval = _dwarf_pro_add_line_entry(dbg, file_index, code_address, 0,
81*f3e7f55eSRobert Mustacchi                                        line_no, col_no, is_stmt_begin,
82*f3e7f55eSRobert Mustacchi                                        is_bb_begin, 0, error);
83*f3e7f55eSRobert Mustacchi     return retval;
84*f3e7f55eSRobert Mustacchi }
85*f3e7f55eSRobert Mustacchi 
86*f3e7f55eSRobert Mustacchi /*------------------------------------------------------------------------
87*f3e7f55eSRobert Mustacchi         Ask to emit DW_LNE_set_address opcode explicitly. Used by be
88*f3e7f55eSRobert Mustacchi         to emit start of a new .text section, or to force a relocated
89*f3e7f55eSRobert Mustacchi         address into debug line information entry.
90*f3e7f55eSRobert Mustacchi -------------------------------------------------------------------------*/
91*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_lne_set_address(Dwarf_P_Debug dbg,Dwarf_Addr offs,Dwarf_Unsigned symidx,Dwarf_Error * error)92*f3e7f55eSRobert Mustacchi dwarf_lne_set_address(Dwarf_P_Debug dbg,
93*f3e7f55eSRobert Mustacchi                       Dwarf_Addr offs,
94*f3e7f55eSRobert Mustacchi                       Dwarf_Unsigned symidx, Dwarf_Error * error)
95*f3e7f55eSRobert Mustacchi {
96*f3e7f55eSRobert Mustacchi     Dwarf_Ubyte opc;
97*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned retval;
98*f3e7f55eSRobert Mustacchi 
99*f3e7f55eSRobert Mustacchi     opc = DW_LNE_set_address;
100*f3e7f55eSRobert Mustacchi     retval =
101*f3e7f55eSRobert Mustacchi         _dwarf_pro_add_line_entry(dbg, 0, offs, symidx, 0, 0, 0, 0, opc,
102*f3e7f55eSRobert Mustacchi                                   error);
103*f3e7f55eSRobert Mustacchi     return retval;
104*f3e7f55eSRobert Mustacchi }
105*f3e7f55eSRobert Mustacchi 
106*f3e7f55eSRobert Mustacchi /*------------------------------------------------------------------------
107*f3e7f55eSRobert Mustacchi         Ask to emit end_seqence opcode. Used normally at the end of a
108*f3e7f55eSRobert Mustacchi         compilation unit. Can also be used in the middle if there
109*f3e7f55eSRobert Mustacchi         are gaps in the region described by the code address.
110*f3e7f55eSRobert Mustacchi -------------------------------------------------------------------------*/
111*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_lne_end_sequence(Dwarf_P_Debug dbg,Dwarf_Addr end_address,Dwarf_Error * error)112*f3e7f55eSRobert Mustacchi dwarf_lne_end_sequence(Dwarf_P_Debug dbg,
113*f3e7f55eSRobert Mustacchi                        Dwarf_Addr end_address, Dwarf_Error * error)
114*f3e7f55eSRobert Mustacchi {
115*f3e7f55eSRobert Mustacchi     Dwarf_Ubyte opc;
116*f3e7f55eSRobert Mustacchi     Dwarf_Unsigned retval;
117*f3e7f55eSRobert Mustacchi 
118*f3e7f55eSRobert Mustacchi     opc = DW_LNE_end_sequence;
119*f3e7f55eSRobert Mustacchi     retval =
120*f3e7f55eSRobert Mustacchi         _dwarf_pro_add_line_entry(dbg, 0, end_address, 0, 0, 0, 0, 0,
121*f3e7f55eSRobert Mustacchi                                   opc, error);
122*f3e7f55eSRobert Mustacchi     return retval;
123*f3e7f55eSRobert Mustacchi }
124*f3e7f55eSRobert Mustacchi 
125*f3e7f55eSRobert Mustacchi /*----------------------------------------------------------------------------
126*f3e7f55eSRobert Mustacchi         Add an entry in the internal list of lines mantained by producer.
127*f3e7f55eSRobert Mustacchi         Opc indicates if an opcode needs to be generated, rather than just
128*f3e7f55eSRobert Mustacchi         an entry in the matrix. During opcodes generation time, these
129*f3e7f55eSRobert Mustacchi         opcodes will be used.
130*f3e7f55eSRobert Mustacchi -----------------------------------------------------------------------------*/
131*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
_dwarf_pro_add_line_entry(Dwarf_P_Debug dbg,Dwarf_Unsigned file_index,Dwarf_Addr code_address,Dwarf_Unsigned symidx,Dwarf_Unsigned line_no,Dwarf_Signed col_no,Dwarf_Bool is_stmt_begin,Dwarf_Bool is_bb_begin,Dwarf_Ubyte opc,Dwarf_Error * error)132*f3e7f55eSRobert Mustacchi _dwarf_pro_add_line_entry(Dwarf_P_Debug dbg,
133*f3e7f55eSRobert Mustacchi                           Dwarf_Unsigned file_index,
134*f3e7f55eSRobert Mustacchi                           Dwarf_Addr code_address,
135*f3e7f55eSRobert Mustacchi                           Dwarf_Unsigned symidx,
136*f3e7f55eSRobert Mustacchi                           Dwarf_Unsigned line_no,
137*f3e7f55eSRobert Mustacchi                           Dwarf_Signed col_no,
138*f3e7f55eSRobert Mustacchi                           Dwarf_Bool is_stmt_begin,
139*f3e7f55eSRobert Mustacchi                           Dwarf_Bool is_bb_begin,
140*f3e7f55eSRobert Mustacchi                           Dwarf_Ubyte opc, Dwarf_Error * error)
141*f3e7f55eSRobert Mustacchi {
142*f3e7f55eSRobert Mustacchi     if (dbg->de_lines == NULL) {
143*f3e7f55eSRobert Mustacchi         dbg->de_lines = (Dwarf_P_Line)
144*f3e7f55eSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
145*f3e7f55eSRobert Mustacchi         if (dbg->de_lines == NULL) {
146*f3e7f55eSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_NOCOUNT);
147*f3e7f55eSRobert Mustacchi         }
148*f3e7f55eSRobert Mustacchi         dbg->de_last_line = dbg->de_lines;
149*f3e7f55eSRobert Mustacchi         _dwarf_pro_reg_init(dbg->de_lines);
150*f3e7f55eSRobert Mustacchi 
151*f3e7f55eSRobert Mustacchi     } else {
152*f3e7f55eSRobert Mustacchi         dbg->de_last_line->dpl_next = (Dwarf_P_Line)
153*f3e7f55eSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
154*f3e7f55eSRobert Mustacchi         if (dbg->de_last_line->dpl_next == NULL) {
155*f3e7f55eSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_NOCOUNT);
156*f3e7f55eSRobert Mustacchi         }
157*f3e7f55eSRobert Mustacchi         dbg->de_last_line = dbg->de_last_line->dpl_next;
158*f3e7f55eSRobert Mustacchi         _dwarf_pro_reg_init(dbg->de_last_line);
159*f3e7f55eSRobert Mustacchi     }
160*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_address = code_address;
161*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_file = (unsigned long) file_index;
162*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_line = (unsigned long) line_no;
163*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_column = (unsigned long) col_no;
164*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_is_stmt = is_stmt_begin;
165*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_basic_block = is_bb_begin;
166*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_opc = opc;
167*f3e7f55eSRobert Mustacchi     dbg->de_last_line->dpl_r_symidx = symidx;
168*f3e7f55eSRobert Mustacchi 
169*f3e7f55eSRobert Mustacchi     return (0);
170*f3e7f55eSRobert Mustacchi }
171*f3e7f55eSRobert Mustacchi 
172*f3e7f55eSRobert Mustacchi /*-----------------------------------------------------------------------
173*f3e7f55eSRobert Mustacchi         Add a directory declaration to the debug_line section. Stored
174*f3e7f55eSRobert Mustacchi         in linked list.
175*f3e7f55eSRobert Mustacchi ------------------------------------------------------------------------*/
176*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_directory_decl(Dwarf_P_Debug dbg,char * name,Dwarf_Error * error)177*f3e7f55eSRobert Mustacchi dwarf_add_directory_decl(Dwarf_P_Debug dbg,
178*f3e7f55eSRobert Mustacchi                          char *name, Dwarf_Error * error)
179*f3e7f55eSRobert Mustacchi {
180*f3e7f55eSRobert Mustacchi     if (dbg->de_inc_dirs == NULL) {
181*f3e7f55eSRobert Mustacchi         dbg->de_inc_dirs = (Dwarf_P_Inc_Dir)
182*f3e7f55eSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Inc_Dir_s));
183*f3e7f55eSRobert Mustacchi         if (dbg->de_inc_dirs == NULL) {
184*f3e7f55eSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC, DW_DLV_NOCOUNT);
185*f3e7f55eSRobert Mustacchi         }
186*f3e7f55eSRobert Mustacchi         dbg->de_last_inc_dir = dbg->de_inc_dirs;
187*f3e7f55eSRobert Mustacchi         dbg->de_n_inc_dirs = 1;
188*f3e7f55eSRobert Mustacchi     } else {
189*f3e7f55eSRobert Mustacchi         dbg->de_last_inc_dir->did_next = (Dwarf_P_Inc_Dir)
190*f3e7f55eSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Inc_Dir_s));
191*f3e7f55eSRobert Mustacchi         if (dbg->de_last_inc_dir->did_next == NULL) {
192*f3e7f55eSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC, DW_DLV_NOCOUNT);
193*f3e7f55eSRobert Mustacchi         }
194*f3e7f55eSRobert Mustacchi         dbg->de_last_inc_dir = dbg->de_last_inc_dir->did_next;
195*f3e7f55eSRobert Mustacchi         dbg->de_n_inc_dirs++;
196*f3e7f55eSRobert Mustacchi     }
197*f3e7f55eSRobert Mustacchi     dbg->de_last_inc_dir->did_name =
198*f3e7f55eSRobert Mustacchi         (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1);
199*f3e7f55eSRobert Mustacchi     if (dbg->de_last_inc_dir->did_name == NULL) {
200*f3e7f55eSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_STRING_ALLOC, DW_DLV_NOCOUNT);
201*f3e7f55eSRobert Mustacchi     }
202*f3e7f55eSRobert Mustacchi     strcpy(dbg->de_last_inc_dir->did_name, name);
203*f3e7f55eSRobert Mustacchi     dbg->de_last_inc_dir->did_next = NULL;
204*f3e7f55eSRobert Mustacchi 
205*f3e7f55eSRobert Mustacchi     return dbg->de_n_inc_dirs;
206*f3e7f55eSRobert Mustacchi }
207*f3e7f55eSRobert Mustacchi 
208*f3e7f55eSRobert Mustacchi /*-----------------------------------------------------------------------
209*f3e7f55eSRobert Mustacchi         Add a file entry declaration to the debug_line section. Stored
210*f3e7f55eSRobert Mustacchi         in linked list. The data is immediately encodes as leb128
211*f3e7f55eSRobert Mustacchi         and stored in Dwarf_P_F_Entry_s struct.
212*f3e7f55eSRobert Mustacchi ------------------------------------------------------------------------*/
213*f3e7f55eSRobert Mustacchi Dwarf_Unsigned
dwarf_add_file_decl(Dwarf_P_Debug dbg,char * name,Dwarf_Unsigned dir_idx,Dwarf_Unsigned time_mod,Dwarf_Unsigned length,Dwarf_Error * error)214*f3e7f55eSRobert Mustacchi dwarf_add_file_decl(Dwarf_P_Debug dbg,
215*f3e7f55eSRobert Mustacchi                     char *name,
216*f3e7f55eSRobert Mustacchi                     Dwarf_Unsigned dir_idx,
217*f3e7f55eSRobert Mustacchi                     Dwarf_Unsigned time_mod,
218*f3e7f55eSRobert Mustacchi                     Dwarf_Unsigned length, Dwarf_Error * error)
219*f3e7f55eSRobert Mustacchi {
220*f3e7f55eSRobert Mustacchi     Dwarf_P_F_Entry cur;
221*f3e7f55eSRobert Mustacchi     char *ptr;
222*f3e7f55eSRobert Mustacchi     int nbytes_idx, nbytes_time, nbytes_len;
223*f3e7f55eSRobert Mustacchi     char buffidx[ENCODE_SPACE_NEEDED];
224*f3e7f55eSRobert Mustacchi     char bufftime[ENCODE_SPACE_NEEDED];
225*f3e7f55eSRobert Mustacchi     char bufflen[ENCODE_SPACE_NEEDED];
226*f3e7f55eSRobert Mustacchi     int res;
227*f3e7f55eSRobert Mustacchi 
228*f3e7f55eSRobert Mustacchi     if (dbg->de_file_entries == NULL) {
229*f3e7f55eSRobert Mustacchi         dbg->de_file_entries = (Dwarf_P_F_Entry)
230*f3e7f55eSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
231*f3e7f55eSRobert Mustacchi         if (dbg->de_file_entries == NULL) {
232*f3e7f55eSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC,
233*f3e7f55eSRobert Mustacchi                               DW_DLV_NOCOUNT);
234*f3e7f55eSRobert Mustacchi         }
235*f3e7f55eSRobert Mustacchi         cur = dbg->de_file_entries;
236*f3e7f55eSRobert Mustacchi         dbg->de_last_file_entry = cur;
237*f3e7f55eSRobert Mustacchi         dbg->de_n_file_entries = 1;
238*f3e7f55eSRobert Mustacchi     } else {
239*f3e7f55eSRobert Mustacchi         cur = dbg->de_last_file_entry;
240*f3e7f55eSRobert Mustacchi         cur->dfe_next = (Dwarf_P_F_Entry)
241*f3e7f55eSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
242*f3e7f55eSRobert Mustacchi         if (cur->dfe_next == NULL) {
243*f3e7f55eSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC,
244*f3e7f55eSRobert Mustacchi                               DW_DLV_NOCOUNT);
245*f3e7f55eSRobert Mustacchi         }
246*f3e7f55eSRobert Mustacchi         cur = cur->dfe_next;
247*f3e7f55eSRobert Mustacchi         dbg->de_last_file_entry = cur;
248*f3e7f55eSRobert Mustacchi         dbg->de_n_file_entries++;
249*f3e7f55eSRobert Mustacchi     }
250*f3e7f55eSRobert Mustacchi     cur->dfe_name = (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1);
251*f3e7f55eSRobert Mustacchi     if (cur->dfe_name == NULL) {
252*f3e7f55eSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
253*f3e7f55eSRobert Mustacchi     }
254*f3e7f55eSRobert Mustacchi     strcpy((char *) cur->dfe_name, name);
255*f3e7f55eSRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(dir_idx, &nbytes_idx,
256*f3e7f55eSRobert Mustacchi                                       buffidx, sizeof(buffidx));
257*f3e7f55eSRobert Mustacchi     if (res != DW_DLV_OK) {
258*f3e7f55eSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
259*f3e7f55eSRobert Mustacchi     }
260*f3e7f55eSRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(time_mod, &nbytes_time,
261*f3e7f55eSRobert Mustacchi                                       bufftime, sizeof(bufftime));
262*f3e7f55eSRobert Mustacchi     if (res != DW_DLV_OK) {
263*f3e7f55eSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
264*f3e7f55eSRobert Mustacchi     }
265*f3e7f55eSRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(length, &nbytes_len,
266*f3e7f55eSRobert Mustacchi                                       bufflen, sizeof(bufflen));
267*f3e7f55eSRobert Mustacchi     cur->dfe_args = (char *)
268*f3e7f55eSRobert Mustacchi         _dwarf_p_get_alloc(dbg, nbytes_idx + nbytes_time + nbytes_len);
269*f3e7f55eSRobert Mustacchi     if (cur->dfe_args == NULL) {
270*f3e7f55eSRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_NOCOUNT);
271*f3e7f55eSRobert Mustacchi     }
272*f3e7f55eSRobert Mustacchi     ptr = cur->dfe_args;
273*f3e7f55eSRobert Mustacchi     memcpy((void *) ptr, buffidx, nbytes_idx);
274*f3e7f55eSRobert Mustacchi     ptr += nbytes_idx;
275*f3e7f55eSRobert Mustacchi     memcpy((void *) ptr, bufftime, nbytes_time);
276*f3e7f55eSRobert Mustacchi     ptr += nbytes_time;
277*f3e7f55eSRobert Mustacchi     memcpy((void *) ptr, bufflen, nbytes_len);
278*f3e7f55eSRobert Mustacchi     ptr += nbytes_len;
279*f3e7f55eSRobert Mustacchi     cur->dfe_nbytes = nbytes_idx + nbytes_time + nbytes_len;
280*f3e7f55eSRobert Mustacchi     cur->dfe_next = NULL;
281*f3e7f55eSRobert Mustacchi 
282*f3e7f55eSRobert Mustacchi     return dbg->de_n_file_entries;
283*f3e7f55eSRobert Mustacchi }
284*f3e7f55eSRobert Mustacchi 
285*f3e7f55eSRobert Mustacchi 
286*f3e7f55eSRobert Mustacchi /*---------------------------------------------------------------------
287*f3e7f55eSRobert Mustacchi         Initialize a row of the matrix for line numbers, meaning
288*f3e7f55eSRobert Mustacchi         initialize the struct corresponding to it
289*f3e7f55eSRobert Mustacchi ----------------------------------------------------------------------*/
290*f3e7f55eSRobert Mustacchi void
_dwarf_pro_reg_init(Dwarf_P_Line cur_line)291*f3e7f55eSRobert Mustacchi _dwarf_pro_reg_init(Dwarf_P_Line cur_line)
292*f3e7f55eSRobert Mustacchi {
293*f3e7f55eSRobert Mustacchi     cur_line->dpl_address = 0;
294*f3e7f55eSRobert Mustacchi     cur_line->dpl_file = 1;
295*f3e7f55eSRobert Mustacchi     cur_line->dpl_line = 1;
296*f3e7f55eSRobert Mustacchi     cur_line->dpl_column = 0;
297*f3e7f55eSRobert Mustacchi     cur_line->dpl_is_stmt = DEFAULT_IS_STMT;
298*f3e7f55eSRobert Mustacchi     cur_line->dpl_basic_block = false;
299*f3e7f55eSRobert Mustacchi     cur_line->dpl_next = NULL;
300*f3e7f55eSRobert Mustacchi }
301