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