xref: /illumos-gate/usr/src/lib/libdwarf/common/pro_line.c (revision 4d9fdb46b215739778ebc12079842c9905586999)
1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright 2011-2019 David Anderson. All Rights Reserved.
4bc1f688bSRobert Mustacchi 
5bc1f688bSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
6bc1f688bSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
7bc1f688bSRobert Mustacchi   as published by the Free Software Foundation.
8bc1f688bSRobert Mustacchi 
9bc1f688bSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
10bc1f688bSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
11bc1f688bSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12bc1f688bSRobert Mustacchi 
13bc1f688bSRobert Mustacchi   Further, this software is distributed without any warranty that it is
14bc1f688bSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
15bc1f688bSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
16bc1f688bSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
17bc1f688bSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
18bc1f688bSRobert Mustacchi   other software, or any other product whatsoever.
19bc1f688bSRobert Mustacchi 
20bc1f688bSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
21bc1f688bSRobert Mustacchi   License along with this program; if not, write the Free Software
22bc1f688bSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23bc1f688bSRobert Mustacchi   USA.
24bc1f688bSRobert Mustacchi 
25bc1f688bSRobert Mustacchi */
26bc1f688bSRobert Mustacchi 
27bc1f688bSRobert Mustacchi #include "config.h"
28bc1f688bSRobert Mustacchi #include "libdwarfdefs.h"
29bc1f688bSRobert Mustacchi #include <stdio.h>
30bc1f688bSRobert Mustacchi #include <string.h>
31*4d9fdb46SRobert Mustacchi 
32bc1f688bSRobert Mustacchi #include "pro_incl.h"
33*4d9fdb46SRobert Mustacchi #include <stddef.h>
34*4d9fdb46SRobert Mustacchi #include "dwarf.h"
35*4d9fdb46SRobert Mustacchi #include "libdwarf.h"
36*4d9fdb46SRobert Mustacchi #include "pro_opaque.h"
37*4d9fdb46SRobert Mustacchi #include "pro_error.h"
38*4d9fdb46SRobert Mustacchi #include "pro_alloc.h"
39*4d9fdb46SRobert Mustacchi #include "pro_encode_nm.h"
40bc1f688bSRobert Mustacchi #include "pro_line.h"
41bc1f688bSRobert Mustacchi 
42*4d9fdb46SRobert Mustacchi static int _dwarf_pro_add_line_entry(Dwarf_P_Debug,
43bc1f688bSRobert Mustacchi     Dwarf_Unsigned file_index,
44bc1f688bSRobert Mustacchi     Dwarf_Addr code_address,
45bc1f688bSRobert Mustacchi     Dwarf_Unsigned symidx,
46bc1f688bSRobert Mustacchi     Dwarf_Unsigned line_no,
47bc1f688bSRobert Mustacchi     Dwarf_Signed col_no,
48bc1f688bSRobert Mustacchi     Dwarf_Bool is_stmt_begin,
49bc1f688bSRobert Mustacchi     Dwarf_Bool is_bb_begin,
50bc1f688bSRobert Mustacchi     Dwarf_Ubyte opc,
51*4d9fdb46SRobert Mustacchi     Dwarf_Bool isepilbeg,
52*4d9fdb46SRobert Mustacchi     Dwarf_Bool isprolend,
53*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa,
54*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator,
55bc1f688bSRobert Mustacchi     Dwarf_Error * error);
56bc1f688bSRobert Mustacchi 
57*4d9fdb46SRobert Mustacchi /*  Add a entry to the line information section
58bc1f688bSRobert Mustacchi     file_index: index of file in file entries, obtained from
59bc1f688bSRobert Mustacchi     add_file_entry() call.
60bc1f688bSRobert Mustacchi 
61bc1f688bSRobert Mustacchi     This function actually calls _dwarf_pro_add_line_entry(), with
62bc1f688bSRobert Mustacchi     an extra parameter, the opcode. Done so that interface calls
63bc1f688bSRobert Mustacchi     dwarf_lne_set_address() and dwarf_lne_end_sequence() can use
64bc1f688bSRobert Mustacchi     this internal routine.
65*4d9fdb46SRobert Mustacchi 
66*4d9fdb46SRobert Mustacchi     The return value of the original
67*4d9fdb46SRobert Mustacchi     interfaces is really signed. Bogus interface.
68*4d9fdb46SRobert Mustacchi     With dwarf_add_line_entry_c the interface is corrected. */
69bc1f688bSRobert Mustacchi Dwarf_Unsigned
dwarf_add_line_entry_b(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_Bool isepilbeg,Dwarf_Bool isprolend,Dwarf_Unsigned isa,Dwarf_Unsigned discriminator,Dwarf_Error * error)70*4d9fdb46SRobert Mustacchi dwarf_add_line_entry_b(Dwarf_P_Debug dbg,
71bc1f688bSRobert Mustacchi     Dwarf_Unsigned file_index,
72bc1f688bSRobert Mustacchi     Dwarf_Addr     code_address,
73bc1f688bSRobert Mustacchi     Dwarf_Unsigned line_no,
74bc1f688bSRobert Mustacchi     Dwarf_Signed   col_no,
75bc1f688bSRobert Mustacchi     Dwarf_Bool     is_stmt_begin,
76*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_bb_begin,
77*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isepilbeg,
78*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isprolend,
79*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa,
80*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator,
81*4d9fdb46SRobert Mustacchi     Dwarf_Error *  error)
82bc1f688bSRobert Mustacchi {
83*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned retval = 0;
84*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte opc = 0;
85*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symidx = 0;
86bc1f688bSRobert Mustacchi 
87*4d9fdb46SRobert Mustacchi     retval = _dwarf_pro_add_line_entry(dbg, file_index, code_address,
88*4d9fdb46SRobert Mustacchi         symidx,
89bc1f688bSRobert Mustacchi         line_no, col_no, is_stmt_begin,
90*4d9fdb46SRobert Mustacchi         is_bb_begin,
91*4d9fdb46SRobert Mustacchi         opc,
92*4d9fdb46SRobert Mustacchi         isepilbeg,isprolend,isa,discriminator, error);
93*4d9fdb46SRobert Mustacchi     if (retval != DW_DLV_OK) {
94*4d9fdb46SRobert Mustacchi         return DW_DLV_NOCOUNT;
95*4d9fdb46SRobert Mustacchi     }
96*4d9fdb46SRobert Mustacchi     return 0;
97*4d9fdb46SRobert Mustacchi }
98*4d9fdb46SRobert Mustacchi int
dwarf_add_line_entry_c(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_Bool isepilbeg,Dwarf_Bool isprolend,Dwarf_Unsigned isa,Dwarf_Unsigned discriminator,Dwarf_Error * error)99*4d9fdb46SRobert Mustacchi dwarf_add_line_entry_c(Dwarf_P_Debug dbg,
100*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned file_index,
101*4d9fdb46SRobert Mustacchi     Dwarf_Addr     code_address,
102*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned line_no,
103*4d9fdb46SRobert Mustacchi     Dwarf_Signed   col_no,
104*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_stmt_begin,
105*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_bb_begin,
106*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isepilbeg,
107*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isprolend,
108*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa,
109*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator,
110*4d9fdb46SRobert Mustacchi     Dwarf_Error *  error)
111*4d9fdb46SRobert Mustacchi {
112*4d9fdb46SRobert Mustacchi     int retval = 0;
113*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte opc = 0;
114*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symidx = 0;
115*4d9fdb46SRobert Mustacchi 
116*4d9fdb46SRobert Mustacchi     retval = _dwarf_pro_add_line_entry(dbg, file_index, code_address,
117*4d9fdb46SRobert Mustacchi         symidx,
118*4d9fdb46SRobert Mustacchi         line_no, col_no, is_stmt_begin,
119*4d9fdb46SRobert Mustacchi         is_bb_begin,
120*4d9fdb46SRobert Mustacchi         opc,
121*4d9fdb46SRobert Mustacchi         isepilbeg,isprolend,isa,discriminator, error);
122bc1f688bSRobert Mustacchi     return retval;
123bc1f688bSRobert Mustacchi }
124bc1f688bSRobert Mustacchi 
125*4d9fdb46SRobert Mustacchi 
126*4d9fdb46SRobert Mustacchi 
127*4d9fdb46SRobert Mustacchi /*  The return value is really signed. Bogus interface.*/
128*4d9fdb46SRobert 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)129*4d9fdb46SRobert Mustacchi dwarf_add_line_entry(Dwarf_P_Debug dbg,
130*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned file_index,
131*4d9fdb46SRobert Mustacchi     Dwarf_Addr code_address,
132*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned line_no,
133*4d9fdb46SRobert Mustacchi     Dwarf_Signed col_no, /* Wrong, should be unsigned. */
134*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_stmt_begin,
135*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_bb_begin, Dwarf_Error * error)
136*4d9fdb46SRobert Mustacchi {
137*4d9fdb46SRobert Mustacchi     int retval = 0;
138*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte opc = 0;
139*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symidx = 0;
140*4d9fdb46SRobert Mustacchi     Dwarf_Bool isepilbeg = 0;
141*4d9fdb46SRobert Mustacchi     Dwarf_Bool isprolend  = 0;
142*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa = 0;
143*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator = 0;
144*4d9fdb46SRobert Mustacchi 
145*4d9fdb46SRobert Mustacchi     retval = _dwarf_pro_add_line_entry(dbg, file_index, code_address,
146*4d9fdb46SRobert Mustacchi         symidx,
147*4d9fdb46SRobert Mustacchi         line_no, col_no, is_stmt_begin,
148*4d9fdb46SRobert Mustacchi         is_bb_begin,
149*4d9fdb46SRobert Mustacchi         opc,
150*4d9fdb46SRobert Mustacchi         isepilbeg, isprolend, isa, discriminator,
151*4d9fdb46SRobert Mustacchi         error);
152*4d9fdb46SRobert Mustacchi     if (retval != DW_DLV_OK) {
153*4d9fdb46SRobert Mustacchi         return DW_DLV_NOCOUNT;
154*4d9fdb46SRobert Mustacchi     }
155*4d9fdb46SRobert Mustacchi     return 0;
156*4d9fdb46SRobert Mustacchi }
157*4d9fdb46SRobert Mustacchi 
158*4d9fdb46SRobert Mustacchi void
_dwarf_init_default_line_header_vals(Dwarf_P_Debug dbg)159*4d9fdb46SRobert Mustacchi _dwarf_init_default_line_header_vals(Dwarf_P_Debug dbg)
160*4d9fdb46SRobert Mustacchi {
161*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_linetable_version = dbg->de_output_version;
162*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_default_is_stmt =
163*4d9fdb46SRobert Mustacchi         /* is false pro_line.h */
164*4d9fdb46SRobert Mustacchi         DEFAULT_IS_STMT;
165*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_minimum_instruction_length =
166*4d9fdb46SRobert Mustacchi         /* is 1 or 4 depending on ifdefs in pro_line.h */
167*4d9fdb46SRobert Mustacchi         MIN_INST_LENGTH;
168*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_maximum_operations_per_instruction =
169*4d9fdb46SRobert Mustacchi         /*  Assuming the instruction set is not VLIW,
170*4d9fdb46SRobert Mustacchi             used in the line table */
171*4d9fdb46SRobert Mustacchi         1;
172*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_opcode_base =
173*4d9fdb46SRobert Mustacchi         /*  is 10 in pro_line.h but should be 13 in DWARF3
174*4d9fdb46SRobert Mustacchi             and later. */
175*4d9fdb46SRobert Mustacchi         OPCODE_BASE;
176*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_line_base =
177*4d9fdb46SRobert Mustacchi         /* is -1 in pro_line.h */
178*4d9fdb46SRobert Mustacchi         LINE_BASE;
179*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_line_range =
180*4d9fdb46SRobert Mustacchi         /* is 4 in pro_line.h */
181*4d9fdb46SRobert Mustacchi         LINE_RANGE;
182*4d9fdb46SRobert Mustacchi 
183*4d9fdb46SRobert Mustacchi     /*  Applies to line table and everywhere else
184*4d9fdb46SRobert Mustacchi         for a CU. */
185*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_address_size = dbg->de_pointer_size;
186*4d9fdb46SRobert Mustacchi 
187*4d9fdb46SRobert Mustacchi     /*  Assuming no segments. */
188*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_segment_selector_size = 0;
189*4d9fdb46SRobert Mustacchi     dbg->de_line_inits.pi_segment_size = 0;
190*4d9fdb46SRobert Mustacchi }
191*4d9fdb46SRobert Mustacchi 
192*4d9fdb46SRobert Mustacchi 
193*4d9fdb46SRobert Mustacchi /*  Ask to emit DW_LNE_set_address opcode explicitly. Used by be
194bc1f688bSRobert Mustacchi     to emit start of a new .text section, or to force a relocated
195*4d9fdb46SRobert Mustacchi     address into debug line information entry. */
196bc1f688bSRobert Mustacchi Dwarf_Unsigned
dwarf_lne_set_address(Dwarf_P_Debug dbg,Dwarf_Addr offs,Dwarf_Unsigned symidx,Dwarf_Error * error)197bc1f688bSRobert Mustacchi dwarf_lne_set_address(Dwarf_P_Debug dbg,
198bc1f688bSRobert Mustacchi     Dwarf_Addr offs,
199bc1f688bSRobert Mustacchi     Dwarf_Unsigned symidx, Dwarf_Error * error)
200bc1f688bSRobert Mustacchi {
201*4d9fdb46SRobert Mustacchi     int res = 0;
202*4d9fdb46SRobert Mustacchi 
203*4d9fdb46SRobert Mustacchi     res = dwarf_lne_set_address_a(dbg,offs,symidx,error);
204*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
205*4d9fdb46SRobert Mustacchi         return DW_DLV_NOCOUNT;
206*4d9fdb46SRobert Mustacchi     }
207*4d9fdb46SRobert Mustacchi     return 0;
208*4d9fdb46SRobert Mustacchi 
209*4d9fdb46SRobert Mustacchi }
210*4d9fdb46SRobert Mustacchi int
dwarf_lne_set_address_a(Dwarf_P_Debug dbg,Dwarf_Addr offs,Dwarf_Unsigned symidx,Dwarf_Error * error)211*4d9fdb46SRobert Mustacchi dwarf_lne_set_address_a(Dwarf_P_Debug dbg,
212*4d9fdb46SRobert Mustacchi     Dwarf_Addr offs,
213*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symidx, Dwarf_Error * error)
214*4d9fdb46SRobert Mustacchi {
215*4d9fdb46SRobert Mustacchi     int            retval = 0;
216*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte    opc = 0;
217*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned file_index = 0;
218*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned line_no = 0;
219*4d9fdb46SRobert Mustacchi     Dwarf_Signed   col_no = 0;
220*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_stmt = 0;
221*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_bb = 0;
222*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isepilbeg = 0;
223*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isprolend  = 0;
224*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa = 0;
225*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator = 0;
226*4d9fdb46SRobert Mustacchi 
227bc1f688bSRobert Mustacchi 
228bc1f688bSRobert Mustacchi     opc = DW_LNE_set_address;
229*4d9fdb46SRobert Mustacchi     retval = _dwarf_pro_add_line_entry(dbg, file_index, offs,
230*4d9fdb46SRobert Mustacchi         symidx,
231*4d9fdb46SRobert Mustacchi         line_no, col_no, is_stmt,
232*4d9fdb46SRobert Mustacchi         is_bb,
233*4d9fdb46SRobert Mustacchi         opc,
234*4d9fdb46SRobert Mustacchi         isepilbeg, isprolend, isa, discriminator,
235bc1f688bSRobert Mustacchi         error);
236bc1f688bSRobert Mustacchi     return retval;
237bc1f688bSRobert Mustacchi }
238bc1f688bSRobert Mustacchi 
239*4d9fdb46SRobert Mustacchi /*  Ask to emit end_seqence opcode. Used normally at the end of a
240bc1f688bSRobert Mustacchi     compilation unit. Can also be used in the middle if there
241*4d9fdb46SRobert Mustacchi     are gaps in the region described by the code address.  */
242bc1f688bSRobert Mustacchi Dwarf_Unsigned
dwarf_lne_end_sequence(Dwarf_P_Debug dbg,Dwarf_Addr end_address,Dwarf_Error * error)243bc1f688bSRobert Mustacchi dwarf_lne_end_sequence(Dwarf_P_Debug dbg,
244bc1f688bSRobert Mustacchi     Dwarf_Addr end_address, Dwarf_Error * error)
245bc1f688bSRobert Mustacchi {
246*4d9fdb46SRobert Mustacchi     int retval = 0;
247*4d9fdb46SRobert Mustacchi 
248*4d9fdb46SRobert Mustacchi     retval = dwarf_lne_end_sequence_a(dbg,end_address,error);
249*4d9fdb46SRobert Mustacchi     if (retval != DW_DLV_OK) {
250*4d9fdb46SRobert Mustacchi         return DW_DLV_NOCOUNT;
251*4d9fdb46SRobert Mustacchi     }
252*4d9fdb46SRobert Mustacchi     return 0;
253*4d9fdb46SRobert Mustacchi }
254*4d9fdb46SRobert Mustacchi int
dwarf_lne_end_sequence_a(Dwarf_P_Debug dbg,Dwarf_Addr end_address,Dwarf_Error * error)255*4d9fdb46SRobert Mustacchi dwarf_lne_end_sequence_a(Dwarf_P_Debug dbg,
256*4d9fdb46SRobert Mustacchi     Dwarf_Addr end_address, Dwarf_Error * error)
257*4d9fdb46SRobert Mustacchi {
258*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte    opc = 0;
259*4d9fdb46SRobert Mustacchi     int retval = 0;
260*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned file_index = 0;
261*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned symidx = 0;
262*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned line_no = 0;
263*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_stmt = 0;
264*4d9fdb46SRobert Mustacchi     Dwarf_Bool     is_bb = 0;
265*4d9fdb46SRobert Mustacchi     Dwarf_Signed   col_no = 0;/* Wrong, should be unsigned. */
266*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isepilbeg = 0;
267*4d9fdb46SRobert Mustacchi     Dwarf_Bool     isprolend  = 0;
268*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa = 0;
269*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator = 0;
270bc1f688bSRobert Mustacchi 
271bc1f688bSRobert Mustacchi     opc = DW_LNE_end_sequence;
272*4d9fdb46SRobert Mustacchi     retval = _dwarf_pro_add_line_entry(dbg, file_index, end_address,
273*4d9fdb46SRobert Mustacchi         symidx,
274*4d9fdb46SRobert Mustacchi         line_no, col_no, is_stmt,
275*4d9fdb46SRobert Mustacchi         is_bb,
276*4d9fdb46SRobert Mustacchi         opc,
277*4d9fdb46SRobert Mustacchi         isepilbeg, isprolend, isa, discriminator,
278*4d9fdb46SRobert Mustacchi         error);
279bc1f688bSRobert Mustacchi     return retval;
280bc1f688bSRobert Mustacchi }
281bc1f688bSRobert Mustacchi 
282*4d9fdb46SRobert Mustacchi /* As of December 2018 this returns DW_DLV_OK, DW_DLV_ERROR
283*4d9fdb46SRobert Mustacchi     not 0, DW_DLV_NOCOUNT*/
284*4d9fdb46SRobert Mustacchi /*  Add an entry in the internal list of lines mantained by producer.
285bc1f688bSRobert Mustacchi     Opc indicates if an opcode needs to be generated, rather than just
286bc1f688bSRobert Mustacchi     an entry in the matrix. During opcodes generation time, these
287*4d9fdb46SRobert Mustacchi     opcodes will be used. */
288*4d9fdb46SRobert Mustacchi static int
_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_Bool isepilbeg,Dwarf_Bool isprolend,Dwarf_Unsigned isa,Dwarf_Unsigned discriminator,Dwarf_Error * error)289bc1f688bSRobert Mustacchi _dwarf_pro_add_line_entry(Dwarf_P_Debug dbg,
290bc1f688bSRobert Mustacchi     Dwarf_Unsigned file_index,
291bc1f688bSRobert Mustacchi     Dwarf_Addr code_address,
292bc1f688bSRobert Mustacchi     Dwarf_Unsigned symidx,
293bc1f688bSRobert Mustacchi     Dwarf_Unsigned line_no,
294bc1f688bSRobert Mustacchi     Dwarf_Signed col_no,
295bc1f688bSRobert Mustacchi     Dwarf_Bool is_stmt_begin,
296bc1f688bSRobert Mustacchi     Dwarf_Bool is_bb_begin,
297*4d9fdb46SRobert Mustacchi     Dwarf_Ubyte opc,
298*4d9fdb46SRobert Mustacchi     Dwarf_Bool isepilbeg,
299*4d9fdb46SRobert Mustacchi     Dwarf_Bool isprolend,
300*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned isa,
301*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned discriminator,
302*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
303bc1f688bSRobert Mustacchi {
304bc1f688bSRobert Mustacchi     if (dbg->de_lines == NULL) {
305bc1f688bSRobert Mustacchi         dbg->de_lines = (Dwarf_P_Line)
306bc1f688bSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
307bc1f688bSRobert Mustacchi         if (dbg->de_lines == NULL) {
308*4d9fdb46SRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_ERROR);
309bc1f688bSRobert Mustacchi         }
310bc1f688bSRobert Mustacchi         dbg->de_last_line = dbg->de_lines;
311*4d9fdb46SRobert Mustacchi         _dwarf_pro_reg_init(dbg,dbg->de_lines);
312bc1f688bSRobert Mustacchi 
313bc1f688bSRobert Mustacchi     } else {
314bc1f688bSRobert Mustacchi         dbg->de_last_line->dpl_next = (Dwarf_P_Line)
315bc1f688bSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_Line_s));
316bc1f688bSRobert Mustacchi         if (dbg->de_last_line->dpl_next == NULL) {
317*4d9fdb46SRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_LINE_ALLOC, DW_DLV_ERROR);
318bc1f688bSRobert Mustacchi         }
319bc1f688bSRobert Mustacchi         dbg->de_last_line = dbg->de_last_line->dpl_next;
320*4d9fdb46SRobert Mustacchi         _dwarf_pro_reg_init(dbg,dbg->de_last_line);
321bc1f688bSRobert Mustacchi     }
322bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_address = code_address;
323bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_file = (unsigned long) file_index;
324bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_line = (unsigned long) line_no;
325bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_column = (unsigned long) col_no;
326bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_is_stmt = is_stmt_begin;
327bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_basic_block = is_bb_begin;
328bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_opc = opc;
329bc1f688bSRobert Mustacchi     dbg->de_last_line->dpl_r_symidx = symidx;
330*4d9fdb46SRobert Mustacchi     dbg->de_last_line->dpl_prologue_end = isprolend;
331*4d9fdb46SRobert Mustacchi     dbg->de_last_line->dpl_epilogue_begin = isepilbeg;
332*4d9fdb46SRobert Mustacchi     dbg->de_last_line->dpl_isa = isa;
333*4d9fdb46SRobert Mustacchi     dbg->de_last_line->dpl_discriminator = discriminator;
334*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
335bc1f688bSRobert Mustacchi }
336bc1f688bSRobert Mustacchi 
337*4d9fdb46SRobert Mustacchi /*  Add a directory declaration to the debug_line section. Stored
338*4d9fdb46SRobert Mustacchi     in linked list. */
339bc1f688bSRobert Mustacchi Dwarf_Unsigned
dwarf_add_directory_decl(Dwarf_P_Debug dbg,char * name,Dwarf_Error * error)340bc1f688bSRobert Mustacchi dwarf_add_directory_decl(Dwarf_P_Debug dbg,
341*4d9fdb46SRobert Mustacchi     char *name,
342*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
343*4d9fdb46SRobert Mustacchi {
344*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index = 0;
345*4d9fdb46SRobert Mustacchi     int res = 0;
346*4d9fdb46SRobert Mustacchi     /* DW_DLV_NOCOUNT on error, de_n_inc_dirs on success. */
347*4d9fdb46SRobert Mustacchi 
348*4d9fdb46SRobert Mustacchi     res = dwarf_add_directory_decl_a(dbg,name,&index,error);
349*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
350*4d9fdb46SRobert Mustacchi         return (Dwarf_Unsigned)DW_DLV_NOCOUNT;
351*4d9fdb46SRobert Mustacchi     }
352*4d9fdb46SRobert Mustacchi     return index;
353*4d9fdb46SRobert Mustacchi }
354*4d9fdb46SRobert Mustacchi int
dwarf_add_directory_decl_a(Dwarf_P_Debug dbg,char * name,Dwarf_Unsigned * index_in_directories,Dwarf_Error * error)355*4d9fdb46SRobert Mustacchi dwarf_add_directory_decl_a(Dwarf_P_Debug dbg,
356*4d9fdb46SRobert Mustacchi     char *name,
357*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *index_in_directories,
358*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
359bc1f688bSRobert Mustacchi {
360bc1f688bSRobert Mustacchi     if (dbg->de_inc_dirs == NULL) {
361*4d9fdb46SRobert Mustacchi         dbg->de_inc_dirs = (Dwarf_P_F_Entry)
362*4d9fdb46SRobert Mustacchi             _dwarf_p_get_alloc(dbg,
363*4d9fdb46SRobert Mustacchi             sizeof(struct Dwarf_P_F_Entry_s));
364bc1f688bSRobert Mustacchi         if (dbg->de_inc_dirs == NULL) {
365*4d9fdb46SRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC,
366*4d9fdb46SRobert Mustacchi                 DW_DLV_ERROR);
367bc1f688bSRobert Mustacchi         }
368bc1f688bSRobert Mustacchi         dbg->de_last_inc_dir = dbg->de_inc_dirs;
369bc1f688bSRobert Mustacchi         dbg->de_n_inc_dirs = 1;
370bc1f688bSRobert Mustacchi     } else {
371*4d9fdb46SRobert Mustacchi         dbg->de_last_inc_dir->dfe_next = (Dwarf_P_F_Entry)
372*4d9fdb46SRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
373*4d9fdb46SRobert Mustacchi         if (dbg->de_last_inc_dir->dfe_next == NULL) {
374*4d9fdb46SRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_INCDIR_ALLOC,
375*4d9fdb46SRobert Mustacchi                 DW_DLV_ERROR);
376bc1f688bSRobert Mustacchi         }
377*4d9fdb46SRobert Mustacchi         dbg->de_last_inc_dir = dbg->de_last_inc_dir->dfe_next;
378bc1f688bSRobert Mustacchi         dbg->de_n_inc_dirs++;
379bc1f688bSRobert Mustacchi     }
380*4d9fdb46SRobert Mustacchi     dbg->de_last_inc_dir->dfe_name =
381bc1f688bSRobert Mustacchi         (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1);
382*4d9fdb46SRobert Mustacchi     if (dbg->de_last_inc_dir->dfe_name == NULL) {
383*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_STRING_ALLOC, DW_DLV_ERROR);
384bc1f688bSRobert Mustacchi     }
385*4d9fdb46SRobert Mustacchi     strcpy(dbg->de_last_inc_dir->dfe_name, name);
386*4d9fdb46SRobert Mustacchi     dbg->de_last_inc_dir->dfe_next = NULL;
387bc1f688bSRobert Mustacchi 
388*4d9fdb46SRobert Mustacchi     *index_in_directories = dbg->de_n_inc_dirs;
389*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
390bc1f688bSRobert Mustacchi }
391bc1f688bSRobert Mustacchi 
392*4d9fdb46SRobert Mustacchi /*  Add a file entry declaration to the debug_line section. Stored
393*4d9fdb46SRobert Mustacchi     in linked list. The data is immediately encoded as leb128
394*4d9fdb46SRobert Mustacchi     and stored in Dwarf_P_F_Entry_s struct. */
395bc1f688bSRobert 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)396bc1f688bSRobert Mustacchi dwarf_add_file_decl(Dwarf_P_Debug dbg,
397bc1f688bSRobert Mustacchi     char *name,
398bc1f688bSRobert Mustacchi     Dwarf_Unsigned dir_idx,
399bc1f688bSRobert Mustacchi     Dwarf_Unsigned time_mod,
400*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length,
401*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
402*4d9fdb46SRobert Mustacchi {
403*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned filecount = 0;
404*4d9fdb46SRobert Mustacchi     int res = 0;
405*4d9fdb46SRobert Mustacchi 
406*4d9fdb46SRobert Mustacchi     res = dwarf_add_file_decl_a(dbg,name,dir_idx,
407*4d9fdb46SRobert Mustacchi         time_mod,length,&filecount,error);
408*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
409*4d9fdb46SRobert Mustacchi         return DW_DLV_NOCOUNT;
410*4d9fdb46SRobert Mustacchi     }
411*4d9fdb46SRobert Mustacchi     return filecount;
412*4d9fdb46SRobert Mustacchi }
413*4d9fdb46SRobert Mustacchi int
dwarf_add_file_decl_a(Dwarf_P_Debug dbg,char * name,Dwarf_Unsigned dir_idx,Dwarf_Unsigned time_mod,Dwarf_Unsigned length,Dwarf_Unsigned * file_entry_count_out,Dwarf_Error * error)414*4d9fdb46SRobert Mustacchi dwarf_add_file_decl_a(Dwarf_P_Debug dbg,
415*4d9fdb46SRobert Mustacchi     char *name,
416*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned dir_idx,
417*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned time_mod,
418*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned length,
419*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *file_entry_count_out,
420*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
421bc1f688bSRobert Mustacchi {
422bc1f688bSRobert Mustacchi     Dwarf_P_F_Entry cur;
423*4d9fdb46SRobert Mustacchi     char *ptr = 0;
424bc1f688bSRobert Mustacchi     int nbytes_idx, nbytes_time, nbytes_len;
425bc1f688bSRobert Mustacchi     char buffidx[ENCODE_SPACE_NEEDED];
426bc1f688bSRobert Mustacchi     char bufftime[ENCODE_SPACE_NEEDED];
427bc1f688bSRobert Mustacchi     char bufflen[ENCODE_SPACE_NEEDED];
428*4d9fdb46SRobert Mustacchi     int res = 0;
429bc1f688bSRobert Mustacchi 
430bc1f688bSRobert Mustacchi     if (dbg->de_file_entries == NULL) {
431bc1f688bSRobert Mustacchi         dbg->de_file_entries = (Dwarf_P_F_Entry)
432bc1f688bSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
433bc1f688bSRobert Mustacchi         if (dbg->de_file_entries == NULL) {
434bc1f688bSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC,
435*4d9fdb46SRobert Mustacchi                 DW_DLV_ERROR);
436bc1f688bSRobert Mustacchi         }
437bc1f688bSRobert Mustacchi         cur = dbg->de_file_entries;
438bc1f688bSRobert Mustacchi         dbg->de_last_file_entry = cur;
439bc1f688bSRobert Mustacchi         dbg->de_n_file_entries = 1;
440bc1f688bSRobert Mustacchi     } else {
441bc1f688bSRobert Mustacchi         cur = dbg->de_last_file_entry;
442bc1f688bSRobert Mustacchi         cur->dfe_next = (Dwarf_P_F_Entry)
443bc1f688bSRobert Mustacchi             _dwarf_p_get_alloc(dbg, sizeof(struct Dwarf_P_F_Entry_s));
444bc1f688bSRobert Mustacchi         if (cur->dfe_next == NULL) {
445bc1f688bSRobert Mustacchi             DWARF_P_DBG_ERROR(dbg, DW_DLE_FILE_ENTRY_ALLOC,
446*4d9fdb46SRobert Mustacchi                 DW_DLV_ERROR);
447bc1f688bSRobert Mustacchi         }
448bc1f688bSRobert Mustacchi         cur = cur->dfe_next;
449bc1f688bSRobert Mustacchi         dbg->de_last_file_entry = cur;
450bc1f688bSRobert Mustacchi         dbg->de_n_file_entries++;
451bc1f688bSRobert Mustacchi     }
452bc1f688bSRobert Mustacchi     cur->dfe_name = (char *) _dwarf_p_get_alloc(dbg, strlen(name) + 1);
453bc1f688bSRobert Mustacchi     if (cur->dfe_name == NULL) {
454*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_ERROR);
455bc1f688bSRobert Mustacchi     }
456bc1f688bSRobert Mustacchi     strcpy((char *) cur->dfe_name, name);
457bc1f688bSRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(dir_idx, &nbytes_idx,
458bc1f688bSRobert Mustacchi         buffidx, sizeof(buffidx));
459bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
460*4d9fdb46SRobert Mustacchi         /* DW_DLV_NO_ENTRY impossible */
461*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_LEB_OUT_ERROR, DW_DLV_ERROR);
462bc1f688bSRobert Mustacchi     }
463bc1f688bSRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(time_mod, &nbytes_time,
464bc1f688bSRobert Mustacchi         bufftime, sizeof(bufftime));
465bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
466*4d9fdb46SRobert Mustacchi         /* DW_DLV_NO_ENTRY impossible */
467*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_LEB_OUT_ERROR, DW_DLV_ERROR);
468bc1f688bSRobert Mustacchi     }
469bc1f688bSRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(length, &nbytes_len,
470bc1f688bSRobert Mustacchi         bufflen, sizeof(bufflen));
471*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
472*4d9fdb46SRobert Mustacchi         /* DW_DLV_NO_ENTRY impossible */
473*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg,DW_DLE_LEB_OUT_ERROR,DW_DLV_ERROR);
474*4d9fdb46SRobert Mustacchi     }
475bc1f688bSRobert Mustacchi     cur->dfe_args = (char *)
476bc1f688bSRobert Mustacchi         _dwarf_p_get_alloc(dbg, nbytes_idx + nbytes_time + nbytes_len);
477bc1f688bSRobert Mustacchi     if (cur->dfe_args == NULL) {
478*4d9fdb46SRobert Mustacchi         DWARF_P_DBG_ERROR(dbg, DW_DLE_ALLOC_FAIL, DW_DLV_ERROR);
479bc1f688bSRobert Mustacchi     }
480bc1f688bSRobert Mustacchi     ptr = cur->dfe_args;
481bc1f688bSRobert Mustacchi     memcpy((void *) ptr, buffidx, nbytes_idx);
482bc1f688bSRobert Mustacchi     ptr += nbytes_idx;
483bc1f688bSRobert Mustacchi     memcpy((void *) ptr, bufftime, nbytes_time);
484bc1f688bSRobert Mustacchi     ptr += nbytes_time;
485bc1f688bSRobert Mustacchi     memcpy((void *) ptr, bufflen, nbytes_len);
486bc1f688bSRobert Mustacchi     cur->dfe_nbytes = nbytes_idx + nbytes_time + nbytes_len;
487bc1f688bSRobert Mustacchi     cur->dfe_next = NULL;
488*4d9fdb46SRobert Mustacchi     *file_entry_count_out = dbg->de_n_file_entries;
489*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
490bc1f688bSRobert Mustacchi }
491bc1f688bSRobert Mustacchi 
492bc1f688bSRobert Mustacchi 
493*4d9fdb46SRobert Mustacchi /*  Initialize a row of the matrix for line numbers, meaning
494*4d9fdb46SRobert Mustacchi     initialize the struct corresponding to it */
495bc1f688bSRobert Mustacchi void
_dwarf_pro_reg_init(Dwarf_P_Debug dbg,Dwarf_P_Line cur_line)496*4d9fdb46SRobert Mustacchi _dwarf_pro_reg_init(Dwarf_P_Debug dbg, Dwarf_P_Line cur_line)
497bc1f688bSRobert Mustacchi {
498bc1f688bSRobert Mustacchi     cur_line->dpl_address = 0;
499bc1f688bSRobert Mustacchi     cur_line->dpl_file = 1;
500bc1f688bSRobert Mustacchi     cur_line->dpl_line = 1;
501bc1f688bSRobert Mustacchi     cur_line->dpl_column = 0;
502*4d9fdb46SRobert Mustacchi     cur_line->dpl_is_stmt = dbg->de_line_inits.pi_default_is_stmt;
503bc1f688bSRobert Mustacchi     cur_line->dpl_basic_block = false;
504bc1f688bSRobert Mustacchi     cur_line->dpl_next = NULL;
505*4d9fdb46SRobert Mustacchi     cur_line->dpl_prologue_end = 0;
506*4d9fdb46SRobert Mustacchi     cur_line->dpl_epilogue_begin = 0;
507*4d9fdb46SRobert Mustacchi     cur_line->dpl_isa = 0;
508*4d9fdb46SRobert Mustacchi     cur_line->dpl_discriminator = 0;
509*4d9fdb46SRobert Mustacchi     cur_line->dpl_opc = 0;
510bc1f688bSRobert Mustacchi }
511