149d3bc91SRichard Lowe /*
2*4d9fdb46SRobert 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.
6*4d9fdb46SRobert Mustacchi
7*4d9fdb46SRobert Mustacchi This program is free software; you can redistribute it and/or modify it
8*4d9fdb46SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
9*4d9fdb46SRobert Mustacchi as published by the Free Software Foundation.
10*4d9fdb46SRobert Mustacchi
11*4d9fdb46SRobert Mustacchi This program is distributed in the hope that it would be useful, but
12*4d9fdb46SRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of
13*4d9fdb46SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14*4d9fdb46SRobert Mustacchi
15*4d9fdb46SRobert Mustacchi Further, this software is distributed without any warranty that it is
16*4d9fdb46SRobert Mustacchi free of the rightful claim of any third person regarding infringement
17*4d9fdb46SRobert Mustacchi or the like. Any license provided herein, whether implied or
18*4d9fdb46SRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if
19*4d9fdb46SRobert Mustacchi any, provided herein do not apply to combinations of this program with
20*4d9fdb46SRobert Mustacchi other software, or any other product whatsoever.
21*4d9fdb46SRobert Mustacchi
22*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General Public
23*4d9fdb46SRobert Mustacchi License along with this program; if not, write the Free Software
24*4d9fdb46SRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
25*4d9fdb46SRobert Mustacchi USA.
2649d3bc91SRichard Lowe
2749d3bc91SRichard Lowe */
2849d3bc91SRichard Lowe
2949d3bc91SRichard Lowe #include "config.h"
3049d3bc91SRichard Lowe #include <stdio.h>
31*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
3207dc1947SRichard Lowe #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"
3849d3bc91SRichard Lowe #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
7207dc1947SRichard Lowe
7307dc1947SRichard Lowe static int
is_path_separator(Dwarf_Small s)7407dc1947SRichard Lowe is_path_separator(Dwarf_Small s)
7507dc1947SRichard Lowe {
76*4d9fdb46SRobert Mustacchi if (s == '/') {
7707dc1947SRichard Lowe return 1;
7807dc1947SRichard Lowe }
7907dc1947SRichard Lowe #ifdef HAVE_WINDOWS_PATH
80*4d9fdb46SRobert Mustacchi if (s == '\\') {
8107dc1947SRichard Lowe return 1;
8207dc1947SRichard Lowe }
8349d3bc91SRichard Lowe #endif
8407dc1947SRichard Lowe return 0;
8507dc1947SRichard Lowe }
8649d3bc91SRichard Lowe
87*4d9fdb46SRobert Mustacchi /* Return 0 if false, 1 if true.
88*4d9fdb46SRobert Mustacchi If HAVE_WINDOWS_PATH is defined we
89*4d9fdb46SRobert Mustacchi attempt to handle windows full paths:
90*4d9fdb46SRobert Mustacchi \\something or C:cwdpath.c
91*4d9fdb46SRobert 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)
9407dc1947SRichard Lowe {
9507dc1947SRichard Lowe Dwarf_Small firstc = *fname;
96*4d9fdb46SRobert Mustacchi if (is_path_separator(firstc)) {
9707dc1947SRichard Lowe /* Full path. */
9807dc1947SRichard Lowe return 1;
9907dc1947SRichard Lowe }
100*4d9fdb46SRobert Mustacchi if (!firstc) {
10107dc1947SRichard Lowe return 0;
10207dc1947SRichard Lowe }
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. */
107*4d9fdb46SRobert Mustacchi if ((firstc >= 'A' && firstc <= 'Z') ||
108*4d9fdb46SRobert Mustacchi (firstc >= 'a' && firstc <= 'z')) {
109*4d9fdb46SRobert Mustacchi
110*4d9fdb46SRobert Mustacchi Dwarf_Small secondc = fname[1];
111*4d9fdb46SRobert Mustacchi if (secondc == ':') {
112*4d9fdb46SRobert Mustacchi return 1;
113*4d9fdb46SRobert Mustacchi }
11407dc1947SRichard Lowe }
115*4d9fdb46SRobert Mustacchi /* End Windows style */
11607dc1947SRichard Lowe return 0;
11707dc1947SRichard Lowe }
118*4d9fdb46SRobert Mustacchi #include "dwarf_line_table_reader_common.h"
119*4d9fdb46SRobert 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 }
25549d3bc91SRichard Lowe
256*4d9fdb46SRobert Mustacchi /* Although source files is supposed to return the
25749d3bc91SRichard Lowe source files in the compilation-unit, it does
25849d3bc91SRichard Lowe not look for any in the statement program. In
25949d3bc91SRichard Lowe other words, it ignores those defined using the
26049d3bc91SRichard Lowe 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.
27349d3bc91SRichard Lowe */
27449d3bc91SRichard Lowe int
dwarf_srcfiles(Dwarf_Die die,char *** srcfiles,Dwarf_Signed * srcfilecount,Dwarf_Error * error)27549d3bc91SRichard Lowe dwarf_srcfiles(Dwarf_Die die,
276*4d9fdb46SRobert Mustacchi char ***srcfiles,
277*4d9fdb46SRobert Mustacchi Dwarf_Signed * srcfilecount, Dwarf_Error * error)
27849d3bc91SRichard Lowe {
279*4d9fdb46SRobert Mustacchi /* This pointer is used to scan the portion of the .debug_line
280*4d9fdb46SRobert Mustacchi section for the current cu. */
281*4d9fdb46SRobert Mustacchi Dwarf_Small *line_ptr = 0;
28249d3bc91SRichard Lowe
283*4d9fdb46SRobert Mustacchi /* Pointer to a DW_AT_stmt_list attribute in case it exists in the
284*4d9fdb46SRobert Mustacchi die. */
285*4d9fdb46SRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0;
28649d3bc91SRichard Lowe
287*4d9fdb46SRobert Mustacchi const char * const_comp_name = 0;
288*4d9fdb46SRobert Mustacchi /* Pointer to name of compilation directory. */
289*4d9fdb46SRobert Mustacchi const char * const_comp_dir = 0;
29049d3bc91SRichard Lowe Dwarf_Small *comp_dir = 0;
29149d3bc91SRichard Lowe
292*4d9fdb46SRobert Mustacchi /* Offset into .debug_line specified by a DW_AT_stmt_list
293*4d9fdb46SRobert Mustacchi attribute. */
29449d3bc91SRichard Lowe Dwarf_Unsigned line_offset = 0;
29549d3bc91SRichard Lowe
296*4d9fdb46SRobert Mustacchi /* This points to a block of char *'s, each of which points to a
297*4d9fdb46SRobert Mustacchi file name. */
29849d3bc91SRichard Lowe char **ret_files = 0;
29949d3bc91SRichard Lowe
300*4d9fdb46SRobert Mustacchi /* The Dwarf_Debug this die belongs to. */
30107dc1947SRichard Lowe Dwarf_Debug dbg = 0;
302*4d9fdb46SRobert Mustacchi Dwarf_CU_Context context = 0;
303*4d9fdb46SRobert Mustacchi Dwarf_Line_Context line_context = 0;
30449d3bc91SRichard Lowe
305*4d9fdb46SRobert Mustacchi /* Used to chain the file names. */
30607dc1947SRichard Lowe Dwarf_Chain curr_chain = NULL;
30707dc1947SRichard Lowe Dwarf_Chain prev_chain = NULL;
30807dc1947SRichard Lowe Dwarf_Chain head_chain = NULL;
309*4d9fdb46SRobert Mustacchi
31007dc1947SRichard Lowe Dwarf_Half attrform = 0;
31107dc1947SRichard Lowe int resattr = DW_DLV_ERROR;
31207dc1947SRichard Lowe int lres = DW_DLV_ERROR;
313*4d9fdb46SRobert Mustacchi unsigned i = 0;
31407dc1947SRichard Lowe int res = DW_DLV_ERROR;
315*4d9fdb46SRobert Mustacchi Dwarf_Small *section_start = 0;
31649d3bc91SRichard Lowe
317*4d9fdb46SRobert Mustacchi /* ***** BEGIN CODE ***** */
318*4d9fdb46SRobert Mustacchi /* Reset error. */
319*4d9fdb46SRobert Mustacchi
320*4d9fdb46SRobert Mustacchi if (error != NULL) {
32107dc1947SRichard Lowe *error = NULL;
322*4d9fdb46SRobert Mustacchi }
32349d3bc91SRichard Lowe
32407dc1947SRichard Lowe CHECK_DIE(die, DW_DLV_ERROR);
325*4d9fdb46SRobert Mustacchi context = die->di_cu_context;
326*4d9fdb46SRobert Mustacchi dbg = context->cc_dbg;
32749d3bc91SRichard Lowe
32849d3bc91SRichard Lowe resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
32949d3bc91SRichard Lowe if (resattr != DW_DLV_OK) {
33007dc1947SRichard Lowe return resattr;
33149d3bc91SRichard Lowe }
33207dc1947SRichard Lowe
33307dc1947SRichard Lowe if (dbg->de_debug_line.dss_index == 0) {
334*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
33507dc1947SRichard Lowe _dwarf_error(dbg, error, DW_DLE_DEBUG_LINE_NULL);
33607dc1947SRichard Lowe return (DW_DLV_ERROR);
33749d3bc91SRichard Lowe }
33849d3bc91SRichard Lowe
33907dc1947SRichard Lowe res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
34049d3bc91SRichard Lowe if (res != DW_DLV_OK) {
341*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
34207dc1947SRichard Lowe return res;
34349d3bc91SRichard Lowe }
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;
34949d3bc91SRichard Lowe
35007dc1947SRichard Lowe lres = dwarf_whatform(stmt_list_attr,&attrform,error);
35107dc1947SRichard Lowe if (lres != DW_DLV_OK) {
352*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
35307dc1947SRichard Lowe return lres;
35407dc1947SRichard Lowe }
35507dc1947SRichard Lowe 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);
38007dc1947SRichard Lowe return (DW_DLV_ERROR);
38107dc1947SRichard Lowe }
38207dc1947SRichard Lowe lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
38349d3bc91SRichard Lowe if (lres != DW_DLV_OK) {
384*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
38507dc1947SRichard Lowe return lres;
38649d3bc91SRichard Lowe }
38707dc1947SRichard Lowe if (line_offset >= dbg->de_debug_line.dss_size) {
388*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
38907dc1947SRichard Lowe _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
39007dc1947SRichard Lowe return (DW_DLV_ERROR);
39149d3bc91SRichard Lowe }
39207dc1947SRichard Lowe 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) {
399*4d9fdb46SRobert 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 }
41049d3bc91SRichard Lowe dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
411*4d9fdb46SRobert Mustacchi stmt_list_attr = 0;
41249d3bc91SRichard Lowe
413*4d9fdb46SRobert Mustacchi resattr = _dwarf_internal_get_die_comp_dir(die, &const_comp_dir,
414*4d9fdb46SRobert Mustacchi &const_comp_name,error);
41549d3bc91SRichard Lowe if (resattr == DW_DLV_ERROR) {
41607dc1947SRichard Lowe return resattr;
41749d3bc91SRichard Lowe }
41807dc1947SRichard Lowe
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);
42649d3bc91SRichard Lowe }
427*4d9fdb46SRobert Mustacchi line_context->lc_new_style_access = false;
428*4d9fdb46SRobert Mustacchi /* We are in dwarf_srcfiles() */
42907dc1947SRichard Lowe {
43007dc1947SRichard Lowe 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,
43607dc1947SRichard Lowe line_ptr,
43707dc1947SRichard Lowe dbg->de_debug_line.dss_size,
43807dc1947SRichard Lowe &line_ptr_out,
439*4d9fdb46SRobert Mustacchi line_context,
44007dc1947SRichard Lowe NULL, NULL,error,
44107dc1947SRichard Lowe 0);
44207dc1947SRichard Lowe
44307dc1947SRichard Lowe if (dres == DW_DLV_ERROR) {
444*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
445*4d9fdb46SRobert Mustacchi line_context = 0;
44607dc1947SRichard Lowe return dres;
44707dc1947SRichard Lowe }
44807dc1947SRichard Lowe if (dres == DW_DLV_NO_ENTRY) {
449*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
450*4d9fdb46SRobert Mustacchi line_context = 0;
45107dc1947SRichard Lowe return dres;
45207dc1947SRichard Lowe }
45349d3bc91SRichard Lowe }
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;
465*4d9fdb46SRobert 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;
47007dc1947SRichard Lowe }
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;
474*4d9fdb46SRobert 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;
482*4d9fdb46SRobert Mustacchi }
483*4d9fdb46SRobert Mustacchi curr_chain =
484*4d9fdb46SRobert Mustacchi (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
485*4d9fdb46SRobert Mustacchi if (curr_chain == NULL) {
486*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
48707dc1947SRichard Lowe _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
48807dc1947SRichard Lowe return (DW_DLV_ERROR);
48907dc1947SRichard Lowe }
490*4d9fdb46SRobert Mustacchi curr_chain->ch_item = name_out;
491*4d9fdb46SRobert Mustacchi if (head_chain == NULL) {
492*4d9fdb46SRobert Mustacchi head_chain = prev_chain = curr_chain;
493*4d9fdb46SRobert Mustacchi } else {
494*4d9fdb46SRobert Mustacchi prev_chain->ch_next = curr_chain;
495*4d9fdb46SRobert Mustacchi prev_chain = curr_chain;
496*4d9fdb46SRobert Mustacchi }
49707dc1947SRichard Lowe }
49849d3bc91SRichard Lowe }
499*4d9fdb46SRobert Mustacchi if (!head_chain) {
500*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
501*4d9fdb46SRobert Mustacchi *srcfiles = NULL;
502*4d9fdb46SRobert Mustacchi *srcfilecount = 0;
503*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
50449d3bc91SRichard Lowe }
50549d3bc91SRichard Lowe
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);
50907dc1947SRichard Lowe *srcfiles = NULL;
51007dc1947SRichard Lowe *srcfilecount = 0;
511*4d9fdb46SRobert Mustacchi return DW_DLV_NO_ENTRY;
51249d3bc91SRichard Lowe }
51349d3bc91SRichard Lowe
51449d3bc91SRichard Lowe ret_files = (char **)
515*4d9fdb46SRobert Mustacchi _dwarf_get_alloc(dbg, DW_DLA_LIST,
516*4d9fdb46SRobert Mustacchi line_context->lc_file_entry_count);
51749d3bc91SRichard Lowe if (ret_files == NULL) {
518*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
51907dc1947SRichard Lowe _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
52007dc1947SRichard Lowe return (DW_DLV_ERROR);
52149d3bc91SRichard Lowe }
52249d3bc91SRichard Lowe
52349d3bc91SRichard Lowe curr_chain = head_chain;
524*4d9fdb46SRobert Mustacchi for (i = 0; i < line_context->lc_file_entry_count; i++) {
52507dc1947SRichard Lowe *(ret_files + i) = curr_chain->ch_item;
526*4d9fdb46SRobert Mustacchi curr_chain->ch_item = 0;
52707dc1947SRichard Lowe prev_chain = curr_chain;
52807dc1947SRichard Lowe curr_chain = curr_chain->ch_next;
52907dc1947SRichard Lowe dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN);
53049d3bc91SRichard Lowe }
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. */
53549d3bc91SRichard Lowe *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);
53849d3bc91SRichard Lowe return (DW_DLV_OK);
53949d3bc91SRichard Lowe }
54049d3bc91SRichard Lowe
54149d3bc91SRichard Lowe
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.
55249d3bc91SRichard Lowe */
553*4d9fdb46SRobert Mustacchi
55449d3bc91SRichard Lowe 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)55549d3bc91SRichard Lowe _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,
56007dc1947SRichard Lowe Dwarf_Line ** linebuf,
561*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount,
562*4d9fdb46SRobert Mustacchi Dwarf_Line ** linebuf_actuals,
563*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount_actuals,
56407dc1947SRichard Lowe Dwarf_Bool doaddrs,
565*4d9fdb46SRobert Mustacchi Dwarf_Bool dolines,
566*4d9fdb46SRobert Mustacchi Dwarf_Error * error)
56749d3bc91SRichard Lowe {
568*4d9fdb46SRobert Mustacchi /* This pointer is used to scan the portion of the .debug_line
569*4d9fdb46SRobert Mustacchi section for the current cu. */
57007dc1947SRichard Lowe Dwarf_Small *line_ptr = 0;
57149d3bc91SRichard Lowe
572*4d9fdb46SRobert Mustacchi /* This points to the last byte of the .debug_line portion for the
573*4d9fdb46SRobert Mustacchi current cu. */
57407dc1947SRichard Lowe Dwarf_Small *line_ptr_end = 0;
57549d3bc91SRichard Lowe
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;
58249d3bc91SRichard Lowe
583*4d9fdb46SRobert Mustacchi /* Pointer to a DW_AT_stmt_list attribute in case it exists in the
584*4d9fdb46SRobert Mustacchi die. */
585*4d9fdb46SRobert Mustacchi Dwarf_Attribute stmt_list_attr = 0;
58649d3bc91SRichard Lowe
587*4d9fdb46SRobert Mustacchi const char * const_comp_name = 0;
588*4d9fdb46SRobert Mustacchi /* Pointer to name of compilation directory. */
589*4d9fdb46SRobert Mustacchi const char * const_comp_dir = NULL;
59049d3bc91SRichard Lowe Dwarf_Small *comp_dir = NULL;
59149d3bc91SRichard Lowe
592*4d9fdb46SRobert Mustacchi /* Offset into .debug_line specified by a DW_AT_stmt_list
593*4d9fdb46SRobert Mustacchi attribute. */
59407dc1947SRichard Lowe Dwarf_Unsigned line_offset = 0;
59549d3bc91SRichard Lowe
596*4d9fdb46SRobert Mustacchi /* Pointer to a Dwarf_Line_Context_s structure that contains the
597*4d9fdb46SRobert 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 */
60307dc1947SRichard Lowe Dwarf_Line_Context line_context = 0;
604*4d9fdb46SRobert Mustacchi Dwarf_CU_Context cu_context = 0;
605*4d9fdb46SRobert Mustacchi Dwarf_Unsigned fission_offset = 0;
60649d3bc91SRichard Lowe
607*4d9fdb46SRobert Mustacchi /* The Dwarf_Debug this die belongs to. */
60807dc1947SRichard Lowe Dwarf_Debug dbg = 0;
60907dc1947SRichard Lowe int resattr = DW_DLV_ERROR;
61007dc1947SRichard Lowe int lres = DW_DLV_ERROR;
61107dc1947SRichard Lowe Dwarf_Half address_size = 0;
612*4d9fdb46SRobert Mustacchi Dwarf_Small * orig_line_ptr = 0;
61349d3bc91SRichard Lowe
61407dc1947SRichard Lowe int res = DW_DLV_ERROR;
61549d3bc91SRichard Lowe
616*4d9fdb46SRobert Mustacchi /* ***** BEGIN CODE ***** */
617*4d9fdb46SRobert Mustacchi if (error != NULL) {
61807dc1947SRichard Lowe *error = NULL;
619*4d9fdb46SRobert Mustacchi }
62049d3bc91SRichard Lowe
62107dc1947SRichard Lowe CHECK_DIE(die, DW_DLV_ERROR);
622*4d9fdb46SRobert Mustacchi cu_context = die->di_cu_context;
623*4d9fdb46SRobert Mustacchi dbg = cu_context->cc_dbg;
62449d3bc91SRichard Lowe
62507dc1947SRichard Lowe res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
62649d3bc91SRichard Lowe if (res != DW_DLV_OK) {
62707dc1947SRichard Lowe return res;
62849d3bc91SRichard Lowe }
629*4d9fdb46SRobert Mustacchi if (!dbg->de_debug_line.dss_size) {
630*4d9fdb46SRobert Mustacchi return (DW_DLV_NO_ENTRY);
631*4d9fdb46SRobert Mustacchi }
632*4d9fdb46SRobert Mustacchi
63307dc1947SRichard Lowe address_size = _dwarf_get_address_size(dbg, die);
63449d3bc91SRichard Lowe resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
63549d3bc91SRichard Lowe if (resattr != DW_DLV_OK) {
63607dc1947SRichard Lowe return resattr;
63749d3bc91SRichard Lowe }
638*4d9fdb46SRobert Mustacchi lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
63949d3bc91SRichard Lowe if (lres != DW_DLV_OK) {
640*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
64107dc1947SRichard Lowe return lres;
64249d3bc91SRichard Lowe }
64349d3bc91SRichard Lowe
64407dc1947SRichard Lowe if (line_offset >= dbg->de_debug_line.dss_size) {
645*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
64607dc1947SRichard Lowe _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
64707dc1947SRichard Lowe return (DW_DLV_ERROR);
64849d3bc91SRichard Lowe }
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) {
656*4d9fdb46SRobert 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;
67049d3bc91SRichard Lowe 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 }
67949d3bc91SRichard Lowe
680*4d9fdb46SRobert Mustacchi /* If die has DW_AT_comp_dir attribute, get the string that names
681*4d9fdb46SRobert 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);
68449d3bc91SRichard Lowe if (resattr == DW_DLV_ERROR) {
68507dc1947SRichard Lowe return resattr;
68649d3bc91SRichard Lowe }
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);
69449d3bc91SRichard Lowe }
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() */
69807dc1947SRichard Lowe {
69907dc1947SRichard Lowe 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,
70307dc1947SRichard Lowe line_ptr,
70407dc1947SRichard Lowe dbg->de_debug_line.dss_size,
70507dc1947SRichard Lowe &newlinep,
706*4d9fdb46SRobert Mustacchi line_context,
70707dc1947SRichard Lowe NULL,NULL,
70807dc1947SRichard Lowe error,
70907dc1947SRichard Lowe 0);
71007dc1947SRichard Lowe
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);
716*4d9fdb46SRobert Mustacchi }
717*4d9fdb46SRobert Mustacchi return resp;
71807dc1947SRichard Lowe }
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;
72607dc1947SRichard Lowe }
727*4d9fdb46SRobert Mustacchi line_ptr_end = line_context->lc_line_ptr_end;
72807dc1947SRichard Lowe 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;
73207dc1947SRichard Lowe }
73349d3bc91SRichard Lowe }
73449d3bc91SRichard Lowe
73549d3bc91SRichard Lowe
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);
75607dc1947SRichard Lowe }
757*4d9fdb46SRobert Mustacchi return res;
758*4d9fdb46SRobert 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);
79007dc1947SRichard Lowe }
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;
81707dc1947SRichard Lowe }
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;
82307dc1947SRichard Lowe }
82407dc1947SRichard Lowe }
82549d3bc91SRichard Lowe }
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;
83849d3bc91SRichard Lowe }
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;
84207dc1947SRichard Lowe }
843*4d9fdb46SRobert Mustacchi *line_context_out = line_context;
84449d3bc91SRichard Lowe return (DW_DLV_OK);
84549d3bc91SRichard Lowe }
84649d3bc91SRichard Lowe
84749d3bc91SRichard Lowe 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)
85149d3bc91SRichard Lowe {
852*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *sec = 0;
853*4d9fdb46SRobert Mustacchi if (error != NULL) {
854*4d9fdb46SRobert Mustacchi *error = NULL;
85549d3bc91SRichard Lowe }
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;
86349d3bc91SRichard Lowe }
86449d3bc91SRichard Lowe
86549d3bc91SRichard Lowe 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)
86949d3bc91SRichard Lowe {
870*4d9fdb46SRobert Mustacchi struct Dwarf_Section_s *sec = 0;
871*4d9fdb46SRobert Mustacchi if (error != NULL) {
872*4d9fdb46SRobert Mustacchi *error = NULL;
87349d3bc91SRichard Lowe }
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;
88049d3bc91SRichard Lowe return DW_DLV_OK;
88149d3bc91SRichard Lowe }
88249d3bc91SRichard Lowe
88349d3bc91SRichard Lowe 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)
88749d3bc91SRichard Lowe {
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;
89549d3bc91SRichard Lowe }
89649d3bc91SRichard Lowe
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;
90549d3bc91SRichard Lowe return DW_DLV_OK;
90649d3bc91SRichard Lowe }
90749d3bc91SRichard Lowe
90849d3bc91SRichard Lowe 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)
91249d3bc91SRichard Lowe {
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;
91849d3bc91SRichard Lowe }
91949d3bc91SRichard Lowe
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;
92649d3bc91SRichard Lowe return DW_DLV_OK;
92749d3bc91SRichard Lowe }
92849d3bc91SRichard Lowe
929*4d9fdb46SRobert Mustacchi
93007dc1947SRichard Lowe int
dwarf_srclines(Dwarf_Die die,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Error * error)931*4d9fdb46SRobert Mustacchi dwarf_srclines(Dwarf_Die die,
932*4d9fdb46SRobert Mustacchi Dwarf_Line ** linebuf,
933*4d9fdb46SRobert Mustacchi Dwarf_Signed * linecount, Dwarf_Error * error)
93407dc1947SRichard Lowe {
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,
948*4d9fdb46SRobert Mustacchi /* addrlist= */ false,
949*4d9fdb46SRobert Mustacchi /* linelist= */ true,
950*4d9fdb46SRobert Mustacchi error);
951*4d9fdb46SRobert Mustacchi return res;
952*4d9fdb46SRobert Mustacchi }
95307dc1947SRichard Lowe
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;
102007dc1947SRichard Lowe }
102107dc1947SRichard Lowe
102249d3bc91SRichard Lowe
1023*4d9fdb46SRobert Mustacchi /* New October 2015. */
102449d3bc91SRichard Lowe 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)
102949d3bc91SRichard Lowe {
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);
103607dc1947SRichard Lowe return (DW_DLV_ERROR);
103749d3bc91SRichard Lowe }
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 }
104249d3bc91SRichard Lowe
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;
106449d3bc91SRichard Lowe return DW_DLV_OK;
106549d3bc91SRichard Lowe }
106649d3bc91SRichard Lowe
106749d3bc91SRichard Lowe
1068*4d9fdb46SRobert Mustacchi /* New October 2015. */
106949d3bc91SRichard Lowe 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)
107349d3bc91SRichard Lowe {
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);
108007dc1947SRichard Lowe return (DW_DLV_ERROR);
108149d3bc91SRichard Lowe }
1082*4d9fdb46SRobert Mustacchi *offset = line_context->lc_section_offset;
1083*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1084*4d9fdb46SRobert Mustacchi }
108549d3bc91SRichard Lowe
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;
110749d3bc91SRichard Lowe return DW_DLV_OK;
110849d3bc91SRichard Lowe }
110949d3bc91SRichard Lowe
111049d3bc91SRichard Lowe
1111*4d9fdb46SRobert Mustacchi
1112*4d9fdb46SRobert Mustacchi
1113*4d9fdb46SRobert Mustacchi /* New October 2015. */
111449d3bc91SRichard Lowe 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)
111849d3bc91SRichard Lowe {
1119*4d9fdb46SRobert Mustacchi if (!line_context ){
1120*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
112107dc1947SRichard Lowe return (DW_DLV_ERROR);
112249d3bc91SRichard Lowe }
1123*4d9fdb46SRobert Mustacchi if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1124*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
112507dc1947SRichard Lowe return (DW_DLV_ERROR);
112649d3bc91SRichard Lowe }
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);
114807dc1947SRichard Lowe return (DW_DLV_ERROR);
114949d3bc91SRichard Lowe }
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);
115207dc1947SRichard Lowe return (DW_DLV_ERROR);
115307dc1947SRichard Lowe }
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 }
116049d3bc91SRichard Lowe
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);
117107dc1947SRichard Lowe return (DW_DLV_ERROR);
117249d3bc91SRichard Lowe }
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 }
117849d3bc91SRichard Lowe
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 }
119349d3bc91SRichard Lowe
119449d3bc91SRichard Lowe
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 }
121207dc1947SRichard Lowe
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);
1247*4d9fdb46SRobert Mustacchi if (res != DW_DLV_OK) {
1248*4d9fdb46SRobert Mustacchi return res;
1249*4d9fdb46SRobert 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;
126007dc1947SRichard Lowe }
1261*4d9fdb46SRobert Mustacchi }
126207dc1947SRichard Lowe
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;
128007dc1947SRichard Lowe }
128149d3bc91SRichard Lowe }
1282*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1283*4d9fdb46SRobert Mustacchi }
1284*4d9fdb46SRobert Mustacchi
128549d3bc91SRichard Lowe
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);
129607dc1947SRichard Lowe return (DW_DLV_ERROR);
129749d3bc91SRichard Lowe }
1298*4d9fdb46SRobert Mustacchi *count = line_context->lc_include_directories_count;
1299*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1300*4d9fdb46SRobert Mustacchi }
130149d3bc91SRichard Lowe
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;
131349d3bc91SRichard Lowe
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);
131749d3bc91SRichard Lowe }
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 }
132549d3bc91SRichard Lowe
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);
133507dc1947SRichard Lowe return (DW_DLV_ERROR);
133607dc1947SRichard Lowe }
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;
1340*4d9fdb46SRobert Mustacchi }
134107dc1947SRichard Lowe
1342*4d9fdb46SRobert Mustacchi
1343*4d9fdb46SRobert Mustacchi
1344*4d9fdb46SRobert Mustacchi /* Every line table entry (except DW_DLE_end_sequence,
1345*4d9fdb46SRobert Mustacchi which is returned using dwarf_lineendsequence())
1346*4d9fdb46SRobert Mustacchi potentially has the begin-statement
1347*4d9fdb46SRobert Mustacchi flag marked 'on'. This returns thru *return_bool,
1348*4d9fdb46SRobert Mustacchi the begin-statement flag. */
1349*4d9fdb46SRobert Mustacchi
1350*4d9fdb46SRobert Mustacchi int
dwarf_linebeginstatement(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1351*4d9fdb46SRobert Mustacchi dwarf_linebeginstatement(Dwarf_Line line,
1352*4d9fdb46SRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error)
1353*4d9fdb46SRobert Mustacchi {
1354*4d9fdb46SRobert Mustacchi if (line == NULL || return_bool == 0) {
1355*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1356*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
135749d3bc91SRichard Lowe }
1358*4d9fdb46SRobert Mustacchi
1359*4d9fdb46SRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_is_stmt);
136049d3bc91SRichard Lowe return DW_DLV_OK;
136149d3bc91SRichard Lowe }
136249d3bc91SRichard Lowe
1363*4d9fdb46SRobert Mustacchi /* At the end of any contiguous line-table there may be
1364*4d9fdb46SRobert Mustacchi a DW_LNE_end_sequence operator.
1365*4d9fdb46SRobert Mustacchi This returns non-zero thru *return_bool
1366*4d9fdb46SRobert Mustacchi if and only if this 'line' entry was a DW_LNE_end_sequence.
1367*4d9fdb46SRobert Mustacchi
1368*4d9fdb46SRobert Mustacchi Within a compilation unit or function there may be multiple
1369*4d9fdb46SRobert Mustacchi line tables, each ending with a DW_LNE_end_sequence.
1370*4d9fdb46SRobert Mustacchi Each table describes a contiguous region.
1371*4d9fdb46SRobert Mustacchi Because compilers may split function code up in arbitrary ways
1372*4d9fdb46SRobert Mustacchi compilers may need to emit multiple contigous regions (ie
1373*4d9fdb46SRobert Mustacchi line tables) for a single function.
1374*4d9fdb46SRobert Mustacchi See the DWARF3 spec section 6.2. */
137549d3bc91SRichard Lowe int
dwarf_lineendsequence(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1376*4d9fdb46SRobert Mustacchi dwarf_lineendsequence(Dwarf_Line line,
137707dc1947SRichard Lowe Dwarf_Bool * return_bool, Dwarf_Error * error)
137849d3bc91SRichard Lowe {
137949d3bc91SRichard Lowe if (line == NULL) {
138007dc1947SRichard Lowe _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
138107dc1947SRichard Lowe return (DW_DLV_ERROR);
138249d3bc91SRichard Lowe }
1383*4d9fdb46SRobert Mustacchi
1384*4d9fdb46SRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_end_sequence);
138549d3bc91SRichard Lowe return DW_DLV_OK;
138649d3bc91SRichard Lowe }
138749d3bc91SRichard Lowe
138849d3bc91SRichard Lowe
1389*4d9fdb46SRobert Mustacchi /* Each 'line' entry has a line-number.
1390*4d9fdb46SRobert Mustacchi If the entry is a DW_LNE_end_sequence the line-number is
1391*4d9fdb46SRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above). */
139249d3bc91SRichard Lowe int
dwarf_lineno(Dwarf_Line line,Dwarf_Unsigned * ret_lineno,Dwarf_Error * error)1393*4d9fdb46SRobert Mustacchi dwarf_lineno(Dwarf_Line line,
1394*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * ret_lineno, Dwarf_Error * error)
139549d3bc91SRichard Lowe {
1396*4d9fdb46SRobert Mustacchi if (line == NULL || ret_lineno == 0) {
1397*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1398*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
139949d3bc91SRichard Lowe }
140049d3bc91SRichard Lowe
1401*4d9fdb46SRobert Mustacchi *ret_lineno = (line->li_addr_line.li_l_data.li_line);
1402*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
140349d3bc91SRichard Lowe }
140449d3bc91SRichard Lowe
1405*4d9fdb46SRobert Mustacchi /* Each 'line' entry has a file-number, and index into the file table.
1406*4d9fdb46SRobert Mustacchi If the entry is a DW_LNE_end_sequence the index is
1407*4d9fdb46SRobert Mustacchi meaningless (see dwarf_lineendsequence(), just above).
1408*4d9fdb46SRobert Mustacchi The file number returned is an index into the file table
1409*4d9fdb46SRobert 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
1412*4d9fdb46SRobert Mustacchi is 1 greater than its index into the dwarf_srcfiles() output array.
1413*4d9fdb46SRobert Mustacchi
1414*4d9fdb46SRobert Mustacchi And entries from DW_LNE_define_file don't appear in
1415*4d9fdb46SRobert Mustacchi the dwarf_srcfiles() output so file indexes from here may exceed
1416*4d9fdb46SRobert Mustacchi the size of the dwarf_srcfiles() output array size.
141707dc1947SRichard Lowe */
1418*4d9fdb46SRobert Mustacchi int
dwarf_line_srcfileno(Dwarf_Line line,Dwarf_Unsigned * ret_fileno,Dwarf_Error * error)1419*4d9fdb46SRobert Mustacchi dwarf_line_srcfileno(Dwarf_Line line,
1420*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * ret_fileno, Dwarf_Error * error)
1421*4d9fdb46SRobert Mustacchi {
1422*4d9fdb46SRobert Mustacchi if (line == NULL || ret_fileno == 0) {
1423*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1424*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1425*4d9fdb46SRobert 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 */
1430*4d9fdb46SRobert Mustacchi *ret_fileno = (line->li_addr_line.li_l_data.li_file);
1431*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1432*4d9fdb46SRobert Mustacchi }
143307dc1947SRichard Lowe
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)
144007dc1947SRichard Lowe {
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 }
144507dc1947SRichard Lowe
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 }
144907dc1947SRichard Lowe
1450*4d9fdb46SRobert Mustacchi /* Each 'line' entry has a line-address.
1451*4d9fdb46SRobert Mustacchi If the entry is a DW_LNE_end_sequence the adddress
1452*4d9fdb46SRobert Mustacchi is one-beyond the last address this contigous region
1453*4d9fdb46SRobert Mustacchi covers, so the address is not inside the region,
1454*4d9fdb46SRobert Mustacchi but is just outside it. */
1455*4d9fdb46SRobert Mustacchi int
dwarf_lineaddr(Dwarf_Line line,Dwarf_Addr * ret_lineaddr,Dwarf_Error * error)1456*4d9fdb46SRobert Mustacchi dwarf_lineaddr(Dwarf_Line line,
1457*4d9fdb46SRobert Mustacchi Dwarf_Addr * ret_lineaddr, Dwarf_Error * error)
1458*4d9fdb46SRobert Mustacchi {
1459*4d9fdb46SRobert Mustacchi if (line == NULL || ret_lineaddr == 0) {
1460*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1461*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
146207dc1947SRichard Lowe }
146349d3bc91SRichard Lowe
1464*4d9fdb46SRobert Mustacchi *ret_lineaddr = (line->li_address);
1465*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1466*4d9fdb46SRobert Mustacchi }
146707dc1947SRichard Lowe
146807dc1947SRichard Lowe
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.
1476*4d9fdb46SRobert Mustacchi */
1477*4d9fdb46SRobert Mustacchi int
dwarf_lineoff(Dwarf_Line line,Dwarf_Signed * ret_lineoff,Dwarf_Error * error)1478*4d9fdb46SRobert Mustacchi dwarf_lineoff(Dwarf_Line line,
1479*4d9fdb46SRobert Mustacchi Dwarf_Signed * ret_lineoff, Dwarf_Error * error)
1480*4d9fdb46SRobert Mustacchi {
1481*4d9fdb46SRobert Mustacchi if (line == NULL || ret_lineoff == 0) {
1482*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1483*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
148407dc1947SRichard Lowe }
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);
1488*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
148907dc1947SRichard Lowe }
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 */
1501*4d9fdb46SRobert 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)
1504*4d9fdb46SRobert Mustacchi {
1505*4d9fdb46SRobert Mustacchi if (line == NULL || ret_lineoff == 0) {
1506*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1507*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1508*4d9fdb46SRobert Mustacchi }
150907dc1947SRichard Lowe
1510*4d9fdb46SRobert Mustacchi *ret_lineoff = line->li_addr_line.li_l_data.li_column;
1511*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1512*4d9fdb46SRobert Mustacchi }
151307dc1947SRichard Lowe
151407dc1947SRichard Lowe
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)
151907dc1947SRichard Lowe {
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;
155407dc1947SRichard Lowe } 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 */
156207dc1947SRichard Lowe }
156307dc1947SRichard Lowe
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 }
157007dc1947SRichard Lowe
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 }
157507dc1947SRichard Lowe
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 }
1583*4d9fdb46SRobert Mustacchi if (line->li_context == NULL) {
1584*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL);
1585*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
1586*4d9fdb46SRobert 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);
1589*4d9fdb46SRobert Mustacchi }
159007dc1947SRichard Lowe
1591*4d9fdb46SRobert Mustacchi /* Every line table entry potentially has the basic-block-start
1592*4d9fdb46SRobert Mustacchi flag marked 'on'. This returns thru *return_bool,
1593*4d9fdb46SRobert Mustacchi the basic-block-start flag.
159407dc1947SRichard Lowe */
1595*4d9fdb46SRobert Mustacchi int
dwarf_lineblock(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1596*4d9fdb46SRobert Mustacchi dwarf_lineblock(Dwarf_Line line,
1597*4d9fdb46SRobert Mustacchi Dwarf_Bool * return_bool, Dwarf_Error * error)
1598*4d9fdb46SRobert Mustacchi {
1599*4d9fdb46SRobert Mustacchi if (line == NULL) {
1600*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1601*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1602*4d9fdb46SRobert Mustacchi }
1603*4d9fdb46SRobert Mustacchi *return_bool = (line->li_addr_line.li_l_data.li_basic_block);
1604*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1605*4d9fdb46SRobert Mustacchi }
1606*4d9fdb46SRobert 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)
1615*4d9fdb46SRobert Mustacchi {
1616*4d9fdb46SRobert Mustacchi if (line == NULL) {
1617*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1618*4d9fdb46SRobert Mustacchi return (DW_DLV_ERROR);
1619*4d9fdb46SRobert 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 }
162607dc1947SRichard Lowe
162749d3bc91SRichard Lowe 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)
163149d3bc91SRichard Lowe {
1632*4d9fdb46SRobert Mustacchi if (line == NULL) {
1633*4d9fdb46SRobert Mustacchi _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
163407dc1947SRichard Lowe return (DW_DLV_ERROR);
163507dc1947SRichard Lowe }
1636*4d9fdb46SRobert Mustacchi *logical = (line->li_addr_line.li_l_data.li_line);
1637*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1638*4d9fdb46SRobert 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);
164707dc1947SRichard Lowe return (DW_DLV_ERROR);
164807dc1947SRichard Lowe }
1649*4d9fdb46SRobert Mustacchi *context = (line->li_addr_line.li_l_data.li_call_context);
1650*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1651*4d9fdb46SRobert Mustacchi }
165207dc1947SRichard Lowe
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);
166007dc1947SRichard Lowe return (DW_DLV_ERROR);
166107dc1947SRichard Lowe }
1662*4d9fdb46SRobert Mustacchi *subprog = (line->li_addr_line.li_l_data.li_subprogram);
1663*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
1664*4d9fdb46SRobert Mustacchi }
166507dc1947SRichard Lowe
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;
167707dc1947SRichard Lowe
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;
1681*4d9fdb46SRobert Mustacchi }
168207dc1947SRichard Lowe
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;
1686*4d9fdb46SRobert Mustacchi }
168707dc1947SRichard Lowe
1688*4d9fdb46SRobert Mustacchi dbg = line->li_context->lc_dbg;
168907dc1947SRichard Lowe
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 }
169707dc1947SRichard Lowe
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 }
170207dc1947SRichard Lowe
1703*4d9fdb46SRobert Mustacchi /* Adjusting for 1 origin subprog no */
1704*4d9fdb46SRobert Mustacchi subprog = &line->li_context->lc_subprogs[subprog_no - 1];
170507dc1947SRichard Lowe
1706*4d9fdb46SRobert Mustacchi *subprog_name = (char *)subprog->ds_subprog_name;
1707*4d9fdb46SRobert Mustacchi *decl_line = subprog->ds_decl_line;
170807dc1947SRichard Lowe
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 {
1723*4d9fdb46SRobert Mustacchi
1724*4d9fdb46SRobert Mustacchi
1725*4d9fdb46SRobert Mustacchi Dwarf_Debug dbg = 0;
1726*4d9fdb46SRobert Mustacchi Dwarf_File_Entry fe = 0;
1727*4d9fdb46SRobert 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
1761*4d9fdb46SRobert Mustacchi free all the resources (in particular, the li_context and its
1762*4d9fdb46SRobert Mustacchi lc_file_entries).
1763*4d9fdb46SRobert 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.
1784*4d9fdb46SRobert Mustacchi */
1785*4d9fdb46SRobert Mustacchi
1786*4d9fdb46SRobert Mustacchi void
dwarf_srclines_dealloc(Dwarf_Debug dbg,Dwarf_Line * linebuf,Dwarf_Signed count)1787*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line * linebuf,
1788*4d9fdb46SRobert Mustacchi Dwarf_Signed count)
1789*4d9fdb46SRobert Mustacchi {
1790*4d9fdb46SRobert 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;
1795*4d9fdb46SRobert 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;
1801*4d9fdb46SRobert 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;
182607dc1947SRichard Lowe }
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;
183107dc1947SRichard Lowe }
183249d3bc91SRichard Lowe }
183307dc1947SRichard Lowe
1834*4d9fdb46SRobert Mustacchi /* Here we actually delete a set of lines. */
1835*4d9fdb46SRobert Mustacchi for (i = 0; i < count; ++i) {
1836*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);
1837*4d9fdb46SRobert Mustacchi }
1838*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);
183907dc1947SRichard Lowe
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);
184549d3bc91SRichard Lowe }
1846*4d9fdb46SRobert Mustacchi return;
1847*4d9fdb46SRobert Mustacchi }
184807dc1947SRichard Lowe
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;
186207dc1947SRichard Lowe
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);
187907dc1947SRichard Lowe }
1880*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, linestable, DW_DLA_LIST);
188149d3bc91SRichard Lowe }
1882*4d9fdb46SRobert Mustacchi line_context->lc_linebuf_logicals = 0;
1883*4d9fdb46SRobert Mustacchi line_context->lc_linecount_logicals = 0;
1884*4d9fdb46SRobert 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);
189007dc1947SRichard Lowe }
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 }
189707dc1947SRichard Lowe
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,
1903*4d9fdb46SRobert 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,
1908*4d9fdb46SRobert Mustacchi int *err_count_out)
1909*4d9fdb46SRobert Mustacchi {
1910*4d9fdb46SRobert Mustacchi if (!err_count_out) {
1911*4d9fdb46SRobert 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 }
1932*4d9fdb46SRobert Mustacchi if (data_start >= dbg->de_debug_line.dss_data &&
1933*4d9fdb46SRobert Mustacchi (data_start < (dbg->de_debug_line.dss_data +
1934*4d9fdb46SRobert 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);
1942*4d9fdb46SRobert Mustacchi } else {
1943*4d9fdb46SRobert Mustacchi dwarfstring_append(&m1,
1944*4d9fdb46SRobert Mustacchi " (unknown section location) ");
1945*4d9fdb46SRobert 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 }
1950*4d9fdb46SRobert Mustacchi *err_count_out += 1;
1951*4d9fdb46SRobert Mustacchi }
195207dc1947SRichard Lowe
1953*4d9fdb46SRobert Mustacchi
1954*4d9fdb46SRobert 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)
1962*4d9fdb46SRobert Mustacchi {
1963*4d9fdb46SRobert Mustacchi int res = 0;
1964*4d9fdb46SRobert 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;
1972*4d9fdb46SRobert 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;
1976*4d9fdb46SRobert Mustacchi }
1977*4d9fdb46SRobert Mustacchi
1978*4d9fdb46SRobert Mustacchi secstart = dbg->de_debug_line_str.dss_data;
1979*4d9fdb46SRobert Mustacchi secend = secstart + dbg->de_debug_line_str.dss_size;
1980*4d9fdb46SRobert 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;
1997*4d9fdb46SRobert 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;
200207dc1947SRichard Lowe }
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 }
201207dc1947SRichard Lowe
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)
2020*4d9fdb46SRobert Mustacchi {
2021*4d9fdb46SRobert Mustacchi Dwarf_Unsigned val = 0;
2022*4d9fdb46SRobert Mustacchi Dwarf_Small * lp = *line_ptr;
202307dc1947SRichard Lowe
2024*4d9fdb46SRobert Mustacchi switch (form) {
202507dc1947SRichard Lowe
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;
203107dc1947SRichard Lowe
2032*4d9fdb46SRobert Mustacchi default:
2033*4d9fdb46SRobert Mustacchi _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
2034*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
203507dc1947SRichard Lowe }
2036*4d9fdb46SRobert Mustacchi }
203707dc1947SRichard Lowe
2038*4d9fdb46SRobert 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;
2045*4d9fdb46SRobert Mustacchi } else {
2046*4d9fdb46SRobert Mustacchi (*curr_chain)->ch_next = chain_line;
2047*4d9fdb46SRobert Mustacchi }
2048*4d9fdb46SRobert Mustacchi *curr_chain = chain_line;
2049*4d9fdb46SRobert Mustacchi }
2050*4d9fdb46SRobert 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;
206407dc1947SRichard Lowe }
2065*4d9fdb46SRobert Mustacchi curr_chain = curr_chain->ch_next;
2066*4d9fdb46SRobert Mustacchi dwarf_dealloc(dbg, t, DW_DLA_CHAIN);
206707dc1947SRichard Lowe }
2068*4d9fdb46SRobert Mustacchi }
206907dc1947SRichard Lowe
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 }
209249d3bc91SRichard Lowe return DW_DLV_OK;
209349d3bc91SRichard Lowe }
209407dc1947SRichard Lowe
209507dc1947SRichard Lowe
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)
209807dc1947SRichard Lowe {
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;
210507dc1947SRichard Lowe }
210607dc1947SRichard Lowe
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 */
211607dc1947SRichard Lowe void
_dwarf_line_context_destructor(void * m)2117*4d9fdb46SRobert Mustacchi _dwarf_line_context_destructor(void *m)
211807dc1947SRichard Lowe {
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;
212307dc1947SRichard Lowe }
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;
2128*4d9fdb46SRobert 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;
215407dc1947SRichard Lowe return;
215507dc1947SRichard Lowe }
2156