1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi Copyright (C) 2000-2006 Silicon Graphics, Inc. All Rights Reserved.
3*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2007-2019 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2010-2012 SN Systems Ltd. All Rights Reserved.
5*4d9fdb46SRobert Mustacchi Portions Copyright (C) 2015-2015 Google, Inc. All Rights Reserved.
6bc1f688bSRobert Mustacchi
7bc1f688bSRobert Mustacchi This program is free software; you can redistribute it and/or modify it
8bc1f688bSRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
9bc1f688bSRobert Mustacchi as published by the Free Software Foundation.
10bc1f688bSRobert Mustacchi
11bc1f688bSRobert Mustacchi This program is distributed in the hope that it would be useful, but
12bc1f688bSRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
13bc1f688bSRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14bc1f688bSRobert Mustacchi
15bc1f688bSRobert Mustacchi Further, this software is distributed without any warranty that it is
16bc1f688bSRobert Mustacchi free of the rightful claim of any third person regarding infringement
17bc1f688bSRobert Mustacchi or the like. Any license provided herein, whether implied or
18bc1f688bSRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
19bc1f688bSRobert Mustacchi any, provided herein do not apply to combinations of this program with
20bc1f688bSRobert Mustacchi other software, or any other product whatsoever.
21bc1f688bSRobert Mustacchi
22bc1f688bSRobert Mustacchi You should have received a copy of the GNU Lesser General Public
23bc1f688bSRobert Mustacchi License along with this program; if not, write the Free Software
24bc1f688bSRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
25bc1f688bSRobert Mustacchi USA.
26bc1f688bSRobert Mustacchi
27bc1f688bSRobert Mustacchi */
28bc1f688bSRobert Mustacchi
29bc1f688bSRobert Mustacchi #include "config.h"
30bc1f688bSRobert Mustacchi #include <stdio.h>
31*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
32bc1f688bSRobert Mustacchi #include <stdlib.h>
33*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
34*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
35*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
36*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
38bc1f688bSRobert Mustacchi #include "dwarf_line.h"
39*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
40*4d9fdb46SRobert Mustacchi
41*4d9fdb46SRobert Mustacchi /* Line Register Set initial conditions. */
42*4d9fdb46SRobert Mustacchi static struct Dwarf_Line_Registers_s _dwarf_line_table_regs_default_values = {
43*4d9fdb46SRobert Mustacchi /* Dwarf_Addr lr_address */ 0,
44*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_file */ 1,
45*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_line */ 1,
46*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_column */ 0,
47*4d9fdb46SRobert Mustacchi /* Dwarf_Bool lr_is_stmt */ false,
48*4d9fdb46SRobert Mustacchi /* Dwarf_Bool lr_basic_block */ false,
49*4d9fdb46SRobert Mustacchi /* Dwarf_Bool lr_end_sequence */ false,
50*4d9fdb46SRobert Mustacchi /* Dwarf_Bool lr_prologue_end */ false,
51*4d9fdb46SRobert Mustacchi /* Dwarf_Bool lr_epilogue_begin */ false,
52*4d9fdb46SRobert Mustacchi /* Dwarf_Small lr_isa */ 0,
53*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_op_index */ 0,
54*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_discriminator */ 0,
55*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_call_context */ 0,
56*4d9fdb46SRobert Mustacchi /* Dwarf_Unsigned lr_subprogram */ 0,
57*4d9fdb46SRobert Mustacchi };
58*4d9fdb46SRobert Mustacchi
59*4d9fdb46SRobert Mustacchi void
_dwarf_set_line_table_regs_default_values(Dwarf_Line_Registers regs,unsigned lineversion,Dwarf_Bool is_stmt)60*4d9fdb46SRobert Mustacchi _dwarf_set_line_table_regs_default_values(Dwarf_Line_Registers regs,
61*4d9fdb46SRobert Mustacchi unsigned lineversion,
62*4d9fdb46SRobert Mustacchi Dwarf_Bool is_stmt)
63*4d9fdb46SRobert Mustacchi {
64*4d9fdb46SRobert Mustacchi *regs = _dwarf_line_table_regs_default_values;
65*4d9fdb46SRobert Mustacchi if (lineversion == DW_LINE_VERSION5) {
66*4d9fdb46SRobert Mustacchi /* DWARF5 file base is zero. */
67*4d9fdb46SRobert Mustacchi regs->lr_file = 0;
68*4d9fdb46SRobert Mustacchi }
69*4d9fdb46SRobert Mustacchi regs->lr_is_stmt = is_stmt;
70*4d9fdb46SRobert Mustacchi }
71*4d9fdb46SRobert Mustacchi
72bc1f688bSRobert Mustacchi
73bc1f688bSRobert Mustacchi static int
is_path_separator(Dwarf_Small s)74bc1f688bSRobert Mustacchi is_path_separator(Dwarf_Small s)
75bc1f688bSRobert Mustacchi {
76bc1f688bSRobert Mustacchi if (s == '/') {
77bc1f688bSRobert Mustacchi return 1;
78bc1f688bSRobert Mustacchi }
79bc1f688bSRobert Mustacchi #ifdef HAVE_WINDOWS_PATH
80bc1f688bSRobert Mustacchi if (s == '\\') {
81bc1f688bSRobert Mustacchi return 1;
82bc1f688bSRobert Mustacchi }
83bc1f688bSRobert Mustacchi #endif
84bc1f688bSRobert Mustacchi return 0;
85bc1f688bSRobert Mustacchi }
86bc1f688bSRobert Mustacchi
87bc1f688bSRobert Mustacchi /* Return 0 if false, 1 if true.
88bc1f688bSRobert Mustacchi If HAVE_WINDOWS_PATH is defined we
89bc1f688bSRobert Mustacchi attempt to handle windows full paths:
90bc1f688bSRobert Mustacchi \\something or C:cwdpath.c
91bc1f688bSRobert Mustacchi */
92*4d9fdb46SRobert Mustacchi int
_dwarf_file_name_is_full_path(Dwarf_Small * fname)93*4d9fdb46SRobert Mustacchi _dwarf_file_name_is_full_path(Dwarf_Small *fname)
94bc1f688bSRobert Mustacchi {
95bc1f688bSRobert Mustacchi Dwarf_Small firstc = *fname;
96bc1f688bSRobert Mustacchi if (is_path_separator(firstc)) {
97bc1f688bSRobert Mustacchi /* Full path. */
98bc1f688bSRobert Mustacchi return 1;
99bc1f688bSRobert Mustacchi }
100bc1f688bSRobert Mustacchi if (!firstc) {
101bc1f688bSRobert Mustacchi return 0;
102bc1f688bSRobert Mustacchi }
103*4d9fdb46SRobert Mustacchi /* This is a windows path test, but we do have
104*4d9fdb46SRobert Mustacchi a few windows paths in our regression tests...
105*4d9fdb46SRobert Mustacchi This is extremely unlikely to cause UN*X/POSIX
106*4d9fdb46SRobert Mustacchi users any problems. */
107bc1f688bSRobert Mustacchi if ((firstc >= 'A' && firstc <= 'Z') ||
108bc1f688bSRobert Mustacchi (firstc >= 'a' && firstc <= 'z')) {
109*4d9fdb46SRobert Mustacchi
110bc1f688bSRobert Mustacchi Dwarf_Small secondc = fname[1];
111bc1f688bSRobert Mustacchi if (secondc == ':') {
112bc1f688bSRobert Mustacchi return 1;
113bc1f688bSRobert Mustacchi }
114bc1f688bSRobert Mustacchi }
115*4d9fdb46SRobert Mustacchi /* End Windows style */
116bc1f688bSRobert Mustacchi return 0;
117bc1f688bSRobert Mustacchi }
118*4d9fdb46SRobert Mustacchi #include "dwarf_line_table_reader_common.h"
119bc1f688bSRobert Mustacchi
120*4d9fdb46SRobert Mustacchi static void
special_cat(char * dst,char * src,UNUSEDARG int srclen)121*4d9fdb46SRobert Mustacchi special_cat(char *dst,char *src,
122*4d9fdb46SRobert Mustacchi UNUSEDARG int srclen)
123*4d9fdb46SRobert Mustacchi {
124*4d9fdb46SRobert Mustacchi #if defined (HAVE_WINDOWS_PATH)
125*4d9fdb46SRobert Mustacchi /* Always '/' instead of '\\', this is a Windows -> Unix
126*4d9fdb46SRobert Mustacchi issue. */
127*4d9fdb46SRobert Mustacchi int i1 = 0;
128*4d9fdb46SRobert Mustacchi int i2 = 0;
129*4d9fdb46SRobert Mustacchi
130*4d9fdb46SRobert Mustacchi for ( ; dst[i1] ; ++i1) {
131*4d9fdb46SRobert Mustacchi }
132*4d9fdb46SRobert Mustacchi for (; i2 < srclen; ++i2,++i1) {
133*4d9fdb46SRobert Mustacchi dst[i1] = src[i2];
134*4d9fdb46SRobert Mustacchi if (dst[i1] == '\\') {
135*4d9fdb46SRobert Mustacchi dst[i1] = '/';
136*4d9fdb46SRobert Mustacchi }
137*4d9fdb46SRobert Mustacchi }
138*4d9fdb46SRobert Mustacchi #else
139*4d9fdb46SRobert Mustacchi strcat(dst, src);
140*4d9fdb46SRobert Mustacchi #endif /* HAVE_WINDOWS_PATH */
141*4d9fdb46SRobert Mustacchi return;
142*4d9fdb46SRobert Mustacchi }
143*4d9fdb46SRobert Mustacchi
144*4d9fdb46SRobert Mustacchi /* With this routine we ensure the file full path
145*4d9fdb46SRobert Mustacchi is calculated identically for
146*4d9fdb46SRobert Mustacchi dwarf_srcfiles() and dwarf_filename()
147*4d9fdb46SRobert Mustacchi
148*4d9fdb46SRobert Mustacchi As of March 14 2020 this *always*
149*4d9fdb46SRobert Mustacchi does an allocation for the string. dwarf_dealloc
150*4d9fdb46SRobert Mustacchi is crucial to do no matter what.
151*4d9fdb46SRobert Mustacchi So we have consistency.
152*4d9fdb46SRobert Mustacchi
153*4d9fdb46SRobert Mustacchi dwarf_finish() will do the dealloc if nothing else does.
154*4d9fdb46SRobert Mustacchi Unless the calling application did the call
155*4d9fdb46SRobert Mustacchi dwarf_set_de_alloc_flag(0).
156*4d9fdb46SRobert Mustacchi */
157*4d9fdb46SRobert Mustacchi static int
create_fullest_file_path(Dwarf_Debug dbg,Dwarf_File_Entry fe,Dwarf_Line_Context line_context,char ** name_ptr_out,Dwarf_Error * error)158*4d9fdb46SRobert Mustacchi create_fullest_file_path(Dwarf_Debug dbg,
159*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fe,
160*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context,
161*4d9fdb46SRobert Mustacchi char ** name_ptr_out,
162*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
163*4d9fdb46SRobert Mustacchi {
164*4d9fdb46SRobert Mustacchi Dwarf_Unsigned dirno = 0;
165*4d9fdb46SRobert Mustacchi char *full_name = 0;
166*4d9fdb46SRobert Mustacchi char *file_name = 0;
167*4d9fdb46SRobert Mustacchi
168*4d9fdb46SRobert Mustacchi dirno = fe->fi_dir_index;
169*4d9fdb46SRobert Mustacchi file_name = (char *) fe->fi_file_name;
170*4d9fdb46SRobert Mustacchi if (!file_name) {
171*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME);
172*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
173*4d9fdb46SRobert Mustacchi }
174*4d9fdb46SRobert Mustacchi if (_dwarf_file_name_is_full_path((Dwarf_Small *)file_name)) {
175*4d9fdb46SRobert Mustacchi { unsigned len = strlen(file_name);
176*4d9fdb46SRobert Mustacchi char *tmp = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING,
177*4d9fdb46SRobert Mustacchi len+1);
178*4d9fdb46SRobert Mustacchi if(tmp) {
179*4d9fdb46SRobert Mustacchi tmp[0] = 0;
180*4d9fdb46SRobert Mustacchi special_cat(tmp,file_name,len);
181*4d9fdb46SRobert Mustacchi *name_ptr_out = tmp;
182*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
183*4d9fdb46SRobert Mustacchi }
184*4d9fdb46SRobert Mustacchi _dwarf_error(dbg,error,DW_DLE_ALLOC_FAIL);
185*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
186*4d9fdb46SRobert Mustacchi }
187*4d9fdb46SRobert Mustacchi } else {
188*4d9fdb46SRobert Mustacchi char *comp_dir_name = "";
189*4d9fdb46SRobert Mustacchi char *inc_dir_name = "";
190*4d9fdb46SRobert Mustacchi Dwarf_Unsigned incdirnamelen = 0;
191*4d9fdb46SRobert Mustacchi Dwarf_Unsigned filenamelen = strlen(file_name);
192*4d9fdb46SRobert Mustacchi Dwarf_Unsigned compdirnamelen = 0;
193*4d9fdb46SRobert Mustacchi
194*4d9fdb46SRobert Mustacchi if (line_context->lc_compilation_directory) {
195*4d9fdb46SRobert Mustacchi comp_dir_name =
196*4d9fdb46SRobert Mustacchi (char *)line_context->lc_compilation_directory;
197*4d9fdb46SRobert Mustacchi compdirnamelen = strlen(comp_dir_name);
198*4d9fdb46SRobert Mustacchi }
199*4d9fdb46SRobert Mustacchi
200*4d9fdb46SRobert Mustacchi if (dirno > line_context->lc_include_directories_count) {
201*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_INCL_DIR_NUM_BAD);
202*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
203*4d9fdb46SRobert Mustacchi }
204*4d9fdb46SRobert Mustacchi if (dirno > 0 && fe->fi_dir_index > 0) {
205*4d9fdb46SRobert Mustacchi inc_dir_name = (char *) line_context->lc_include_directories[
206*4d9fdb46SRobert Mustacchi fe->fi_dir_index - 1];
207*4d9fdb46SRobert Mustacchi if (!inc_dir_name) {
208*4d9fdb46SRobert Mustacchi /* This should never ever happen except in case
209*4d9fdb46SRobert Mustacchi of a corrupted object file. */
210*4d9fdb46SRobert Mustacchi inc_dir_name = "<erroneous NULL include dir pointer>";
211*4d9fdb46SRobert Mustacchi }
212*4d9fdb46SRobert Mustacchi incdirnamelen = strlen(inc_dir_name);
213*4d9fdb46SRobert Mustacchi }
214*4d9fdb46SRobert Mustacchi full_name = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING,
215*4d9fdb46SRobert Mustacchi compdirnamelen + 1 +
216*4d9fdb46SRobert Mustacchi incdirnamelen + 1 +
217*4d9fdb46SRobert Mustacchi filenamelen + 1);
218*4d9fdb46SRobert Mustacchi if (full_name == NULL) {
219*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
220*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
221*4d9fdb46SRobert Mustacchi }
222*4d9fdb46SRobert Mustacchi if (fe->fi_dir_index == 0) {
223*4d9fdb46SRobert Mustacchi /* Just use comp dir name */
224*4d9fdb46SRobert Mustacchi if (compdirnamelen > 0) {
225*4d9fdb46SRobert Mustacchi special_cat(full_name,comp_dir_name,compdirnamelen);
226*4d9fdb46SRobert Mustacchi strcat(full_name, "/");
227*4d9fdb46SRobert Mustacchi }
228*4d9fdb46SRobert Mustacchi special_cat(full_name,file_name,filenamelen);
229*4d9fdb46SRobert Mustacchi *name_ptr_out = full_name;
230*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
231*4d9fdb46SRobert Mustacchi }
232*4d9fdb46SRobert Mustacchi if (incdirnamelen > 0 &&
233*4d9fdb46SRobert Mustacchi _dwarf_file_name_is_full_path((Dwarf_Small*)inc_dir_name) ) {
234*4d9fdb46SRobert Mustacchi /* Just use inc dir. */
235*4d9fdb46SRobert Mustacchi special_cat(full_name,inc_dir_name,incdirnamelen);
236*4d9fdb46SRobert Mustacchi strcat(full_name,"/");
237*4d9fdb46SRobert Mustacchi special_cat(full_name,file_name,filenamelen);
238*4d9fdb46SRobert Mustacchi *name_ptr_out = full_name;
239*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
240*4d9fdb46SRobert Mustacchi }
241*4d9fdb46SRobert Mustacchi /* Concat all three names. */
242*4d9fdb46SRobert Mustacchi if (compdirnamelen > 0) {
243*4d9fdb46SRobert Mustacchi special_cat(full_name,comp_dir_name,compdirnamelen);
244*4d9fdb46SRobert Mustacchi strcat(full_name, "/");
245*4d9fdb46SRobert Mustacchi }
246*4d9fdb46SRobert Mustacchi if (incdirnamelen > 0) {
247*4d9fdb46SRobert Mustacchi special_cat(full_name,inc_dir_name,incdirnamelen);
248*4d9fdb46SRobert Mustacchi strcat(full_name, "/");
249*4d9fdb46SRobert Mustacchi }
250*4d9fdb46SRobert Mustacchi special_cat(full_name,file_name,filenamelen);
251*4d9fdb46SRobert Mustacchi }
252*4d9fdb46SRobert Mustacchi *name_ptr_out = full_name;
253*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
254*4d9fdb46SRobert Mustacchi }
255*4d9fdb46SRobert Mustacchi
256*4d9fdb46SRobert Mustacchi /* Although source files is supposed to return the
257bc1f688bSRobert Mustacchi source files in the compilation-unit, it does
258bc1f688bSRobert Mustacchi not look for any in the statement program. In
259bc1f688bSRobert Mustacchi other words, it ignores those defined using the
260bc1f688bSRobert Mustacchi extended opcode DW_LNE_define_file.
261*4d9fdb46SRobert Mustacchi We do not know of a producer that uses DW_LNE_define_file.
262*4d9fdb46SRobert Mustacchi
263*4d9fdb46SRobert Mustacchi In DWARF2,3,4 the array of sourcefiles is represented
264*4d9fdb46SRobert Mustacchi differently than DWARF5.
265*4d9fdb46SRobert Mustacchi DWARF 2,3,4,:
266*4d9fdb46SRobert Mustacchi Take the line number from macro information or lines data
267*4d9fdb46SRobert Mustacchi and subtract 1 to index into srcfiles. Any with line
268*4d9fdb46SRobert Mustacchi number zero can be assumed to refer to DW_AT_name from the
269*4d9fdb46SRobert Mustacchi CU DIE, but zero really means "no file".
270*4d9fdb46SRobert Mustacchi DWARF 5:
271*4d9fdb46SRobert Mustacchi Just like DW4, but index 1 refers to the
272*4d9fdb46SRobert Mustacchi same string as DW_AT_name of the CU DIE.
273bc1f688bSRobert Mustacchi */
274bc1f688bSRobert Mustacchi int
dwarf_srcfiles(Dwarf_Die die,char *** srcfiles,Dwarf_Signed * srcfilecount,Dwarf_Error * error)275bc1f688bSRobert Mustacchi dwarf_srcfiles(Dwarf_Die die,
276bc1f688bSRobert Mustacchi char ***srcfiles,
277bc1f688bSRobert Mustacchi Dwarf_Signed * srcfilecount, Dwarf_Error * error)
278bc1f688bSRobert Mustacchi {
279bc1f688bSRobert Mustacchi /* This pointer is used to scan the portion of the .debug_line
280bc1f688bSRobert Mustacchi section for the current cu. */
281*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr = 0;
282bc1f688bSRobert Mustacchi
283bc1f688bSRobert Mustacchi /* Pointer to a DW_AT_stmt_list attribute in case it exists in the
284bc1f688bSRobert Mustacchi die. */
285*4d9fdb46SRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0;
286bc1f688bSRobert Mustacchi
287*4d9fdb46SRobert Mustacchi const char * const_comp_name = 0;
288bc1f688bSRobert Mustacchi /* Pointer to name of compilation directory. */
289*4d9fdb46SRobert Mustacchi const char * const_comp_dir = 0;
290bc1f688bSRobert Mustacchi Dwarf_Small *comp_dir = 0;
291bc1f688bSRobert Mustacchi
292bc1f688bSRobert Mustacchi /* Offset into .debug_line specified by a DW_AT_stmt_list
293bc1f688bSRobert Mustacchi attribute. */
294bc1f688bSRobert Mustacchi Dwarf_Unsigned line_offset = 0;
295bc1f688bSRobert Mustacchi
296bc1f688bSRobert Mustacchi /* This points to a block of char *'s, each of which points to a
297bc1f688bSRobert Mustacchi file name. */
298bc1f688bSRobert Mustacchi char **ret_files = 0;
299bc1f688bSRobert Mustacchi
300bc1f688bSRobert Mustacchi /* The Dwarf_Debug this die belongs to. */
301bc1f688bSRobert Mustacchi Dwarf_Debug dbg = 0;
302*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context = 0;
303*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context = 0;
304bc1f688bSRobert Mustacchi
305bc1f688bSRobert Mustacchi /* Used to chain the file names. */
306bc1f688bSRobert Mustacchi Dwarf_Chain curr_chain = NULL;
307bc1f688bSRobert Mustacchi Dwarf_Chain prev_chain = NULL;
308bc1f688bSRobert Mustacchi Dwarf_Chain head_chain = NULL;
309*4d9fdb46SRobert Mustacchi
310bc1f688bSRobert Mustacchi Dwarf_Half attrform = 0;
311bc1f688bSRobert Mustacchi int resattr = DW_DLV_ERROR;
312bc1f688bSRobert Mustacchi int lres = DW_DLV_ERROR;
313*4d9fdb46SRobert Mustacchi unsigned i = 0;
314bc1f688bSRobert Mustacchi int res = DW_DLV_ERROR;
315*4d9fdb46SRobert Mustacchi Dwarf_Small *section_start = 0;
316bc1f688bSRobert Mustacchi
317bc1f688bSRobert Mustacchi /* ***** BEGIN CODE ***** */
318bc1f688bSRobert Mustacchi /* Reset error. */
319*4d9fdb46SRobert Mustacchi
320*4d9fdb46SRobert Mustacchi if (error != NULL) {
321bc1f688bSRobert Mustacchi *error = NULL;
322*4d9fdb46SRobert Mustacchi }
323bc1f688bSRobert Mustacchi
324bc1f688bSRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR);
325*4d9fdb46SRobert Mustacchi context = die->di_cu_context;
326*4d9fdb46SRobert Mustacchi dbg = context->cc_dbg;
327bc1f688bSRobert Mustacchi
328bc1f688bSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
329bc1f688bSRobert Mustacchi if (resattr != DW_DLV_OK) {
330bc1f688bSRobert Mustacchi return resattr;
331bc1f688bSRobert Mustacchi }
332bc1f688bSRobert Mustacchi
333bc1f688bSRobert Mustacchi if (dbg->de_debug_line.dss_index == 0) {
334*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
335bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_DEBUG_LINE_NULL);
336bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
337bc1f688bSRobert Mustacchi }
338bc1f688bSRobert Mustacchi
339bc1f688bSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
340bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) {
341*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
342bc1f688bSRobert Mustacchi return res;
343bc1f688bSRobert Mustacchi }
344*4d9fdb46SRobert Mustacchi if (!dbg->de_debug_line.dss_size) {
345*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
346*4d9fdb46SRobert Mustacchi return (DW_DLV_NO_ENTRY);
347*4d9fdb46SRobert Mustacchi }
348*4d9fdb46SRobert Mustacchi section_start = dbg->de_debug_line.dss_data;
349bc1f688bSRobert Mustacchi
350bc1f688bSRobert Mustacchi lres = dwarf_whatform(stmt_list_attr,&attrform,error);
351bc1f688bSRobert Mustacchi if (lres != DW_DLV_OK) {
352*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
353bc1f688bSRobert Mustacchi return lres;
354bc1f688bSRobert Mustacchi }
355bc1f688bSRobert Mustacchi if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
356*4d9fdb46SRobert Mustacchi attrform != DW_FORM_sec_offset &&
357*4d9fdb46SRobert Mustacchi attrform != DW_FORM_GNU_ref_alt) {
358*4d9fdb46SRobert Mustacchi dwarfstring m;
359*4d9fdb46SRobert Mustacchi dwarfstring f;
360*4d9fdb46SRobert Mustacchi const char *formname = 0;
361*4d9fdb46SRobert Mustacchi
362*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&f);
363*4d9fdb46SRobert Mustacchi dwarf_get_FORM_name(attrform,&formname);
364*4d9fdb46SRobert Mustacchi if (!formname) {
365*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&f,"Invalid Form Code "
366*4d9fdb46SRobert Mustacchi " 0x" DW_PR_DUx,attrform);
367*4d9fdb46SRobert Mustacchi } else {
368*4d9fdb46SRobert Mustacchi dwarfstring_append(&f,(char *)formname);
369*4d9fdb46SRobert Mustacchi }
370*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
371*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m);
372*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_s(&m,
373*4d9fdb46SRobert Mustacchi "DW_DLE_LINE_OFFSET_WRONG_FORM: form %s "
374*4d9fdb46SRobert Mustacchi "instead of an allowed section offset form.",
375*4d9fdb46SRobert Mustacchi dwarfstring_string(&f));
376*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error, DW_DLE_LINE_OFFSET_WRONG_FORM,
377*4d9fdb46SRobert Mustacchi dwarfstring_string(&m));
378*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m);
379*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&f);
380bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
381bc1f688bSRobert Mustacchi }
382bc1f688bSRobert Mustacchi lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
383bc1f688bSRobert Mustacchi if (lres != DW_DLV_OK) {
384*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
385bc1f688bSRobert Mustacchi return lres;
386bc1f688bSRobert Mustacchi }
387bc1f688bSRobert Mustacchi if (line_offset >= dbg->de_debug_line.dss_size) {
388*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
389bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
390bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
391bc1f688bSRobert Mustacchi }
392bc1f688bSRobert Mustacchi line_ptr = dbg->de_debug_line.dss_data + line_offset;
393*4d9fdb46SRobert Mustacchi {
394*4d9fdb46SRobert Mustacchi Dwarf_Unsigned fission_offset = 0;
395*4d9fdb46SRobert Mustacchi Dwarf_Unsigned fission_size = 0;
396*4d9fdb46SRobert Mustacchi int resl = _dwarf_get_fission_addition_die(die, DW_SECT_LINE,
397*4d9fdb46SRobert Mustacchi &fission_offset,&fission_size,error);
398*4d9fdb46SRobert Mustacchi if(resl != DW_DLV_OK) {
399bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
400*4d9fdb46SRobert Mustacchi return resl;
401*4d9fdb46SRobert Mustacchi }
402*4d9fdb46SRobert Mustacchi line_ptr += fission_offset;
403*4d9fdb46SRobert Mustacchi if (line_ptr > dbg->de_debug_line.dss_data +
404*4d9fdb46SRobert Mustacchi dbg->de_debug_line.dss_size) {
405*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
406*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_FISSION_ADDITION_ERROR);
407*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
408*4d9fdb46SRobert Mustacchi }
409*4d9fdb46SRobert Mustacchi }
410*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
411*4d9fdb46SRobert Mustacchi stmt_list_attr = 0;
412bc1f688bSRobert Mustacchi
413*4d9fdb46SRobert Mustacchi resattr = _dwarf_internal_get_die_comp_dir(die, &const_comp_dir,
414*4d9fdb46SRobert Mustacchi &const_comp_name,error);
415bc1f688bSRobert Mustacchi if (resattr == DW_DLV_ERROR) {
416bc1f688bSRobert Mustacchi return resattr;
417bc1f688bSRobert Mustacchi }
418bc1f688bSRobert Mustacchi
419*4d9fdb46SRobert Mustacchi /* Horrible cast away const to match historical interfaces. */
420*4d9fdb46SRobert Mustacchi comp_dir = (Dwarf_Small *)const_comp_dir;
421*4d9fdb46SRobert Mustacchi line_context = (Dwarf_Line_Context)
422*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1);
423*4d9fdb46SRobert Mustacchi if (line_context == NULL) {
424*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
425*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
426bc1f688bSRobert Mustacchi }
427*4d9fdb46SRobert Mustacchi line_context->lc_new_style_access = false;
428*4d9fdb46SRobert Mustacchi /* We are in dwarf_srcfiles() */
429bc1f688bSRobert Mustacchi {
430bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr_out = 0;
431*4d9fdb46SRobert Mustacchi int dres = 0;
432*4d9fdb46SRobert Mustacchi
433*4d9fdb46SRobert Mustacchi dres = _dwarf_read_line_table_header(dbg,
434*4d9fdb46SRobert Mustacchi context,
435*4d9fdb46SRobert Mustacchi section_start,
436bc1f688bSRobert Mustacchi line_ptr,
437bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size,
438bc1f688bSRobert Mustacchi &line_ptr_out,
439*4d9fdb46SRobert Mustacchi line_context,
440bc1f688bSRobert Mustacchi NULL, NULL,error,
441bc1f688bSRobert Mustacchi 0);
442bc1f688bSRobert Mustacchi
443bc1f688bSRobert Mustacchi if (dres == DW_DLV_ERROR) {
444*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
445*4d9fdb46SRobert Mustacchi line_context = 0;
446bc1f688bSRobert Mustacchi return dres;
447bc1f688bSRobert Mustacchi }
448bc1f688bSRobert Mustacchi if (dres == DW_DLV_NO_ENTRY) {
449*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
450*4d9fdb46SRobert Mustacchi line_context = 0;
451bc1f688bSRobert Mustacchi return dres;
452bc1f688bSRobert Mustacchi }
453bc1f688bSRobert Mustacchi }
454*4d9fdb46SRobert Mustacchi /* For DWARF5, use of DW_AT_comp_dir not needed.
455*4d9fdb46SRobert Mustacchi Line table file names and directories
456*4d9fdb46SRobert Mustacchi start with comp_dir and name. FIXME DWARF5 */
457*4d9fdb46SRobert Mustacchi line_context->lc_compilation_directory = comp_dir;
458*4d9fdb46SRobert Mustacchi /* We are in dwarf_srcfiles() */
459*4d9fdb46SRobert Mustacchi {
460*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fe = 0;
461*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fe2 =line_context->lc_file_entries;
462*4d9fdb46SRobert Mustacchi Dwarf_Signed baseindex = 0;
463*4d9fdb46SRobert Mustacchi Dwarf_Signed file_count = 0;
464*4d9fdb46SRobert Mustacchi Dwarf_Signed endindex = 0;
465bc1f688bSRobert Mustacchi
466*4d9fdb46SRobert Mustacchi res = dwarf_srclines_files_indexes(line_context, &baseindex,
467*4d9fdb46SRobert Mustacchi &file_count, &endindex, error);
468*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
469*4d9fdb46SRobert Mustacchi return res;
470bc1f688bSRobert Mustacchi }
471*4d9fdb46SRobert Mustacchi for (i = baseindex; i < endindex; ++i,fe2 = fe->fi_next ) {
472*4d9fdb46SRobert Mustacchi int sres = 0;
473*4d9fdb46SRobert Mustacchi char *name_out = 0;
474bc1f688bSRobert Mustacchi
475*4d9fdb46SRobert Mustacchi fe = fe2;
476*4d9fdb46SRobert Mustacchi sres = create_fullest_file_path(dbg,fe,line_context,
477*4d9fdb46SRobert Mustacchi &name_out,error);
478*4d9fdb46SRobert Mustacchi if (sres != DW_DLV_OK) {
479*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
480*4d9fdb46SRobert Mustacchi /* This can leak some strings */
481*4d9fdb46SRobert Mustacchi return sres;
482bc1f688bSRobert Mustacchi }
483bc1f688bSRobert Mustacchi curr_chain =
484bc1f688bSRobert Mustacchi (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
485bc1f688bSRobert Mustacchi if (curr_chain == NULL) {
486*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
487bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
488bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
489bc1f688bSRobert Mustacchi }
490*4d9fdb46SRobert Mustacchi curr_chain->ch_item = name_out;
491*4d9fdb46SRobert Mustacchi if (head_chain == NULL) {
492bc1f688bSRobert Mustacchi head_chain = prev_chain = curr_chain;
493*4d9fdb46SRobert Mustacchi } else {
494bc1f688bSRobert Mustacchi prev_chain->ch_next = curr_chain;
495bc1f688bSRobert Mustacchi prev_chain = curr_chain;
496bc1f688bSRobert Mustacchi }
497bc1f688bSRobert Mustacchi }
498bc1f688bSRobert Mustacchi }
499*4d9fdb46SRobert Mustacchi if (!head_chain) {
500*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
501bc1f688bSRobert Mustacchi *srcfiles = NULL;
502bc1f688bSRobert Mustacchi *srcfilecount = 0;
503*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
504*4d9fdb46SRobert Mustacchi }
505*4d9fdb46SRobert Mustacchi
506*4d9fdb46SRobert Mustacchi /* We are in dwarf_srcfiles() */
507*4d9fdb46SRobert Mustacchi if (line_context->lc_file_entry_count == 0) {
508*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
509*4d9fdb46SRobert Mustacchi *srcfiles = NULL;
510*4d9fdb46SRobert Mustacchi *srcfilecount = 0;
511*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
512bc1f688bSRobert Mustacchi }
513bc1f688bSRobert Mustacchi
514bc1f688bSRobert Mustacchi ret_files = (char **)
515*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LIST,
516*4d9fdb46SRobert Mustacchi line_context->lc_file_entry_count);
517bc1f688bSRobert Mustacchi if (ret_files == NULL) {
518*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
519bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
520bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
521bc1f688bSRobert Mustacchi }
522bc1f688bSRobert Mustacchi
523bc1f688bSRobert Mustacchi curr_chain = head_chain;
524*4d9fdb46SRobert Mustacchi for (i = 0; i < line_context->lc_file_entry_count; i++) {
525bc1f688bSRobert Mustacchi *(ret_files + i) = curr_chain->ch_item;
526*4d9fdb46SRobert Mustacchi curr_chain->ch_item = 0;
527bc1f688bSRobert Mustacchi prev_chain = curr_chain;
528bc1f688bSRobert Mustacchi curr_chain = curr_chain->ch_next;
529bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN);
530bc1f688bSRobert Mustacchi }
531*4d9fdb46SRobert Mustacchi /* Our chain is not recorded in the line_context so
532*4d9fdb46SRobert Mustacchi the line_context destructor will not destroy our
533*4d9fdb46SRobert Mustacchi list of strings or our strings.
534*4d9fdb46SRobert Mustacchi Our caller has to do the deallocations. */
535bc1f688bSRobert Mustacchi *srcfiles = ret_files;
536*4d9fdb46SRobert Mustacchi *srcfilecount = line_context->lc_file_entry_count;
537*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
538bc1f688bSRobert Mustacchi return (DW_DLV_OK);
539bc1f688bSRobert Mustacchi }
540bc1f688bSRobert Mustacchi
541bc1f688bSRobert Mustacchi
542*4d9fdb46SRobert Mustacchi
543*4d9fdb46SRobert Mustacchi /* Return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR
544*4d9fdb46SRobert Mustacchi doaddrs is true iff this is being called for SGI IRIX rqs processing
545*4d9fdb46SRobert Mustacchi (ie, not a normal libdwarf dwarf_srclines or two-level user call at all).
546*4d9fdb46SRobert Mustacchi dolines is true iff this is called by a dwarf_srclines call.
547*4d9fdb46SRobert Mustacchi
548*4d9fdb46SRobert Mustacchi In case of error or NO_ENTRY in this code we use the
549*4d9fdb46SRobert Mustacchi dwarf_srcline_dealloc(line_context)
550*4d9fdb46SRobert Mustacchi and dealloc of DW_DLA_LINE_CONTEXT
551*4d9fdb46SRobert Mustacchi from the new interface for uniformity here.
552bc1f688bSRobert Mustacchi */
553*4d9fdb46SRobert Mustacchi
554bc1f688bSRobert Mustacchi int
_dwarf_internal_srclines(Dwarf_Die die,Dwarf_Bool is_new_interface,Dwarf_Unsigned * version,Dwarf_Small * table_count,Dwarf_Line_Context * line_context_out,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Line ** linebuf_actuals,Dwarf_Signed * linecount_actuals,Dwarf_Bool doaddrs,Dwarf_Bool dolines,Dwarf_Error * error)555bc1f688bSRobert Mustacchi _dwarf_internal_srclines(Dwarf_Die die,
556*4d9fdb46SRobert Mustacchi Dwarf_Bool is_new_interface,
557*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * version,
558*4d9fdb46SRobert Mustacchi Dwarf_Small * table_count, /* returns 0,1, or 2 */
559*4d9fdb46SRobert Mustacchi Dwarf_Line_Context *line_context_out,
560bc1f688bSRobert Mustacchi Dwarf_Line ** linebuf,
561*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount,
562*4d9fdb46SRobert Mustacchi Dwarf_Line ** linebuf_actuals,
563*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount_actuals,
564bc1f688bSRobert Mustacchi Dwarf_Bool doaddrs,
565*4d9fdb46SRobert Mustacchi Dwarf_Bool dolines,
566*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
567bc1f688bSRobert Mustacchi {
568bc1f688bSRobert Mustacchi /* This pointer is used to scan the portion of the .debug_line
569bc1f688bSRobert Mustacchi section for the current cu. */
570bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr = 0;
571bc1f688bSRobert Mustacchi
572bc1f688bSRobert Mustacchi /* This points to the last byte of the .debug_line portion for the
573bc1f688bSRobert Mustacchi current cu. */
574bc1f688bSRobert Mustacchi Dwarf_Small *line_ptr_end = 0;
575bc1f688bSRobert Mustacchi
576*4d9fdb46SRobert Mustacchi /* For two-level line tables, this points to the first byte of the
577*4d9fdb46SRobert Mustacchi actuals table (and the end of the logicals table) for the current
578*4d9fdb46SRobert Mustacchi cu. */
579*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr_actuals = 0;
580*4d9fdb46SRobert Mustacchi Dwarf_Small *section_start = 0;
581*4d9fdb46SRobert Mustacchi Dwarf_Small *section_end = 0;
582*4d9fdb46SRobert Mustacchi
583bc1f688bSRobert Mustacchi /* Pointer to a DW_AT_stmt_list attribute in case it exists in the
584bc1f688bSRobert Mustacchi die. */
585bc1f688bSRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0;
586bc1f688bSRobert Mustacchi
587*4d9fdb46SRobert Mustacchi const char * const_comp_name = 0;
588bc1f688bSRobert Mustacchi /* Pointer to name of compilation directory. */
589*4d9fdb46SRobert Mustacchi const char * const_comp_dir = NULL;
590bc1f688bSRobert Mustacchi Dwarf_Small *comp_dir = NULL;
591bc1f688bSRobert Mustacchi
592bc1f688bSRobert Mustacchi /* Offset into .debug_line specified by a DW_AT_stmt_list
593bc1f688bSRobert Mustacchi attribute. */
594bc1f688bSRobert Mustacchi Dwarf_Unsigned line_offset = 0;
595bc1f688bSRobert Mustacchi
596bc1f688bSRobert Mustacchi /* Pointer to a Dwarf_Line_Context_s structure that contains the
597bc1f688bSRobert Mustacchi context such as file names and include directories for the set
598*4d9fdb46SRobert Mustacchi of lines being generated.
599*4d9fdb46SRobert Mustacchi This is always recorded on an
600*4d9fdb46SRobert Mustacchi DW_LNS_end_sequence operator,
601*4d9fdb46SRobert Mustacchi on all special opcodes, and on DW_LNS_copy.
602*4d9fdb46SRobert Mustacchi */
603bc1f688bSRobert Mustacchi Dwarf_Line_Context line_context = 0;
604*4d9fdb46SRobert Mustacchi Dwarf_CU_Context cu_context = 0;
605*4d9fdb46SRobert Mustacchi Dwarf_Unsigned fission_offset = 0;
606bc1f688bSRobert Mustacchi
607bc1f688bSRobert Mustacchi /* The Dwarf_Debug this die belongs to. */
608bc1f688bSRobert Mustacchi Dwarf_Debug dbg = 0;
609bc1f688bSRobert Mustacchi int resattr = DW_DLV_ERROR;
610bc1f688bSRobert Mustacchi int lres = DW_DLV_ERROR;
611bc1f688bSRobert Mustacchi Dwarf_Half address_size = 0;
612*4d9fdb46SRobert Mustacchi Dwarf_Small * orig_line_ptr = 0;
613bc1f688bSRobert Mustacchi
614bc1f688bSRobert Mustacchi int res = DW_DLV_ERROR;
615bc1f688bSRobert Mustacchi
616bc1f688bSRobert Mustacchi /* ***** BEGIN CODE ***** */
617*4d9fdb46SRobert Mustacchi if (error != NULL) {
618bc1f688bSRobert Mustacchi *error = NULL;
619*4d9fdb46SRobert Mustacchi }
620bc1f688bSRobert Mustacchi
621bc1f688bSRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR);
622*4d9fdb46SRobert Mustacchi cu_context = die->di_cu_context;
623*4d9fdb46SRobert Mustacchi dbg = cu_context->cc_dbg;
624bc1f688bSRobert Mustacchi
625bc1f688bSRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
626bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) {
627bc1f688bSRobert Mustacchi return res;
628bc1f688bSRobert Mustacchi }
629*4d9fdb46SRobert Mustacchi if (!dbg->de_debug_line.dss_size) {
630*4d9fdb46SRobert Mustacchi return (DW_DLV_NO_ENTRY);
631*4d9fdb46SRobert Mustacchi }
632*4d9fdb46SRobert Mustacchi
633bc1f688bSRobert Mustacchi address_size = _dwarf_get_address_size(dbg, die);
634bc1f688bSRobert Mustacchi resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
635bc1f688bSRobert Mustacchi if (resattr != DW_DLV_OK) {
636bc1f688bSRobert Mustacchi return resattr;
637bc1f688bSRobert Mustacchi }
638*4d9fdb46SRobert Mustacchi lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
639bc1f688bSRobert Mustacchi if (lres != DW_DLV_OK) {
640*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
641bc1f688bSRobert Mustacchi return lres;
642bc1f688bSRobert Mustacchi }
643bc1f688bSRobert Mustacchi
644bc1f688bSRobert Mustacchi if (line_offset >= dbg->de_debug_line.dss_size) {
645*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
646bc1f688bSRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
647bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
648bc1f688bSRobert Mustacchi }
649*4d9fdb46SRobert Mustacchi section_start = dbg->de_debug_line.dss_data;
650*4d9fdb46SRobert Mustacchi section_end = section_start +dbg->de_debug_line.dss_size;
651*4d9fdb46SRobert Mustacchi {
652*4d9fdb46SRobert Mustacchi Dwarf_Unsigned fission_size = 0;
653*4d9fdb46SRobert Mustacchi int resf = _dwarf_get_fission_addition_die(die, DW_SECT_LINE,
654*4d9fdb46SRobert Mustacchi &fission_offset,&fission_size,error);
655*4d9fdb46SRobert Mustacchi if(resf != DW_DLV_OK) {
656bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
657*4d9fdb46SRobert Mustacchi return resf;
658*4d9fdb46SRobert Mustacchi }
659*4d9fdb46SRobert Mustacchi line_ptr += fission_offset;
660*4d9fdb46SRobert Mustacchi if (line_ptr > section_end) {
661*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_FISSION_ADDITION_ERROR);
662*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
663*4d9fdb46SRobert Mustacchi }
664*4d9fdb46SRobert Mustacchi }
665*4d9fdb46SRobert Mustacchi
666*4d9fdb46SRobert Mustacchi section_start = dbg->de_debug_line.dss_data;
667*4d9fdb46SRobert Mustacchi section_end = section_start +dbg->de_debug_line.dss_size;
668*4d9fdb46SRobert Mustacchi orig_line_ptr = section_start + line_offset + fission_offset;
669*4d9fdb46SRobert Mustacchi line_ptr = orig_line_ptr;
670*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
671*4d9fdb46SRobert Mustacchi if ((line_offset + fission_offset) > dbg->de_debug_line.dss_size) {
672*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
673*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
674*4d9fdb46SRobert Mustacchi }
675*4d9fdb46SRobert Mustacchi if (line_ptr > section_end) {
676*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
677*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
678*4d9fdb46SRobert Mustacchi }
679bc1f688bSRobert Mustacchi
680bc1f688bSRobert Mustacchi /* If die has DW_AT_comp_dir attribute, get the string that names
681bc1f688bSRobert Mustacchi the compilation directory. */
682*4d9fdb46SRobert Mustacchi resattr = _dwarf_internal_get_die_comp_dir(die, &const_comp_dir,
683*4d9fdb46SRobert Mustacchi &const_comp_name,error);
684bc1f688bSRobert Mustacchi if (resattr == DW_DLV_ERROR) {
685bc1f688bSRobert Mustacchi return resattr;
686bc1f688bSRobert Mustacchi }
687*4d9fdb46SRobert Mustacchi /* Horrible cast to match historic interfaces. */
688*4d9fdb46SRobert Mustacchi comp_dir = (Dwarf_Small *)const_comp_dir;
689*4d9fdb46SRobert Mustacchi line_context = (Dwarf_Line_Context)
690*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1);
691*4d9fdb46SRobert Mustacchi if (line_context == NULL) {
692*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
693*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
694bc1f688bSRobert Mustacchi }
695*4d9fdb46SRobert Mustacchi line_context->lc_new_style_access = is_new_interface;
696*4d9fdb46SRobert Mustacchi line_context->lc_compilation_directory = comp_dir;
697*4d9fdb46SRobert Mustacchi /* We are in dwarf_internal_srclines() */
698bc1f688bSRobert Mustacchi {
699bc1f688bSRobert Mustacchi Dwarf_Small *newlinep = 0;
700*4d9fdb46SRobert Mustacchi int resp = _dwarf_read_line_table_header(dbg,
701*4d9fdb46SRobert Mustacchi cu_context,
702*4d9fdb46SRobert Mustacchi section_start,
703bc1f688bSRobert Mustacchi line_ptr,
704bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size,
705bc1f688bSRobert Mustacchi &newlinep,
706*4d9fdb46SRobert Mustacchi line_context,
707bc1f688bSRobert Mustacchi NULL,NULL,
708bc1f688bSRobert Mustacchi error,
709bc1f688bSRobert Mustacchi 0);
710bc1f688bSRobert Mustacchi
711*4d9fdb46SRobert Mustacchi if (resp == DW_DLV_ERROR) {
712*4d9fdb46SRobert Mustacchi if(is_new_interface) {
713*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(line_context);
714*4d9fdb46SRobert Mustacchi } else {
715*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
716bc1f688bSRobert Mustacchi }
717*4d9fdb46SRobert Mustacchi return resp;
718bc1f688bSRobert Mustacchi }
719*4d9fdb46SRobert Mustacchi if (resp == DW_DLV_NO_ENTRY) {
720*4d9fdb46SRobert Mustacchi if(is_new_interface) {
721*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(line_context);
722*4d9fdb46SRobert Mustacchi } else {
723*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
724*4d9fdb46SRobert Mustacchi }
725*4d9fdb46SRobert Mustacchi return resp;
726*4d9fdb46SRobert Mustacchi }
727*4d9fdb46SRobert Mustacchi line_ptr_end = line_context->lc_line_ptr_end;
728bc1f688bSRobert Mustacchi line_ptr = newlinep;
729*4d9fdb46SRobert Mustacchi if (line_context->lc_actuals_table_offset > 0) {
730*4d9fdb46SRobert Mustacchi line_ptr_actuals = line_context->lc_line_prologue_start +
731*4d9fdb46SRobert Mustacchi line_context->lc_actuals_table_offset;
732bc1f688bSRobert Mustacchi }
733bc1f688bSRobert Mustacchi }
734bc1f688bSRobert Mustacchi
735bc1f688bSRobert Mustacchi
736*4d9fdb46SRobert Mustacchi if (line_ptr_actuals == 0) {
737*4d9fdb46SRobert Mustacchi /* ASSERT: lc_table_count == 1 or lc_table_count == 0 */
738*4d9fdb46SRobert Mustacchi int err_count_out = 0;
739*4d9fdb46SRobert Mustacchi /* Normal style (single level) line table. */
740*4d9fdb46SRobert Mustacchi Dwarf_Bool is_actuals_table = false;
741*4d9fdb46SRobert Mustacchi Dwarf_Bool local_is_single_table = true;
742*4d9fdb46SRobert Mustacchi res = read_line_table_program(dbg,
743*4d9fdb46SRobert Mustacchi line_ptr, line_ptr_end, orig_line_ptr,
744*4d9fdb46SRobert Mustacchi section_start,
745*4d9fdb46SRobert Mustacchi line_context,
746*4d9fdb46SRobert Mustacchi address_size, doaddrs, dolines,
747*4d9fdb46SRobert Mustacchi local_is_single_table,
748*4d9fdb46SRobert Mustacchi is_actuals_table,
749*4d9fdb46SRobert Mustacchi error,
750*4d9fdb46SRobert Mustacchi &err_count_out);
751*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
752*4d9fdb46SRobert Mustacchi if(is_new_interface) {
753*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(line_context);
754*4d9fdb46SRobert Mustacchi } else {
755*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
756bc1f688bSRobert Mustacchi }
757*4d9fdb46SRobert Mustacchi return res;
758bc1f688bSRobert Mustacchi }
759*4d9fdb46SRobert Mustacchi if (linebuf)
760*4d9fdb46SRobert Mustacchi *linebuf = line_context->lc_linebuf_logicals;
761*4d9fdb46SRobert Mustacchi if (linecount)
762*4d9fdb46SRobert Mustacchi *linecount = line_context->lc_linecount_logicals;
763*4d9fdb46SRobert Mustacchi if (linebuf_actuals) {
764*4d9fdb46SRobert Mustacchi *linebuf_actuals = NULL;
765*4d9fdb46SRobert Mustacchi }
766*4d9fdb46SRobert Mustacchi if (linecount_actuals) {
767*4d9fdb46SRobert Mustacchi *linecount_actuals = 0;
768*4d9fdb46SRobert Mustacchi }
769*4d9fdb46SRobert Mustacchi } else {
770*4d9fdb46SRobert Mustacchi Dwarf_Bool is_actuals_table = false;
771*4d9fdb46SRobert Mustacchi Dwarf_Bool local2_is_single_table = false;
772*4d9fdb46SRobert Mustacchi int err_count_out = 0;
773*4d9fdb46SRobert Mustacchi
774*4d9fdb46SRobert Mustacchi line_context->lc_is_single_table = false;
775*4d9fdb46SRobert Mustacchi /* Two-level line table.
776*4d9fdb46SRobert Mustacchi First read the logicals table. */
777*4d9fdb46SRobert Mustacchi res = read_line_table_program(dbg,
778*4d9fdb46SRobert Mustacchi line_ptr, line_ptr_actuals, orig_line_ptr,
779*4d9fdb46SRobert Mustacchi section_start,
780*4d9fdb46SRobert Mustacchi line_context,
781*4d9fdb46SRobert Mustacchi address_size, doaddrs, dolines,
782*4d9fdb46SRobert Mustacchi local2_is_single_table,
783*4d9fdb46SRobert Mustacchi is_actuals_table, error,
784*4d9fdb46SRobert Mustacchi &err_count_out);
785*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
786*4d9fdb46SRobert Mustacchi if(is_new_interface) {
787*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(line_context);
788*4d9fdb46SRobert Mustacchi } else {
789*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
790*4d9fdb46SRobert Mustacchi }
791*4d9fdb46SRobert Mustacchi return res;
792*4d9fdb46SRobert Mustacchi }
793*4d9fdb46SRobert Mustacchi if (linebuf) {
794*4d9fdb46SRobert Mustacchi *linebuf = line_context->lc_linebuf_logicals;
795*4d9fdb46SRobert Mustacchi } else {
796*4d9fdb46SRobert Mustacchi }
797*4d9fdb46SRobert Mustacchi if (linecount) {
798*4d9fdb46SRobert Mustacchi *linecount = line_context->lc_linecount_logicals;
799*4d9fdb46SRobert Mustacchi }
800*4d9fdb46SRobert Mustacchi if (is_new_interface) {
801*4d9fdb46SRobert Mustacchi /* ASSERT: linebuf_actuals == NULL */
802*4d9fdb46SRobert Mustacchi is_actuals_table = true;
803*4d9fdb46SRobert Mustacchi /* The call requested an actuals table
804*4d9fdb46SRobert Mustacchi and one is present. So now read that one. */
805*4d9fdb46SRobert Mustacchi res = read_line_table_program(dbg,
806*4d9fdb46SRobert Mustacchi
807*4d9fdb46SRobert Mustacchi line_ptr_actuals, line_ptr_end, orig_line_ptr,
808*4d9fdb46SRobert Mustacchi section_start,
809*4d9fdb46SRobert Mustacchi line_context,
810*4d9fdb46SRobert Mustacchi address_size, doaddrs, dolines,
811*4d9fdb46SRobert Mustacchi local2_is_single_table,
812*4d9fdb46SRobert Mustacchi is_actuals_table, error,
813*4d9fdb46SRobert Mustacchi &err_count_out);
814*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
815*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(line_context);
816*4d9fdb46SRobert Mustacchi return res;
817*4d9fdb46SRobert Mustacchi }
818*4d9fdb46SRobert Mustacchi if (linebuf_actuals) {
819*4d9fdb46SRobert Mustacchi *linebuf_actuals = line_context->lc_linebuf_actuals;
820*4d9fdb46SRobert Mustacchi }
821*4d9fdb46SRobert Mustacchi if (linecount_actuals != NULL) {
822*4d9fdb46SRobert Mustacchi *linecount_actuals = line_context->lc_linecount_actuals;
823bc1f688bSRobert Mustacchi }
824bc1f688bSRobert Mustacchi }
825bc1f688bSRobert Mustacchi }
826*4d9fdb46SRobert Mustacchi if (!is_new_interface && linecount &&
827*4d9fdb46SRobert Mustacchi (linecount == 0 ||*linecount == 0) &&
828*4d9fdb46SRobert Mustacchi (linecount_actuals == 0 || *linecount_actuals == 0)) {
829*4d9fdb46SRobert Mustacchi /* Here we have no actual lines of any kind. In other words,
830*4d9fdb46SRobert Mustacchi it looks like a debugfission line table skeleton or
831*4d9fdb46SRobert Mustacchi a caller not prepared for skeletons or two-level reading..
832*4d9fdb46SRobert Mustacchi In that case there are no line entries so the context
833*4d9fdb46SRobert Mustacchi had nowhere to be recorded. Hence we have to delete it
834*4d9fdb46SRobert Mustacchi else we would leak the context. */
835*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
836*4d9fdb46SRobert Mustacchi line_context = 0;
837*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
838bc1f688bSRobert Mustacchi }
839*4d9fdb46SRobert Mustacchi *table_count = line_context->lc_table_count;
840*4d9fdb46SRobert Mustacchi if (version != NULL) {
841*4d9fdb46SRobert Mustacchi *version = line_context->lc_version_number;
842bc1f688bSRobert Mustacchi }
843*4d9fdb46SRobert Mustacchi *line_context_out = line_context;
844bc1f688bSRobert Mustacchi return (DW_DLV_OK);
845bc1f688bSRobert Mustacchi }
846bc1f688bSRobert Mustacchi
847bc1f688bSRobert Mustacchi int
dwarf_get_ranges_section_name(Dwarf_Debug dbg,const char ** section_name_out,Dwarf_Error * error)848*4d9fdb46SRobert Mustacchi dwarf_get_ranges_section_name(Dwarf_Debug dbg,
849*4d9fdb46SRobert Mustacchi const char **section_name_out,
850*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
851*4d9fdb46SRobert Mustacchi {
852*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *sec = 0;
853*4d9fdb46SRobert Mustacchi if (error != NULL) {
854*4d9fdb46SRobert Mustacchi *error = NULL;
855*4d9fdb46SRobert Mustacchi }
856*4d9fdb46SRobert Mustacchi sec = &dbg->de_debug_ranges;
857*4d9fdb46SRobert Mustacchi if (sec->dss_size == 0) {
858*4d9fdb46SRobert Mustacchi /* We don't have such a section at all. */
859*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
860*4d9fdb46SRobert Mustacchi }
861*4d9fdb46SRobert Mustacchi *section_name_out = sec->dss_name;
862*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
863*4d9fdb46SRobert Mustacchi }
864*4d9fdb46SRobert Mustacchi
865*4d9fdb46SRobert Mustacchi int
dwarf_get_aranges_section_name(Dwarf_Debug dbg,const char ** section_name_out,Dwarf_Error * error)866*4d9fdb46SRobert Mustacchi dwarf_get_aranges_section_name(Dwarf_Debug dbg,
867*4d9fdb46SRobert Mustacchi const char **section_name_out,
868*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
869*4d9fdb46SRobert Mustacchi {
870*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *sec = 0;
871*4d9fdb46SRobert Mustacchi if (error != NULL) {
872*4d9fdb46SRobert Mustacchi *error = NULL;
873*4d9fdb46SRobert Mustacchi }
874*4d9fdb46SRobert Mustacchi sec = &dbg->de_debug_aranges;
875*4d9fdb46SRobert Mustacchi if (sec->dss_size == 0) {
876*4d9fdb46SRobert Mustacchi /* We don't have such a section at all. */
877*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
878*4d9fdb46SRobert Mustacchi }
879*4d9fdb46SRobert Mustacchi *section_name_out = sec->dss_name;
880*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
881*4d9fdb46SRobert Mustacchi }
882*4d9fdb46SRobert Mustacchi
883*4d9fdb46SRobert Mustacchi int
dwarf_get_line_section_name_from_die(Dwarf_Die die,const char ** section_name_out,Dwarf_Error * error)884*4d9fdb46SRobert Mustacchi dwarf_get_line_section_name_from_die(Dwarf_Die die,
885*4d9fdb46SRobert Mustacchi const char **section_name_out,
886*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
887*4d9fdb46SRobert Mustacchi {
888*4d9fdb46SRobert Mustacchi /* The Dwarf_Debug this die belongs to. */
889*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = 0;
890*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *sec = 0;
891*4d9fdb46SRobert Mustacchi
892*4d9fdb46SRobert Mustacchi /* ***** BEGIN CODE ***** */
893*4d9fdb46SRobert Mustacchi if (error) {
894*4d9fdb46SRobert Mustacchi *error = NULL;
895*4d9fdb46SRobert Mustacchi }
896*4d9fdb46SRobert Mustacchi
897*4d9fdb46SRobert Mustacchi CHECK_DIE(die, DW_DLV_ERROR);
898*4d9fdb46SRobert Mustacchi dbg = die->di_cu_context->cc_dbg;
899*4d9fdb46SRobert Mustacchi sec = &dbg->de_debug_line;
900*4d9fdb46SRobert Mustacchi if (sec->dss_size == 0) {
901*4d9fdb46SRobert Mustacchi /* We don't have such a section at all. */
902*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
903*4d9fdb46SRobert Mustacchi }
904*4d9fdb46SRobert Mustacchi *section_name_out = sec->dss_name;
905*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
906*4d9fdb46SRobert Mustacchi }
907*4d9fdb46SRobert Mustacchi
908*4d9fdb46SRobert Mustacchi int
dwarf_get_string_section_name(Dwarf_Debug dbg,const char ** section_name_out,Dwarf_Error * error)909*4d9fdb46SRobert Mustacchi dwarf_get_string_section_name(Dwarf_Debug dbg,
910*4d9fdb46SRobert Mustacchi const char **section_name_out,
911*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
912*4d9fdb46SRobert Mustacchi {
913*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *sec = 0;
914*4d9fdb46SRobert Mustacchi
915*4d9fdb46SRobert Mustacchi /* ***** BEGIN CODE ***** */
916*4d9fdb46SRobert Mustacchi if (error != NULL) {
917*4d9fdb46SRobert Mustacchi *error = NULL;
918*4d9fdb46SRobert Mustacchi }
919*4d9fdb46SRobert Mustacchi
920*4d9fdb46SRobert Mustacchi sec = &dbg->de_debug_str;
921*4d9fdb46SRobert Mustacchi if (sec->dss_size == 0) {
922*4d9fdb46SRobert Mustacchi /* We don't have such a section at all. */
923*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
924*4d9fdb46SRobert Mustacchi }
925*4d9fdb46SRobert Mustacchi *section_name_out = sec->dss_name;
926*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
927*4d9fdb46SRobert Mustacchi }
928*4d9fdb46SRobert Mustacchi
929*4d9fdb46SRobert Mustacchi
930*4d9fdb46SRobert Mustacchi int
dwarf_srclines(Dwarf_Die die,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Error * error)931bc1f688bSRobert Mustacchi dwarf_srclines(Dwarf_Die die,
932bc1f688bSRobert Mustacchi Dwarf_Line ** linebuf,
933bc1f688bSRobert Mustacchi Dwarf_Signed * linecount, Dwarf_Error * error)
934bc1f688bSRobert Mustacchi {
935*4d9fdb46SRobert Mustacchi Dwarf_Unsigned version = 0;
936*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context = 0;
937*4d9fdb46SRobert Mustacchi Dwarf_Small table_count = 0;
938*4d9fdb46SRobert Mustacchi Dwarf_Bool is_new_interface = false;
939*4d9fdb46SRobert Mustacchi int res = _dwarf_internal_srclines(die,
940*4d9fdb46SRobert Mustacchi is_new_interface,
941*4d9fdb46SRobert Mustacchi &version,
942*4d9fdb46SRobert Mustacchi &table_count,
943*4d9fdb46SRobert Mustacchi &line_context,
944*4d9fdb46SRobert Mustacchi linebuf,
945*4d9fdb46SRobert Mustacchi linecount,
946*4d9fdb46SRobert Mustacchi /* linebuf_actuals */ 0,
947*4d9fdb46SRobert Mustacchi /*linecount_actuals*/0,
948bc1f688bSRobert Mustacchi /* addrlist= */ false,
949*4d9fdb46SRobert Mustacchi /* linelist= */ true,
950*4d9fdb46SRobert Mustacchi error);
951*4d9fdb46SRobert Mustacchi return res;
952*4d9fdb46SRobert Mustacchi }
953*4d9fdb46SRobert Mustacchi
954*4d9fdb46SRobert Mustacchi int
dwarf_srclines_two_level(Dwarf_Die die,Dwarf_Unsigned * version,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Line ** linebuf_actuals,Dwarf_Signed * linecount_actuals,Dwarf_Error * error)955*4d9fdb46SRobert Mustacchi dwarf_srclines_two_level(Dwarf_Die die,
956*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * version,
957*4d9fdb46SRobert Mustacchi Dwarf_Line ** linebuf,
958*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount,
959*4d9fdb46SRobert Mustacchi Dwarf_Line ** linebuf_actuals,
960*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount_actuals,
961*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
962*4d9fdb46SRobert Mustacchi {
963*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context = 0;
964*4d9fdb46SRobert Mustacchi Dwarf_Small table_count = 0;
965*4d9fdb46SRobert Mustacchi Dwarf_Bool is_new_interface = false;
966*4d9fdb46SRobert Mustacchi int res = _dwarf_internal_srclines(die,
967*4d9fdb46SRobert Mustacchi is_new_interface,
968*4d9fdb46SRobert Mustacchi version,
969*4d9fdb46SRobert Mustacchi &table_count,
970*4d9fdb46SRobert Mustacchi &line_context,
971*4d9fdb46SRobert Mustacchi linebuf,
972*4d9fdb46SRobert Mustacchi linecount,
973*4d9fdb46SRobert Mustacchi linebuf_actuals,
974*4d9fdb46SRobert Mustacchi linecount_actuals,
975*4d9fdb46SRobert Mustacchi /* addrlist= */ false,
976*4d9fdb46SRobert Mustacchi /* linelist= */ true,
977*4d9fdb46SRobert Mustacchi error);
978*4d9fdb46SRobert Mustacchi return res;
979*4d9fdb46SRobert Mustacchi }
980*4d9fdb46SRobert Mustacchi
981*4d9fdb46SRobert Mustacchi /* New October 2015. */
982*4d9fdb46SRobert Mustacchi int
dwarf_srclines_b(Dwarf_Die die,Dwarf_Unsigned * version_out,Dwarf_Small * table_count,Dwarf_Line_Context * line_context,Dwarf_Error * error)983*4d9fdb46SRobert Mustacchi dwarf_srclines_b(Dwarf_Die die,
984*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * version_out,
985*4d9fdb46SRobert Mustacchi Dwarf_Small * table_count,
986*4d9fdb46SRobert Mustacchi Dwarf_Line_Context * line_context,
987*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
988*4d9fdb46SRobert Mustacchi {
989*4d9fdb46SRobert Mustacchi Dwarf_Signed linecount_actuals = 0;
990*4d9fdb46SRobert Mustacchi Dwarf_Line *linebuf = 0;
991*4d9fdb46SRobert Mustacchi Dwarf_Line *linebuf_actuals = 0;
992*4d9fdb46SRobert Mustacchi Dwarf_Signed linecount = 0;
993*4d9fdb46SRobert Mustacchi Dwarf_Bool is_new_interface = true;
994*4d9fdb46SRobert Mustacchi int res = 0;
995*4d9fdb46SRobert Mustacchi Dwarf_Unsigned tcount = 0;
996*4d9fdb46SRobert Mustacchi
997*4d9fdb46SRobert Mustacchi res = _dwarf_internal_srclines(die,
998*4d9fdb46SRobert Mustacchi is_new_interface,
999*4d9fdb46SRobert Mustacchi version_out,
1000*4d9fdb46SRobert Mustacchi table_count,
1001*4d9fdb46SRobert Mustacchi line_context,
1002*4d9fdb46SRobert Mustacchi &linebuf,
1003*4d9fdb46SRobert Mustacchi &linecount,
1004*4d9fdb46SRobert Mustacchi &linebuf_actuals,
1005*4d9fdb46SRobert Mustacchi &linecount_actuals,
1006*4d9fdb46SRobert Mustacchi /* addrlist= */ false,
1007*4d9fdb46SRobert Mustacchi /* linelist= */ true,
1008*4d9fdb46SRobert Mustacchi error);
1009*4d9fdb46SRobert Mustacchi if (res == DW_DLV_OK) {
1010*4d9fdb46SRobert Mustacchi (*line_context)->lc_new_style_access = true;
1011*4d9fdb46SRobert Mustacchi }
1012*4d9fdb46SRobert Mustacchi if(linecount_actuals ) {
1013*4d9fdb46SRobert Mustacchi tcount++;
1014*4d9fdb46SRobert Mustacchi }
1015*4d9fdb46SRobert Mustacchi if(linecount ) {
1016*4d9fdb46SRobert Mustacchi tcount++;
1017*4d9fdb46SRobert Mustacchi }
1018*4d9fdb46SRobert Mustacchi *table_count = tcount;
1019*4d9fdb46SRobert Mustacchi return res;
1020*4d9fdb46SRobert Mustacchi }
1021*4d9fdb46SRobert Mustacchi
1022*4d9fdb46SRobert Mustacchi
1023*4d9fdb46SRobert Mustacchi /* New October 2015. */
1024*4d9fdb46SRobert Mustacchi int
dwarf_srclines_from_linecontext(Dwarf_Line_Context line_context,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Error * error)1025*4d9fdb46SRobert Mustacchi dwarf_srclines_from_linecontext(Dwarf_Line_Context line_context,
1026*4d9fdb46SRobert Mustacchi Dwarf_Line** linebuf,
1027*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount,
1028*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1029*4d9fdb46SRobert Mustacchi {
1030*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1031*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1032*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1033*4d9fdb46SRobert Mustacchi }
1034*4d9fdb46SRobert Mustacchi if (!line_context->lc_new_style_access) {
1035*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1036*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1037*4d9fdb46SRobert Mustacchi }
1038*4d9fdb46SRobert Mustacchi *linebuf = line_context->lc_linebuf_logicals;
1039*4d9fdb46SRobert Mustacchi *linecount = line_context->lc_linecount_logicals;
1040*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1041*4d9fdb46SRobert Mustacchi }
1042*4d9fdb46SRobert Mustacchi
1043*4d9fdb46SRobert Mustacchi /* New October 2015. */
1044*4d9fdb46SRobert Mustacchi int
dwarf_srclines_two_level_from_linecontext(Dwarf_Line_Context line_context,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Line ** linebuf_actuals,Dwarf_Signed * linecount_actuals,Dwarf_Error * error)1045*4d9fdb46SRobert Mustacchi dwarf_srclines_two_level_from_linecontext(Dwarf_Line_Context line_context,
1046*4d9fdb46SRobert Mustacchi Dwarf_Line** linebuf,
1047*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount,
1048*4d9fdb46SRobert Mustacchi Dwarf_Line** linebuf_actuals,
1049*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount_actuals,
1050*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1051*4d9fdb46SRobert Mustacchi {
1052*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1053*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1054*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1055*4d9fdb46SRobert Mustacchi }
1056*4d9fdb46SRobert Mustacchi if (!line_context->lc_new_style_access) {
1057*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1058*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1059*4d9fdb46SRobert Mustacchi }
1060*4d9fdb46SRobert Mustacchi *linebuf = line_context->lc_linebuf_logicals;
1061*4d9fdb46SRobert Mustacchi *linecount = line_context->lc_linecount_logicals;
1062*4d9fdb46SRobert Mustacchi *linebuf_actuals = line_context->lc_linebuf_actuals;
1063*4d9fdb46SRobert Mustacchi *linecount_actuals = line_context->lc_linecount_actuals;
1064*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1065*4d9fdb46SRobert Mustacchi }
1066*4d9fdb46SRobert Mustacchi
1067*4d9fdb46SRobert Mustacchi
1068*4d9fdb46SRobert Mustacchi /* New October 2015. */
1069*4d9fdb46SRobert Mustacchi int
dwarf_srclines_table_offset(Dwarf_Line_Context line_context,Dwarf_Unsigned * offset,Dwarf_Error * error)1070*4d9fdb46SRobert Mustacchi dwarf_srclines_table_offset(Dwarf_Line_Context line_context,
1071*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * offset,
1072*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1073*4d9fdb46SRobert Mustacchi {
1074*4d9fdb46SRobert Mustacchi if (!line_context ){
1075*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1076*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1077*4d9fdb46SRobert Mustacchi }
1078*4d9fdb46SRobert Mustacchi if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1079*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1080*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1081*4d9fdb46SRobert Mustacchi }
1082*4d9fdb46SRobert Mustacchi *offset = line_context->lc_section_offset;
1083*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1084*4d9fdb46SRobert Mustacchi }
1085*4d9fdb46SRobert Mustacchi
1086*4d9fdb46SRobert Mustacchi /* New October 2015. */
1087*4d9fdb46SRobert Mustacchi /* If the CU DIE has no DW_AT_comp_dir then
1088*4d9fdb46SRobert Mustacchi the pointer pushed back to *compilation_directory
1089*4d9fdb46SRobert Mustacchi will be NULL.
1090*4d9fdb46SRobert Mustacchi Foy DWARF5 the line table header has the compilation
1091*4d9fdb46SRobert Mustacchi directory. FIXME DWARF5.
1092*4d9fdb46SRobert Mustacchi */
dwarf_srclines_comp_dir(Dwarf_Line_Context line_context,const char ** compilation_directory,Dwarf_Error * error)1093*4d9fdb46SRobert Mustacchi int dwarf_srclines_comp_dir(Dwarf_Line_Context line_context,
1094*4d9fdb46SRobert Mustacchi const char ** compilation_directory,
1095*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1096*4d9fdb46SRobert Mustacchi {
1097*4d9fdb46SRobert Mustacchi if (!line_context ){
1098*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1099*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1100*4d9fdb46SRobert Mustacchi }
1101*4d9fdb46SRobert Mustacchi if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1102*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1103*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1104*4d9fdb46SRobert Mustacchi }
1105*4d9fdb46SRobert Mustacchi *compilation_directory =
1106*4d9fdb46SRobert Mustacchi (const char *)line_context->lc_compilation_directory;
1107*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1108*4d9fdb46SRobert Mustacchi }
1109*4d9fdb46SRobert Mustacchi
1110*4d9fdb46SRobert Mustacchi
1111*4d9fdb46SRobert Mustacchi
1112*4d9fdb46SRobert Mustacchi
1113*4d9fdb46SRobert Mustacchi /* New October 2015. */
1114*4d9fdb46SRobert Mustacchi int
dwarf_srclines_subprog_count(Dwarf_Line_Context line_context,Dwarf_Signed * count_out,Dwarf_Error * error)1115*4d9fdb46SRobert Mustacchi dwarf_srclines_subprog_count(Dwarf_Line_Context line_context,
1116*4d9fdb46SRobert Mustacchi Dwarf_Signed * count_out,
1117*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1118*4d9fdb46SRobert Mustacchi {
1119*4d9fdb46SRobert Mustacchi if (!line_context ){
1120*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1121*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1122*4d9fdb46SRobert Mustacchi }
1123*4d9fdb46SRobert Mustacchi if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1124*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1125*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1126*4d9fdb46SRobert Mustacchi }
1127*4d9fdb46SRobert Mustacchi *count_out = line_context->lc_subprogs_count;
1128*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1129*4d9fdb46SRobert Mustacchi }
1130*4d9fdb46SRobert Mustacchi /* New October 2015. */
1131*4d9fdb46SRobert Mustacchi /* Index says which to return. Valid indexes are
1132*4d9fdb46SRobert Mustacchi 1-lc_subprogs_count
1133*4d9fdb46SRobert Mustacchi */
1134*4d9fdb46SRobert Mustacchi int
dwarf_srclines_subprog_data(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Unsigned * decl_file,Dwarf_Unsigned * decl_line,Dwarf_Error * error)1135*4d9fdb46SRobert Mustacchi dwarf_srclines_subprog_data(Dwarf_Line_Context line_context,
1136*4d9fdb46SRobert Mustacchi Dwarf_Signed index_in,
1137*4d9fdb46SRobert Mustacchi const char ** name,
1138*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *decl_file,
1139*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *decl_line,
1140*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
1141*4d9fdb46SRobert Mustacchi {
1142*4d9fdb46SRobert Mustacchi /* Negative values not sensible. Leaving traditional
1143*4d9fdb46SRobert Mustacchi signed interfaces. */
1144*4d9fdb46SRobert Mustacchi Dwarf_Unsigned index = (Dwarf_Unsigned)index_in;
1145*4d9fdb46SRobert Mustacchi Dwarf_Subprog_Entry sub = 0;
1146*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1147*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1148*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1149*4d9fdb46SRobert Mustacchi }
1150*4d9fdb46SRobert Mustacchi if (index < 1 || index > line_context->lc_subprogs_count) {
1151*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_INDEX_WRONG);
1152*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1153*4d9fdb46SRobert Mustacchi }
1154*4d9fdb46SRobert Mustacchi sub = line_context->lc_subprogs + (index-1);
1155*4d9fdb46SRobert Mustacchi *name = (const char *)sub->ds_subprog_name;
1156*4d9fdb46SRobert Mustacchi *decl_file = sub->ds_decl_file;
1157*4d9fdb46SRobert Mustacchi *decl_line = sub->ds_decl_line;
1158*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1159*4d9fdb46SRobert Mustacchi }
1160*4d9fdb46SRobert Mustacchi
1161*4d9fdb46SRobert Mustacchi /* New October 2015. See also
1162*4d9fdb46SRobert Mustacchi dwarf_srclines_files_indexes() */
1163*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_count(Dwarf_Line_Context line_context,Dwarf_Signed * count_out,Dwarf_Error * error)1164*4d9fdb46SRobert Mustacchi dwarf_srclines_files_count(Dwarf_Line_Context line_context,
1165*4d9fdb46SRobert Mustacchi Dwarf_Signed *count_out,
1166*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
1167*4d9fdb46SRobert Mustacchi {
1168*4d9fdb46SRobert Mustacchi if (!line_context ||
1169*4d9fdb46SRobert Mustacchi line_context->lc_magic != DW_CONTEXT_MAGIC) {
1170*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1171*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1172*4d9fdb46SRobert Mustacchi }
1173*4d9fdb46SRobert Mustacchi /* Negative values not sensible. Leaving traditional
1174*4d9fdb46SRobert Mustacchi signed interfaces. */
1175*4d9fdb46SRobert Mustacchi *count_out = (Dwarf_Signed)line_context->lc_file_entry_count;
1176*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1177*4d9fdb46SRobert Mustacchi }
1178*4d9fdb46SRobert Mustacchi
1179*4d9fdb46SRobert Mustacchi /* New October 2015. */
1180*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_data(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Unsigned * directory_index,Dwarf_Unsigned * last_mod_time,Dwarf_Unsigned * file_length,Dwarf_Error * error)1181*4d9fdb46SRobert Mustacchi dwarf_srclines_files_data(Dwarf_Line_Context line_context,
1182*4d9fdb46SRobert Mustacchi Dwarf_Signed index_in,
1183*4d9fdb46SRobert Mustacchi const char ** name,
1184*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * directory_index,
1185*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * last_mod_time,
1186*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * file_length,
1187*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1188*4d9fdb46SRobert Mustacchi {
1189*4d9fdb46SRobert Mustacchi return dwarf_srclines_files_data_b(
1190*4d9fdb46SRobert Mustacchi line_context,index_in,name,directory_index,
1191*4d9fdb46SRobert Mustacchi last_mod_time,file_length,0,error);
1192*4d9fdb46SRobert Mustacchi }
1193*4d9fdb46SRobert Mustacchi
1194*4d9fdb46SRobert Mustacchi
1195*4d9fdb46SRobert Mustacchi /* New March 2018 making iteration through file names. */
1196*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_indexes(Dwarf_Line_Context line_context,Dwarf_Signed * baseindex,Dwarf_Signed * file_count,Dwarf_Signed * endindex,Dwarf_Error * error)1197*4d9fdb46SRobert Mustacchi dwarf_srclines_files_indexes(Dwarf_Line_Context line_context,
1198*4d9fdb46SRobert Mustacchi Dwarf_Signed *baseindex,
1199*4d9fdb46SRobert Mustacchi Dwarf_Signed *file_count,
1200*4d9fdb46SRobert Mustacchi Dwarf_Signed *endindex,
1201*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1202*4d9fdb46SRobert Mustacchi {
1203*4d9fdb46SRobert Mustacchi if(line_context->lc_magic != DW_CONTEXT_MAGIC) {
1204*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1205*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1206*4d9fdb46SRobert Mustacchi }
1207*4d9fdb46SRobert Mustacchi *baseindex = line_context->lc_file_entry_baseindex;
1208*4d9fdb46SRobert Mustacchi *file_count = line_context->lc_file_entry_count;
1209*4d9fdb46SRobert Mustacchi *endindex = line_context->lc_file_entry_endindex;
1210*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1211*4d9fdb46SRobert Mustacchi }
1212*4d9fdb46SRobert Mustacchi
1213*4d9fdb46SRobert Mustacchi /* New March 2018 adding DWARF5 data. */
1214*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_data_b(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Unsigned * directory_index,Dwarf_Unsigned * last_mod_time,Dwarf_Unsigned * file_length,Dwarf_Form_Data16 ** data16ptr,Dwarf_Error * error)1215*4d9fdb46SRobert Mustacchi dwarf_srclines_files_data_b(Dwarf_Line_Context line_context,
1216*4d9fdb46SRobert Mustacchi Dwarf_Signed index_in,
1217*4d9fdb46SRobert Mustacchi const char ** name,
1218*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * directory_index,
1219*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * last_mod_time,
1220*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * file_length,
1221*4d9fdb46SRobert Mustacchi Dwarf_Form_Data16 ** data16ptr,
1222*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1223*4d9fdb46SRobert Mustacchi {
1224*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fi = 0;
1225*4d9fdb46SRobert Mustacchi Dwarf_Signed i =0;
1226*4d9fdb46SRobert Mustacchi Dwarf_Signed baseindex = 0;
1227*4d9fdb46SRobert Mustacchi Dwarf_Signed file_count = 0;
1228*4d9fdb46SRobert Mustacchi Dwarf_Signed endindex = 0;
1229*4d9fdb46SRobert Mustacchi /* Negative values not sensible. Leaving traditional
1230*4d9fdb46SRobert Mustacchi signed interfaces. */
1231*4d9fdb46SRobert Mustacchi Dwarf_Signed index = index_in;
1232*4d9fdb46SRobert Mustacchi int res = 0;
1233*4d9fdb46SRobert Mustacchi
1234*4d9fdb46SRobert Mustacchi
1235*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1236*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1237*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1238*4d9fdb46SRobert Mustacchi }
1239*4d9fdb46SRobert Mustacchi
1240*4d9fdb46SRobert Mustacchi /* Special accomodation of the special gnu experimental
1241*4d9fdb46SRobert Mustacchi version number (a high number) so we cannot just
1242*4d9fdb46SRobert Mustacchi say '5 or greater'. This is awkward, but at least
1243*4d9fdb46SRobert Mustacchi if there is a version 6 or later it still allows
1244*4d9fdb46SRobert Mustacchi the experimental table. */
1245*4d9fdb46SRobert Mustacchi res = dwarf_srclines_files_indexes(line_context, &baseindex,
1246*4d9fdb46SRobert Mustacchi &file_count, &endindex, error);
1247bc1f688bSRobert Mustacchi if (res != DW_DLV_OK) {
1248bc1f688bSRobert Mustacchi return res;
1249bc1f688bSRobert Mustacchi }
1250*4d9fdb46SRobert Mustacchi fi = line_context->lc_file_entries;
1251*4d9fdb46SRobert Mustacchi if (index < baseindex || index >= endindex) {
1252*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_INDEX_WRONG);
1253*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1254*4d9fdb46SRobert Mustacchi }
1255*4d9fdb46SRobert Mustacchi for ( i = baseindex;i < index; i++) {
1256*4d9fdb46SRobert Mustacchi fi = fi->fi_next;
1257*4d9fdb46SRobert Mustacchi if(!fi) {
1258*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_HEADER_CORRUPT);
1259*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1260*4d9fdb46SRobert Mustacchi }
1261*4d9fdb46SRobert Mustacchi }
1262*4d9fdb46SRobert Mustacchi
1263*4d9fdb46SRobert Mustacchi if(name) {
1264*4d9fdb46SRobert Mustacchi *name = (const char *)fi->fi_file_name;
1265*4d9fdb46SRobert Mustacchi }
1266*4d9fdb46SRobert Mustacchi if (directory_index) {
1267*4d9fdb46SRobert Mustacchi *directory_index = fi->fi_dir_index;
1268*4d9fdb46SRobert Mustacchi }
1269*4d9fdb46SRobert Mustacchi if (last_mod_time) {
1270*4d9fdb46SRobert Mustacchi *last_mod_time = fi->fi_time_last_mod;
1271*4d9fdb46SRobert Mustacchi }
1272*4d9fdb46SRobert Mustacchi if (file_length) {
1273*4d9fdb46SRobert Mustacchi *file_length = fi->fi_file_length;
1274*4d9fdb46SRobert Mustacchi }
1275*4d9fdb46SRobert Mustacchi if (data16ptr) {
1276*4d9fdb46SRobert Mustacchi if (fi->fi_md5_present) {
1277*4d9fdb46SRobert Mustacchi *data16ptr = &fi->fi_md5_value;
1278*4d9fdb46SRobert Mustacchi } else {
1279*4d9fdb46SRobert Mustacchi *data16ptr = 0;
1280*4d9fdb46SRobert Mustacchi }
1281*4d9fdb46SRobert Mustacchi }
1282*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1283*4d9fdb46SRobert Mustacchi }
1284*4d9fdb46SRobert Mustacchi
1285*4d9fdb46SRobert Mustacchi
1286*4d9fdb46SRobert Mustacchi
1287*4d9fdb46SRobert Mustacchi
1288*4d9fdb46SRobert Mustacchi /* New October 2015. */
1289*4d9fdb46SRobert Mustacchi int
dwarf_srclines_include_dir_count(Dwarf_Line_Context line_context,Dwarf_Signed * count,Dwarf_Error * error)1290*4d9fdb46SRobert Mustacchi dwarf_srclines_include_dir_count(Dwarf_Line_Context line_context,
1291*4d9fdb46SRobert Mustacchi Dwarf_Signed * count,
1292*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1293*4d9fdb46SRobert Mustacchi {
1294*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1295*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1296*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1297*4d9fdb46SRobert Mustacchi }
1298*4d9fdb46SRobert Mustacchi *count = line_context->lc_include_directories_count;
1299*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1300*4d9fdb46SRobert Mustacchi }
1301*4d9fdb46SRobert Mustacchi
1302*4d9fdb46SRobert Mustacchi /* New October 2015. */
1303*4d9fdb46SRobert Mustacchi int
dwarf_srclines_include_dir_data(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Error * error)1304*4d9fdb46SRobert Mustacchi dwarf_srclines_include_dir_data(Dwarf_Line_Context line_context,
1305*4d9fdb46SRobert Mustacchi Dwarf_Signed index_in,
1306*4d9fdb46SRobert Mustacchi const char ** name,
1307*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1308*4d9fdb46SRobert Mustacchi {
1309*4d9fdb46SRobert Mustacchi /* It never made sense that the srclines used a signed count.
1310*4d9fdb46SRobert Mustacchi But that cannot be fixed in interfaces for compatibility.
1311*4d9fdb46SRobert Mustacchi So we adjust here. */
1312*4d9fdb46SRobert Mustacchi Dwarf_Unsigned index = index_in;
1313*4d9fdb46SRobert Mustacchi
1314*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1315*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1316*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1317*4d9fdb46SRobert Mustacchi }
1318*4d9fdb46SRobert Mustacchi if (index < 1 || index > line_context->lc_include_directories_count) {
1319*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_INDEX_WRONG);
1320*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1321*4d9fdb46SRobert Mustacchi }
1322*4d9fdb46SRobert Mustacchi *name = (const char *)(line_context->lc_include_directories[index-1]);
1323*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1324*4d9fdb46SRobert Mustacchi }
1325*4d9fdb46SRobert Mustacchi
1326*4d9fdb46SRobert Mustacchi /* New October 2015. */
1327*4d9fdb46SRobert Mustacchi int
dwarf_srclines_version(Dwarf_Line_Context line_context,Dwarf_Unsigned * version_out,Dwarf_Small * table_count_out,Dwarf_Error * error)1328*4d9fdb46SRobert Mustacchi dwarf_srclines_version(Dwarf_Line_Context line_context,
1329*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *version_out,
1330*4d9fdb46SRobert Mustacchi Dwarf_Small *table_count_out,
1331*4d9fdb46SRobert Mustacchi Dwarf_Error *error)
1332*4d9fdb46SRobert Mustacchi {
1333*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1334*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1335*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1336*4d9fdb46SRobert Mustacchi }
1337*4d9fdb46SRobert Mustacchi *version_out = line_context->lc_version_number;
1338*4d9fdb46SRobert Mustacchi *table_count_out = line_context->lc_table_count;
1339*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1340bc1f688bSRobert Mustacchi }
1341bc1f688bSRobert Mustacchi
1342bc1f688bSRobert Mustacchi
1343bc1f688bSRobert Mustacchi
1344bc1f688bSRobert Mustacchi /* Every line table entry (except DW_DLE_end_sequence,
1345bc1f688bSRobert Mustacchi which is returned using dwarf_lineendsequence())
1346bc1f688bSRobert Mustacchi potentially has the begin-statement
1347bc1f688bSRobert Mustacchi flag marked 'on'. This returns thru *return_bool,
1348*4d9fdb46SRobert Mustacchi the begin-statement flag. */
1349bc1f688bSRobert Mustacchi
1350bc1f688bSRobert Mustacchi int
dwarf_linebeginstatement(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1351bc1f688bSRobert Mustacchi dwarf_linebeginstatement(Dwarf_Line line,
1352bc1f688bSRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error)
1353bc1f688bSRobert Mustacchi {
1354bc1f688bSRobert Mustacchi if (line == NULL || return_bool == 0) {
1355bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1356bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1357bc1f688bSRobert Mustacchi }
1358bc1f688bSRobert Mustacchi
1359bc1f688bSRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_is_stmt);
1360bc1f688bSRobert Mustacchi return DW_DLV_OK;
1361bc1f688bSRobert Mustacchi }
1362bc1f688bSRobert Mustacchi
1363bc1f688bSRobert Mustacchi /* At the end of any contiguous line-table there may be
1364bc1f688bSRobert Mustacchi a DW_LNE_end_sequence operator.
1365bc1f688bSRobert Mustacchi This returns non-zero thru *return_bool
1366bc1f688bSRobert Mustacchi if and only if this 'line' entry was a DW_LNE_end_sequence.
1367bc1f688bSRobert Mustacchi
1368bc1f688bSRobert Mustacchi Within a compilation unit or function there may be multiple
1369bc1f688bSRobert Mustacchi line tables, each ending with a DW_LNE_end_sequence.
1370bc1f688bSRobert Mustacchi Each table describes a contiguous region.
1371bc1f688bSRobert Mustacchi Because compilers may split function code up in arbitrary ways
1372bc1f688bSRobert Mustacchi compilers may need to emit multiple contigous regions (ie
1373bc1f688bSRobert Mustacchi line tables) for a single function.
1374*4d9fdb46SRobert Mustacchi See the DWARF3 spec section 6.2. */
1375bc1f688bSRobert Mustacchi int
dwarf_lineendsequence(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1376bc1f688bSRobert Mustacchi dwarf_lineendsequence(Dwarf_Line line,
1377bc1f688bSRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error)
1378bc1f688bSRobert Mustacchi {
1379bc1f688bSRobert Mustacchi if (line == NULL) {
1380bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1381bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1382bc1f688bSRobert Mustacchi }
1383bc1f688bSRobert Mustacchi
1384bc1f688bSRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_end_sequence);
1385bc1f688bSRobert Mustacchi return DW_DLV_OK;
1386bc1f688bSRobert Mustacchi }
1387bc1f688bSRobert Mustacchi
1388bc1f688bSRobert Mustacchi
1389bc1f688bSRobert Mustacchi /* Each 'line' entry has a line-number.
1390bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the line-number is
1391*4d9fdb46SRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above). */
1392bc1f688bSRobert Mustacchi int
dwarf_lineno(Dwarf_Line line,Dwarf_Unsigned * ret_lineno,Dwarf_Error * error)1393bc1f688bSRobert Mustacchi dwarf_lineno(Dwarf_Line line,
1394bc1f688bSRobert Mustacchi Dwarf_Unsigned * ret_lineno, Dwarf_Error * error)
1395bc1f688bSRobert Mustacchi {
1396bc1f688bSRobert Mustacchi if (line == NULL || ret_lineno == 0) {
1397bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1398bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1399bc1f688bSRobert Mustacchi }
1400bc1f688bSRobert Mustacchi
1401bc1f688bSRobert Mustacchi *ret_lineno = (line->li_addr_line.li_l_data.li_line);
1402bc1f688bSRobert Mustacchi return DW_DLV_OK;
1403bc1f688bSRobert Mustacchi }
1404bc1f688bSRobert Mustacchi
1405bc1f688bSRobert Mustacchi /* Each 'line' entry has a file-number, and index into the file table.
1406bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the index is
1407bc1f688bSRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above).
1408bc1f688bSRobert Mustacchi The file number returned is an index into the file table
1409bc1f688bSRobert Mustacchi produced by dwarf_srcfiles(), but care is required: the
1410*4d9fdb46SRobert Mustacchi li_file begins with 1 for DWARF2,3,4
1411*4d9fdb46SRobert Mustacchi files, so that the li_file returned here
1412bc1f688bSRobert Mustacchi is 1 greater than its index into the dwarf_srcfiles() output array.
1413*4d9fdb46SRobert Mustacchi
1414bc1f688bSRobert Mustacchi And entries from DW_LNE_define_file don't appear in
1415bc1f688bSRobert Mustacchi the dwarf_srcfiles() output so file indexes from here may exceed
1416bc1f688bSRobert Mustacchi the size of the dwarf_srcfiles() output array size.
1417bc1f688bSRobert Mustacchi */
1418bc1f688bSRobert Mustacchi int
dwarf_line_srcfileno(Dwarf_Line line,Dwarf_Unsigned * ret_fileno,Dwarf_Error * error)1419bc1f688bSRobert Mustacchi dwarf_line_srcfileno(Dwarf_Line line,
1420bc1f688bSRobert Mustacchi Dwarf_Unsigned * ret_fileno, Dwarf_Error * error)
1421bc1f688bSRobert Mustacchi {
1422bc1f688bSRobert Mustacchi if (line == NULL || ret_fileno == 0) {
1423bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1424*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1425bc1f688bSRobert Mustacchi }
1426*4d9fdb46SRobert Mustacchi /* li_file must be <= line->li_context->lc_file_entry_count else
1427*4d9fdb46SRobert Mustacchi it is trash. li_file 0 means not attributable to
1428*4d9fdb46SRobert Mustacchi any source file per dwarf2/3 spec.
1429*4d9fdb46SRobert Mustacchi For DWARF5, li_file < lc_file_entry_count */
1430bc1f688bSRobert Mustacchi *ret_fileno = (line->li_addr_line.li_l_data.li_file);
1431bc1f688bSRobert Mustacchi return DW_DLV_OK;
1432bc1f688bSRobert Mustacchi }
1433bc1f688bSRobert Mustacchi
1434*4d9fdb46SRobert Mustacchi /* Each 'line' entry has an is_addr_set attribute.
1435*4d9fdb46SRobert Mustacchi If the entry is a DW_LNE_set_address, return TRUE through
1436*4d9fdb46SRobert Mustacchi the *is_addr_set pointer. */
1437*4d9fdb46SRobert Mustacchi int
dwarf_line_is_addr_set(Dwarf_Line line,Dwarf_Bool * is_addr_set,Dwarf_Error * error)1438*4d9fdb46SRobert Mustacchi dwarf_line_is_addr_set(Dwarf_Line line,
1439*4d9fdb46SRobert Mustacchi Dwarf_Bool *is_addr_set, Dwarf_Error * error)
1440*4d9fdb46SRobert Mustacchi {
1441*4d9fdb46SRobert Mustacchi if (line == NULL) {
1442*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1443*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1444*4d9fdb46SRobert Mustacchi }
1445*4d9fdb46SRobert Mustacchi
1446*4d9fdb46SRobert Mustacchi *is_addr_set = (line->li_addr_line.li_l_data.li_is_addr_set);
1447*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1448*4d9fdb46SRobert Mustacchi }
1449bc1f688bSRobert Mustacchi
1450bc1f688bSRobert Mustacchi /* Each 'line' entry has a line-address.
1451bc1f688bSRobert Mustacchi If the entry is a DW_LNE_end_sequence the adddress
1452bc1f688bSRobert Mustacchi is one-beyond the last address this contigous region
1453bc1f688bSRobert Mustacchi covers, so the address is not inside the region,
1454*4d9fdb46SRobert Mustacchi but is just outside it. */
1455bc1f688bSRobert Mustacchi int
dwarf_lineaddr(Dwarf_Line line,Dwarf_Addr * ret_lineaddr,Dwarf_Error * error)1456bc1f688bSRobert Mustacchi dwarf_lineaddr(Dwarf_Line line,
1457bc1f688bSRobert Mustacchi Dwarf_Addr * ret_lineaddr, Dwarf_Error * error)
1458bc1f688bSRobert Mustacchi {
1459bc1f688bSRobert Mustacchi if (line == NULL || ret_lineaddr == 0) {
1460bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1461bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1462bc1f688bSRobert Mustacchi }
1463bc1f688bSRobert Mustacchi
1464bc1f688bSRobert Mustacchi *ret_lineaddr = (line->li_address);
1465bc1f688bSRobert Mustacchi return DW_DLV_OK;
1466bc1f688bSRobert Mustacchi }
1467bc1f688bSRobert Mustacchi
1468bc1f688bSRobert Mustacchi
1469*4d9fdb46SRobert Mustacchi /* Obsolete: do not use this function.
1470*4d9fdb46SRobert Mustacchi December 2011: For reasons lost in the mists of history,
1471*4d9fdb46SRobert Mustacchi this returned -1, not zero (through the pointer
1472*4d9fdb46SRobert Mustacchi ret_lineoff), if the column was zero.
1473*4d9fdb46SRobert Mustacchi That was always bogus, even in DWARF2.
1474*4d9fdb46SRobert Mustacchi It is also bogus that the column value is signed, but
1475*4d9fdb46SRobert Mustacchi it is painful to change the argument type in 2011, so leave it.
1476bc1f688bSRobert Mustacchi */
1477bc1f688bSRobert Mustacchi int
dwarf_lineoff(Dwarf_Line line,Dwarf_Signed * ret_lineoff,Dwarf_Error * error)1478bc1f688bSRobert Mustacchi dwarf_lineoff(Dwarf_Line line,
1479bc1f688bSRobert Mustacchi Dwarf_Signed * ret_lineoff, Dwarf_Error * error)
1480bc1f688bSRobert Mustacchi {
1481bc1f688bSRobert Mustacchi if (line == NULL || ret_lineoff == 0) {
1482bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1483bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1484bc1f688bSRobert Mustacchi }
1485*4d9fdb46SRobert Mustacchi *ret_lineoff = (
1486*4d9fdb46SRobert Mustacchi (line->li_addr_line.li_l_data.li_column == 0) ?
1487*4d9fdb46SRobert Mustacchi -1 : line->li_addr_line.li_l_data.li_column);
1488bc1f688bSRobert Mustacchi return DW_DLV_OK;
1489bc1f688bSRobert Mustacchi }
1490*4d9fdb46SRobert Mustacchi /* Each 'line' entry has a column-within-line (offset
1491*4d9fdb46SRobert Mustacchi within the line) where the
1492*4d9fdb46SRobert Mustacchi source text begins.
1493*4d9fdb46SRobert Mustacchi If the entry is a DW_LNE_end_sequence the line-number is
1494*4d9fdb46SRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above).
1495*4d9fdb46SRobert Mustacchi Lines of text begin at column 1. The value 0
1496*4d9fdb46SRobert Mustacchi means the line begins at the left edge of the line.
1497*4d9fdb46SRobert Mustacchi (See the DWARF3 spec, section 6.2.2).
1498*4d9fdb46SRobert Mustacchi So 0 and 1 mean essentially the same thing.
1499*4d9fdb46SRobert Mustacchi dwarf_lineoff_b() is new in December 2011.
1500*4d9fdb46SRobert Mustacchi */
1501bc1f688bSRobert Mustacchi int
dwarf_lineoff_b(Dwarf_Line line,Dwarf_Unsigned * ret_lineoff,Dwarf_Error * error)1502*4d9fdb46SRobert Mustacchi dwarf_lineoff_b(Dwarf_Line line,
1503*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * ret_lineoff, Dwarf_Error * error)
1504bc1f688bSRobert Mustacchi {
1505*4d9fdb46SRobert Mustacchi if (line == NULL || ret_lineoff == 0) {
1506bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1507bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1508bc1f688bSRobert Mustacchi }
1509bc1f688bSRobert Mustacchi
1510*4d9fdb46SRobert Mustacchi *ret_lineoff = line->li_addr_line.li_l_data.li_column;
1511*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1512*4d9fdb46SRobert Mustacchi }
1513*4d9fdb46SRobert Mustacchi
1514*4d9fdb46SRobert Mustacchi
1515*4d9fdb46SRobert Mustacchi static int
dwarf_filename(Dwarf_Line_Context context,Dwarf_Signed fileno_in,char ** ret_filename,Dwarf_Error * error)1516*4d9fdb46SRobert Mustacchi dwarf_filename(Dwarf_Line_Context context,
1517*4d9fdb46SRobert Mustacchi Dwarf_Signed fileno_in,
1518*4d9fdb46SRobert Mustacchi char **ret_filename, Dwarf_Error *error)
1519*4d9fdb46SRobert Mustacchi {
1520*4d9fdb46SRobert Mustacchi Dwarf_Signed i = 0;
1521*4d9fdb46SRobert Mustacchi Dwarf_File_Entry file_entry = 0;
1522*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = context->lc_dbg;
1523*4d9fdb46SRobert Mustacchi int res = 0;
1524*4d9fdb46SRobert Mustacchi Dwarf_Signed baseindex = 0;
1525*4d9fdb46SRobert Mustacchi Dwarf_Signed file_count = 0;
1526*4d9fdb46SRobert Mustacchi Dwarf_Signed endindex = 0;
1527*4d9fdb46SRobert Mustacchi /* Negative values not sensible. Leaving traditional
1528*4d9fdb46SRobert Mustacchi signed interfaces in place. */
1529*4d9fdb46SRobert Mustacchi Dwarf_Signed fileno = fileno_in;
1530*4d9fdb46SRobert Mustacchi unsigned linetab_version = context->lc_version_number;
1531*4d9fdb46SRobert Mustacchi
1532*4d9fdb46SRobert Mustacchi res = dwarf_srclines_files_indexes(context, &baseindex,
1533*4d9fdb46SRobert Mustacchi &file_count, &endindex, error);
1534*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1535*4d9fdb46SRobert Mustacchi return res;
1536*4d9fdb46SRobert Mustacchi }
1537*4d9fdb46SRobert Mustacchi if (fileno >= endindex) {
1538*4d9fdb46SRobert Mustacchi dwarfstring m;
1539*4d9fdb46SRobert Mustacchi
1540*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m);
1541*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1542*4d9fdb46SRobert Mustacchi "DW_DLE_NO_FILE_NAME: the file number is %d ",
1543*4d9fdb46SRobert Mustacchi fileno);
1544*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m,
1545*4d9fdb46SRobert Mustacchi "( this is a DWARF 0x%x linetable)",
1546*4d9fdb46SRobert Mustacchi linetab_version);
1547*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m,
1548*4d9fdb46SRobert Mustacchi " yet the highest allowed file name index is %d.",
1549*4d9fdb46SRobert Mustacchi endindex-1);
1550*4d9fdb46SRobert Mustacchi _dwarf_error_string(dbg, error, DW_DLE_NO_FILE_NAME,
1551*4d9fdb46SRobert Mustacchi dwarfstring_string(&m));
1552*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m);
1553*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1554*4d9fdb46SRobert Mustacchi } else {
1555*4d9fdb46SRobert Mustacchi if (linetab_version <= DW_LINE_VERSION4 ||
1556*4d9fdb46SRobert Mustacchi linetab_version == EXPERIMENTAL_LINE_TABLES_VERSION) {
1557*4d9fdb46SRobert Mustacchi if (!fileno) {
1558*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
1559*4d9fdb46SRobert Mustacchi }
1560*4d9fdb46SRobert Mustacchi /* else ok */
1561*4d9fdb46SRobert Mustacchi } /* else DWARF 5 line index 0 is fine */
1562*4d9fdb46SRobert Mustacchi }
1563*4d9fdb46SRobert Mustacchi
1564*4d9fdb46SRobert Mustacchi file_entry = context->lc_file_entries;
1565*4d9fdb46SRobert Mustacchi /* zero fileno allowed for DWARF5 table. For DWARF4,
1566*4d9fdb46SRobert Mustacchi zero fileno handled above. */
1567*4d9fdb46SRobert Mustacchi for (i = baseindex; i < fileno ; i++) {
1568*4d9fdb46SRobert Mustacchi file_entry = file_entry->fi_next;
1569*4d9fdb46SRobert Mustacchi }
1570*4d9fdb46SRobert Mustacchi
1571*4d9fdb46SRobert Mustacchi res = create_fullest_file_path(dbg,
1572*4d9fdb46SRobert Mustacchi file_entry,context, ret_filename,error);
1573*4d9fdb46SRobert Mustacchi return res;
1574*4d9fdb46SRobert Mustacchi }
1575*4d9fdb46SRobert Mustacchi
1576*4d9fdb46SRobert Mustacchi int
dwarf_linesrc(Dwarf_Line line,char ** ret_linesrc,Dwarf_Error * error)1577*4d9fdb46SRobert Mustacchi dwarf_linesrc(Dwarf_Line line, char **ret_linesrc, Dwarf_Error * error)
1578*4d9fdb46SRobert Mustacchi {
1579*4d9fdb46SRobert Mustacchi if (line == NULL) {
1580*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1581*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1582*4d9fdb46SRobert Mustacchi }
1583bc1f688bSRobert Mustacchi if (line->li_context == NULL) {
1584bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL);
1585*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1586bc1f688bSRobert Mustacchi }
1587*4d9fdb46SRobert Mustacchi return dwarf_filename(line->li_context,
1588*4d9fdb46SRobert Mustacchi line->li_addr_line.li_l_data.li_file, ret_linesrc, error);
1589bc1f688bSRobert Mustacchi }
1590bc1f688bSRobert Mustacchi
1591bc1f688bSRobert Mustacchi /* Every line table entry potentially has the basic-block-start
1592bc1f688bSRobert Mustacchi flag marked 'on'. This returns thru *return_bool,
1593bc1f688bSRobert Mustacchi the basic-block-start flag.
1594bc1f688bSRobert Mustacchi */
1595bc1f688bSRobert Mustacchi int
dwarf_lineblock(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1596bc1f688bSRobert Mustacchi dwarf_lineblock(Dwarf_Line line,
1597bc1f688bSRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error)
1598bc1f688bSRobert Mustacchi {
1599bc1f688bSRobert Mustacchi if (line == NULL) {
1600bc1f688bSRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1601bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1602bc1f688bSRobert Mustacchi }
1603bc1f688bSRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_basic_block);
1604bc1f688bSRobert Mustacchi return DW_DLV_OK;
1605bc1f688bSRobert Mustacchi }
1606bc1f688bSRobert Mustacchi
1607*4d9fdb46SRobert Mustacchi /* We gather these into one call as it's likely one
1608*4d9fdb46SRobert Mustacchi will want all or none of them. */
dwarf_prologue_end_etc(Dwarf_Line line,Dwarf_Bool * prologue_end,Dwarf_Bool * epilogue_begin,Dwarf_Unsigned * isa,Dwarf_Unsigned * discriminator,Dwarf_Error * error)1609*4d9fdb46SRobert Mustacchi int dwarf_prologue_end_etc(Dwarf_Line line,
1610*4d9fdb46SRobert Mustacchi Dwarf_Bool * prologue_end,
1611*4d9fdb46SRobert Mustacchi Dwarf_Bool * epilogue_begin,
1612*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * isa,
1613*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * discriminator,
1614*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1615bc1f688bSRobert Mustacchi {
1616*4d9fdb46SRobert Mustacchi if (line == NULL) {
1617*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1618bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1619bc1f688bSRobert Mustacchi }
1620*4d9fdb46SRobert Mustacchi *prologue_end = (line->li_addr_line.li_l_data.li_prologue_end);
1621*4d9fdb46SRobert Mustacchi *epilogue_begin = (line->li_addr_line.li_l_data.li_epilogue_begin);
1622*4d9fdb46SRobert Mustacchi *isa = (line->li_addr_line.li_l_data.li_isa);
1623*4d9fdb46SRobert Mustacchi *discriminator = (line->li_addr_line.li_l_data.li_discriminator);
1624*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1625*4d9fdb46SRobert Mustacchi }
1626bc1f688bSRobert Mustacchi
1627*4d9fdb46SRobert Mustacchi int
dwarf_linelogical(Dwarf_Line line,Dwarf_Unsigned * logical,Dwarf_Error * error)1628*4d9fdb46SRobert Mustacchi dwarf_linelogical(Dwarf_Line line,
1629*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * logical,
1630*4d9fdb46SRobert Mustacchi Dwarf_Error* error)
1631*4d9fdb46SRobert Mustacchi {
1632*4d9fdb46SRobert Mustacchi if (line == NULL) {
1633*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1634bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1635bc1f688bSRobert Mustacchi }
1636*4d9fdb46SRobert Mustacchi *logical = (line->li_addr_line.li_l_data.li_line);
1637*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1638bc1f688bSRobert Mustacchi }
1639*4d9fdb46SRobert Mustacchi
1640*4d9fdb46SRobert Mustacchi int
dwarf_linecontext(Dwarf_Line line,Dwarf_Unsigned * context,Dwarf_Error * error)1641*4d9fdb46SRobert Mustacchi dwarf_linecontext(Dwarf_Line line,
1642*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * context,
1643*4d9fdb46SRobert Mustacchi Dwarf_Error* error)
1644*4d9fdb46SRobert Mustacchi {
1645*4d9fdb46SRobert Mustacchi if (line == NULL) {
1646*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1647bc1f688bSRobert Mustacchi return (DW_DLV_ERROR);
1648bc1f688bSRobert Mustacchi }
1649*4d9fdb46SRobert Mustacchi *context = (line->li_addr_line.li_l_data.li_call_context);
1650*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1651bc1f688bSRobert Mustacchi }
1652bc1f688bSRobert Mustacchi
1653*4d9fdb46SRobert Mustacchi int
dwarf_line_subprogno(Dwarf_Line line,Dwarf_Unsigned * subprog,Dwarf_Error * error)1654*4d9fdb46SRobert Mustacchi dwarf_line_subprogno(Dwarf_Line line,
1655*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * subprog,
1656*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1657*4d9fdb46SRobert Mustacchi {
1658*4d9fdb46SRobert Mustacchi if (line == NULL) {
1659*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1660*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1661*4d9fdb46SRobert Mustacchi }
1662*4d9fdb46SRobert Mustacchi *subprog = (line->li_addr_line.li_l_data.li_subprogram);
1663*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1664bc1f688bSRobert Mustacchi }
1665bc1f688bSRobert Mustacchi
1666*4d9fdb46SRobert Mustacchi int
dwarf_line_subprog(Dwarf_Line line,char ** subprog_name,char ** decl_filename,Dwarf_Unsigned * decl_line,Dwarf_Error * error)1667*4d9fdb46SRobert Mustacchi dwarf_line_subprog(Dwarf_Line line,
1668*4d9fdb46SRobert Mustacchi char ** subprog_name,
1669*4d9fdb46SRobert Mustacchi char ** decl_filename,
1670*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * decl_line,
1671*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1672*4d9fdb46SRobert Mustacchi {
1673*4d9fdb46SRobert Mustacchi Dwarf_Unsigned subprog_no;
1674*4d9fdb46SRobert Mustacchi Dwarf_Subprog_Entry subprog;
1675*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg;
1676*4d9fdb46SRobert Mustacchi int res;
1677*4d9fdb46SRobert Mustacchi
1678*4d9fdb46SRobert Mustacchi if (line == NULL) {
1679*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1680*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1681bc1f688bSRobert Mustacchi }
1682bc1f688bSRobert Mustacchi
1683*4d9fdb46SRobert Mustacchi if (line->li_context == NULL) {
1684*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL);
1685*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1686bc1f688bSRobert Mustacchi }
1687*4d9fdb46SRobert Mustacchi
1688*4d9fdb46SRobert Mustacchi dbg = line->li_context->lc_dbg;
1689*4d9fdb46SRobert Mustacchi
1690*4d9fdb46SRobert Mustacchi subprog_no = line->li_addr_line.li_l_data.li_subprogram;
1691*4d9fdb46SRobert Mustacchi if (subprog_no == 0) {
1692*4d9fdb46SRobert Mustacchi *subprog_name = NULL;
1693*4d9fdb46SRobert Mustacchi *decl_filename = NULL;
1694*4d9fdb46SRobert Mustacchi *decl_line = 0;
1695*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1696*4d9fdb46SRobert Mustacchi }
1697*4d9fdb46SRobert Mustacchi
1698*4d9fdb46SRobert Mustacchi if (subprog_no > line->li_context->lc_subprogs_count) {
1699*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME);
1700*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1701*4d9fdb46SRobert Mustacchi }
1702*4d9fdb46SRobert Mustacchi
1703*4d9fdb46SRobert Mustacchi /* Adjusting for 1 origin subprog no */
1704*4d9fdb46SRobert Mustacchi subprog = &line->li_context->lc_subprogs[subprog_no - 1];
1705*4d9fdb46SRobert Mustacchi
1706*4d9fdb46SRobert Mustacchi *subprog_name = (char *)subprog->ds_subprog_name;
1707*4d9fdb46SRobert Mustacchi *decl_line = subprog->ds_decl_line;
1708*4d9fdb46SRobert Mustacchi
1709*4d9fdb46SRobert Mustacchi res = dwarf_filename(line->li_context,
1710*4d9fdb46SRobert Mustacchi subprog->ds_decl_file,
1711*4d9fdb46SRobert Mustacchi decl_filename, error);
1712*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1713*4d9fdb46SRobert Mustacchi *decl_filename = NULL;
1714*4d9fdb46SRobert Mustacchi return res;
1715*4d9fdb46SRobert Mustacchi }
1716*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1717*4d9fdb46SRobert Mustacchi }
1718*4d9fdb46SRobert Mustacchi
1719*4d9fdb46SRobert Mustacchi /* This is another line_context_destructor. */
1720*4d9fdb46SRobert Mustacchi static void
delete_line_context_itself(Dwarf_Line_Context context)1721*4d9fdb46SRobert Mustacchi delete_line_context_itself(Dwarf_Line_Context context)
1722*4d9fdb46SRobert Mustacchi {
1723bc1f688bSRobert Mustacchi
1724bc1f688bSRobert Mustacchi
1725*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = 0;
1726*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fe = 0;
1727bc1f688bSRobert Mustacchi
1728*4d9fdb46SRobert Mustacchi if(context->lc_magic != DW_CONTEXT_MAGIC) {
1729*4d9fdb46SRobert Mustacchi /* Something is wrong. */
1730*4d9fdb46SRobert Mustacchi return;
1731*4d9fdb46SRobert Mustacchi }
1732*4d9fdb46SRobert Mustacchi dbg = context->lc_dbg;
1733*4d9fdb46SRobert Mustacchi fe = context->lc_file_entries;
1734*4d9fdb46SRobert Mustacchi while (fe) {
1735*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fenext = fe->fi_next;
1736*4d9fdb46SRobert Mustacchi fe->fi_next = 0;
1737*4d9fdb46SRobert Mustacchi free(fe);
1738*4d9fdb46SRobert Mustacchi fe = fenext;
1739*4d9fdb46SRobert Mustacchi }
1740*4d9fdb46SRobert Mustacchi context->lc_file_entries = 0;
1741*4d9fdb46SRobert Mustacchi context->lc_file_entry_count = 0;
1742*4d9fdb46SRobert Mustacchi context->lc_file_entry_baseindex = 0;
1743*4d9fdb46SRobert Mustacchi context->lc_file_entry_endindex = 0;
1744*4d9fdb46SRobert Mustacchi if (context->lc_subprogs) {
1745*4d9fdb46SRobert Mustacchi free(context->lc_subprogs);
1746*4d9fdb46SRobert Mustacchi context->lc_subprogs = 0;
1747*4d9fdb46SRobert Mustacchi }
1748*4d9fdb46SRobert Mustacchi free(context->lc_directory_format_values);
1749*4d9fdb46SRobert Mustacchi context->lc_directory_format_values = 0;
1750*4d9fdb46SRobert Mustacchi free(context->lc_file_format_values);
1751*4d9fdb46SRobert Mustacchi context->lc_file_format_values = 0;
1752*4d9fdb46SRobert Mustacchi if (context->lc_include_directories) {
1753*4d9fdb46SRobert Mustacchi free(context->lc_include_directories);
1754*4d9fdb46SRobert Mustacchi context->lc_include_directories = 0;
1755*4d9fdb46SRobert Mustacchi }
1756*4d9fdb46SRobert Mustacchi context->lc_magic = 0xdead;
1757*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, context, DW_DLA_LINE_CONTEXT);
1758*4d9fdb46SRobert Mustacchi }
1759*4d9fdb46SRobert Mustacchi
1760*4d9fdb46SRobert Mustacchi /* It's impossible for callers of dwarf_srclines() to get to and
1761bc1f688bSRobert Mustacchi free all the resources (in particular, the li_context and its
1762bc1f688bSRobert Mustacchi lc_file_entries).
1763bc1f688bSRobert Mustacchi So this function, new July 2005, does it.
1764*4d9fdb46SRobert Mustacchi
1765*4d9fdb46SRobert Mustacchi As of September 2015 this will now delete either
1766*4d9fdb46SRobert Mustacchi table of a two-level line table.
1767*4d9fdb46SRobert Mustacchi In the two-level case one calls it once each on
1768*4d9fdb46SRobert Mustacchi both the logicals and actuals tables.
1769*4d9fdb46SRobert Mustacchi (in either order, the order is not critical).
1770*4d9fdb46SRobert Mustacchi Once the logicals table is dealloced any
1771*4d9fdb46SRobert Mustacchi use of the actuals table will surely result in chaos.
1772*4d9fdb46SRobert Mustacchi Just do the two calls one after the other.
1773*4d9fdb46SRobert Mustacchi
1774*4d9fdb46SRobert Mustacchi In the standard single-table case (DWARF 2,3,4)
1775*4d9fdb46SRobert Mustacchi one calls it just once on the
1776*4d9fdb46SRobert Mustacchi linebuf. Old style dealloc. Should never be used with
1777*4d9fdb46SRobert Mustacchi dwarf_srclines_b(), but if it is there
1778*4d9fdb46SRobert Mustacchi are no bad consequences..
1779*4d9fdb46SRobert Mustacchi
1780*4d9fdb46SRobert Mustacchi Those using standard DWARF should use
1781*4d9fdb46SRobert Mustacchi dwarf_srclines_b() and dwarf_srclines_dealloc_b()
1782*4d9fdb46SRobert Mustacchi instead of dwarf_srclines and dwarf_srclines_dealloc()
1783*4d9fdb46SRobert Mustacchi as that gives access to various bits of useful information.
1784bc1f688bSRobert Mustacchi */
1785bc1f688bSRobert Mustacchi
1786bc1f688bSRobert Mustacchi void
dwarf_srclines_dealloc(Dwarf_Debug dbg,Dwarf_Line * linebuf,Dwarf_Signed count)1787bc1f688bSRobert Mustacchi dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line * linebuf,
1788bc1f688bSRobert Mustacchi Dwarf_Signed count)
1789bc1f688bSRobert Mustacchi {
1790bc1f688bSRobert Mustacchi Dwarf_Signed i = 0;
1791*4d9fdb46SRobert Mustacchi /* alternate_data_count is a failsafe to prevent
1792*4d9fdb46SRobert Mustacchi duplicate frees when there is inappropriate mixing
1793*4d9fdb46SRobert Mustacchi of new interface and this old routine */
1794*4d9fdb46SRobert Mustacchi Dwarf_Bool alternate_data_count = 0;
1795bc1f688bSRobert Mustacchi
1796*4d9fdb46SRobert Mustacchi struct Dwarf_Line_Context_s *line_context = 0;
1797*4d9fdb46SRobert Mustacchi
1798*4d9fdb46SRobert Mustacchi
1799*4d9fdb46SRobert Mustacchi if(!linebuf) {
1800*4d9fdb46SRobert Mustacchi return;
1801bc1f688bSRobert Mustacchi }
1802*4d9fdb46SRobert Mustacchi if (count > 0) {
1803*4d9fdb46SRobert Mustacchi /* All these entries share a single line_context, and
1804*4d9fdb46SRobert Mustacchi for two-levels tables each table gets it too.
1805*4d9fdb46SRobert Mustacchi Hence we will dealloc ONLY if !is_actuals_table
1806*4d9fdb46SRobert Mustacchi so for single and two-level tables the space
1807*4d9fdb46SRobert Mustacchi is deallocated. */
1808*4d9fdb46SRobert Mustacchi line_context = linebuf[0]->li_context;
1809*4d9fdb46SRobert Mustacchi if (line_context && line_context->lc_magic != DW_CONTEXT_MAGIC ) {
1810*4d9fdb46SRobert Mustacchi /* Something is very wrong. */
1811*4d9fdb46SRobert Mustacchi line_context = 0;
1812*4d9fdb46SRobert Mustacchi } else if (line_context) {
1813*4d9fdb46SRobert Mustacchi if (linebuf == line_context->lc_linebuf_logicals) {
1814*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_logicals = 0;
1815*4d9fdb46SRobert Mustacchi line_context->lc_linecount_logicals = 0;
1816*4d9fdb46SRobert Mustacchi alternate_data_count = line_context->lc_linecount_actuals;
1817*4d9fdb46SRobert Mustacchi /* Ok to delete logicals */
1818*4d9fdb46SRobert Mustacchi } else if (linebuf == line_context->lc_linebuf_actuals) {
1819*4d9fdb46SRobert Mustacchi /* Ok to delete actuals */
1820*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_actuals = 0;
1821*4d9fdb46SRobert Mustacchi line_context->lc_linecount_actuals = 0;
1822*4d9fdb46SRobert Mustacchi alternate_data_count = line_context->lc_linecount_logicals;
1823*4d9fdb46SRobert Mustacchi } else {
1824*4d9fdb46SRobert Mustacchi /* Something is wrong very wrong. */
1825*4d9fdb46SRobert Mustacchi return;
1826*4d9fdb46SRobert Mustacchi }
1827*4d9fdb46SRobert Mustacchi } else {
1828*4d9fdb46SRobert Mustacchi /* Else: impossible. Unless the caller
1829*4d9fdb46SRobert Mustacchi passed in a bogus linebuf. */
1830*4d9fdb46SRobert Mustacchi line_context = 0;
1831*4d9fdb46SRobert Mustacchi }
1832*4d9fdb46SRobert Mustacchi }
1833*4d9fdb46SRobert Mustacchi
1834*4d9fdb46SRobert Mustacchi /* Here we actually delete a set of lines. */
1835bc1f688bSRobert Mustacchi for (i = 0; i < count; ++i) {
1836bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);
1837bc1f688bSRobert Mustacchi }
1838bc1f688bSRobert Mustacchi dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);
1839bc1f688bSRobert Mustacchi
1840*4d9fdb46SRobert Mustacchi if (line_context && !line_context->lc_new_style_access
1841*4d9fdb46SRobert Mustacchi && !alternate_data_count ) {
1842*4d9fdb46SRobert Mustacchi /* There is nothing left
1843*4d9fdb46SRobert Mustacchi referencing this line_context. */
1844*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
1845bc1f688bSRobert Mustacchi }
1846bc1f688bSRobert Mustacchi return;
1847bc1f688bSRobert Mustacchi }
1848bc1f688bSRobert Mustacchi
1849*4d9fdb46SRobert Mustacchi /* New October 2015.
1850*4d9fdb46SRobert Mustacchi This should be used to deallocate all
1851*4d9fdb46SRobert Mustacchi lines data that is
1852*4d9fdb46SRobert Mustacchi set up by dwarf_srclines_b().
1853*4d9fdb46SRobert Mustacchi This and dwarf_srclines_b() are now (October 2015)
1854*4d9fdb46SRobert Mustacchi the preferred routine to use. */
1855*4d9fdb46SRobert Mustacchi void
dwarf_srclines_dealloc_b(Dwarf_Line_Context line_context)1856*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(Dwarf_Line_Context line_context)
1857*4d9fdb46SRobert Mustacchi {
1858*4d9fdb46SRobert Mustacchi Dwarf_Line *linestable = 0;
1859*4d9fdb46SRobert Mustacchi Dwarf_Signed linescount = 0;
1860*4d9fdb46SRobert Mustacchi Dwarf_Signed i = 0;
1861*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = 0;
1862bc1f688bSRobert Mustacchi
1863*4d9fdb46SRobert Mustacchi if(!line_context) {
1864*4d9fdb46SRobert Mustacchi return;
1865*4d9fdb46SRobert Mustacchi }
1866*4d9fdb46SRobert Mustacchi if(line_context->lc_magic != DW_CONTEXT_MAGIC) {
1867*4d9fdb46SRobert Mustacchi /* Something is wrong. */
1868*4d9fdb46SRobert Mustacchi return; }
1869*4d9fdb46SRobert Mustacchi dbg = line_context->lc_dbg;
1870*4d9fdb46SRobert Mustacchi if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1871*4d9fdb46SRobert Mustacchi /* Something is badly wrong here.*/
1872*4d9fdb46SRobert Mustacchi return;
1873*4d9fdb46SRobert Mustacchi }
1874*4d9fdb46SRobert Mustacchi linestable = line_context->lc_linebuf_logicals;
1875*4d9fdb46SRobert Mustacchi if (linestable) {
1876*4d9fdb46SRobert Mustacchi linescount = line_context->lc_linecount_logicals;
1877*4d9fdb46SRobert Mustacchi for (i = 0; i < linescount ; ++i) {
1878*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linestable[i], DW_DLA_LINE);
1879*4d9fdb46SRobert Mustacchi }
1880*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linestable, DW_DLA_LIST);
1881*4d9fdb46SRobert Mustacchi }
1882*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_logicals = 0;
1883*4d9fdb46SRobert Mustacchi line_context->lc_linecount_logicals = 0;
1884bc1f688bSRobert Mustacchi
1885*4d9fdb46SRobert Mustacchi linestable = line_context->lc_linebuf_actuals;
1886*4d9fdb46SRobert Mustacchi if (linestable) {
1887*4d9fdb46SRobert Mustacchi linescount = line_context->lc_linecount_actuals;
1888*4d9fdb46SRobert Mustacchi for (i = 0; i <linescount ; ++i) {
1889*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linestable[i], DW_DLA_LINE);
1890*4d9fdb46SRobert Mustacchi }
1891*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linestable, DW_DLA_LIST);
1892*4d9fdb46SRobert Mustacchi }
1893*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_actuals = 0;
1894*4d9fdb46SRobert Mustacchi line_context->lc_linecount_actuals = 0;
1895*4d9fdb46SRobert Mustacchi delete_line_context_itself(line_context);
1896*4d9fdb46SRobert Mustacchi }
1897*4d9fdb46SRobert Mustacchi
1898*4d9fdb46SRobert Mustacchi /* There is an error, so count it. If we are printing
1899*4d9fdb46SRobert Mustacchi errors by command line option, print the details. */
1900*4d9fdb46SRobert Mustacchi void
_dwarf_print_header_issue(Dwarf_Debug dbg,const char * specific_msg,Dwarf_Small * data_start,Dwarf_Signed value,unsigned index,unsigned tabv,unsigned linetabv,int * err_count_out)1901*4d9fdb46SRobert Mustacchi _dwarf_print_header_issue(Dwarf_Debug dbg,
1902*4d9fdb46SRobert Mustacchi const char *specific_msg,
1903bc1f688bSRobert Mustacchi Dwarf_Small *data_start,
1904*4d9fdb46SRobert Mustacchi Dwarf_Signed value,
1905*4d9fdb46SRobert Mustacchi unsigned index,
1906*4d9fdb46SRobert Mustacchi unsigned tabv,
1907*4d9fdb46SRobert Mustacchi unsigned linetabv,
1908bc1f688bSRobert Mustacchi int *err_count_out)
1909bc1f688bSRobert Mustacchi {
1910*4d9fdb46SRobert Mustacchi if (!err_count_out) {
1911bc1f688bSRobert Mustacchi return;
1912*4d9fdb46SRobert Mustacchi }
1913*4d9fdb46SRobert Mustacchi /* Are we in verbose mode */
1914*4d9fdb46SRobert Mustacchi if (dwarf_cmdline_options.check_verbose_mode){
1915*4d9fdb46SRobert Mustacchi dwarfstring m1;
1916*4d9fdb46SRobert Mustacchi
1917*4d9fdb46SRobert Mustacchi dwarfstring_constructor(&m1);
1918*4d9fdb46SRobert Mustacchi dwarfstring_append(&m1,
1919*4d9fdb46SRobert Mustacchi "\n*** DWARF CHECK: "
1920*4d9fdb46SRobert Mustacchi ".debug_line: ");
1921*4d9fdb46SRobert Mustacchi dwarfstring_append(&m1,(char *)specific_msg);
1922*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_i(&m1,
1923*4d9fdb46SRobert Mustacchi " %" DW_PR_DSd,value);
1924*4d9fdb46SRobert Mustacchi if (index || tabv || linetabv) {
1925*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m1,
1926*4d9fdb46SRobert Mustacchi "; Mismatch index %u",index);
1927*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m1,
1928*4d9fdb46SRobert Mustacchi " stdval %u",tabv);
1929*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m1,
1930*4d9fdb46SRobert Mustacchi " linetabval %u",linetabv);
1931*4d9fdb46SRobert Mustacchi }
1932bc1f688bSRobert Mustacchi if (data_start >= dbg->de_debug_line.dss_data &&
1933bc1f688bSRobert Mustacchi (data_start < (dbg->de_debug_line.dss_data +
1934bc1f688bSRobert Mustacchi dbg->de_debug_line.dss_size))) {
1935*4d9fdb46SRobert Mustacchi Dwarf_Unsigned off =
1936*4d9fdb46SRobert Mustacchi data_start - dbg->de_debug_line.dss_data;
1937*4d9fdb46SRobert Mustacchi
1938*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m1,
1939*4d9fdb46SRobert Mustacchi " at offset 0x%" DW_PR_XZEROS DW_PR_DUx,off);
1940*4d9fdb46SRobert Mustacchi dwarfstring_append_printf_u(&m1,
1941*4d9fdb46SRobert Mustacchi " ( %" DW_PR_DUu " ) ",off);
1942bc1f688bSRobert Mustacchi } else {
1943*4d9fdb46SRobert Mustacchi dwarfstring_append(&m1,
1944*4d9fdb46SRobert Mustacchi " (unknown section location) ");
1945bc1f688bSRobert Mustacchi }
1946*4d9fdb46SRobert Mustacchi dwarfstring_append(&m1,"***\n");
1947*4d9fdb46SRobert Mustacchi _dwarf_printf(dbg,dwarfstring_string(&m1));
1948*4d9fdb46SRobert Mustacchi dwarfstring_destructor(&m1);
1949*4d9fdb46SRobert Mustacchi }
1950bc1f688bSRobert Mustacchi *err_count_out += 1;
1951bc1f688bSRobert Mustacchi }
1952bc1f688bSRobert Mustacchi
1953bc1f688bSRobert Mustacchi
1954bc1f688bSRobert Mustacchi int
_dwarf_decode_line_string_form(Dwarf_Debug dbg,Dwarf_Unsigned form,Dwarf_Unsigned offset_size,Dwarf_Small ** line_ptr,Dwarf_Small * line_ptr_end,char ** return_str,Dwarf_Error * error)1955*4d9fdb46SRobert Mustacchi _dwarf_decode_line_string_form(Dwarf_Debug dbg,
1956*4d9fdb46SRobert Mustacchi Dwarf_Unsigned form,
1957*4d9fdb46SRobert Mustacchi Dwarf_Unsigned offset_size,
1958*4d9fdb46SRobert Mustacchi Dwarf_Small **line_ptr,
1959*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr_end,
1960*4d9fdb46SRobert Mustacchi char **return_str,
1961*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
1962bc1f688bSRobert Mustacchi {
1963*4d9fdb46SRobert Mustacchi int res = 0;
1964bc1f688bSRobert Mustacchi
1965*4d9fdb46SRobert Mustacchi switch (form) {
1966*4d9fdb46SRobert Mustacchi case DW_FORM_line_strp: {
1967*4d9fdb46SRobert Mustacchi Dwarf_Small *secstart = 0;
1968*4d9fdb46SRobert Mustacchi Dwarf_Small *secend = 0;
1969*4d9fdb46SRobert Mustacchi Dwarf_Small *strptr = 0;
1970*4d9fdb46SRobert Mustacchi Dwarf_Unsigned offset = 0;
1971*4d9fdb46SRobert Mustacchi Dwarf_Small *offsetptr = *line_ptr;
1972bc1f688bSRobert Mustacchi
1973*4d9fdb46SRobert Mustacchi res = _dwarf_load_section(dbg, &dbg->de_debug_line_str,error);
1974*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1975*4d9fdb46SRobert Mustacchi return res;
1976bc1f688bSRobert Mustacchi }
1977bc1f688bSRobert Mustacchi
1978*4d9fdb46SRobert Mustacchi secstart = dbg->de_debug_line_str.dss_data;
1979*4d9fdb46SRobert Mustacchi secend = secstart + dbg->de_debug_line_str.dss_size;
1980bc1f688bSRobert Mustacchi
1981*4d9fdb46SRobert Mustacchi READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,offsetptr, offset_size,
1982*4d9fdb46SRobert Mustacchi error,line_ptr_end);
1983*4d9fdb46SRobert Mustacchi *line_ptr += offset_size;
1984*4d9fdb46SRobert Mustacchi strptr = secstart + offset;
1985*4d9fdb46SRobert Mustacchi res = _dwarf_check_string_valid(dbg,
1986*4d9fdb46SRobert Mustacchi secstart,strptr,secend,
1987*4d9fdb46SRobert Mustacchi DW_DLE_LINE_STRP_OFFSET_BAD,error);
1988*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1989*4d9fdb46SRobert Mustacchi return res;
1990*4d9fdb46SRobert Mustacchi }
1991*4d9fdb46SRobert Mustacchi *return_str = (char *) strptr;
1992*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1993*4d9fdb46SRobert Mustacchi }
1994*4d9fdb46SRobert Mustacchi case DW_FORM_string: {
1995*4d9fdb46SRobert Mustacchi Dwarf_Small *secend = line_ptr_end;
1996*4d9fdb46SRobert Mustacchi Dwarf_Small *strptr = *line_ptr;
1997bc1f688bSRobert Mustacchi
1998*4d9fdb46SRobert Mustacchi res = _dwarf_check_string_valid(dbg,
1999*4d9fdb46SRobert Mustacchi strptr ,strptr,secend,DW_DLE_LINE_STRING_BAD,error);
2000*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
2001*4d9fdb46SRobert Mustacchi return res;
2002*4d9fdb46SRobert Mustacchi }
2003*4d9fdb46SRobert Mustacchi *return_str = (char *)strptr;
2004*4d9fdb46SRobert Mustacchi *line_ptr += strlen((const char *)strptr) + 1;
2005*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
2006*4d9fdb46SRobert Mustacchi }
2007*4d9fdb46SRobert Mustacchi default:
2008*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
2009*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2010*4d9fdb46SRobert Mustacchi }
2011*4d9fdb46SRobert Mustacchi }
2012bc1f688bSRobert Mustacchi
2013*4d9fdb46SRobert Mustacchi int
_dwarf_decode_line_udata_form(Dwarf_Debug dbg,Dwarf_Unsigned form,Dwarf_Small ** line_ptr,Dwarf_Unsigned * return_val,Dwarf_Small * line_end_ptr,Dwarf_Error * error)2014*4d9fdb46SRobert Mustacchi _dwarf_decode_line_udata_form(Dwarf_Debug dbg,
2015*4d9fdb46SRobert Mustacchi Dwarf_Unsigned form,
2016*4d9fdb46SRobert Mustacchi Dwarf_Small **line_ptr,
2017*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *return_val,
2018*4d9fdb46SRobert Mustacchi Dwarf_Small *line_end_ptr,
2019*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
2020bc1f688bSRobert Mustacchi {
2021*4d9fdb46SRobert Mustacchi Dwarf_Unsigned val = 0;
2022*4d9fdb46SRobert Mustacchi Dwarf_Small * lp = *line_ptr;
2023bc1f688bSRobert Mustacchi
2024*4d9fdb46SRobert Mustacchi switch (form) {
2025bc1f688bSRobert Mustacchi
2026*4d9fdb46SRobert Mustacchi case DW_FORM_udata:
2027*4d9fdb46SRobert Mustacchi DECODE_LEB128_UWORD_CK(lp, val,dbg,error,line_end_ptr);
2028*4d9fdb46SRobert Mustacchi *return_val = val;
2029*4d9fdb46SRobert Mustacchi *line_ptr = lp;
2030*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
2031*4d9fdb46SRobert Mustacchi
2032*4d9fdb46SRobert Mustacchi default:
2033*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
2034*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
2035bc1f688bSRobert Mustacchi }
2036bc1f688bSRobert Mustacchi }
2037bc1f688bSRobert Mustacchi
2038bc1f688bSRobert Mustacchi
2039*4d9fdb46SRobert Mustacchi void
_dwarf_update_chain_list(Dwarf_Chain chain_line,Dwarf_Chain * head_chain,Dwarf_Chain * curr_chain)2040*4d9fdb46SRobert Mustacchi _dwarf_update_chain_list( Dwarf_Chain chain_line,
2041*4d9fdb46SRobert Mustacchi Dwarf_Chain *head_chain, Dwarf_Chain *curr_chain)
2042*4d9fdb46SRobert Mustacchi {
2043*4d9fdb46SRobert Mustacchi if (*head_chain == NULL) {
2044*4d9fdb46SRobert Mustacchi *head_chain = chain_line;
2045bc1f688bSRobert Mustacchi } else {
2046*4d9fdb46SRobert Mustacchi (*curr_chain)->ch_next = chain_line;
2047bc1f688bSRobert Mustacchi }
2048*4d9fdb46SRobert Mustacchi *curr_chain = chain_line;
2049bc1f688bSRobert Mustacchi }
2050bc1f688bSRobert Mustacchi
2051*4d9fdb46SRobert Mustacchi void
_dwarf_free_chain_entries(Dwarf_Debug dbg,Dwarf_Chain head,int count)2052*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(Dwarf_Debug dbg,Dwarf_Chain head,int count)
2053*4d9fdb46SRobert Mustacchi {
2054*4d9fdb46SRobert Mustacchi int i = 0;
2055*4d9fdb46SRobert Mustacchi Dwarf_Chain curr_chain = head;
2056*4d9fdb46SRobert Mustacchi for (i = 0; i < count; i++) {
2057*4d9fdb46SRobert Mustacchi Dwarf_Chain t = curr_chain;
2058*4d9fdb46SRobert Mustacchi void *item = t->ch_item;
2059*4d9fdb46SRobert Mustacchi int itype = t->ch_itemtype;
2060*4d9fdb46SRobert Mustacchi
2061*4d9fdb46SRobert Mustacchi if (item && itype) { /* valid DW_DLA types are never 0 */
2062*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg,item,itype);
2063*4d9fdb46SRobert Mustacchi t->ch_item = 0;
2064*4d9fdb46SRobert Mustacchi }
2065*4d9fdb46SRobert Mustacchi curr_chain = curr_chain->ch_next;
2066*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, t, DW_DLA_CHAIN);
2067*4d9fdb46SRobert Mustacchi }
2068*4d9fdb46SRobert Mustacchi }
2069*4d9fdb46SRobert Mustacchi
2070*4d9fdb46SRobert Mustacchi int
_dwarf_add_to_files_list(Dwarf_Line_Context context,Dwarf_File_Entry fe)2071*4d9fdb46SRobert Mustacchi _dwarf_add_to_files_list(Dwarf_Line_Context context, Dwarf_File_Entry fe)
2072*4d9fdb46SRobert Mustacchi {
2073*4d9fdb46SRobert Mustacchi if (!context->lc_file_entries) {
2074*4d9fdb46SRobert Mustacchi context->lc_file_entries = fe;
2075*4d9fdb46SRobert Mustacchi } else {
2076*4d9fdb46SRobert Mustacchi context->lc_last_entry->fi_next = fe;
2077*4d9fdb46SRobert Mustacchi }
2078*4d9fdb46SRobert Mustacchi context->lc_last_entry = fe;
2079*4d9fdb46SRobert Mustacchi context->lc_file_entry_count++;
2080*4d9fdb46SRobert Mustacchi /* Here we attempt to write code to make it easy to interate
2081*4d9fdb46SRobert Mustacchi though source file names without having to code specially
2082*4d9fdb46SRobert Mustacchi for DWARF2,3,4 vs DWARF5 */
2083*4d9fdb46SRobert Mustacchi if (context->lc_version_number >= DW_LINE_VERSION5 &&
2084*4d9fdb46SRobert Mustacchi context->lc_version_number != EXPERIMENTAL_LINE_TABLES_VERSION) {
2085*4d9fdb46SRobert Mustacchi context->lc_file_entry_baseindex = 0;
2086*4d9fdb46SRobert Mustacchi context->lc_file_entry_endindex = context->lc_file_entry_count;
2087*4d9fdb46SRobert Mustacchi } else {
2088*4d9fdb46SRobert Mustacchi /* DWARF2,3,4 and the EXPERIMENTAL_LINE_TABLES_VERSION. */
2089*4d9fdb46SRobert Mustacchi context->lc_file_entry_baseindex = 1;
2090*4d9fdb46SRobert Mustacchi context->lc_file_entry_endindex = context->lc_file_entry_count+1;
2091*4d9fdb46SRobert Mustacchi }
2092bc1f688bSRobert Mustacchi return DW_DLV_OK;
2093bc1f688bSRobert Mustacchi }
2094bc1f688bSRobert Mustacchi
2095bc1f688bSRobert Mustacchi
2096*4d9fdb46SRobert Mustacchi int
_dwarf_line_context_constructor(Dwarf_Debug dbg,void * m)2097*4d9fdb46SRobert Mustacchi _dwarf_line_context_constructor(Dwarf_Debug dbg, void *m)
2098bc1f688bSRobert Mustacchi {
2099*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context = (Dwarf_Line_Context)m;
2100*4d9fdb46SRobert Mustacchi /* dwarf_get_alloc ensures the bytes are all zero
2101*4d9fdb46SRobert Mustacchi when m is passed to us. */
2102*4d9fdb46SRobert Mustacchi line_context->lc_magic = DW_CONTEXT_MAGIC;
2103*4d9fdb46SRobert Mustacchi line_context->lc_dbg = dbg;
2104*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
2105bc1f688bSRobert Mustacchi }
2106bc1f688bSRobert Mustacchi
2107*4d9fdb46SRobert Mustacchi /* This cleans up a contex record.
2108*4d9fdb46SRobert Mustacchi The lines tables (actuals and logicals)
2109*4d9fdb46SRobert Mustacchi are themselves items that will
2110*4d9fdb46SRobert Mustacchi be dealloc'd either manually
2111*4d9fdb46SRobert Mustacchi or, at closing the libdwarf dbg,
2112*4d9fdb46SRobert Mustacchi automatically. So we DO NOT
2113*4d9fdb46SRobert Mustacchi touch the lines tables here
2114*4d9fdb46SRobert Mustacchi See also: delete_line_context_itself()
2115*4d9fdb46SRobert Mustacchi */
2116bc1f688bSRobert Mustacchi void
_dwarf_line_context_destructor(void * m)2117*4d9fdb46SRobert Mustacchi _dwarf_line_context_destructor(void *m)
2118bc1f688bSRobert Mustacchi {
2119*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context = (Dwarf_Line_Context)m;
2120*4d9fdb46SRobert Mustacchi if (line_context->lc_magic != DW_CONTEXT_MAGIC) {
2121*4d9fdb46SRobert Mustacchi /* Nothing is safe, do nothing. */
2122*4d9fdb46SRobert Mustacchi return;
2123bc1f688bSRobert Mustacchi }
2124*4d9fdb46SRobert Mustacchi if (line_context->lc_include_directories) {
2125*4d9fdb46SRobert Mustacchi free(line_context->lc_include_directories);
2126*4d9fdb46SRobert Mustacchi line_context->lc_include_directories = 0;
2127*4d9fdb46SRobert Mustacchi line_context->lc_include_directories_count = 0;
2128bc1f688bSRobert Mustacchi }
2129*4d9fdb46SRobert Mustacchi if (line_context->lc_file_entries) {
2130*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fe = line_context->lc_file_entries;
2131*4d9fdb46SRobert Mustacchi while(fe) {
2132*4d9fdb46SRobert Mustacchi Dwarf_File_Entry t = fe;
2133*4d9fdb46SRobert Mustacchi fe = t->fi_next;
2134*4d9fdb46SRobert Mustacchi t->fi_next = 0;
2135*4d9fdb46SRobert Mustacchi free(t);
2136*4d9fdb46SRobert Mustacchi }
2137*4d9fdb46SRobert Mustacchi line_context->lc_file_entries = 0;
2138*4d9fdb46SRobert Mustacchi line_context->lc_last_entry = 0;
2139*4d9fdb46SRobert Mustacchi line_context->lc_file_entry_count = 0;
2140*4d9fdb46SRobert Mustacchi line_context->lc_file_entry_baseindex = 0;
2141*4d9fdb46SRobert Mustacchi line_context->lc_file_entry_endindex = 0;
2142*4d9fdb46SRobert Mustacchi }
2143*4d9fdb46SRobert Mustacchi free(line_context->lc_directory_format_values);
2144*4d9fdb46SRobert Mustacchi line_context->lc_directory_format_values = 0;
2145*4d9fdb46SRobert Mustacchi free(line_context->lc_file_format_values);
2146*4d9fdb46SRobert Mustacchi line_context->lc_file_format_values = 0;
2147*4d9fdb46SRobert Mustacchi
2148*4d9fdb46SRobert Mustacchi if (line_context->lc_subprogs) {
2149*4d9fdb46SRobert Mustacchi free(line_context->lc_subprogs);
2150*4d9fdb46SRobert Mustacchi line_context->lc_subprogs = 0;
2151*4d9fdb46SRobert Mustacchi line_context->lc_subprogs_count = 0;
2152*4d9fdb46SRobert Mustacchi }
2153*4d9fdb46SRobert Mustacchi line_context->lc_magic = 0;
2154bc1f688bSRobert Mustacchi return;
2155bc1f688bSRobert Mustacchi }
2156