149d3bc91SRichard Lowe /*
2*4d9fdb46SRobert Mustacchi    Copyright (C) 2000-2006 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi    Portions Copyright (C) 2007-2019 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi    Portions Copyright (C) 2010-2012 SN Systems Ltd. All Rights Reserved.
5*4d9fdb46SRobert Mustacchi    Portions Copyright (C) 2015-2015 Google, Inc. All Rights Reserved.
6*4d9fdb46SRobert Mustacchi 
7*4d9fdb46SRobert Mustacchi    This program is free software; you can redistribute it and/or modify it
8*4d9fdb46SRobert Mustacchi    under the terms of version 2.1 of the GNU Lesser General Public License
9*4d9fdb46SRobert Mustacchi    as published by the Free Software Foundation.
10*4d9fdb46SRobert Mustacchi 
11*4d9fdb46SRobert Mustacchi    This program is distributed in the hope that it would be useful, but
12*4d9fdb46SRobert Mustacchi    WITHOUT ANY WARRANTY; without even the implied warranty of
13*4d9fdb46SRobert Mustacchi    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14*4d9fdb46SRobert Mustacchi 
15*4d9fdb46SRobert Mustacchi    Further, this software is distributed without any warranty that it is
16*4d9fdb46SRobert Mustacchi    free of the rightful claim of any third person regarding infringement
17*4d9fdb46SRobert Mustacchi    or the like.  Any license provided herein, whether implied or
18*4d9fdb46SRobert Mustacchi    otherwise, applies only to this software file.  Patent licenses, if
19*4d9fdb46SRobert Mustacchi    any, provided herein do not apply to combinations of this program with
20*4d9fdb46SRobert Mustacchi    other software, or any other product whatsoever.
21*4d9fdb46SRobert Mustacchi 
22*4d9fdb46SRobert Mustacchi    You should have received a copy of the GNU Lesser General Public
23*4d9fdb46SRobert Mustacchi    License along with this program; if not, write the Free Software
24*4d9fdb46SRobert Mustacchi    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
25*4d9fdb46SRobert Mustacchi    USA.
2649d3bc91SRichard Lowe 
2749d3bc91SRichard Lowe */
2849d3bc91SRichard Lowe 
2949d3bc91SRichard Lowe #include "config.h"
3049d3bc91SRichard Lowe #include <stdio.h>
31*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDLIB_H
3207dc1947SRichard Lowe #include <stdlib.h>
33*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDLIB_H */
34*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
35*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
36*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
3849d3bc91SRichard Lowe #include "dwarf_line.h"
39*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
40*4d9fdb46SRobert Mustacchi 
41*4d9fdb46SRobert Mustacchi /* Line Register Set initial conditions. */
42*4d9fdb46SRobert Mustacchi static struct Dwarf_Line_Registers_s _dwarf_line_table_regs_default_values = {
43*4d9fdb46SRobert Mustacchi     /* Dwarf_Addr lr_address */ 0,
44*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_file */ 1,
45*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_line */  1,
46*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_column */  0,
47*4d9fdb46SRobert Mustacchi     /* Dwarf_Bool lr_is_stmt */  false,
48*4d9fdb46SRobert Mustacchi     /* Dwarf_Bool lr_basic_block */  false,
49*4d9fdb46SRobert Mustacchi     /* Dwarf_Bool lr_end_sequence */  false,
50*4d9fdb46SRobert Mustacchi     /* Dwarf_Bool lr_prologue_end */  false,
51*4d9fdb46SRobert Mustacchi     /* Dwarf_Bool lr_epilogue_begin */  false,
52*4d9fdb46SRobert Mustacchi     /* Dwarf_Small lr_isa */  0,
53*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_op_index  */  0,
54*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_discriminator */  0,
55*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_call_context */  0,
56*4d9fdb46SRobert Mustacchi     /* Dwarf_Unsigned lr_subprogram */  0,
57*4d9fdb46SRobert Mustacchi };
58*4d9fdb46SRobert Mustacchi 
59*4d9fdb46SRobert Mustacchi void
_dwarf_set_line_table_regs_default_values(Dwarf_Line_Registers regs,unsigned lineversion,Dwarf_Bool is_stmt)60*4d9fdb46SRobert Mustacchi _dwarf_set_line_table_regs_default_values(Dwarf_Line_Registers regs,
61*4d9fdb46SRobert Mustacchi     unsigned lineversion,
62*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_stmt)
63*4d9fdb46SRobert Mustacchi {
64*4d9fdb46SRobert Mustacchi     *regs = _dwarf_line_table_regs_default_values;
65*4d9fdb46SRobert Mustacchi     if (lineversion == DW_LINE_VERSION5) {
66*4d9fdb46SRobert Mustacchi         /* DWARF5 file base is zero. */
67*4d9fdb46SRobert Mustacchi         regs->lr_file = 0;
68*4d9fdb46SRobert Mustacchi     }
69*4d9fdb46SRobert Mustacchi     regs->lr_is_stmt = is_stmt;
70*4d9fdb46SRobert Mustacchi }
71*4d9fdb46SRobert Mustacchi 
7207dc1947SRichard Lowe 
7307dc1947SRichard Lowe static int
is_path_separator(Dwarf_Small s)7407dc1947SRichard Lowe is_path_separator(Dwarf_Small s)
7507dc1947SRichard Lowe {
76*4d9fdb46SRobert Mustacchi     if (s == '/') {
7707dc1947SRichard Lowe         return 1;
7807dc1947SRichard Lowe     }
7907dc1947SRichard Lowe #ifdef HAVE_WINDOWS_PATH
80*4d9fdb46SRobert Mustacchi     if (s == '\\') {
8107dc1947SRichard Lowe         return 1;
8207dc1947SRichard Lowe     }
8349d3bc91SRichard Lowe #endif
8407dc1947SRichard Lowe     return 0;
8507dc1947SRichard Lowe }
8649d3bc91SRichard Lowe 
87*4d9fdb46SRobert Mustacchi /*  Return 0 if false, 1 if true.
88*4d9fdb46SRobert Mustacchi     If HAVE_WINDOWS_PATH is defined we
89*4d9fdb46SRobert Mustacchi     attempt to handle windows full paths:
90*4d9fdb46SRobert Mustacchi     \\something   or  C:cwdpath.c
91*4d9fdb46SRobert Mustacchi */
92*4d9fdb46SRobert Mustacchi int
_dwarf_file_name_is_full_path(Dwarf_Small * fname)93*4d9fdb46SRobert Mustacchi _dwarf_file_name_is_full_path(Dwarf_Small  *fname)
9407dc1947SRichard Lowe {
9507dc1947SRichard Lowe     Dwarf_Small firstc = *fname;
96*4d9fdb46SRobert Mustacchi     if (is_path_separator(firstc)) {
9707dc1947SRichard Lowe         /* Full path. */
9807dc1947SRichard Lowe         return 1;
9907dc1947SRichard Lowe     }
100*4d9fdb46SRobert Mustacchi     if (!firstc) {
10107dc1947SRichard Lowe         return 0;
10207dc1947SRichard Lowe     }
103*4d9fdb46SRobert Mustacchi /*  This is a windows path test, but we do have
104*4d9fdb46SRobert Mustacchi     a few windows paths in our regression tests...
105*4d9fdb46SRobert Mustacchi     This is extremely unlikely to cause UN*X/POSIX
106*4d9fdb46SRobert Mustacchi     users any problems. */
107*4d9fdb46SRobert Mustacchi     if ((firstc >= 'A' && firstc <= 'Z') ||
108*4d9fdb46SRobert Mustacchi         (firstc >= 'a' && firstc <= 'z')) {
109*4d9fdb46SRobert Mustacchi 
110*4d9fdb46SRobert Mustacchi         Dwarf_Small secondc = fname[1];
111*4d9fdb46SRobert Mustacchi         if (secondc == ':') {
112*4d9fdb46SRobert Mustacchi             return 1;
113*4d9fdb46SRobert Mustacchi         }
11407dc1947SRichard Lowe     }
115*4d9fdb46SRobert Mustacchi /* End Windows style */
11607dc1947SRichard Lowe     return 0;
11707dc1947SRichard Lowe }
118*4d9fdb46SRobert Mustacchi #include "dwarf_line_table_reader_common.h"
119*4d9fdb46SRobert Mustacchi 
120*4d9fdb46SRobert Mustacchi static void
special_cat(char * dst,char * src,UNUSEDARG int srclen)121*4d9fdb46SRobert Mustacchi special_cat(char *dst,char *src,
122*4d9fdb46SRobert Mustacchi     UNUSEDARG int srclen)
123*4d9fdb46SRobert Mustacchi {
124*4d9fdb46SRobert Mustacchi #if defined (HAVE_WINDOWS_PATH)
125*4d9fdb46SRobert Mustacchi     /*  Always '/' instead of '\\', this is a Windows -> Unix
126*4d9fdb46SRobert Mustacchi         issue. */
127*4d9fdb46SRobert Mustacchi     int i1 = 0;
128*4d9fdb46SRobert Mustacchi     int i2 = 0;
129*4d9fdb46SRobert Mustacchi 
130*4d9fdb46SRobert Mustacchi     for ( ; dst[i1] ; ++i1) {
131*4d9fdb46SRobert Mustacchi     }
132*4d9fdb46SRobert Mustacchi     for (; i2 < srclen; ++i2,++i1) {
133*4d9fdb46SRobert Mustacchi         dst[i1] = src[i2];
134*4d9fdb46SRobert Mustacchi         if (dst[i1] == '\\') {
135*4d9fdb46SRobert Mustacchi             dst[i1] = '/';
136*4d9fdb46SRobert Mustacchi         }
137*4d9fdb46SRobert Mustacchi     }
138*4d9fdb46SRobert Mustacchi #else
139*4d9fdb46SRobert Mustacchi     strcat(dst, src);
140*4d9fdb46SRobert Mustacchi #endif /* HAVE_WINDOWS_PATH */
141*4d9fdb46SRobert Mustacchi     return;
142*4d9fdb46SRobert Mustacchi }
143*4d9fdb46SRobert Mustacchi 
144*4d9fdb46SRobert Mustacchi /*  With this routine we ensure the file full path
145*4d9fdb46SRobert Mustacchi     is calculated identically for
146*4d9fdb46SRobert Mustacchi     dwarf_srcfiles() and dwarf_filename()
147*4d9fdb46SRobert Mustacchi 
148*4d9fdb46SRobert Mustacchi     As of March 14 2020 this *always*
149*4d9fdb46SRobert Mustacchi     does an allocation for the string. dwarf_dealloc
150*4d9fdb46SRobert Mustacchi     is crucial to do no matter what.
151*4d9fdb46SRobert Mustacchi     So we have consistency.
152*4d9fdb46SRobert Mustacchi 
153*4d9fdb46SRobert Mustacchi     dwarf_finish() will do the dealloc if nothing else does.
154*4d9fdb46SRobert Mustacchi     Unless the calling application did the call
155*4d9fdb46SRobert Mustacchi     dwarf_set_de_alloc_flag(0).
156*4d9fdb46SRobert Mustacchi */
157*4d9fdb46SRobert Mustacchi static int
create_fullest_file_path(Dwarf_Debug dbg,Dwarf_File_Entry fe,Dwarf_Line_Context line_context,char ** name_ptr_out,Dwarf_Error * error)158*4d9fdb46SRobert Mustacchi create_fullest_file_path(Dwarf_Debug dbg,
159*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry fe,
160*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context,
161*4d9fdb46SRobert Mustacchi     char ** name_ptr_out,
162*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
163*4d9fdb46SRobert Mustacchi {
164*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned dirno = 0;
165*4d9fdb46SRobert Mustacchi     char *full_name = 0;
166*4d9fdb46SRobert Mustacchi     char *file_name = 0;
167*4d9fdb46SRobert Mustacchi 
168*4d9fdb46SRobert Mustacchi     dirno = fe->fi_dir_index;
169*4d9fdb46SRobert Mustacchi     file_name = (char *) fe->fi_file_name;
170*4d9fdb46SRobert Mustacchi     if (!file_name) {
171*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME);
172*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
173*4d9fdb46SRobert Mustacchi     }
174*4d9fdb46SRobert Mustacchi     if (_dwarf_file_name_is_full_path((Dwarf_Small *)file_name)) {
175*4d9fdb46SRobert Mustacchi         {   unsigned len = strlen(file_name);
176*4d9fdb46SRobert Mustacchi             char *tmp = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING,
177*4d9fdb46SRobert Mustacchi                 len+1);
178*4d9fdb46SRobert Mustacchi             if(tmp) {
179*4d9fdb46SRobert Mustacchi                 tmp[0] = 0;
180*4d9fdb46SRobert Mustacchi                 special_cat(tmp,file_name,len);
181*4d9fdb46SRobert Mustacchi                 *name_ptr_out = tmp;
182*4d9fdb46SRobert Mustacchi                 return DW_DLV_OK;
183*4d9fdb46SRobert Mustacchi             }
184*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_ALLOC_FAIL);
185*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
186*4d9fdb46SRobert Mustacchi         }
187*4d9fdb46SRobert Mustacchi     } else {
188*4d9fdb46SRobert Mustacchi         char *comp_dir_name = "";
189*4d9fdb46SRobert Mustacchi         char *inc_dir_name = "";
190*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned incdirnamelen = 0;
191*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned filenamelen = strlen(file_name);
192*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned compdirnamelen = 0;
193*4d9fdb46SRobert Mustacchi 
194*4d9fdb46SRobert Mustacchi         if (line_context->lc_compilation_directory) {
195*4d9fdb46SRobert Mustacchi             comp_dir_name =
196*4d9fdb46SRobert Mustacchi                 (char *)line_context->lc_compilation_directory;
197*4d9fdb46SRobert Mustacchi             compdirnamelen = strlen(comp_dir_name);
198*4d9fdb46SRobert Mustacchi         }
199*4d9fdb46SRobert Mustacchi 
200*4d9fdb46SRobert Mustacchi         if (dirno > line_context->lc_include_directories_count) {
201*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_INCL_DIR_NUM_BAD);
202*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
203*4d9fdb46SRobert Mustacchi         }
204*4d9fdb46SRobert Mustacchi         if (dirno > 0 && fe->fi_dir_index > 0) {
205*4d9fdb46SRobert Mustacchi             inc_dir_name = (char *) line_context->lc_include_directories[
206*4d9fdb46SRobert Mustacchi                 fe->fi_dir_index - 1];
207*4d9fdb46SRobert Mustacchi             if (!inc_dir_name) {
208*4d9fdb46SRobert Mustacchi                 /*  This should never ever happen except in case
209*4d9fdb46SRobert Mustacchi                     of a corrupted object file. */
210*4d9fdb46SRobert Mustacchi                 inc_dir_name = "<erroneous NULL include dir pointer>";
211*4d9fdb46SRobert Mustacchi             }
212*4d9fdb46SRobert Mustacchi             incdirnamelen = strlen(inc_dir_name);
213*4d9fdb46SRobert Mustacchi         }
214*4d9fdb46SRobert Mustacchi         full_name = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING,
215*4d9fdb46SRobert Mustacchi             compdirnamelen + 1 +
216*4d9fdb46SRobert Mustacchi             incdirnamelen + 1 +
217*4d9fdb46SRobert Mustacchi             filenamelen + 1);
218*4d9fdb46SRobert Mustacchi         if (full_name == NULL) {
219*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
220*4d9fdb46SRobert Mustacchi             return (DW_DLV_ERROR);
221*4d9fdb46SRobert Mustacchi         }
222*4d9fdb46SRobert Mustacchi         if (fe->fi_dir_index == 0) {
223*4d9fdb46SRobert Mustacchi             /*  Just use comp dir name */
224*4d9fdb46SRobert Mustacchi             if (compdirnamelen > 0) {
225*4d9fdb46SRobert Mustacchi                 special_cat(full_name,comp_dir_name,compdirnamelen);
226*4d9fdb46SRobert Mustacchi                 strcat(full_name, "/");
227*4d9fdb46SRobert Mustacchi             }
228*4d9fdb46SRobert Mustacchi             special_cat(full_name,file_name,filenamelen);
229*4d9fdb46SRobert Mustacchi             *name_ptr_out =  full_name;
230*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
231*4d9fdb46SRobert Mustacchi         }
232*4d9fdb46SRobert Mustacchi         if (incdirnamelen > 0 &&
233*4d9fdb46SRobert Mustacchi             _dwarf_file_name_is_full_path((Dwarf_Small*)inc_dir_name) ) {
234*4d9fdb46SRobert Mustacchi             /*  Just use inc dir. */
235*4d9fdb46SRobert Mustacchi             special_cat(full_name,inc_dir_name,incdirnamelen);
236*4d9fdb46SRobert Mustacchi             strcat(full_name,"/");
237*4d9fdb46SRobert Mustacchi             special_cat(full_name,file_name,filenamelen);
238*4d9fdb46SRobert Mustacchi             *name_ptr_out = full_name;
239*4d9fdb46SRobert Mustacchi             return DW_DLV_OK;
240*4d9fdb46SRobert Mustacchi         }
241*4d9fdb46SRobert Mustacchi         /* Concat all three names. */
242*4d9fdb46SRobert Mustacchi         if (compdirnamelen > 0) {
243*4d9fdb46SRobert Mustacchi             special_cat(full_name,comp_dir_name,compdirnamelen);
244*4d9fdb46SRobert Mustacchi             strcat(full_name, "/");
245*4d9fdb46SRobert Mustacchi         }
246*4d9fdb46SRobert Mustacchi         if (incdirnamelen > 0) {
247*4d9fdb46SRobert Mustacchi             special_cat(full_name,inc_dir_name,incdirnamelen);
248*4d9fdb46SRobert Mustacchi             strcat(full_name, "/");
249*4d9fdb46SRobert Mustacchi         }
250*4d9fdb46SRobert Mustacchi         special_cat(full_name,file_name,filenamelen);
251*4d9fdb46SRobert Mustacchi     }
252*4d9fdb46SRobert Mustacchi     *name_ptr_out = full_name;
253*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
254*4d9fdb46SRobert Mustacchi }
25549d3bc91SRichard Lowe 
256*4d9fdb46SRobert Mustacchi /*  Although source files is supposed to return the
25749d3bc91SRichard Lowe     source files in the compilation-unit, it does
25849d3bc91SRichard Lowe     not look for any in the statement program.  In
25949d3bc91SRichard Lowe     other words, it ignores those defined using the
26049d3bc91SRichard Lowe     extended opcode DW_LNE_define_file.
261*4d9fdb46SRobert Mustacchi     We do not know of a producer that uses DW_LNE_define_file.
262*4d9fdb46SRobert Mustacchi 
263*4d9fdb46SRobert Mustacchi     In DWARF2,3,4 the array of sourcefiles is represented
264*4d9fdb46SRobert Mustacchi     differently than DWARF5.
265*4d9fdb46SRobert Mustacchi     DWARF 2,3,4,:
266*4d9fdb46SRobert Mustacchi         Take the line number from macro information or lines data
267*4d9fdb46SRobert Mustacchi         and subtract 1 to  index into srcfiles.  Any with line
268*4d9fdb46SRobert Mustacchi         number zero can be assumed to refer to DW_AT_name from the
269*4d9fdb46SRobert Mustacchi         CU DIE, but zero really means "no file".
270*4d9fdb46SRobert Mustacchi     DWARF 5:
271*4d9fdb46SRobert Mustacchi         Just like DW4, but  index 1 refers to the
272*4d9fdb46SRobert Mustacchi         same string as DW_AT_name of the CU DIE.
27349d3bc91SRichard Lowe */
27449d3bc91SRichard Lowe int
dwarf_srcfiles(Dwarf_Die die,char *** srcfiles,Dwarf_Signed * srcfilecount,Dwarf_Error * error)27549d3bc91SRichard Lowe dwarf_srcfiles(Dwarf_Die die,
276*4d9fdb46SRobert Mustacchi     char ***srcfiles,
277*4d9fdb46SRobert Mustacchi     Dwarf_Signed * srcfilecount, Dwarf_Error * error)
27849d3bc91SRichard Lowe {
279*4d9fdb46SRobert Mustacchi     /*  This pointer is used to scan the portion of the .debug_line
280*4d9fdb46SRobert Mustacchi         section for the current cu. */
281*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr = 0;
28249d3bc91SRichard Lowe 
283*4d9fdb46SRobert Mustacchi     /*  Pointer to a DW_AT_stmt_list attribute in case it exists in the
284*4d9fdb46SRobert Mustacchi         die. */
285*4d9fdb46SRobert Mustacchi     Dwarf_Attribute stmt_list_attr = 0;
28649d3bc91SRichard Lowe 
287*4d9fdb46SRobert Mustacchi     const char * const_comp_name = 0;
288*4d9fdb46SRobert Mustacchi     /*  Pointer to name of compilation directory. */
289*4d9fdb46SRobert Mustacchi     const char * const_comp_dir = 0;
29049d3bc91SRichard Lowe     Dwarf_Small *comp_dir = 0;
29149d3bc91SRichard Lowe 
292*4d9fdb46SRobert Mustacchi     /*  Offset into .debug_line specified by a DW_AT_stmt_list
293*4d9fdb46SRobert Mustacchi         attribute. */
29449d3bc91SRichard Lowe     Dwarf_Unsigned line_offset = 0;
29549d3bc91SRichard Lowe 
296*4d9fdb46SRobert Mustacchi     /*  This points to a block of char *'s, each of which points to a
297*4d9fdb46SRobert Mustacchi         file name. */
29849d3bc91SRichard Lowe     char **ret_files = 0;
29949d3bc91SRichard Lowe 
300*4d9fdb46SRobert Mustacchi     /*  The Dwarf_Debug this die belongs to. */
30107dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
302*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context context = 0;
303*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context  line_context = 0;
30449d3bc91SRichard Lowe 
305*4d9fdb46SRobert Mustacchi     /*  Used to chain the file names. */
30607dc1947SRichard Lowe     Dwarf_Chain curr_chain = NULL;
30707dc1947SRichard Lowe     Dwarf_Chain prev_chain = NULL;
30807dc1947SRichard Lowe     Dwarf_Chain head_chain = NULL;
309*4d9fdb46SRobert Mustacchi 
31007dc1947SRichard Lowe     Dwarf_Half attrform = 0;
31107dc1947SRichard Lowe     int resattr = DW_DLV_ERROR;
31207dc1947SRichard Lowe     int lres = DW_DLV_ERROR;
313*4d9fdb46SRobert Mustacchi     unsigned i = 0;
31407dc1947SRichard Lowe     int res = DW_DLV_ERROR;
315*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start = 0;
31649d3bc91SRichard Lowe 
317*4d9fdb46SRobert Mustacchi     /*  ***** BEGIN CODE ***** */
318*4d9fdb46SRobert Mustacchi     /*  Reset error. */
319*4d9fdb46SRobert Mustacchi 
320*4d9fdb46SRobert Mustacchi     if (error != NULL) {
32107dc1947SRichard Lowe         *error = NULL;
322*4d9fdb46SRobert Mustacchi     }
32349d3bc91SRichard Lowe 
32407dc1947SRichard Lowe     CHECK_DIE(die, DW_DLV_ERROR);
325*4d9fdb46SRobert Mustacchi     context = die->di_cu_context;
326*4d9fdb46SRobert Mustacchi     dbg = context->cc_dbg;
32749d3bc91SRichard Lowe 
32849d3bc91SRichard Lowe     resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
32949d3bc91SRichard Lowe     if (resattr != DW_DLV_OK) {
33007dc1947SRichard Lowe         return resattr;
33149d3bc91SRichard Lowe     }
33207dc1947SRichard Lowe 
33307dc1947SRichard Lowe     if (dbg->de_debug_line.dss_index == 0) {
334*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
33507dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_DEBUG_LINE_NULL);
33607dc1947SRichard Lowe         return (DW_DLV_ERROR);
33749d3bc91SRichard Lowe     }
33849d3bc91SRichard Lowe 
33907dc1947SRichard Lowe     res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
34049d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
341*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
34207dc1947SRichard Lowe         return res;
34349d3bc91SRichard Lowe     }
344*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_line.dss_size) {
345*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
346*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
347*4d9fdb46SRobert Mustacchi     }
348*4d9fdb46SRobert Mustacchi     section_start = dbg->de_debug_line.dss_data;
34949d3bc91SRichard Lowe 
35007dc1947SRichard Lowe     lres = dwarf_whatform(stmt_list_attr,&attrform,error);
35107dc1947SRichard Lowe     if (lres != DW_DLV_OK) {
352*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
35307dc1947SRichard Lowe         return lres;
35407dc1947SRichard Lowe     }
35507dc1947SRichard Lowe     if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
356*4d9fdb46SRobert Mustacchi         attrform != DW_FORM_sec_offset  &&
357*4d9fdb46SRobert Mustacchi         attrform != DW_FORM_GNU_ref_alt) {
358*4d9fdb46SRobert Mustacchi         dwarfstring m;
359*4d9fdb46SRobert Mustacchi         dwarfstring f;
360*4d9fdb46SRobert Mustacchi         const char *formname = 0;
361*4d9fdb46SRobert Mustacchi 
362*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&f);
363*4d9fdb46SRobert Mustacchi         dwarf_get_FORM_name(attrform,&formname);
364*4d9fdb46SRobert Mustacchi         if (!formname) {
365*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&f,"Invalid Form Code "
366*4d9fdb46SRobert Mustacchi                 " 0x" DW_PR_DUx,attrform);
367*4d9fdb46SRobert Mustacchi         } else {
368*4d9fdb46SRobert Mustacchi             dwarfstring_append(&f,(char *)formname);
369*4d9fdb46SRobert Mustacchi         }
370*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
371*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m);
372*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_s(&m,
373*4d9fdb46SRobert Mustacchi             "DW_DLE_LINE_OFFSET_WRONG_FORM: form %s "
374*4d9fdb46SRobert Mustacchi             "instead of an allowed section offset form.",
375*4d9fdb46SRobert Mustacchi             dwarfstring_string(&f));
376*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error, DW_DLE_LINE_OFFSET_WRONG_FORM,
377*4d9fdb46SRobert Mustacchi             dwarfstring_string(&m));
378*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m);
379*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&f);
38007dc1947SRichard Lowe         return (DW_DLV_ERROR);
38107dc1947SRichard Lowe     }
38207dc1947SRichard Lowe     lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
38349d3bc91SRichard Lowe     if (lres != DW_DLV_OK) {
384*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
38507dc1947SRichard Lowe         return lres;
38649d3bc91SRichard Lowe     }
38707dc1947SRichard Lowe     if (line_offset >= dbg->de_debug_line.dss_size) {
388*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
38907dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
39007dc1947SRichard Lowe         return (DW_DLV_ERROR);
39149d3bc91SRichard Lowe     }
39207dc1947SRichard Lowe     line_ptr = dbg->de_debug_line.dss_data + line_offset;
393*4d9fdb46SRobert Mustacchi     {
394*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned fission_offset = 0;
395*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned fission_size = 0;
396*4d9fdb46SRobert Mustacchi         int resl = _dwarf_get_fission_addition_die(die, DW_SECT_LINE,
397*4d9fdb46SRobert Mustacchi             &fission_offset,&fission_size,error);
398*4d9fdb46SRobert Mustacchi         if(resl != DW_DLV_OK) {
399*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
400*4d9fdb46SRobert Mustacchi             return resl;
401*4d9fdb46SRobert Mustacchi         }
402*4d9fdb46SRobert Mustacchi         line_ptr += fission_offset;
403*4d9fdb46SRobert Mustacchi         if (line_ptr > dbg->de_debug_line.dss_data +
404*4d9fdb46SRobert Mustacchi             dbg->de_debug_line.dss_size) {
405*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
406*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_FISSION_ADDITION_ERROR);
407*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
408*4d9fdb46SRobert Mustacchi         }
409*4d9fdb46SRobert Mustacchi     }
41049d3bc91SRichard Lowe     dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
411*4d9fdb46SRobert Mustacchi     stmt_list_attr = 0;
41249d3bc91SRichard Lowe 
413*4d9fdb46SRobert Mustacchi     resattr = _dwarf_internal_get_die_comp_dir(die, &const_comp_dir,
414*4d9fdb46SRobert Mustacchi         &const_comp_name,error);
41549d3bc91SRichard Lowe     if (resattr == DW_DLV_ERROR) {
41607dc1947SRichard Lowe         return resattr;
41749d3bc91SRichard Lowe     }
41807dc1947SRichard Lowe 
419*4d9fdb46SRobert Mustacchi     /* Horrible cast away const to match historical interfaces. */
420*4d9fdb46SRobert Mustacchi     comp_dir = (Dwarf_Small *)const_comp_dir;
421*4d9fdb46SRobert Mustacchi     line_context = (Dwarf_Line_Context)
422*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1);
423*4d9fdb46SRobert Mustacchi     if (line_context == NULL) {
424*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
425*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
42649d3bc91SRichard Lowe     }
427*4d9fdb46SRobert Mustacchi     line_context->lc_new_style_access = false;
428*4d9fdb46SRobert Mustacchi     /*  We are in dwarf_srcfiles() */
42907dc1947SRichard Lowe     {
43007dc1947SRichard Lowe         Dwarf_Small *line_ptr_out = 0;
431*4d9fdb46SRobert Mustacchi         int dres = 0;
432*4d9fdb46SRobert Mustacchi 
433*4d9fdb46SRobert Mustacchi         dres = _dwarf_read_line_table_header(dbg,
434*4d9fdb46SRobert Mustacchi             context,
435*4d9fdb46SRobert Mustacchi             section_start,
43607dc1947SRichard Lowe             line_ptr,
43707dc1947SRichard Lowe             dbg->de_debug_line.dss_size,
43807dc1947SRichard Lowe             &line_ptr_out,
439*4d9fdb46SRobert Mustacchi             line_context,
44007dc1947SRichard Lowe             NULL, NULL,error,
44107dc1947SRichard Lowe             0);
44207dc1947SRichard Lowe 
44307dc1947SRichard Lowe         if (dres == DW_DLV_ERROR) {
444*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
445*4d9fdb46SRobert Mustacchi             line_context = 0;
44607dc1947SRichard Lowe             return dres;
44707dc1947SRichard Lowe         }
44807dc1947SRichard Lowe         if (dres == DW_DLV_NO_ENTRY) {
449*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
450*4d9fdb46SRobert Mustacchi             line_context = 0;
45107dc1947SRichard Lowe             return dres;
45207dc1947SRichard Lowe         }
45349d3bc91SRichard Lowe     }
454*4d9fdb46SRobert Mustacchi     /*  For DWARF5, use of DW_AT_comp_dir not needed.
455*4d9fdb46SRobert Mustacchi         Line table file names and directories
456*4d9fdb46SRobert Mustacchi         start with comp_dir and name.  FIXME DWARF5 */
457*4d9fdb46SRobert Mustacchi     line_context->lc_compilation_directory = comp_dir;
458*4d9fdb46SRobert Mustacchi     /* We are in dwarf_srcfiles() */
459*4d9fdb46SRobert Mustacchi     {
460*4d9fdb46SRobert Mustacchi         Dwarf_File_Entry fe = 0;
461*4d9fdb46SRobert Mustacchi         Dwarf_File_Entry fe2 =line_context->lc_file_entries;
462*4d9fdb46SRobert Mustacchi         Dwarf_Signed baseindex = 0;
463*4d9fdb46SRobert Mustacchi         Dwarf_Signed file_count = 0;
464*4d9fdb46SRobert Mustacchi         Dwarf_Signed endindex = 0;
465*4d9fdb46SRobert Mustacchi 
466*4d9fdb46SRobert Mustacchi         res =  dwarf_srclines_files_indexes(line_context, &baseindex,
467*4d9fdb46SRobert Mustacchi             &file_count, &endindex, error);
468*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
469*4d9fdb46SRobert Mustacchi             return res;
47007dc1947SRichard Lowe         }
471*4d9fdb46SRobert Mustacchi         for (i = baseindex; i < endindex; ++i,fe2 = fe->fi_next ) {
472*4d9fdb46SRobert Mustacchi             int sres = 0;
473*4d9fdb46SRobert Mustacchi             char *name_out = 0;
474*4d9fdb46SRobert Mustacchi 
475*4d9fdb46SRobert Mustacchi             fe = fe2;
476*4d9fdb46SRobert Mustacchi             sres = create_fullest_file_path(dbg,fe,line_context,
477*4d9fdb46SRobert Mustacchi                 &name_out,error);
478*4d9fdb46SRobert Mustacchi             if (sres != DW_DLV_OK) {
479*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
480*4d9fdb46SRobert Mustacchi                 /* This can leak some strings */
481*4d9fdb46SRobert Mustacchi                 return sres;
482*4d9fdb46SRobert Mustacchi             }
483*4d9fdb46SRobert Mustacchi             curr_chain =
484*4d9fdb46SRobert Mustacchi                 (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
485*4d9fdb46SRobert Mustacchi             if (curr_chain == NULL) {
486*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
48707dc1947SRichard Lowe                 _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
48807dc1947SRichard Lowe                 return (DW_DLV_ERROR);
48907dc1947SRichard Lowe             }
490*4d9fdb46SRobert Mustacchi             curr_chain->ch_item = name_out;
491*4d9fdb46SRobert Mustacchi             if (head_chain == NULL) {
492*4d9fdb46SRobert Mustacchi                 head_chain = prev_chain = curr_chain;
493*4d9fdb46SRobert Mustacchi             } else {
494*4d9fdb46SRobert Mustacchi                 prev_chain->ch_next = curr_chain;
495*4d9fdb46SRobert Mustacchi                 prev_chain = curr_chain;
496*4d9fdb46SRobert Mustacchi             }
49707dc1947SRichard Lowe         }
49849d3bc91SRichard Lowe     }
499*4d9fdb46SRobert Mustacchi     if (!head_chain) {
500*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
501*4d9fdb46SRobert Mustacchi         *srcfiles = NULL;
502*4d9fdb46SRobert Mustacchi         *srcfilecount = 0;
503*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
50449d3bc91SRichard Lowe     }
50549d3bc91SRichard Lowe 
506*4d9fdb46SRobert Mustacchi     /* We are in dwarf_srcfiles() */
507*4d9fdb46SRobert Mustacchi     if (line_context->lc_file_entry_count == 0) {
508*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
50907dc1947SRichard Lowe         *srcfiles = NULL;
51007dc1947SRichard Lowe         *srcfilecount = 0;
511*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
51249d3bc91SRichard Lowe     }
51349d3bc91SRichard Lowe 
51449d3bc91SRichard Lowe     ret_files = (char **)
515*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LIST,
516*4d9fdb46SRobert Mustacchi         line_context->lc_file_entry_count);
51749d3bc91SRichard Lowe     if (ret_files == NULL) {
518*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
51907dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
52007dc1947SRichard Lowe         return (DW_DLV_ERROR);
52149d3bc91SRichard Lowe     }
52249d3bc91SRichard Lowe 
52349d3bc91SRichard Lowe     curr_chain = head_chain;
524*4d9fdb46SRobert Mustacchi     for (i = 0; i < line_context->lc_file_entry_count; i++) {
52507dc1947SRichard Lowe         *(ret_files + i) = curr_chain->ch_item;
526*4d9fdb46SRobert Mustacchi         curr_chain->ch_item = 0;
52707dc1947SRichard Lowe         prev_chain = curr_chain;
52807dc1947SRichard Lowe         curr_chain = curr_chain->ch_next;
52907dc1947SRichard Lowe         dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN);
53049d3bc91SRichard Lowe     }
531*4d9fdb46SRobert Mustacchi     /*  Our chain is not recorded in the line_context so
532*4d9fdb46SRobert Mustacchi         the line_context destructor will not destroy our
533*4d9fdb46SRobert Mustacchi         list of strings or our strings.
534*4d9fdb46SRobert Mustacchi         Our caller has to do the deallocations.  */
53549d3bc91SRichard Lowe     *srcfiles = ret_files;
536*4d9fdb46SRobert Mustacchi     *srcfilecount = line_context->lc_file_entry_count;
537*4d9fdb46SRobert Mustacchi     dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
53849d3bc91SRichard Lowe     return (DW_DLV_OK);
53949d3bc91SRichard Lowe }
54049d3bc91SRichard Lowe 
54149d3bc91SRichard Lowe 
542*4d9fdb46SRobert Mustacchi 
543*4d9fdb46SRobert Mustacchi /*  Return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR
544*4d9fdb46SRobert Mustacchi     doaddrs is true iff this is being called for SGI IRIX rqs processing
545*4d9fdb46SRobert Mustacchi     (ie, not a normal libdwarf dwarf_srclines or two-level  user call at all).
546*4d9fdb46SRobert Mustacchi     dolines is true iff this is called by a dwarf_srclines call.
547*4d9fdb46SRobert Mustacchi 
548*4d9fdb46SRobert Mustacchi     In case of error or NO_ENTRY in this code we use the
549*4d9fdb46SRobert Mustacchi     dwarf_srcline_dealloc(line_context)
550*4d9fdb46SRobert Mustacchi     and dealloc of DW_DLA_LINE_CONTEXT
551*4d9fdb46SRobert Mustacchi     from the new interface for uniformity here.
55249d3bc91SRichard Lowe */
553*4d9fdb46SRobert Mustacchi 
55449d3bc91SRichard Lowe int
_dwarf_internal_srclines(Dwarf_Die die,Dwarf_Bool is_new_interface,Dwarf_Unsigned * version,Dwarf_Small * table_count,Dwarf_Line_Context * line_context_out,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Line ** linebuf_actuals,Dwarf_Signed * linecount_actuals,Dwarf_Bool doaddrs,Dwarf_Bool dolines,Dwarf_Error * error)55549d3bc91SRichard Lowe _dwarf_internal_srclines(Dwarf_Die die,
556*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_new_interface,
557*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * version,
558*4d9fdb46SRobert Mustacchi     Dwarf_Small    * table_count, /* returns 0,1, or 2 */
559*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context *line_context_out,
56007dc1947SRichard Lowe     Dwarf_Line ** linebuf,
561*4d9fdb46SRobert Mustacchi     Dwarf_Signed * linecount,
562*4d9fdb46SRobert Mustacchi     Dwarf_Line ** linebuf_actuals,
563*4d9fdb46SRobert Mustacchi     Dwarf_Signed * linecount_actuals,
56407dc1947SRichard Lowe     Dwarf_Bool doaddrs,
565*4d9fdb46SRobert Mustacchi     Dwarf_Bool dolines,
566*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
56749d3bc91SRichard Lowe {
568*4d9fdb46SRobert Mustacchi     /*  This pointer is used to scan the portion of the .debug_line
569*4d9fdb46SRobert Mustacchi         section for the current cu. */
57007dc1947SRichard Lowe     Dwarf_Small *line_ptr = 0;
57149d3bc91SRichard Lowe 
572*4d9fdb46SRobert Mustacchi     /*  This points to the last byte of the .debug_line portion for the
573*4d9fdb46SRobert Mustacchi         current cu. */
57407dc1947SRichard Lowe     Dwarf_Small *line_ptr_end = 0;
57549d3bc91SRichard Lowe 
576*4d9fdb46SRobert Mustacchi     /*  For two-level line tables, this points to the first byte of the
577*4d9fdb46SRobert Mustacchi         actuals table (and the end of the logicals table) for the current
578*4d9fdb46SRobert Mustacchi         cu. */
579*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_actuals = 0;
580*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_start = 0;
581*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end = 0;
58249d3bc91SRichard Lowe 
583*4d9fdb46SRobert Mustacchi     /*  Pointer to a DW_AT_stmt_list attribute in case it exists in the
584*4d9fdb46SRobert Mustacchi         die. */
585*4d9fdb46SRobert Mustacchi     Dwarf_Attribute stmt_list_attr = 0;
58649d3bc91SRichard Lowe 
587*4d9fdb46SRobert Mustacchi     const char * const_comp_name = 0;
588*4d9fdb46SRobert Mustacchi     /*  Pointer to name of compilation directory. */
589*4d9fdb46SRobert Mustacchi     const char * const_comp_dir = NULL;
59049d3bc91SRichard Lowe     Dwarf_Small *comp_dir = NULL;
59149d3bc91SRichard Lowe 
592*4d9fdb46SRobert Mustacchi     /*  Offset into .debug_line specified by a DW_AT_stmt_list
593*4d9fdb46SRobert Mustacchi         attribute. */
59407dc1947SRichard Lowe     Dwarf_Unsigned line_offset = 0;
59549d3bc91SRichard Lowe 
596*4d9fdb46SRobert Mustacchi     /*  Pointer to a Dwarf_Line_Context_s structure that contains the
597*4d9fdb46SRobert Mustacchi         context such as file names and include directories for the set
598*4d9fdb46SRobert Mustacchi         of lines being generated.
599*4d9fdb46SRobert Mustacchi         This is always recorded on an
600*4d9fdb46SRobert Mustacchi         DW_LNS_end_sequence operator,
601*4d9fdb46SRobert Mustacchi         on  all special opcodes, and on DW_LNS_copy.
602*4d9fdb46SRobert Mustacchi         */
60307dc1947SRichard Lowe     Dwarf_Line_Context line_context = 0;
604*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context   cu_context = 0;
605*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned fission_offset = 0;
60649d3bc91SRichard Lowe 
607*4d9fdb46SRobert Mustacchi     /*  The Dwarf_Debug this die belongs to. */
60807dc1947SRichard Lowe     Dwarf_Debug dbg = 0;
60907dc1947SRichard Lowe     int resattr = DW_DLV_ERROR;
61007dc1947SRichard Lowe     int lres = DW_DLV_ERROR;
61107dc1947SRichard Lowe     Dwarf_Half address_size = 0;
612*4d9fdb46SRobert Mustacchi     Dwarf_Small * orig_line_ptr = 0;
61349d3bc91SRichard Lowe 
61407dc1947SRichard Lowe     int res = DW_DLV_ERROR;
61549d3bc91SRichard Lowe 
616*4d9fdb46SRobert Mustacchi     /*  ***** BEGIN CODE ***** */
617*4d9fdb46SRobert Mustacchi     if (error != NULL) {
61807dc1947SRichard Lowe         *error = NULL;
619*4d9fdb46SRobert Mustacchi     }
62049d3bc91SRichard Lowe 
62107dc1947SRichard Lowe     CHECK_DIE(die, DW_DLV_ERROR);
622*4d9fdb46SRobert Mustacchi     cu_context = die->di_cu_context;
623*4d9fdb46SRobert Mustacchi     dbg = cu_context->cc_dbg;
62449d3bc91SRichard Lowe 
62507dc1947SRichard Lowe     res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
62649d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
62707dc1947SRichard Lowe         return res;
62849d3bc91SRichard Lowe     }
629*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_line.dss_size) {
630*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
631*4d9fdb46SRobert Mustacchi     }
632*4d9fdb46SRobert Mustacchi 
63307dc1947SRichard Lowe     address_size = _dwarf_get_address_size(dbg, die);
63449d3bc91SRichard Lowe     resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
63549d3bc91SRichard Lowe     if (resattr != DW_DLV_OK) {
63607dc1947SRichard Lowe         return resattr;
63749d3bc91SRichard Lowe     }
638*4d9fdb46SRobert Mustacchi     lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
63949d3bc91SRichard Lowe     if (lres != DW_DLV_OK) {
640*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
64107dc1947SRichard Lowe         return lres;
64249d3bc91SRichard Lowe     }
64349d3bc91SRichard Lowe 
64407dc1947SRichard Lowe     if (line_offset >= dbg->de_debug_line.dss_size) {
645*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
64607dc1947SRichard Lowe         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
64707dc1947SRichard Lowe         return (DW_DLV_ERROR);
64849d3bc91SRichard Lowe     }
649*4d9fdb46SRobert Mustacchi     section_start = dbg->de_debug_line.dss_data;
650*4d9fdb46SRobert Mustacchi     section_end = section_start  +dbg->de_debug_line.dss_size;
651*4d9fdb46SRobert Mustacchi     {
652*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned fission_size = 0;
653*4d9fdb46SRobert Mustacchi         int resf = _dwarf_get_fission_addition_die(die, DW_SECT_LINE,
654*4d9fdb46SRobert Mustacchi             &fission_offset,&fission_size,error);
655*4d9fdb46SRobert Mustacchi         if(resf != DW_DLV_OK) {
656*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
657*4d9fdb46SRobert Mustacchi             return resf;
658*4d9fdb46SRobert Mustacchi         }
659*4d9fdb46SRobert Mustacchi         line_ptr += fission_offset;
660*4d9fdb46SRobert Mustacchi         if (line_ptr > section_end) {
661*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_FISSION_ADDITION_ERROR);
662*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
663*4d9fdb46SRobert Mustacchi         }
664*4d9fdb46SRobert Mustacchi     }
665*4d9fdb46SRobert Mustacchi 
666*4d9fdb46SRobert Mustacchi     section_start = dbg->de_debug_line.dss_data;
667*4d9fdb46SRobert Mustacchi     section_end = section_start  +dbg->de_debug_line.dss_size;
668*4d9fdb46SRobert Mustacchi     orig_line_ptr = section_start + line_offset + fission_offset;
669*4d9fdb46SRobert Mustacchi     line_ptr = orig_line_ptr;
67049d3bc91SRichard Lowe     dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
671*4d9fdb46SRobert Mustacchi     if ((line_offset + fission_offset) > dbg->de_debug_line.dss_size) {
672*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
673*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
674*4d9fdb46SRobert Mustacchi     }
675*4d9fdb46SRobert Mustacchi     if (line_ptr > section_end) {
676*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
677*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
678*4d9fdb46SRobert Mustacchi     }
67949d3bc91SRichard Lowe 
680*4d9fdb46SRobert Mustacchi     /*  If die has DW_AT_comp_dir attribute, get the string that names
681*4d9fdb46SRobert Mustacchi         the compilation directory. */
682*4d9fdb46SRobert Mustacchi     resattr = _dwarf_internal_get_die_comp_dir(die, &const_comp_dir,
683*4d9fdb46SRobert Mustacchi         &const_comp_name,error);
68449d3bc91SRichard Lowe     if (resattr == DW_DLV_ERROR) {
68507dc1947SRichard Lowe         return resattr;
68649d3bc91SRichard Lowe     }
687*4d9fdb46SRobert Mustacchi     /* Horrible cast to match historic interfaces. */
688*4d9fdb46SRobert Mustacchi     comp_dir = (Dwarf_Small *)const_comp_dir;
689*4d9fdb46SRobert Mustacchi     line_context = (Dwarf_Line_Context)
690*4d9fdb46SRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1);
691*4d9fdb46SRobert Mustacchi     if (line_context == NULL) {
692*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
693*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
69449d3bc91SRichard Lowe     }
695*4d9fdb46SRobert Mustacchi     line_context->lc_new_style_access = is_new_interface;
696*4d9fdb46SRobert Mustacchi     line_context->lc_compilation_directory = comp_dir;
697*4d9fdb46SRobert Mustacchi     /*  We are in dwarf_internal_srclines() */
69807dc1947SRichard Lowe     {
69907dc1947SRichard Lowe         Dwarf_Small *newlinep = 0;
700*4d9fdb46SRobert Mustacchi         int resp = _dwarf_read_line_table_header(dbg,
701*4d9fdb46SRobert Mustacchi             cu_context,
702*4d9fdb46SRobert Mustacchi             section_start,
70307dc1947SRichard Lowe             line_ptr,
70407dc1947SRichard Lowe             dbg->de_debug_line.dss_size,
70507dc1947SRichard Lowe             &newlinep,
706*4d9fdb46SRobert Mustacchi             line_context,
70707dc1947SRichard Lowe             NULL,NULL,
70807dc1947SRichard Lowe             error,
70907dc1947SRichard Lowe             0);
71007dc1947SRichard Lowe 
711*4d9fdb46SRobert Mustacchi         if (resp == DW_DLV_ERROR) {
712*4d9fdb46SRobert Mustacchi             if(is_new_interface) {
713*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
714*4d9fdb46SRobert Mustacchi             } else {
715*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
716*4d9fdb46SRobert Mustacchi             }
717*4d9fdb46SRobert Mustacchi             return resp;
71807dc1947SRichard Lowe         }
719*4d9fdb46SRobert Mustacchi         if (resp == DW_DLV_NO_ENTRY) {
720*4d9fdb46SRobert Mustacchi             if(is_new_interface) {
721*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
722*4d9fdb46SRobert Mustacchi             } else {
723*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
724*4d9fdb46SRobert Mustacchi             }
725*4d9fdb46SRobert Mustacchi             return resp;
72607dc1947SRichard Lowe         }
727*4d9fdb46SRobert Mustacchi         line_ptr_end = line_context->lc_line_ptr_end;
72807dc1947SRichard Lowe         line_ptr = newlinep;
729*4d9fdb46SRobert Mustacchi         if (line_context->lc_actuals_table_offset > 0) {
730*4d9fdb46SRobert Mustacchi             line_ptr_actuals = line_context->lc_line_prologue_start +
731*4d9fdb46SRobert Mustacchi                 line_context->lc_actuals_table_offset;
73207dc1947SRichard Lowe         }
73349d3bc91SRichard Lowe     }
73449d3bc91SRichard Lowe 
73549d3bc91SRichard Lowe 
736*4d9fdb46SRobert Mustacchi     if (line_ptr_actuals == 0) {
737*4d9fdb46SRobert Mustacchi         /* ASSERT: lc_table_count == 1 or lc_table_count == 0 */
738*4d9fdb46SRobert Mustacchi         int err_count_out = 0;
739*4d9fdb46SRobert Mustacchi         /* Normal style (single level) line table. */
740*4d9fdb46SRobert Mustacchi         Dwarf_Bool is_actuals_table = false;
741*4d9fdb46SRobert Mustacchi         Dwarf_Bool local_is_single_table = true;
742*4d9fdb46SRobert Mustacchi         res = read_line_table_program(dbg,
743*4d9fdb46SRobert Mustacchi             line_ptr, line_ptr_end, orig_line_ptr,
744*4d9fdb46SRobert Mustacchi             section_start,
745*4d9fdb46SRobert Mustacchi             line_context,
746*4d9fdb46SRobert Mustacchi             address_size, doaddrs, dolines,
747*4d9fdb46SRobert Mustacchi             local_is_single_table,
748*4d9fdb46SRobert Mustacchi             is_actuals_table,
749*4d9fdb46SRobert Mustacchi             error,
750*4d9fdb46SRobert Mustacchi             &err_count_out);
751*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
752*4d9fdb46SRobert Mustacchi             if(is_new_interface) {
753*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
754*4d9fdb46SRobert Mustacchi             } else {
755*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
75607dc1947SRichard Lowe             }
757*4d9fdb46SRobert Mustacchi             return res;
758*4d9fdb46SRobert Mustacchi         }
759*4d9fdb46SRobert Mustacchi         if (linebuf)
760*4d9fdb46SRobert Mustacchi             *linebuf = line_context->lc_linebuf_logicals;
761*4d9fdb46SRobert Mustacchi         if (linecount)
762*4d9fdb46SRobert Mustacchi             *linecount =  line_context->lc_linecount_logicals;
763*4d9fdb46SRobert Mustacchi         if (linebuf_actuals) {
764*4d9fdb46SRobert Mustacchi             *linebuf_actuals = NULL;
765*4d9fdb46SRobert Mustacchi         }
766*4d9fdb46SRobert Mustacchi         if (linecount_actuals) {
767*4d9fdb46SRobert Mustacchi             *linecount_actuals = 0;
768*4d9fdb46SRobert Mustacchi         }
769*4d9fdb46SRobert Mustacchi     } else {
770*4d9fdb46SRobert Mustacchi         Dwarf_Bool is_actuals_table = false;
771*4d9fdb46SRobert Mustacchi         Dwarf_Bool local2_is_single_table = false;
772*4d9fdb46SRobert Mustacchi         int err_count_out = 0;
773*4d9fdb46SRobert Mustacchi 
774*4d9fdb46SRobert Mustacchi         line_context->lc_is_single_table  = false;
775*4d9fdb46SRobert Mustacchi         /*  Two-level line table.
776*4d9fdb46SRobert Mustacchi             First read the logicals table. */
777*4d9fdb46SRobert Mustacchi         res = read_line_table_program(dbg,
778*4d9fdb46SRobert Mustacchi             line_ptr, line_ptr_actuals, orig_line_ptr,
779*4d9fdb46SRobert Mustacchi             section_start,
780*4d9fdb46SRobert Mustacchi             line_context,
781*4d9fdb46SRobert Mustacchi             address_size, doaddrs, dolines,
782*4d9fdb46SRobert Mustacchi             local2_is_single_table,
783*4d9fdb46SRobert Mustacchi             is_actuals_table, error,
784*4d9fdb46SRobert Mustacchi             &err_count_out);
785*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
786*4d9fdb46SRobert Mustacchi             if(is_new_interface) {
787*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
788*4d9fdb46SRobert Mustacchi             } else {
789*4d9fdb46SRobert Mustacchi                 dwarf_dealloc(dbg,line_context,DW_DLA_LINE_CONTEXT);
79007dc1947SRichard Lowe             }
791*4d9fdb46SRobert Mustacchi             return res;
792*4d9fdb46SRobert Mustacchi         }
793*4d9fdb46SRobert Mustacchi         if (linebuf) {
794*4d9fdb46SRobert Mustacchi             *linebuf = line_context->lc_linebuf_logicals;
795*4d9fdb46SRobert Mustacchi         } else {
796*4d9fdb46SRobert Mustacchi         }
797*4d9fdb46SRobert Mustacchi         if (linecount) {
798*4d9fdb46SRobert Mustacchi             *linecount =  line_context->lc_linecount_logicals;
799*4d9fdb46SRobert Mustacchi         }
800*4d9fdb46SRobert Mustacchi         if (is_new_interface) {
801*4d9fdb46SRobert Mustacchi             /* ASSERT: linebuf_actuals == NULL  */
802*4d9fdb46SRobert Mustacchi             is_actuals_table = true;
803*4d9fdb46SRobert Mustacchi             /* The call requested an actuals table
804*4d9fdb46SRobert Mustacchi                 and one is present. So now read that one. */
805*4d9fdb46SRobert Mustacchi             res = read_line_table_program(dbg,
806*4d9fdb46SRobert Mustacchi 
807*4d9fdb46SRobert Mustacchi                 line_ptr_actuals, line_ptr_end, orig_line_ptr,
808*4d9fdb46SRobert Mustacchi                 section_start,
809*4d9fdb46SRobert Mustacchi                 line_context,
810*4d9fdb46SRobert Mustacchi                 address_size, doaddrs, dolines,
811*4d9fdb46SRobert Mustacchi                 local2_is_single_table,
812*4d9fdb46SRobert Mustacchi                 is_actuals_table, error,
813*4d9fdb46SRobert Mustacchi                 &err_count_out);
814*4d9fdb46SRobert Mustacchi             if (res != DW_DLV_OK) {
815*4d9fdb46SRobert Mustacchi                 dwarf_srclines_dealloc_b(line_context);
816*4d9fdb46SRobert Mustacchi                 return res;
81707dc1947SRichard Lowe             }
818*4d9fdb46SRobert Mustacchi             if (linebuf_actuals) {
819*4d9fdb46SRobert Mustacchi                 *linebuf_actuals = line_context->lc_linebuf_actuals;
820*4d9fdb46SRobert Mustacchi             }
821*4d9fdb46SRobert Mustacchi             if (linecount_actuals != NULL) {
822*4d9fdb46SRobert Mustacchi                 *linecount_actuals = line_context->lc_linecount_actuals;
82307dc1947SRichard Lowe             }
82407dc1947SRichard Lowe         }
82549d3bc91SRichard Lowe     }
826*4d9fdb46SRobert Mustacchi     if (!is_new_interface && linecount &&
827*4d9fdb46SRobert Mustacchi         (linecount == 0 ||*linecount == 0) &&
828*4d9fdb46SRobert Mustacchi         (linecount_actuals == 0  || *linecount_actuals == 0)) {
829*4d9fdb46SRobert Mustacchi         /*  Here we have no actual lines of any kind. In other words,
830*4d9fdb46SRobert Mustacchi             it looks like a debugfission line table skeleton or
831*4d9fdb46SRobert Mustacchi             a caller not prepared for skeletons or two-level reading..
832*4d9fdb46SRobert Mustacchi             In that case there are no line entries so the context
833*4d9fdb46SRobert Mustacchi             had nowhere to be recorded. Hence we have to delete it
834*4d9fdb46SRobert Mustacchi             else we would leak the context.  */
835*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
836*4d9fdb46SRobert Mustacchi         line_context = 0;
837*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
83849d3bc91SRichard Lowe     }
839*4d9fdb46SRobert Mustacchi     *table_count = line_context->lc_table_count;
840*4d9fdb46SRobert Mustacchi     if (version != NULL) {
841*4d9fdb46SRobert Mustacchi         *version = line_context->lc_version_number;
84207dc1947SRichard Lowe     }
843*4d9fdb46SRobert Mustacchi     *line_context_out = line_context;
84449d3bc91SRichard Lowe     return (DW_DLV_OK);
84549d3bc91SRichard Lowe }
84649d3bc91SRichard Lowe 
84749d3bc91SRichard Lowe int
dwarf_get_ranges_section_name(Dwarf_Debug dbg,const char ** section_name_out,Dwarf_Error * error)848*4d9fdb46SRobert Mustacchi dwarf_get_ranges_section_name(Dwarf_Debug dbg,
849*4d9fdb46SRobert Mustacchi     const char **section_name_out,
850*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
85149d3bc91SRichard Lowe {
852*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *sec = 0;
853*4d9fdb46SRobert Mustacchi     if (error != NULL) {
854*4d9fdb46SRobert Mustacchi         *error = NULL;
85549d3bc91SRichard Lowe     }
856*4d9fdb46SRobert Mustacchi     sec = &dbg->de_debug_ranges;
857*4d9fdb46SRobert Mustacchi     if (sec->dss_size == 0) {
858*4d9fdb46SRobert Mustacchi         /* We don't have such a  section at all. */
859*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
860*4d9fdb46SRobert Mustacchi     }
861*4d9fdb46SRobert Mustacchi     *section_name_out = sec->dss_name;
862*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
86349d3bc91SRichard Lowe }
86449d3bc91SRichard Lowe 
86549d3bc91SRichard Lowe int
dwarf_get_aranges_section_name(Dwarf_Debug dbg,const char ** section_name_out,Dwarf_Error * error)866*4d9fdb46SRobert Mustacchi dwarf_get_aranges_section_name(Dwarf_Debug dbg,
867*4d9fdb46SRobert Mustacchi     const char **section_name_out,
868*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
86949d3bc91SRichard Lowe {
870*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *sec = 0;
871*4d9fdb46SRobert Mustacchi     if (error != NULL) {
872*4d9fdb46SRobert Mustacchi         *error = NULL;
87349d3bc91SRichard Lowe     }
874*4d9fdb46SRobert Mustacchi     sec = &dbg->de_debug_aranges;
875*4d9fdb46SRobert Mustacchi     if (sec->dss_size == 0) {
876*4d9fdb46SRobert Mustacchi         /* We don't have such a  section at all. */
877*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
878*4d9fdb46SRobert Mustacchi     }
879*4d9fdb46SRobert Mustacchi     *section_name_out = sec->dss_name;
88049d3bc91SRichard Lowe     return DW_DLV_OK;
88149d3bc91SRichard Lowe }
88249d3bc91SRichard Lowe 
88349d3bc91SRichard Lowe int
dwarf_get_line_section_name_from_die(Dwarf_Die die,const char ** section_name_out,Dwarf_Error * error)884*4d9fdb46SRobert Mustacchi dwarf_get_line_section_name_from_die(Dwarf_Die die,
885*4d9fdb46SRobert Mustacchi     const char **section_name_out,
886*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
88749d3bc91SRichard Lowe {
888*4d9fdb46SRobert Mustacchi     /*  The Dwarf_Debug this die belongs to. */
889*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
890*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *sec = 0;
891*4d9fdb46SRobert Mustacchi 
892*4d9fdb46SRobert Mustacchi     /*  ***** BEGIN CODE ***** */
893*4d9fdb46SRobert Mustacchi     if (error) {
894*4d9fdb46SRobert Mustacchi         *error = NULL;
89549d3bc91SRichard Lowe     }
89649d3bc91SRichard Lowe 
897*4d9fdb46SRobert Mustacchi     CHECK_DIE(die, DW_DLV_ERROR);
898*4d9fdb46SRobert Mustacchi     dbg = die->di_cu_context->cc_dbg;
899*4d9fdb46SRobert Mustacchi     sec = &dbg->de_debug_line;
900*4d9fdb46SRobert Mustacchi     if (sec->dss_size == 0) {
901*4d9fdb46SRobert Mustacchi         /* We don't have such a  section at all. */
902*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
903*4d9fdb46SRobert Mustacchi     }
904*4d9fdb46SRobert Mustacchi     *section_name_out = sec->dss_name;
90549d3bc91SRichard Lowe     return DW_DLV_OK;
90649d3bc91SRichard Lowe }
90749d3bc91SRichard Lowe 
90849d3bc91SRichard Lowe int
dwarf_get_string_section_name(Dwarf_Debug dbg,const char ** section_name_out,Dwarf_Error * error)909*4d9fdb46SRobert Mustacchi dwarf_get_string_section_name(Dwarf_Debug dbg,
910*4d9fdb46SRobert Mustacchi     const char **section_name_out,
911*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
91249d3bc91SRichard Lowe {
913*4d9fdb46SRobert Mustacchi     struct Dwarf_Section_s *sec = 0;
914*4d9fdb46SRobert Mustacchi 
915*4d9fdb46SRobert Mustacchi     /*  ***** BEGIN CODE ***** */
916*4d9fdb46SRobert Mustacchi     if (error != NULL) {
917*4d9fdb46SRobert Mustacchi         *error = NULL;
91849d3bc91SRichard Lowe     }
91949d3bc91SRichard Lowe 
920*4d9fdb46SRobert Mustacchi     sec = &dbg->de_debug_str;
921*4d9fdb46SRobert Mustacchi     if (sec->dss_size == 0) {
922*4d9fdb46SRobert Mustacchi         /* We don't have such a  section at all. */
923*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
924*4d9fdb46SRobert Mustacchi     }
925*4d9fdb46SRobert Mustacchi     *section_name_out = sec->dss_name;
92649d3bc91SRichard Lowe     return DW_DLV_OK;
92749d3bc91SRichard Lowe }
92849d3bc91SRichard Lowe 
929*4d9fdb46SRobert Mustacchi 
93007dc1947SRichard Lowe int
dwarf_srclines(Dwarf_Die die,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Error * error)931*4d9fdb46SRobert Mustacchi dwarf_srclines(Dwarf_Die die,
932*4d9fdb46SRobert Mustacchi     Dwarf_Line ** linebuf,
933*4d9fdb46SRobert Mustacchi     Dwarf_Signed * linecount, Dwarf_Error * error)
93407dc1947SRichard Lowe {
935*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned version = 0;
936*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context = 0;
937*4d9fdb46SRobert Mustacchi     Dwarf_Small    table_count = 0;
938*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_new_interface = false;
939*4d9fdb46SRobert Mustacchi     int res  = _dwarf_internal_srclines(die,
940*4d9fdb46SRobert Mustacchi         is_new_interface,
941*4d9fdb46SRobert Mustacchi         &version,
942*4d9fdb46SRobert Mustacchi         &table_count,
943*4d9fdb46SRobert Mustacchi         &line_context,
944*4d9fdb46SRobert Mustacchi         linebuf,
945*4d9fdb46SRobert Mustacchi         linecount,
946*4d9fdb46SRobert Mustacchi         /* linebuf_actuals */ 0,
947*4d9fdb46SRobert Mustacchi         /*linecount_actuals*/0,
948*4d9fdb46SRobert Mustacchi         /* addrlist= */ false,
949*4d9fdb46SRobert Mustacchi         /* linelist= */ true,
950*4d9fdb46SRobert Mustacchi         error);
951*4d9fdb46SRobert Mustacchi     return res;
952*4d9fdb46SRobert Mustacchi }
95307dc1947SRichard Lowe 
954*4d9fdb46SRobert Mustacchi int
dwarf_srclines_two_level(Dwarf_Die die,Dwarf_Unsigned * version,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Line ** linebuf_actuals,Dwarf_Signed * linecount_actuals,Dwarf_Error * error)955*4d9fdb46SRobert Mustacchi dwarf_srclines_two_level(Dwarf_Die die,
956*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * version,
957*4d9fdb46SRobert Mustacchi     Dwarf_Line    ** linebuf,
958*4d9fdb46SRobert Mustacchi     Dwarf_Signed   * linecount,
959*4d9fdb46SRobert Mustacchi     Dwarf_Line    ** linebuf_actuals,
960*4d9fdb46SRobert Mustacchi     Dwarf_Signed   * linecount_actuals,
961*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
962*4d9fdb46SRobert Mustacchi {
963*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context = 0;
964*4d9fdb46SRobert Mustacchi     Dwarf_Small table_count = 0;
965*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_new_interface = false;
966*4d9fdb46SRobert Mustacchi     int res  = _dwarf_internal_srclines(die,
967*4d9fdb46SRobert Mustacchi         is_new_interface,
968*4d9fdb46SRobert Mustacchi         version,
969*4d9fdb46SRobert Mustacchi         &table_count,
970*4d9fdb46SRobert Mustacchi         &line_context,
971*4d9fdb46SRobert Mustacchi         linebuf,
972*4d9fdb46SRobert Mustacchi         linecount,
973*4d9fdb46SRobert Mustacchi         linebuf_actuals,
974*4d9fdb46SRobert Mustacchi         linecount_actuals,
975*4d9fdb46SRobert Mustacchi         /* addrlist= */ false,
976*4d9fdb46SRobert Mustacchi         /* linelist= */ true,
977*4d9fdb46SRobert Mustacchi         error);
978*4d9fdb46SRobert Mustacchi    return res;
979*4d9fdb46SRobert Mustacchi }
980*4d9fdb46SRobert Mustacchi 
981*4d9fdb46SRobert Mustacchi /* New October 2015. */
982*4d9fdb46SRobert Mustacchi int
dwarf_srclines_b(Dwarf_Die die,Dwarf_Unsigned * version_out,Dwarf_Small * table_count,Dwarf_Line_Context * line_context,Dwarf_Error * error)983*4d9fdb46SRobert Mustacchi dwarf_srclines_b(Dwarf_Die die,
984*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  * version_out,
985*4d9fdb46SRobert Mustacchi     Dwarf_Small     * table_count,
986*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context * line_context,
987*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
988*4d9fdb46SRobert Mustacchi {
989*4d9fdb46SRobert Mustacchi     Dwarf_Signed linecount_actuals = 0;
990*4d9fdb46SRobert Mustacchi     Dwarf_Line *linebuf = 0;
991*4d9fdb46SRobert Mustacchi     Dwarf_Line *linebuf_actuals = 0;
992*4d9fdb46SRobert Mustacchi     Dwarf_Signed linecount = 0;
993*4d9fdb46SRobert Mustacchi     Dwarf_Bool is_new_interface = true;
994*4d9fdb46SRobert Mustacchi     int res = 0;
995*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned tcount = 0;
996*4d9fdb46SRobert Mustacchi 
997*4d9fdb46SRobert Mustacchi     res  = _dwarf_internal_srclines(die,
998*4d9fdb46SRobert Mustacchi         is_new_interface,
999*4d9fdb46SRobert Mustacchi         version_out,
1000*4d9fdb46SRobert Mustacchi         table_count,
1001*4d9fdb46SRobert Mustacchi         line_context,
1002*4d9fdb46SRobert Mustacchi         &linebuf,
1003*4d9fdb46SRobert Mustacchi         &linecount,
1004*4d9fdb46SRobert Mustacchi         &linebuf_actuals,
1005*4d9fdb46SRobert Mustacchi         &linecount_actuals,
1006*4d9fdb46SRobert Mustacchi         /* addrlist= */ false,
1007*4d9fdb46SRobert Mustacchi         /* linelist= */ true,
1008*4d9fdb46SRobert Mustacchi         error);
1009*4d9fdb46SRobert Mustacchi     if (res == DW_DLV_OK) {
1010*4d9fdb46SRobert Mustacchi         (*line_context)->lc_new_style_access = true;
1011*4d9fdb46SRobert Mustacchi     }
1012*4d9fdb46SRobert Mustacchi     if(linecount_actuals ) {
1013*4d9fdb46SRobert Mustacchi         tcount++;
1014*4d9fdb46SRobert Mustacchi     }
1015*4d9fdb46SRobert Mustacchi     if(linecount ) {
1016*4d9fdb46SRobert Mustacchi         tcount++;
1017*4d9fdb46SRobert Mustacchi     }
1018*4d9fdb46SRobert Mustacchi     *table_count = tcount;
1019*4d9fdb46SRobert Mustacchi     return res;
102007dc1947SRichard Lowe }
102107dc1947SRichard Lowe 
102249d3bc91SRichard Lowe 
1023*4d9fdb46SRobert Mustacchi /* New October 2015. */
102449d3bc91SRichard Lowe int
dwarf_srclines_from_linecontext(Dwarf_Line_Context line_context,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Error * error)1025*4d9fdb46SRobert Mustacchi dwarf_srclines_from_linecontext(Dwarf_Line_Context line_context,
1026*4d9fdb46SRobert Mustacchi     Dwarf_Line**     linebuf,
1027*4d9fdb46SRobert Mustacchi     Dwarf_Signed *   linecount,
1028*4d9fdb46SRobert Mustacchi     Dwarf_Error  *    error)
102949d3bc91SRichard Lowe {
1030*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1031*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1032*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1033*4d9fdb46SRobert Mustacchi     }
1034*4d9fdb46SRobert Mustacchi     if (!line_context->lc_new_style_access) {
1035*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
103607dc1947SRichard Lowe         return (DW_DLV_ERROR);
103749d3bc91SRichard Lowe     }
1038*4d9fdb46SRobert Mustacchi     *linebuf =           line_context->lc_linebuf_logicals;
1039*4d9fdb46SRobert Mustacchi     *linecount =         line_context->lc_linecount_logicals;
1040*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1041*4d9fdb46SRobert Mustacchi }
104249d3bc91SRichard Lowe 
1043*4d9fdb46SRobert Mustacchi /* New October 2015. */
1044*4d9fdb46SRobert Mustacchi int
dwarf_srclines_two_level_from_linecontext(Dwarf_Line_Context line_context,Dwarf_Line ** linebuf,Dwarf_Signed * linecount,Dwarf_Line ** linebuf_actuals,Dwarf_Signed * linecount_actuals,Dwarf_Error * error)1045*4d9fdb46SRobert Mustacchi dwarf_srclines_two_level_from_linecontext(Dwarf_Line_Context line_context,
1046*4d9fdb46SRobert Mustacchi     Dwarf_Line**     linebuf,
1047*4d9fdb46SRobert Mustacchi     Dwarf_Signed *   linecount,
1048*4d9fdb46SRobert Mustacchi     Dwarf_Line**     linebuf_actuals,
1049*4d9fdb46SRobert Mustacchi     Dwarf_Signed *   linecount_actuals,
1050*4d9fdb46SRobert Mustacchi     Dwarf_Error  *    error)
1051*4d9fdb46SRobert Mustacchi {
1052*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1053*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1054*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1055*4d9fdb46SRobert Mustacchi     }
1056*4d9fdb46SRobert Mustacchi     if (!line_context->lc_new_style_access) {
1057*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1058*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1059*4d9fdb46SRobert Mustacchi     }
1060*4d9fdb46SRobert Mustacchi     *linebuf =           line_context->lc_linebuf_logicals;
1061*4d9fdb46SRobert Mustacchi     *linecount =         line_context->lc_linecount_logicals;
1062*4d9fdb46SRobert Mustacchi     *linebuf_actuals =    line_context->lc_linebuf_actuals;
1063*4d9fdb46SRobert Mustacchi     *linecount_actuals = line_context->lc_linecount_actuals;
106449d3bc91SRichard Lowe     return DW_DLV_OK;
106549d3bc91SRichard Lowe }
106649d3bc91SRichard Lowe 
106749d3bc91SRichard Lowe 
1068*4d9fdb46SRobert Mustacchi /* New October 2015. */
106949d3bc91SRichard Lowe int
dwarf_srclines_table_offset(Dwarf_Line_Context line_context,Dwarf_Unsigned * offset,Dwarf_Error * error)1070*4d9fdb46SRobert Mustacchi dwarf_srclines_table_offset(Dwarf_Line_Context line_context,
1071*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * offset,
1072*4d9fdb46SRobert Mustacchi     Dwarf_Error  *    error)
107349d3bc91SRichard Lowe {
1074*4d9fdb46SRobert Mustacchi     if (!line_context ){
1075*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1076*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1077*4d9fdb46SRobert Mustacchi     }
1078*4d9fdb46SRobert Mustacchi     if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1079*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
108007dc1947SRichard Lowe         return (DW_DLV_ERROR);
108149d3bc91SRichard Lowe     }
1082*4d9fdb46SRobert Mustacchi     *offset = line_context->lc_section_offset;
1083*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1084*4d9fdb46SRobert Mustacchi }
108549d3bc91SRichard Lowe 
1086*4d9fdb46SRobert Mustacchi /* New October 2015. */
1087*4d9fdb46SRobert Mustacchi /*  If the CU DIE  has no DW_AT_comp_dir then
1088*4d9fdb46SRobert Mustacchi     the pointer pushed back to *compilation_directory
1089*4d9fdb46SRobert Mustacchi     will be NULL.
1090*4d9fdb46SRobert Mustacchi     Foy DWARF5 the line table header has the compilation
1091*4d9fdb46SRobert Mustacchi     directory. FIXME DWARF5.
1092*4d9fdb46SRobert Mustacchi     */
dwarf_srclines_comp_dir(Dwarf_Line_Context line_context,const char ** compilation_directory,Dwarf_Error * error)1093*4d9fdb46SRobert Mustacchi int dwarf_srclines_comp_dir(Dwarf_Line_Context line_context,
1094*4d9fdb46SRobert Mustacchi     const char **  compilation_directory,
1095*4d9fdb46SRobert Mustacchi     Dwarf_Error  *  error)
1096*4d9fdb46SRobert Mustacchi {
1097*4d9fdb46SRobert Mustacchi     if (!line_context ){
1098*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1099*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1100*4d9fdb46SRobert Mustacchi     }
1101*4d9fdb46SRobert Mustacchi     if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1102*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1103*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1104*4d9fdb46SRobert Mustacchi     }
1105*4d9fdb46SRobert Mustacchi     *compilation_directory =
1106*4d9fdb46SRobert Mustacchi         (const char *)line_context->lc_compilation_directory;
110749d3bc91SRichard Lowe     return DW_DLV_OK;
110849d3bc91SRichard Lowe }
110949d3bc91SRichard Lowe 
111049d3bc91SRichard Lowe 
1111*4d9fdb46SRobert Mustacchi 
1112*4d9fdb46SRobert Mustacchi 
1113*4d9fdb46SRobert Mustacchi /* New October 2015. */
111449d3bc91SRichard Lowe int
dwarf_srclines_subprog_count(Dwarf_Line_Context line_context,Dwarf_Signed * count_out,Dwarf_Error * error)1115*4d9fdb46SRobert Mustacchi dwarf_srclines_subprog_count(Dwarf_Line_Context line_context,
1116*4d9fdb46SRobert Mustacchi     Dwarf_Signed * count_out,
1117*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
111849d3bc91SRichard Lowe {
1119*4d9fdb46SRobert Mustacchi     if (!line_context ){
1120*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
112107dc1947SRichard Lowe         return (DW_DLV_ERROR);
112249d3bc91SRichard Lowe     }
1123*4d9fdb46SRobert Mustacchi     if( line_context->lc_magic != DW_CONTEXT_MAGIC) {
1124*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
112507dc1947SRichard Lowe         return (DW_DLV_ERROR);
112649d3bc91SRichard Lowe     }
1127*4d9fdb46SRobert Mustacchi     *count_out = line_context->lc_subprogs_count;
1128*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1129*4d9fdb46SRobert Mustacchi }
1130*4d9fdb46SRobert Mustacchi /* New October 2015. */
1131*4d9fdb46SRobert Mustacchi /*  Index says which to return.  Valid indexes are
1132*4d9fdb46SRobert Mustacchi     1-lc_subprogs_count
1133*4d9fdb46SRobert Mustacchi     */
1134*4d9fdb46SRobert Mustacchi int
dwarf_srclines_subprog_data(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Unsigned * decl_file,Dwarf_Unsigned * decl_line,Dwarf_Error * error)1135*4d9fdb46SRobert Mustacchi dwarf_srclines_subprog_data(Dwarf_Line_Context line_context,
1136*4d9fdb46SRobert Mustacchi     Dwarf_Signed index_in,
1137*4d9fdb46SRobert Mustacchi     const char ** name,
1138*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *decl_file,
1139*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *decl_line,
1140*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1141*4d9fdb46SRobert Mustacchi {
1142*4d9fdb46SRobert Mustacchi     /*  Negative values not sensible. Leaving traditional
1143*4d9fdb46SRobert Mustacchi         signed interfaces. */
1144*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index = (Dwarf_Unsigned)index_in;
1145*4d9fdb46SRobert Mustacchi     Dwarf_Subprog_Entry sub = 0;
1146*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1147*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
114807dc1947SRichard Lowe         return (DW_DLV_ERROR);
114949d3bc91SRichard Lowe     }
1150*4d9fdb46SRobert Mustacchi     if (index < 1 || index > line_context->lc_subprogs_count) {
1151*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_INDEX_WRONG);
115207dc1947SRichard Lowe         return (DW_DLV_ERROR);
115307dc1947SRichard Lowe     }
1154*4d9fdb46SRobert Mustacchi     sub = line_context->lc_subprogs + (index-1);
1155*4d9fdb46SRobert Mustacchi     *name = (const char *)sub->ds_subprog_name;
1156*4d9fdb46SRobert Mustacchi     *decl_file = sub->ds_decl_file;
1157*4d9fdb46SRobert Mustacchi     *decl_line = sub->ds_decl_line;
1158*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1159*4d9fdb46SRobert Mustacchi }
116049d3bc91SRichard Lowe 
1161*4d9fdb46SRobert Mustacchi /*  New October 2015. See also
1162*4d9fdb46SRobert Mustacchi     dwarf_srclines_files_indexes() */
1163*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_count(Dwarf_Line_Context line_context,Dwarf_Signed * count_out,Dwarf_Error * error)1164*4d9fdb46SRobert Mustacchi dwarf_srclines_files_count(Dwarf_Line_Context line_context,
1165*4d9fdb46SRobert Mustacchi     Dwarf_Signed *count_out,
1166*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1167*4d9fdb46SRobert Mustacchi {
1168*4d9fdb46SRobert Mustacchi     if (!line_context ||
1169*4d9fdb46SRobert Mustacchi         line_context->lc_magic != DW_CONTEXT_MAGIC) {
1170*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
117107dc1947SRichard Lowe         return (DW_DLV_ERROR);
117249d3bc91SRichard Lowe     }
1173*4d9fdb46SRobert Mustacchi     /*  Negative values not sensible. Leaving traditional
1174*4d9fdb46SRobert Mustacchi         signed interfaces. */
1175*4d9fdb46SRobert Mustacchi     *count_out = (Dwarf_Signed)line_context->lc_file_entry_count;
1176*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1177*4d9fdb46SRobert Mustacchi }
117849d3bc91SRichard Lowe 
1179*4d9fdb46SRobert Mustacchi /* New October 2015. */
1180*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_data(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Unsigned * directory_index,Dwarf_Unsigned * last_mod_time,Dwarf_Unsigned * file_length,Dwarf_Error * error)1181*4d9fdb46SRobert Mustacchi dwarf_srclines_files_data(Dwarf_Line_Context line_context,
1182*4d9fdb46SRobert Mustacchi     Dwarf_Signed     index_in,
1183*4d9fdb46SRobert Mustacchi     const char **    name,
1184*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * directory_index,
1185*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * last_mod_time,
1186*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * file_length,
1187*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
1188*4d9fdb46SRobert Mustacchi {
1189*4d9fdb46SRobert Mustacchi     return dwarf_srclines_files_data_b(
1190*4d9fdb46SRobert Mustacchi         line_context,index_in,name,directory_index,
1191*4d9fdb46SRobert Mustacchi         last_mod_time,file_length,0,error);
1192*4d9fdb46SRobert Mustacchi }
119349d3bc91SRichard Lowe 
119449d3bc91SRichard Lowe 
1195*4d9fdb46SRobert Mustacchi /* New March 2018 making iteration through file names. */
1196*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_indexes(Dwarf_Line_Context line_context,Dwarf_Signed * baseindex,Dwarf_Signed * file_count,Dwarf_Signed * endindex,Dwarf_Error * error)1197*4d9fdb46SRobert Mustacchi dwarf_srclines_files_indexes(Dwarf_Line_Context line_context,
1198*4d9fdb46SRobert Mustacchi     Dwarf_Signed   *baseindex,
1199*4d9fdb46SRobert Mustacchi     Dwarf_Signed   *file_count,
1200*4d9fdb46SRobert Mustacchi     Dwarf_Signed   *endindex,
1201*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
1202*4d9fdb46SRobert Mustacchi {
1203*4d9fdb46SRobert Mustacchi     if(line_context->lc_magic != DW_CONTEXT_MAGIC) {
1204*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1205*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1206*4d9fdb46SRobert Mustacchi     }
1207*4d9fdb46SRobert Mustacchi     *baseindex  = line_context->lc_file_entry_baseindex;
1208*4d9fdb46SRobert Mustacchi     *file_count = line_context->lc_file_entry_count;
1209*4d9fdb46SRobert Mustacchi     *endindex   = line_context->lc_file_entry_endindex;
1210*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1211*4d9fdb46SRobert Mustacchi }
121207dc1947SRichard Lowe 
1213*4d9fdb46SRobert Mustacchi /* New March 2018 adding DWARF5 data. */
1214*4d9fdb46SRobert Mustacchi int
dwarf_srclines_files_data_b(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Unsigned * directory_index,Dwarf_Unsigned * last_mod_time,Dwarf_Unsigned * file_length,Dwarf_Form_Data16 ** data16ptr,Dwarf_Error * error)1215*4d9fdb46SRobert Mustacchi dwarf_srclines_files_data_b(Dwarf_Line_Context line_context,
1216*4d9fdb46SRobert Mustacchi     Dwarf_Signed     index_in,
1217*4d9fdb46SRobert Mustacchi     const char **    name,
1218*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * directory_index,
1219*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * last_mod_time,
1220*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * file_length,
1221*4d9fdb46SRobert Mustacchi     Dwarf_Form_Data16 ** data16ptr,
1222*4d9fdb46SRobert Mustacchi     Dwarf_Error    * error)
1223*4d9fdb46SRobert Mustacchi {
1224*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry fi = 0;
1225*4d9fdb46SRobert Mustacchi     Dwarf_Signed i  =0;
1226*4d9fdb46SRobert Mustacchi     Dwarf_Signed baseindex = 0;
1227*4d9fdb46SRobert Mustacchi     Dwarf_Signed file_count = 0;
1228*4d9fdb46SRobert Mustacchi     Dwarf_Signed endindex = 0;
1229*4d9fdb46SRobert Mustacchi     /*  Negative values not sensible. Leaving traditional
1230*4d9fdb46SRobert Mustacchi         signed interfaces. */
1231*4d9fdb46SRobert Mustacchi     Dwarf_Signed index = index_in;
1232*4d9fdb46SRobert Mustacchi     int res = 0;
1233*4d9fdb46SRobert Mustacchi 
1234*4d9fdb46SRobert Mustacchi 
1235*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1236*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1237*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1238*4d9fdb46SRobert Mustacchi     }
1239*4d9fdb46SRobert Mustacchi 
1240*4d9fdb46SRobert Mustacchi     /*  Special accomodation of the special gnu experimental
1241*4d9fdb46SRobert Mustacchi         version number (a high number) so we cannot just
1242*4d9fdb46SRobert Mustacchi         say '5 or greater'. This is awkward, but at least
1243*4d9fdb46SRobert Mustacchi         if there is a version 6 or later it still allows
1244*4d9fdb46SRobert Mustacchi         the experimental table.  */
1245*4d9fdb46SRobert Mustacchi     res =  dwarf_srclines_files_indexes(line_context, &baseindex,
1246*4d9fdb46SRobert Mustacchi         &file_count, &endindex, error);
1247*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1248*4d9fdb46SRobert Mustacchi         return res;
1249*4d9fdb46SRobert Mustacchi     }
1250*4d9fdb46SRobert Mustacchi     fi = line_context->lc_file_entries;
1251*4d9fdb46SRobert Mustacchi     if (index < baseindex || index >= endindex) {
1252*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_INDEX_WRONG);
1253*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
1254*4d9fdb46SRobert Mustacchi     }
1255*4d9fdb46SRobert Mustacchi     for ( i = baseindex;i < index; i++) {
1256*4d9fdb46SRobert Mustacchi         fi = fi->fi_next;
1257*4d9fdb46SRobert Mustacchi         if(!fi) {
1258*4d9fdb46SRobert Mustacchi             _dwarf_error(NULL, error, DW_DLE_LINE_HEADER_CORRUPT);
1259*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
126007dc1947SRichard Lowe         }
1261*4d9fdb46SRobert Mustacchi     }
126207dc1947SRichard Lowe 
1263*4d9fdb46SRobert Mustacchi     if(name) {
1264*4d9fdb46SRobert Mustacchi         *name = (const char *)fi->fi_file_name;
1265*4d9fdb46SRobert Mustacchi     }
1266*4d9fdb46SRobert Mustacchi     if (directory_index) {
1267*4d9fdb46SRobert Mustacchi         *directory_index = fi->fi_dir_index;
1268*4d9fdb46SRobert Mustacchi     }
1269*4d9fdb46SRobert Mustacchi     if (last_mod_time) {
1270*4d9fdb46SRobert Mustacchi         *last_mod_time = fi->fi_time_last_mod;
1271*4d9fdb46SRobert Mustacchi     }
1272*4d9fdb46SRobert Mustacchi     if (file_length) {
1273*4d9fdb46SRobert Mustacchi         *file_length = fi->fi_file_length;
1274*4d9fdb46SRobert Mustacchi     }
1275*4d9fdb46SRobert Mustacchi     if (data16ptr) {
1276*4d9fdb46SRobert Mustacchi         if (fi->fi_md5_present) {
1277*4d9fdb46SRobert Mustacchi             *data16ptr = &fi->fi_md5_value;
1278*4d9fdb46SRobert Mustacchi         } else {
1279*4d9fdb46SRobert Mustacchi             *data16ptr = 0;
128007dc1947SRichard Lowe         }
128149d3bc91SRichard Lowe     }
1282*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1283*4d9fdb46SRobert Mustacchi }
1284*4d9fdb46SRobert Mustacchi 
128549d3bc91SRichard Lowe 
1286*4d9fdb46SRobert Mustacchi 
1287*4d9fdb46SRobert Mustacchi 
1288*4d9fdb46SRobert Mustacchi /* New October 2015. */
1289*4d9fdb46SRobert Mustacchi int
dwarf_srclines_include_dir_count(Dwarf_Line_Context line_context,Dwarf_Signed * count,Dwarf_Error * error)1290*4d9fdb46SRobert Mustacchi dwarf_srclines_include_dir_count(Dwarf_Line_Context line_context,
1291*4d9fdb46SRobert Mustacchi     Dwarf_Signed * count,
1292*4d9fdb46SRobert Mustacchi     Dwarf_Error  * error)
1293*4d9fdb46SRobert Mustacchi {
1294*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1295*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
129607dc1947SRichard Lowe         return (DW_DLV_ERROR);
129749d3bc91SRichard Lowe     }
1298*4d9fdb46SRobert Mustacchi     *count = line_context->lc_include_directories_count;
1299*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1300*4d9fdb46SRobert Mustacchi }
130149d3bc91SRichard Lowe 
1302*4d9fdb46SRobert Mustacchi /* New October 2015. */
1303*4d9fdb46SRobert Mustacchi int
dwarf_srclines_include_dir_data(Dwarf_Line_Context line_context,Dwarf_Signed index_in,const char ** name,Dwarf_Error * error)1304*4d9fdb46SRobert Mustacchi dwarf_srclines_include_dir_data(Dwarf_Line_Context line_context,
1305*4d9fdb46SRobert Mustacchi     Dwarf_Signed   index_in,
1306*4d9fdb46SRobert Mustacchi     const char  ** name,
1307*4d9fdb46SRobert Mustacchi     Dwarf_Error *  error)
1308*4d9fdb46SRobert Mustacchi {
1309*4d9fdb46SRobert Mustacchi     /*  It never made sense that the srclines used a signed count.
1310*4d9fdb46SRobert Mustacchi         But that cannot be fixed in interfaces for compatibility.
1311*4d9fdb46SRobert Mustacchi         So we adjust here. */
1312*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned index = index_in;
131349d3bc91SRichard Lowe 
1314*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1315*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
1316*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
131749d3bc91SRichard Lowe     }
1318*4d9fdb46SRobert Mustacchi     if (index < 1 || index > line_context->lc_include_directories_count) {
1319*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_INDEX_WRONG);
1320*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1321*4d9fdb46SRobert Mustacchi     }
1322*4d9fdb46SRobert Mustacchi     *name = (const char *)(line_context->lc_include_directories[index-1]);
1323*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1324*4d9fdb46SRobert Mustacchi }
132549d3bc91SRichard Lowe 
1326*4d9fdb46SRobert Mustacchi /* New October 2015. */
1327*4d9fdb46SRobert Mustacchi int
dwarf_srclines_version(Dwarf_Line_Context line_context,Dwarf_Unsigned * version_out,Dwarf_Small * table_count_out,Dwarf_Error * error)1328*4d9fdb46SRobert Mustacchi dwarf_srclines_version(Dwarf_Line_Context line_context,
1329*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *version_out,
1330*4d9fdb46SRobert Mustacchi     Dwarf_Small    *table_count_out,
1331*4d9fdb46SRobert Mustacchi     Dwarf_Error *error)
1332*4d9fdb46SRobert Mustacchi {
1333*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1334*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_BOTCH);
133507dc1947SRichard Lowe         return (DW_DLV_ERROR);
133607dc1947SRichard Lowe     }
1337*4d9fdb46SRobert Mustacchi     *version_out = line_context->lc_version_number;
1338*4d9fdb46SRobert Mustacchi     *table_count_out = line_context->lc_table_count;
1339*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1340*4d9fdb46SRobert Mustacchi }
134107dc1947SRichard Lowe 
1342*4d9fdb46SRobert Mustacchi 
1343*4d9fdb46SRobert Mustacchi 
1344*4d9fdb46SRobert Mustacchi /*  Every line table entry (except DW_DLE_end_sequence,
1345*4d9fdb46SRobert Mustacchi     which is returned using dwarf_lineendsequence())
1346*4d9fdb46SRobert Mustacchi     potentially has the begin-statement
1347*4d9fdb46SRobert Mustacchi     flag marked 'on'.   This returns thru *return_bool,
1348*4d9fdb46SRobert Mustacchi     the begin-statement flag.  */
1349*4d9fdb46SRobert Mustacchi 
1350*4d9fdb46SRobert Mustacchi int
dwarf_linebeginstatement(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1351*4d9fdb46SRobert Mustacchi dwarf_linebeginstatement(Dwarf_Line line,
1352*4d9fdb46SRobert Mustacchi     Dwarf_Bool * return_bool, Dwarf_Error * error)
1353*4d9fdb46SRobert Mustacchi {
1354*4d9fdb46SRobert Mustacchi     if (line == NULL || return_bool == 0) {
1355*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1356*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
135749d3bc91SRichard Lowe     }
1358*4d9fdb46SRobert Mustacchi 
1359*4d9fdb46SRobert Mustacchi     *return_bool = (line->li_addr_line.li_l_data.li_is_stmt);
136049d3bc91SRichard Lowe     return DW_DLV_OK;
136149d3bc91SRichard Lowe }
136249d3bc91SRichard Lowe 
1363*4d9fdb46SRobert Mustacchi /*  At the end of any contiguous line-table there may be
1364*4d9fdb46SRobert Mustacchi     a DW_LNE_end_sequence operator.
1365*4d9fdb46SRobert Mustacchi     This returns non-zero thru *return_bool
1366*4d9fdb46SRobert Mustacchi     if and only if this 'line' entry was a DW_LNE_end_sequence.
1367*4d9fdb46SRobert Mustacchi 
1368*4d9fdb46SRobert Mustacchi     Within a compilation unit or function there may be multiple
1369*4d9fdb46SRobert Mustacchi     line tables, each ending with a DW_LNE_end_sequence.
1370*4d9fdb46SRobert Mustacchi     Each table describes a contiguous region.
1371*4d9fdb46SRobert Mustacchi     Because compilers may split function code up in arbitrary ways
1372*4d9fdb46SRobert Mustacchi     compilers may need to emit multiple contigous regions (ie
1373*4d9fdb46SRobert Mustacchi     line tables) for a single function.
1374*4d9fdb46SRobert Mustacchi     See the DWARF3 spec section 6.2.  */
137549d3bc91SRichard Lowe int
dwarf_lineendsequence(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1376*4d9fdb46SRobert Mustacchi dwarf_lineendsequence(Dwarf_Line line,
137707dc1947SRichard Lowe     Dwarf_Bool * return_bool, Dwarf_Error * error)
137849d3bc91SRichard Lowe {
137949d3bc91SRichard Lowe     if (line == NULL) {
138007dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
138107dc1947SRichard Lowe         return (DW_DLV_ERROR);
138249d3bc91SRichard Lowe     }
1383*4d9fdb46SRobert Mustacchi 
1384*4d9fdb46SRobert Mustacchi     *return_bool = (line->li_addr_line.li_l_data.li_end_sequence);
138549d3bc91SRichard Lowe     return DW_DLV_OK;
138649d3bc91SRichard Lowe }
138749d3bc91SRichard Lowe 
138849d3bc91SRichard Lowe 
1389*4d9fdb46SRobert Mustacchi /*  Each 'line' entry has a line-number.
1390*4d9fdb46SRobert Mustacchi     If the entry is a DW_LNE_end_sequence the line-number is
1391*4d9fdb46SRobert Mustacchi     meaningless (see dwarf_lineendsequence(), just above).  */
139249d3bc91SRichard Lowe int
dwarf_lineno(Dwarf_Line line,Dwarf_Unsigned * ret_lineno,Dwarf_Error * error)1393*4d9fdb46SRobert Mustacchi dwarf_lineno(Dwarf_Line line,
1394*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * ret_lineno, Dwarf_Error * error)
139549d3bc91SRichard Lowe {
1396*4d9fdb46SRobert Mustacchi     if (line == NULL || ret_lineno == 0) {
1397*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1398*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
139949d3bc91SRichard Lowe     }
140049d3bc91SRichard Lowe 
1401*4d9fdb46SRobert Mustacchi     *ret_lineno = (line->li_addr_line.li_l_data.li_line);
1402*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
140349d3bc91SRichard Lowe }
140449d3bc91SRichard Lowe 
1405*4d9fdb46SRobert Mustacchi /*  Each 'line' entry has a file-number, and index into the file table.
1406*4d9fdb46SRobert Mustacchi     If the entry is a DW_LNE_end_sequence the index is
1407*4d9fdb46SRobert Mustacchi     meaningless (see dwarf_lineendsequence(), just above).
1408*4d9fdb46SRobert Mustacchi     The file number returned is an index into the file table
1409*4d9fdb46SRobert Mustacchi     produced by dwarf_srcfiles(), but care is required: the
1410*4d9fdb46SRobert Mustacchi     li_file begins with 1 for DWARF2,3,4
1411*4d9fdb46SRobert Mustacchi     files, so that the li_file returned here
1412*4d9fdb46SRobert Mustacchi     is 1 greater than its index into the dwarf_srcfiles() output array.
1413*4d9fdb46SRobert Mustacchi 
1414*4d9fdb46SRobert Mustacchi     And entries from DW_LNE_define_file don't appear in
1415*4d9fdb46SRobert Mustacchi     the dwarf_srcfiles() output so file indexes from here may exceed
1416*4d9fdb46SRobert Mustacchi     the size of the dwarf_srcfiles() output array size.
141707dc1947SRichard Lowe */
1418*4d9fdb46SRobert Mustacchi int
dwarf_line_srcfileno(Dwarf_Line line,Dwarf_Unsigned * ret_fileno,Dwarf_Error * error)1419*4d9fdb46SRobert Mustacchi dwarf_line_srcfileno(Dwarf_Line line,
1420*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * ret_fileno, Dwarf_Error * error)
1421*4d9fdb46SRobert Mustacchi {
1422*4d9fdb46SRobert Mustacchi     if (line == NULL || ret_fileno == 0) {
1423*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1424*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1425*4d9fdb46SRobert Mustacchi     }
1426*4d9fdb46SRobert Mustacchi     /*  li_file must be <= line->li_context->lc_file_entry_count else
1427*4d9fdb46SRobert Mustacchi         it is trash. li_file 0 means not attributable to
1428*4d9fdb46SRobert Mustacchi         any source file per dwarf2/3 spec.
1429*4d9fdb46SRobert Mustacchi         For DWARF5, li_file < lc_file_entry_count */
1430*4d9fdb46SRobert Mustacchi     *ret_fileno = (line->li_addr_line.li_l_data.li_file);
1431*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1432*4d9fdb46SRobert Mustacchi }
143307dc1947SRichard Lowe 
1434*4d9fdb46SRobert Mustacchi /*  Each 'line' entry has an is_addr_set attribute.
1435*4d9fdb46SRobert Mustacchi     If the entry is a DW_LNE_set_address, return TRUE through
1436*4d9fdb46SRobert Mustacchi     the *is_addr_set pointer.  */
1437*4d9fdb46SRobert Mustacchi int
dwarf_line_is_addr_set(Dwarf_Line line,Dwarf_Bool * is_addr_set,Dwarf_Error * error)1438*4d9fdb46SRobert Mustacchi dwarf_line_is_addr_set(Dwarf_Line line,
1439*4d9fdb46SRobert Mustacchi     Dwarf_Bool *is_addr_set, Dwarf_Error * error)
144007dc1947SRichard Lowe {
1441*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1442*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1443*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1444*4d9fdb46SRobert Mustacchi     }
144507dc1947SRichard Lowe 
1446*4d9fdb46SRobert Mustacchi     *is_addr_set = (line->li_addr_line.li_l_data.li_is_addr_set);
1447*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1448*4d9fdb46SRobert Mustacchi }
144907dc1947SRichard Lowe 
1450*4d9fdb46SRobert Mustacchi /*  Each 'line' entry has a line-address.
1451*4d9fdb46SRobert Mustacchi     If the entry is a DW_LNE_end_sequence the adddress
1452*4d9fdb46SRobert Mustacchi     is one-beyond the last address this contigous region
1453*4d9fdb46SRobert Mustacchi     covers, so the address is not inside the region,
1454*4d9fdb46SRobert Mustacchi     but is just outside it.  */
1455*4d9fdb46SRobert Mustacchi int
dwarf_lineaddr(Dwarf_Line line,Dwarf_Addr * ret_lineaddr,Dwarf_Error * error)1456*4d9fdb46SRobert Mustacchi dwarf_lineaddr(Dwarf_Line line,
1457*4d9fdb46SRobert Mustacchi     Dwarf_Addr * ret_lineaddr, Dwarf_Error * error)
1458*4d9fdb46SRobert Mustacchi {
1459*4d9fdb46SRobert Mustacchi     if (line == NULL || ret_lineaddr == 0) {
1460*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1461*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
146207dc1947SRichard Lowe     }
146349d3bc91SRichard Lowe 
1464*4d9fdb46SRobert Mustacchi     *ret_lineaddr = (line->li_address);
1465*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1466*4d9fdb46SRobert Mustacchi }
146707dc1947SRichard Lowe 
146807dc1947SRichard Lowe 
1469*4d9fdb46SRobert Mustacchi /*  Obsolete: do not use this function.
1470*4d9fdb46SRobert Mustacchi     December 2011: For reasons lost in the mists of history,
1471*4d9fdb46SRobert Mustacchi     this returned -1, not zero (through the pointer
1472*4d9fdb46SRobert Mustacchi     ret_lineoff), if the column was zero.
1473*4d9fdb46SRobert Mustacchi     That was always bogus, even in DWARF2.
1474*4d9fdb46SRobert Mustacchi     It is also bogus that the column value is signed, but
1475*4d9fdb46SRobert Mustacchi     it is painful to change the argument type in 2011, so leave it.
1476*4d9fdb46SRobert Mustacchi     */
1477*4d9fdb46SRobert Mustacchi int
dwarf_lineoff(Dwarf_Line line,Dwarf_Signed * ret_lineoff,Dwarf_Error * error)1478*4d9fdb46SRobert Mustacchi dwarf_lineoff(Dwarf_Line line,
1479*4d9fdb46SRobert Mustacchi     Dwarf_Signed * ret_lineoff, Dwarf_Error * error)
1480*4d9fdb46SRobert Mustacchi {
1481*4d9fdb46SRobert Mustacchi     if (line == NULL || ret_lineoff == 0) {
1482*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1483*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
148407dc1947SRichard Lowe     }
1485*4d9fdb46SRobert Mustacchi     *ret_lineoff = (
1486*4d9fdb46SRobert Mustacchi         (line->li_addr_line.li_l_data.li_column == 0) ?
1487*4d9fdb46SRobert Mustacchi             -1 : line->li_addr_line.li_l_data.li_column);
1488*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
148907dc1947SRichard Lowe }
1490*4d9fdb46SRobert Mustacchi /*  Each 'line' entry has a column-within-line (offset
1491*4d9fdb46SRobert Mustacchi     within the line) where the
1492*4d9fdb46SRobert Mustacchi     source text begins.
1493*4d9fdb46SRobert Mustacchi     If the entry is a DW_LNE_end_sequence the line-number is
1494*4d9fdb46SRobert Mustacchi     meaningless (see dwarf_lineendsequence(), just above).
1495*4d9fdb46SRobert Mustacchi     Lines of text begin at column 1.  The value 0
1496*4d9fdb46SRobert Mustacchi     means the line begins at the left edge of the line.
1497*4d9fdb46SRobert Mustacchi     (See the DWARF3 spec, section 6.2.2).
1498*4d9fdb46SRobert Mustacchi     So 0 and 1 mean essentially the same thing.
1499*4d9fdb46SRobert Mustacchi     dwarf_lineoff_b() is new in December 2011.
1500*4d9fdb46SRobert Mustacchi     */
1501*4d9fdb46SRobert Mustacchi int
dwarf_lineoff_b(Dwarf_Line line,Dwarf_Unsigned * ret_lineoff,Dwarf_Error * error)1502*4d9fdb46SRobert Mustacchi dwarf_lineoff_b(Dwarf_Line line,
1503*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * ret_lineoff, Dwarf_Error * error)
1504*4d9fdb46SRobert Mustacchi {
1505*4d9fdb46SRobert Mustacchi     if (line == NULL || ret_lineoff == 0) {
1506*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1507*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1508*4d9fdb46SRobert Mustacchi     }
150907dc1947SRichard Lowe 
1510*4d9fdb46SRobert Mustacchi     *ret_lineoff = line->li_addr_line.li_l_data.li_column;
1511*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1512*4d9fdb46SRobert Mustacchi }
151307dc1947SRichard Lowe 
151407dc1947SRichard Lowe 
1515*4d9fdb46SRobert Mustacchi static int
dwarf_filename(Dwarf_Line_Context context,Dwarf_Signed fileno_in,char ** ret_filename,Dwarf_Error * error)1516*4d9fdb46SRobert Mustacchi dwarf_filename(Dwarf_Line_Context context,
1517*4d9fdb46SRobert Mustacchi     Dwarf_Signed fileno_in,
1518*4d9fdb46SRobert Mustacchi     char **ret_filename, Dwarf_Error *error)
151907dc1947SRichard Lowe {
1520*4d9fdb46SRobert Mustacchi     Dwarf_Signed i = 0;
1521*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry file_entry = 0;
1522*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = context->lc_dbg;
1523*4d9fdb46SRobert Mustacchi     int res = 0;
1524*4d9fdb46SRobert Mustacchi     Dwarf_Signed baseindex = 0;
1525*4d9fdb46SRobert Mustacchi     Dwarf_Signed file_count = 0;
1526*4d9fdb46SRobert Mustacchi     Dwarf_Signed endindex = 0;
1527*4d9fdb46SRobert Mustacchi     /*  Negative values not sensible. Leaving traditional
1528*4d9fdb46SRobert Mustacchi         signed interfaces in place. */
1529*4d9fdb46SRobert Mustacchi     Dwarf_Signed fileno = fileno_in;
1530*4d9fdb46SRobert Mustacchi     unsigned linetab_version = context->lc_version_number;
1531*4d9fdb46SRobert Mustacchi 
1532*4d9fdb46SRobert Mustacchi     res =  dwarf_srclines_files_indexes(context, &baseindex,
1533*4d9fdb46SRobert Mustacchi         &file_count, &endindex, error);
1534*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1535*4d9fdb46SRobert Mustacchi         return res;
1536*4d9fdb46SRobert Mustacchi     }
1537*4d9fdb46SRobert Mustacchi     if (fileno >= endindex) {
1538*4d9fdb46SRobert Mustacchi         dwarfstring m;
1539*4d9fdb46SRobert Mustacchi 
1540*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m);
1541*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m,
1542*4d9fdb46SRobert Mustacchi             "DW_DLE_NO_FILE_NAME: the file number is %d ",
1543*4d9fdb46SRobert Mustacchi             fileno);
1544*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_u(&m,
1545*4d9fdb46SRobert Mustacchi             "( this is a DWARF 0x%x linetable)",
1546*4d9fdb46SRobert Mustacchi             linetab_version);
1547*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m,
1548*4d9fdb46SRobert Mustacchi             " yet the highest allowed file name index is %d.",
1549*4d9fdb46SRobert Mustacchi             endindex-1);
1550*4d9fdb46SRobert Mustacchi         _dwarf_error_string(dbg, error, DW_DLE_NO_FILE_NAME,
1551*4d9fdb46SRobert Mustacchi             dwarfstring_string(&m));
1552*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m);
1553*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
155407dc1947SRichard Lowe     } else {
1555*4d9fdb46SRobert Mustacchi         if (linetab_version <= DW_LINE_VERSION4 ||
1556*4d9fdb46SRobert Mustacchi             linetab_version == EXPERIMENTAL_LINE_TABLES_VERSION) {
1557*4d9fdb46SRobert Mustacchi             if (!fileno) {
1558*4d9fdb46SRobert Mustacchi                 return DW_DLV_NO_ENTRY;
1559*4d9fdb46SRobert Mustacchi             }
1560*4d9fdb46SRobert Mustacchi             /* else ok */
1561*4d9fdb46SRobert Mustacchi         }  /* else DWARF 5 line index 0 is fine */
156207dc1947SRichard Lowe     }
156307dc1947SRichard Lowe 
1564*4d9fdb46SRobert Mustacchi     file_entry = context->lc_file_entries;
1565*4d9fdb46SRobert Mustacchi     /*  zero fileno allowed for DWARF5 table. For DWARF4,
1566*4d9fdb46SRobert Mustacchi         zero fileno handled above. */
1567*4d9fdb46SRobert Mustacchi     for (i =  baseindex; i < fileno ; i++) {
1568*4d9fdb46SRobert Mustacchi         file_entry = file_entry->fi_next;
1569*4d9fdb46SRobert Mustacchi     }
157007dc1947SRichard Lowe 
1571*4d9fdb46SRobert Mustacchi     res = create_fullest_file_path(dbg,
1572*4d9fdb46SRobert Mustacchi         file_entry,context, ret_filename,error);
1573*4d9fdb46SRobert Mustacchi     return res;
1574*4d9fdb46SRobert Mustacchi }
157507dc1947SRichard Lowe 
1576*4d9fdb46SRobert Mustacchi int
dwarf_linesrc(Dwarf_Line line,char ** ret_linesrc,Dwarf_Error * error)1577*4d9fdb46SRobert Mustacchi dwarf_linesrc(Dwarf_Line line, char **ret_linesrc, Dwarf_Error * error)
1578*4d9fdb46SRobert Mustacchi {
1579*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1580*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1581*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1582*4d9fdb46SRobert Mustacchi     }
1583*4d9fdb46SRobert Mustacchi     if (line->li_context == NULL) {
1584*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL);
1585*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1586*4d9fdb46SRobert Mustacchi     }
1587*4d9fdb46SRobert Mustacchi     return dwarf_filename(line->li_context,
1588*4d9fdb46SRobert Mustacchi         line->li_addr_line.li_l_data.li_file, ret_linesrc, error);
1589*4d9fdb46SRobert Mustacchi }
159007dc1947SRichard Lowe 
1591*4d9fdb46SRobert Mustacchi /*  Every line table entry potentially has the basic-block-start
1592*4d9fdb46SRobert Mustacchi     flag marked 'on'.   This returns thru *return_bool,
1593*4d9fdb46SRobert Mustacchi     the basic-block-start flag.
159407dc1947SRichard Lowe */
1595*4d9fdb46SRobert Mustacchi int
dwarf_lineblock(Dwarf_Line line,Dwarf_Bool * return_bool,Dwarf_Error * error)1596*4d9fdb46SRobert Mustacchi dwarf_lineblock(Dwarf_Line line,
1597*4d9fdb46SRobert Mustacchi     Dwarf_Bool * return_bool, Dwarf_Error * error)
1598*4d9fdb46SRobert Mustacchi {
1599*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1600*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1601*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1602*4d9fdb46SRobert Mustacchi     }
1603*4d9fdb46SRobert Mustacchi     *return_bool = (line->li_addr_line.li_l_data.li_basic_block);
1604*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1605*4d9fdb46SRobert Mustacchi }
1606*4d9fdb46SRobert Mustacchi 
1607*4d9fdb46SRobert Mustacchi /* We gather these into one call as it's likely one
1608*4d9fdb46SRobert Mustacchi    will want all or none of them.  */
dwarf_prologue_end_etc(Dwarf_Line line,Dwarf_Bool * prologue_end,Dwarf_Bool * epilogue_begin,Dwarf_Unsigned * isa,Dwarf_Unsigned * discriminator,Dwarf_Error * error)1609*4d9fdb46SRobert Mustacchi int dwarf_prologue_end_etc(Dwarf_Line  line,
1610*4d9fdb46SRobert Mustacchi     Dwarf_Bool  *    prologue_end,
1611*4d9fdb46SRobert Mustacchi     Dwarf_Bool  *    epilogue_begin,
1612*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * isa,
1613*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * discriminator,
1614*4d9fdb46SRobert Mustacchi     Dwarf_Error *    error)
1615*4d9fdb46SRobert Mustacchi {
1616*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1617*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1618*4d9fdb46SRobert Mustacchi         return (DW_DLV_ERROR);
1619*4d9fdb46SRobert Mustacchi     }
1620*4d9fdb46SRobert Mustacchi     *prologue_end = (line->li_addr_line.li_l_data.li_prologue_end);
1621*4d9fdb46SRobert Mustacchi     *epilogue_begin = (line->li_addr_line.li_l_data.li_epilogue_begin);
1622*4d9fdb46SRobert Mustacchi     *isa = (line->li_addr_line.li_l_data.li_isa);
1623*4d9fdb46SRobert Mustacchi     *discriminator = (line->li_addr_line.li_l_data.li_discriminator);
1624*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1625*4d9fdb46SRobert Mustacchi }
162607dc1947SRichard Lowe 
162749d3bc91SRichard Lowe int
dwarf_linelogical(Dwarf_Line line,Dwarf_Unsigned * logical,Dwarf_Error * error)1628*4d9fdb46SRobert Mustacchi dwarf_linelogical(Dwarf_Line line,
1629*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * logical,
1630*4d9fdb46SRobert Mustacchi     Dwarf_Error*     error)
163149d3bc91SRichard Lowe {
1632*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1633*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
163407dc1947SRichard Lowe         return (DW_DLV_ERROR);
163507dc1947SRichard Lowe     }
1636*4d9fdb46SRobert Mustacchi     *logical = (line->li_addr_line.li_l_data.li_line);
1637*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1638*4d9fdb46SRobert Mustacchi }
1639*4d9fdb46SRobert Mustacchi 
1640*4d9fdb46SRobert Mustacchi int
dwarf_linecontext(Dwarf_Line line,Dwarf_Unsigned * context,Dwarf_Error * error)1641*4d9fdb46SRobert Mustacchi dwarf_linecontext(Dwarf_Line line,
1642*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * context,
1643*4d9fdb46SRobert Mustacchi     Dwarf_Error*     error)
1644*4d9fdb46SRobert Mustacchi {
1645*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1646*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
164707dc1947SRichard Lowe         return (DW_DLV_ERROR);
164807dc1947SRichard Lowe     }
1649*4d9fdb46SRobert Mustacchi     *context = (line->li_addr_line.li_l_data.li_call_context);
1650*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1651*4d9fdb46SRobert Mustacchi }
165207dc1947SRichard Lowe 
1653*4d9fdb46SRobert Mustacchi int
dwarf_line_subprogno(Dwarf_Line line,Dwarf_Unsigned * subprog,Dwarf_Error * error)1654*4d9fdb46SRobert Mustacchi dwarf_line_subprogno(Dwarf_Line line,
1655*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * subprog,
1656*4d9fdb46SRobert Mustacchi     Dwarf_Error *    error)
1657*4d9fdb46SRobert Mustacchi {
1658*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1659*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
166007dc1947SRichard Lowe         return (DW_DLV_ERROR);
166107dc1947SRichard Lowe     }
1662*4d9fdb46SRobert Mustacchi     *subprog = (line->li_addr_line.li_l_data.li_subprogram);
1663*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1664*4d9fdb46SRobert Mustacchi }
166507dc1947SRichard Lowe 
1666*4d9fdb46SRobert Mustacchi int
dwarf_line_subprog(Dwarf_Line line,char ** subprog_name,char ** decl_filename,Dwarf_Unsigned * decl_line,Dwarf_Error * error)1667*4d9fdb46SRobert Mustacchi dwarf_line_subprog(Dwarf_Line line,
1668*4d9fdb46SRobert Mustacchi     char   **        subprog_name,
1669*4d9fdb46SRobert Mustacchi     char   **        decl_filename,
1670*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned * decl_line,
1671*4d9fdb46SRobert Mustacchi     Dwarf_Error *    error)
1672*4d9fdb46SRobert Mustacchi {
1673*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned subprog_no;
1674*4d9fdb46SRobert Mustacchi     Dwarf_Subprog_Entry subprog;
1675*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg;
1676*4d9fdb46SRobert Mustacchi     int res;
167707dc1947SRichard Lowe 
1678*4d9fdb46SRobert Mustacchi     if (line == NULL) {
1679*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1680*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1681*4d9fdb46SRobert Mustacchi     }
168207dc1947SRichard Lowe 
1683*4d9fdb46SRobert Mustacchi     if (line->li_context == NULL) {
1684*4d9fdb46SRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL);
1685*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1686*4d9fdb46SRobert Mustacchi     }
168707dc1947SRichard Lowe 
1688*4d9fdb46SRobert Mustacchi     dbg = line->li_context->lc_dbg;
168907dc1947SRichard Lowe 
1690*4d9fdb46SRobert Mustacchi     subprog_no = line->li_addr_line.li_l_data.li_subprogram;
1691*4d9fdb46SRobert Mustacchi     if (subprog_no == 0) {
1692*4d9fdb46SRobert Mustacchi         *subprog_name = NULL;
1693*4d9fdb46SRobert Mustacchi         *decl_filename = NULL;
1694*4d9fdb46SRobert Mustacchi         *decl_line = 0;
1695*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
1696*4d9fdb46SRobert Mustacchi     }
169707dc1947SRichard Lowe 
1698*4d9fdb46SRobert Mustacchi     if (subprog_no > line->li_context->lc_subprogs_count) {
1699*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME);
1700*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
1701*4d9fdb46SRobert Mustacchi     }
170207dc1947SRichard Lowe 
1703*4d9fdb46SRobert Mustacchi     /*  Adjusting for 1 origin subprog no */
1704*4d9fdb46SRobert Mustacchi     subprog = &line->li_context->lc_subprogs[subprog_no - 1];
170507dc1947SRichard Lowe 
1706*4d9fdb46SRobert Mustacchi     *subprog_name = (char *)subprog->ds_subprog_name;
1707*4d9fdb46SRobert Mustacchi     *decl_line = subprog->ds_decl_line;
170807dc1947SRichard Lowe 
1709*4d9fdb46SRobert Mustacchi     res = dwarf_filename(line->li_context,
1710*4d9fdb46SRobert Mustacchi         subprog->ds_decl_file,
1711*4d9fdb46SRobert Mustacchi         decl_filename, error);
1712*4d9fdb46SRobert Mustacchi     if (res != DW_DLV_OK) {
1713*4d9fdb46SRobert Mustacchi         *decl_filename = NULL;
1714*4d9fdb46SRobert Mustacchi         return res;
1715*4d9fdb46SRobert Mustacchi     }
1716*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
1717*4d9fdb46SRobert Mustacchi }
1718*4d9fdb46SRobert Mustacchi 
1719*4d9fdb46SRobert Mustacchi /*  This is another line_context_destructor. */
1720*4d9fdb46SRobert Mustacchi static void
delete_line_context_itself(Dwarf_Line_Context context)1721*4d9fdb46SRobert Mustacchi delete_line_context_itself(Dwarf_Line_Context context)
1722*4d9fdb46SRobert Mustacchi {
1723*4d9fdb46SRobert Mustacchi 
1724*4d9fdb46SRobert Mustacchi 
1725*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
1726*4d9fdb46SRobert Mustacchi     Dwarf_File_Entry fe = 0;
1727*4d9fdb46SRobert Mustacchi 
1728*4d9fdb46SRobert Mustacchi     if(context->lc_magic != DW_CONTEXT_MAGIC) {
1729*4d9fdb46SRobert Mustacchi         /* Something is wrong. */
1730*4d9fdb46SRobert Mustacchi         return;
1731*4d9fdb46SRobert Mustacchi     }
1732*4d9fdb46SRobert Mustacchi     dbg = context->lc_dbg;
1733*4d9fdb46SRobert Mustacchi     fe = context->lc_file_entries;
1734*4d9fdb46SRobert Mustacchi     while (fe) {
1735*4d9fdb46SRobert Mustacchi         Dwarf_File_Entry fenext = fe->fi_next;
1736*4d9fdb46SRobert Mustacchi         fe->fi_next = 0;
1737*4d9fdb46SRobert Mustacchi         free(fe);
1738*4d9fdb46SRobert Mustacchi         fe = fenext;
1739*4d9fdb46SRobert Mustacchi     }
1740*4d9fdb46SRobert Mustacchi     context->lc_file_entries = 0;
1741*4d9fdb46SRobert Mustacchi     context->lc_file_entry_count = 0;
1742*4d9fdb46SRobert Mustacchi     context->lc_file_entry_baseindex = 0;
1743*4d9fdb46SRobert Mustacchi     context->lc_file_entry_endindex = 0;
1744*4d9fdb46SRobert Mustacchi     if (context->lc_subprogs) {
1745*4d9fdb46SRobert Mustacchi         free(context->lc_subprogs);
1746*4d9fdb46SRobert Mustacchi         context->lc_subprogs = 0;
1747*4d9fdb46SRobert Mustacchi     }
1748*4d9fdb46SRobert Mustacchi     free(context->lc_directory_format_values);
1749*4d9fdb46SRobert Mustacchi     context->lc_directory_format_values = 0;
1750*4d9fdb46SRobert Mustacchi     free(context->lc_file_format_values);
1751*4d9fdb46SRobert Mustacchi     context->lc_file_format_values = 0;
1752*4d9fdb46SRobert Mustacchi     if (context->lc_include_directories) {
1753*4d9fdb46SRobert Mustacchi         free(context->lc_include_directories);
1754*4d9fdb46SRobert Mustacchi         context->lc_include_directories = 0;
1755*4d9fdb46SRobert Mustacchi     }
1756*4d9fdb46SRobert Mustacchi     context->lc_magic = 0xdead;
1757*4d9fdb46SRobert Mustacchi     dwarf_dealloc(dbg, context, DW_DLA_LINE_CONTEXT);
1758*4d9fdb46SRobert Mustacchi }
1759*4d9fdb46SRobert Mustacchi 
1760*4d9fdb46SRobert Mustacchi /*  It's impossible for callers of dwarf_srclines() to get to and
1761*4d9fdb46SRobert Mustacchi     free all the resources (in particular, the li_context and its
1762*4d9fdb46SRobert Mustacchi     lc_file_entries).
1763*4d9fdb46SRobert Mustacchi     So this function, new July 2005, does it.
1764*4d9fdb46SRobert Mustacchi 
1765*4d9fdb46SRobert Mustacchi     As of September 2015 this will now delete either
1766*4d9fdb46SRobert Mustacchi     table of a two-level line table.
1767*4d9fdb46SRobert Mustacchi     In the two-level case one calls it once each on
1768*4d9fdb46SRobert Mustacchi     both the logicals and actuals tables.
1769*4d9fdb46SRobert Mustacchi     (in either order, the order is not critical).
1770*4d9fdb46SRobert Mustacchi     Once  the  logicals table is dealloced any
1771*4d9fdb46SRobert Mustacchi     use of the actuals table will surely result in chaos.
1772*4d9fdb46SRobert Mustacchi     Just do the two calls one after the other.
1773*4d9fdb46SRobert Mustacchi 
1774*4d9fdb46SRobert Mustacchi     In the standard single-table case (DWARF 2,3,4)
1775*4d9fdb46SRobert Mustacchi     one calls it just once on the
1776*4d9fdb46SRobert Mustacchi     linebuf.  Old style dealloc. Should never be used with
1777*4d9fdb46SRobert Mustacchi     dwarf_srclines_b(), but if it is there
1778*4d9fdb46SRobert Mustacchi     are no bad consequences..
1779*4d9fdb46SRobert Mustacchi 
1780*4d9fdb46SRobert Mustacchi     Those using standard DWARF should use
1781*4d9fdb46SRobert Mustacchi     dwarf_srclines_b() and dwarf_srclines_dealloc_b()
1782*4d9fdb46SRobert Mustacchi     instead of dwarf_srclines and dwarf_srclines_dealloc()
1783*4d9fdb46SRobert Mustacchi     as that gives access to various bits of useful information.
1784*4d9fdb46SRobert Mustacchi     */
1785*4d9fdb46SRobert Mustacchi 
1786*4d9fdb46SRobert Mustacchi void
dwarf_srclines_dealloc(Dwarf_Debug dbg,Dwarf_Line * linebuf,Dwarf_Signed count)1787*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line * linebuf,
1788*4d9fdb46SRobert Mustacchi     Dwarf_Signed count)
1789*4d9fdb46SRobert Mustacchi {
1790*4d9fdb46SRobert Mustacchi     Dwarf_Signed i = 0;
1791*4d9fdb46SRobert Mustacchi     /*  alternate_data_count is a failsafe to prevent
1792*4d9fdb46SRobert Mustacchi         duplicate frees when there is inappropriate mixing
1793*4d9fdb46SRobert Mustacchi         of new interface and this old routine */
1794*4d9fdb46SRobert Mustacchi     Dwarf_Bool alternate_data_count = 0;
1795*4d9fdb46SRobert Mustacchi 
1796*4d9fdb46SRobert Mustacchi     struct Dwarf_Line_Context_s *line_context = 0;
1797*4d9fdb46SRobert Mustacchi 
1798*4d9fdb46SRobert Mustacchi 
1799*4d9fdb46SRobert Mustacchi     if(!linebuf) {
1800*4d9fdb46SRobert Mustacchi         return;
1801*4d9fdb46SRobert Mustacchi     }
1802*4d9fdb46SRobert Mustacchi     if (count > 0) {
1803*4d9fdb46SRobert Mustacchi         /*  All these entries share a single line_context, and
1804*4d9fdb46SRobert Mustacchi             for two-levels tables each table gets it too.
1805*4d9fdb46SRobert Mustacchi             Hence we will dealloc ONLY if !is_actuals_table
1806*4d9fdb46SRobert Mustacchi             so for single and two-level tables the space
1807*4d9fdb46SRobert Mustacchi             is deallocated. */
1808*4d9fdb46SRobert Mustacchi         line_context = linebuf[0]->li_context;
1809*4d9fdb46SRobert Mustacchi         if (line_context && line_context->lc_magic != DW_CONTEXT_MAGIC ) {
1810*4d9fdb46SRobert Mustacchi             /* Something is very wrong. */
1811*4d9fdb46SRobert Mustacchi             line_context = 0;
1812*4d9fdb46SRobert Mustacchi         } else if (line_context) {
1813*4d9fdb46SRobert Mustacchi             if (linebuf == line_context->lc_linebuf_logicals) {
1814*4d9fdb46SRobert Mustacchi                 line_context->lc_linebuf_logicals = 0;
1815*4d9fdb46SRobert Mustacchi                 line_context->lc_linecount_logicals = 0;
1816*4d9fdb46SRobert Mustacchi                 alternate_data_count = line_context->lc_linecount_actuals;
1817*4d9fdb46SRobert Mustacchi                 /* Ok to delete logicals */
1818*4d9fdb46SRobert Mustacchi             } else if (linebuf == line_context->lc_linebuf_actuals) {
1819*4d9fdb46SRobert Mustacchi                 /* Ok to delete actuals */
1820*4d9fdb46SRobert Mustacchi                 line_context->lc_linebuf_actuals = 0;
1821*4d9fdb46SRobert Mustacchi                 line_context->lc_linecount_actuals = 0;
1822*4d9fdb46SRobert Mustacchi                 alternate_data_count = line_context->lc_linecount_logicals;
1823*4d9fdb46SRobert Mustacchi             } else {
1824*4d9fdb46SRobert Mustacchi                 /* Something is wrong very wrong. */
1825*4d9fdb46SRobert Mustacchi                 return;
182607dc1947SRichard Lowe             }
1827*4d9fdb46SRobert Mustacchi         }  else {
1828*4d9fdb46SRobert Mustacchi             /*  Else: impossible. Unless the caller
1829*4d9fdb46SRobert Mustacchi                 passed in a bogus linebuf. */
1830*4d9fdb46SRobert Mustacchi             line_context = 0;
183107dc1947SRichard Lowe         }
183249d3bc91SRichard Lowe     }
183307dc1947SRichard Lowe 
1834*4d9fdb46SRobert Mustacchi     /*  Here we actually delete a set of lines. */
1835*4d9fdb46SRobert Mustacchi     for (i = 0; i < count; ++i) {
1836*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);
1837*4d9fdb46SRobert Mustacchi     }
1838*4d9fdb46SRobert Mustacchi     dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);
183907dc1947SRichard Lowe 
1840*4d9fdb46SRobert Mustacchi     if (line_context && !line_context->lc_new_style_access
1841*4d9fdb46SRobert Mustacchi         && !alternate_data_count ) {
1842*4d9fdb46SRobert Mustacchi         /*  There is nothing left
1843*4d9fdb46SRobert Mustacchi             referencing this line_context. */
1844*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, line_context, DW_DLA_LINE_CONTEXT);
184549d3bc91SRichard Lowe     }
1846*4d9fdb46SRobert Mustacchi     return;
1847*4d9fdb46SRobert Mustacchi }
184807dc1947SRichard Lowe 
1849*4d9fdb46SRobert Mustacchi /*  New October 2015.
1850*4d9fdb46SRobert Mustacchi     This should be used to deallocate all
1851*4d9fdb46SRobert Mustacchi     lines data that is
1852*4d9fdb46SRobert Mustacchi     set up by dwarf_srclines_b().
1853*4d9fdb46SRobert Mustacchi     This and dwarf_srclines_b() are now (October 2015)
1854*4d9fdb46SRobert Mustacchi     the preferred routine to use.  */
1855*4d9fdb46SRobert Mustacchi void
dwarf_srclines_dealloc_b(Dwarf_Line_Context line_context)1856*4d9fdb46SRobert Mustacchi dwarf_srclines_dealloc_b(Dwarf_Line_Context line_context)
1857*4d9fdb46SRobert Mustacchi {
1858*4d9fdb46SRobert Mustacchi     Dwarf_Line *linestable = 0;
1859*4d9fdb46SRobert Mustacchi     Dwarf_Signed linescount = 0;
1860*4d9fdb46SRobert Mustacchi     Dwarf_Signed i = 0;
1861*4d9fdb46SRobert Mustacchi     Dwarf_Debug dbg = 0;
186207dc1947SRichard Lowe 
1863*4d9fdb46SRobert Mustacchi     if(!line_context) {
1864*4d9fdb46SRobert Mustacchi         return;
1865*4d9fdb46SRobert Mustacchi     }
1866*4d9fdb46SRobert Mustacchi     if(line_context->lc_magic != DW_CONTEXT_MAGIC) {
1867*4d9fdb46SRobert Mustacchi         /* Something is wrong. */
1868*4d9fdb46SRobert Mustacchi         return; }
1869*4d9fdb46SRobert Mustacchi     dbg = line_context->lc_dbg;
1870*4d9fdb46SRobert Mustacchi     if (!line_context || line_context->lc_magic != DW_CONTEXT_MAGIC) {
1871*4d9fdb46SRobert Mustacchi         /*  Something is badly wrong here.*/
1872*4d9fdb46SRobert Mustacchi         return;
1873*4d9fdb46SRobert Mustacchi     }
1874*4d9fdb46SRobert Mustacchi     linestable = line_context->lc_linebuf_logicals;
1875*4d9fdb46SRobert Mustacchi     if (linestable) {
1876*4d9fdb46SRobert Mustacchi         linescount = line_context->lc_linecount_logicals;
1877*4d9fdb46SRobert Mustacchi         for (i = 0; i < linescount ; ++i) {
1878*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, linestable[i], DW_DLA_LINE);
187907dc1947SRichard Lowe         }
1880*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, linestable, DW_DLA_LIST);
188149d3bc91SRichard Lowe     }
1882*4d9fdb46SRobert Mustacchi     line_context->lc_linebuf_logicals = 0;
1883*4d9fdb46SRobert Mustacchi     line_context->lc_linecount_logicals = 0;
1884*4d9fdb46SRobert Mustacchi 
1885*4d9fdb46SRobert Mustacchi     linestable = line_context->lc_linebuf_actuals;
1886*4d9fdb46SRobert Mustacchi     if (linestable) {
1887*4d9fdb46SRobert Mustacchi         linescount = line_context->lc_linecount_actuals;
1888*4d9fdb46SRobert Mustacchi         for (i = 0; i <linescount ; ++i) {
1889*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg, linestable[i], DW_DLA_LINE);
189007dc1947SRichard Lowe         }
1891*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, linestable, DW_DLA_LIST);
1892*4d9fdb46SRobert Mustacchi     }
1893*4d9fdb46SRobert Mustacchi     line_context->lc_linebuf_actuals = 0;
1894*4d9fdb46SRobert Mustacchi     line_context->lc_linecount_actuals = 0;
1895*4d9fdb46SRobert Mustacchi     delete_line_context_itself(line_context);
1896*4d9fdb46SRobert Mustacchi }
189707dc1947SRichard Lowe 
1898*4d9fdb46SRobert Mustacchi /* There is an error, so count it. If we are printing
1899*4d9fdb46SRobert Mustacchi    errors by command line option, print the details.  */
1900*4d9fdb46SRobert Mustacchi void
_dwarf_print_header_issue(Dwarf_Debug dbg,const char * specific_msg,Dwarf_Small * data_start,Dwarf_Signed value,unsigned index,unsigned tabv,unsigned linetabv,int * err_count_out)1901*4d9fdb46SRobert Mustacchi _dwarf_print_header_issue(Dwarf_Debug dbg,
1902*4d9fdb46SRobert Mustacchi     const char *specific_msg,
1903*4d9fdb46SRobert Mustacchi     Dwarf_Small *data_start,
1904*4d9fdb46SRobert Mustacchi     Dwarf_Signed value,
1905*4d9fdb46SRobert Mustacchi     unsigned index,
1906*4d9fdb46SRobert Mustacchi     unsigned tabv,
1907*4d9fdb46SRobert Mustacchi     unsigned linetabv,
1908*4d9fdb46SRobert Mustacchi     int *err_count_out)
1909*4d9fdb46SRobert Mustacchi {
1910*4d9fdb46SRobert Mustacchi     if (!err_count_out) {
1911*4d9fdb46SRobert Mustacchi         return;
1912*4d9fdb46SRobert Mustacchi     }
1913*4d9fdb46SRobert Mustacchi     /* Are we in verbose mode */
1914*4d9fdb46SRobert Mustacchi     if (dwarf_cmdline_options.check_verbose_mode){
1915*4d9fdb46SRobert Mustacchi         dwarfstring m1;
1916*4d9fdb46SRobert Mustacchi 
1917*4d9fdb46SRobert Mustacchi         dwarfstring_constructor(&m1);
1918*4d9fdb46SRobert Mustacchi         dwarfstring_append(&m1,
1919*4d9fdb46SRobert Mustacchi             "\n*** DWARF CHECK: "
1920*4d9fdb46SRobert Mustacchi             ".debug_line: ");
1921*4d9fdb46SRobert Mustacchi         dwarfstring_append(&m1,(char *)specific_msg);
1922*4d9fdb46SRobert Mustacchi         dwarfstring_append_printf_i(&m1,
1923*4d9fdb46SRobert Mustacchi             " %" DW_PR_DSd,value);
1924*4d9fdb46SRobert Mustacchi         if (index || tabv || linetabv) {
1925*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
1926*4d9fdb46SRobert Mustacchi                 "; Mismatch index %u",index);
1927*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
1928*4d9fdb46SRobert Mustacchi                 " stdval %u",tabv);
1929*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
1930*4d9fdb46SRobert Mustacchi                 " linetabval %u",linetabv);
1931*4d9fdb46SRobert Mustacchi         }
1932*4d9fdb46SRobert Mustacchi         if (data_start >= dbg->de_debug_line.dss_data &&
1933*4d9fdb46SRobert Mustacchi             (data_start < (dbg->de_debug_line.dss_data +
1934*4d9fdb46SRobert Mustacchi             dbg->de_debug_line.dss_size))) {
1935*4d9fdb46SRobert Mustacchi             Dwarf_Unsigned off =
1936*4d9fdb46SRobert Mustacchi                 data_start - dbg->de_debug_line.dss_data;
1937*4d9fdb46SRobert Mustacchi 
1938*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
1939*4d9fdb46SRobert Mustacchi                 " at offset 0x%" DW_PR_XZEROS DW_PR_DUx,off);
1940*4d9fdb46SRobert Mustacchi             dwarfstring_append_printf_u(&m1,
1941*4d9fdb46SRobert Mustacchi                 "  ( %" DW_PR_DUu " ) ",off);
1942*4d9fdb46SRobert Mustacchi         } else {
1943*4d9fdb46SRobert Mustacchi             dwarfstring_append(&m1,
1944*4d9fdb46SRobert Mustacchi                 " (unknown section location) ");
1945*4d9fdb46SRobert Mustacchi         }
1946*4d9fdb46SRobert Mustacchi         dwarfstring_append(&m1,"***\n");
1947*4d9fdb46SRobert Mustacchi         _dwarf_printf(dbg,dwarfstring_string(&m1));
1948*4d9fdb46SRobert Mustacchi         dwarfstring_destructor(&m1);
1949*4d9fdb46SRobert Mustacchi     }
1950*4d9fdb46SRobert Mustacchi     *err_count_out += 1;
1951*4d9fdb46SRobert Mustacchi }
195207dc1947SRichard Lowe 
1953*4d9fdb46SRobert Mustacchi 
1954*4d9fdb46SRobert Mustacchi int
_dwarf_decode_line_string_form(Dwarf_Debug dbg,Dwarf_Unsigned form,Dwarf_Unsigned offset_size,Dwarf_Small ** line_ptr,Dwarf_Small * line_ptr_end,char ** return_str,Dwarf_Error * error)1955*4d9fdb46SRobert Mustacchi _dwarf_decode_line_string_form(Dwarf_Debug dbg,
1956*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned form,
1957*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset_size,
1958*4d9fdb46SRobert Mustacchi     Dwarf_Small **line_ptr,
1959*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_ptr_end,
1960*4d9fdb46SRobert Mustacchi     char **return_str,
1961*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
1962*4d9fdb46SRobert Mustacchi {
1963*4d9fdb46SRobert Mustacchi     int res = 0;
1964*4d9fdb46SRobert Mustacchi 
1965*4d9fdb46SRobert Mustacchi     switch (form) {
1966*4d9fdb46SRobert Mustacchi     case DW_FORM_line_strp: {
1967*4d9fdb46SRobert Mustacchi         Dwarf_Small *secstart = 0;
1968*4d9fdb46SRobert Mustacchi         Dwarf_Small *secend = 0;
1969*4d9fdb46SRobert Mustacchi         Dwarf_Small *strptr = 0;
1970*4d9fdb46SRobert Mustacchi         Dwarf_Unsigned offset = 0;
1971*4d9fdb46SRobert Mustacchi         Dwarf_Small *offsetptr = *line_ptr;
1972*4d9fdb46SRobert Mustacchi 
1973*4d9fdb46SRobert Mustacchi         res = _dwarf_load_section(dbg, &dbg->de_debug_line_str,error);
1974*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1975*4d9fdb46SRobert Mustacchi             return res;
1976*4d9fdb46SRobert Mustacchi         }
1977*4d9fdb46SRobert Mustacchi 
1978*4d9fdb46SRobert Mustacchi         secstart = dbg->de_debug_line_str.dss_data;
1979*4d9fdb46SRobert Mustacchi         secend = secstart + dbg->de_debug_line_str.dss_size;
1980*4d9fdb46SRobert Mustacchi 
1981*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,offsetptr, offset_size,
1982*4d9fdb46SRobert Mustacchi             error,line_ptr_end);
1983*4d9fdb46SRobert Mustacchi         *line_ptr += offset_size;
1984*4d9fdb46SRobert Mustacchi         strptr = secstart + offset;
1985*4d9fdb46SRobert Mustacchi         res = _dwarf_check_string_valid(dbg,
1986*4d9fdb46SRobert Mustacchi             secstart,strptr,secend,
1987*4d9fdb46SRobert Mustacchi             DW_DLE_LINE_STRP_OFFSET_BAD,error);
1988*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
1989*4d9fdb46SRobert Mustacchi             return res;
1990*4d9fdb46SRobert Mustacchi         }
1991*4d9fdb46SRobert Mustacchi         *return_str = (char *) strptr;
1992*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
1993*4d9fdb46SRobert Mustacchi         }
1994*4d9fdb46SRobert Mustacchi     case DW_FORM_string: {
1995*4d9fdb46SRobert Mustacchi         Dwarf_Small *secend = line_ptr_end;
1996*4d9fdb46SRobert Mustacchi         Dwarf_Small *strptr = *line_ptr;
1997*4d9fdb46SRobert Mustacchi 
1998*4d9fdb46SRobert Mustacchi         res = _dwarf_check_string_valid(dbg,
1999*4d9fdb46SRobert Mustacchi             strptr ,strptr,secend,DW_DLE_LINE_STRING_BAD,error);
2000*4d9fdb46SRobert Mustacchi         if (res != DW_DLV_OK) {
2001*4d9fdb46SRobert Mustacchi             return res;
200207dc1947SRichard Lowe         }
2003*4d9fdb46SRobert Mustacchi         *return_str = (char *)strptr;
2004*4d9fdb46SRobert Mustacchi         *line_ptr += strlen((const char *)strptr) + 1;
2005*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
2006*4d9fdb46SRobert Mustacchi         }
2007*4d9fdb46SRobert Mustacchi     default:
2008*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
2009*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
2010*4d9fdb46SRobert Mustacchi     }
2011*4d9fdb46SRobert Mustacchi }
201207dc1947SRichard Lowe 
2013*4d9fdb46SRobert Mustacchi int
_dwarf_decode_line_udata_form(Dwarf_Debug dbg,Dwarf_Unsigned form,Dwarf_Small ** line_ptr,Dwarf_Unsigned * return_val,Dwarf_Small * line_end_ptr,Dwarf_Error * error)2014*4d9fdb46SRobert Mustacchi _dwarf_decode_line_udata_form(Dwarf_Debug dbg,
2015*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned form,
2016*4d9fdb46SRobert Mustacchi     Dwarf_Small **line_ptr,
2017*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *return_val,
2018*4d9fdb46SRobert Mustacchi     Dwarf_Small *line_end_ptr,
2019*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
2020*4d9fdb46SRobert Mustacchi {
2021*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned val = 0;
2022*4d9fdb46SRobert Mustacchi     Dwarf_Small * lp = *line_ptr;
202307dc1947SRichard Lowe 
2024*4d9fdb46SRobert Mustacchi     switch (form) {
202507dc1947SRichard Lowe 
2026*4d9fdb46SRobert Mustacchi     case DW_FORM_udata:
2027*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_CK(lp, val,dbg,error,line_end_ptr);
2028*4d9fdb46SRobert Mustacchi         *return_val = val;
2029*4d9fdb46SRobert Mustacchi         *line_ptr = lp;
2030*4d9fdb46SRobert Mustacchi         return DW_DLV_OK;
203107dc1947SRichard Lowe 
2032*4d9fdb46SRobert Mustacchi     default:
2033*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ATTR_FORM_BAD);
2034*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
203507dc1947SRichard Lowe     }
2036*4d9fdb46SRobert Mustacchi }
203707dc1947SRichard Lowe 
2038*4d9fdb46SRobert Mustacchi 
2039*4d9fdb46SRobert Mustacchi void
_dwarf_update_chain_list(Dwarf_Chain chain_line,Dwarf_Chain * head_chain,Dwarf_Chain * curr_chain)2040*4d9fdb46SRobert Mustacchi _dwarf_update_chain_list( Dwarf_Chain chain_line,
2041*4d9fdb46SRobert Mustacchi     Dwarf_Chain *head_chain, Dwarf_Chain *curr_chain)
2042*4d9fdb46SRobert Mustacchi {
2043*4d9fdb46SRobert Mustacchi     if (*head_chain == NULL) {
2044*4d9fdb46SRobert Mustacchi         *head_chain = chain_line;
2045*4d9fdb46SRobert Mustacchi     } else {
2046*4d9fdb46SRobert Mustacchi         (*curr_chain)->ch_next = chain_line;
2047*4d9fdb46SRobert Mustacchi     }
2048*4d9fdb46SRobert Mustacchi     *curr_chain = chain_line;
2049*4d9fdb46SRobert Mustacchi }
2050*4d9fdb46SRobert Mustacchi 
2051*4d9fdb46SRobert Mustacchi void
_dwarf_free_chain_entries(Dwarf_Debug dbg,Dwarf_Chain head,int count)2052*4d9fdb46SRobert Mustacchi _dwarf_free_chain_entries(Dwarf_Debug dbg,Dwarf_Chain head,int count)
2053*4d9fdb46SRobert Mustacchi {
2054*4d9fdb46SRobert Mustacchi     int i = 0;
2055*4d9fdb46SRobert Mustacchi     Dwarf_Chain curr_chain = head;
2056*4d9fdb46SRobert Mustacchi     for (i = 0; i < count; i++) {
2057*4d9fdb46SRobert Mustacchi         Dwarf_Chain t = curr_chain;
2058*4d9fdb46SRobert Mustacchi         void *item = t->ch_item;
2059*4d9fdb46SRobert Mustacchi         int itype = t->ch_itemtype;
2060*4d9fdb46SRobert Mustacchi 
2061*4d9fdb46SRobert Mustacchi         if (item && itype) { /* valid DW_DLA types are never 0 */
2062*4d9fdb46SRobert Mustacchi             dwarf_dealloc(dbg,item,itype);
2063*4d9fdb46SRobert Mustacchi             t->ch_item = 0;
206407dc1947SRichard Lowe         }
2065*4d9fdb46SRobert Mustacchi         curr_chain = curr_chain->ch_next;
2066*4d9fdb46SRobert Mustacchi         dwarf_dealloc(dbg, t, DW_DLA_CHAIN);
206707dc1947SRichard Lowe     }
2068*4d9fdb46SRobert Mustacchi }
206907dc1947SRichard Lowe 
2070*4d9fdb46SRobert Mustacchi int
_dwarf_add_to_files_list(Dwarf_Line_Context context,Dwarf_File_Entry fe)2071*4d9fdb46SRobert Mustacchi _dwarf_add_to_files_list(Dwarf_Line_Context context, Dwarf_File_Entry fe)
2072*4d9fdb46SRobert Mustacchi {
2073*4d9fdb46SRobert Mustacchi     if (!context->lc_file_entries) {
2074*4d9fdb46SRobert Mustacchi         context->lc_file_entries = fe;
2075*4d9fdb46SRobert Mustacchi     } else {
2076*4d9fdb46SRobert Mustacchi         context->lc_last_entry->fi_next = fe;
2077*4d9fdb46SRobert Mustacchi     }
2078*4d9fdb46SRobert Mustacchi     context->lc_last_entry = fe;
2079*4d9fdb46SRobert Mustacchi     context->lc_file_entry_count++;
2080*4d9fdb46SRobert Mustacchi     /*  Here we attempt to write code to make it easy to interate
2081*4d9fdb46SRobert Mustacchi         though source file names without having to code specially
2082*4d9fdb46SRobert Mustacchi         for DWARF2,3,4 vs DWARF5 */
2083*4d9fdb46SRobert Mustacchi     if (context->lc_version_number >= DW_LINE_VERSION5 &&
2084*4d9fdb46SRobert Mustacchi         context->lc_version_number != EXPERIMENTAL_LINE_TABLES_VERSION) {
2085*4d9fdb46SRobert Mustacchi         context->lc_file_entry_baseindex = 0;
2086*4d9fdb46SRobert Mustacchi         context->lc_file_entry_endindex = context->lc_file_entry_count;
2087*4d9fdb46SRobert Mustacchi     } else {
2088*4d9fdb46SRobert Mustacchi         /* DWARF2,3,4 and the EXPERIMENTAL_LINE_TABLES_VERSION. */
2089*4d9fdb46SRobert Mustacchi         context->lc_file_entry_baseindex = 1;
2090*4d9fdb46SRobert Mustacchi         context->lc_file_entry_endindex = context->lc_file_entry_count+1;
2091*4d9fdb46SRobert Mustacchi     }
209249d3bc91SRichard Lowe     return DW_DLV_OK;
209349d3bc91SRichard Lowe }
209407dc1947SRichard Lowe 
209507dc1947SRichard Lowe 
2096*4d9fdb46SRobert Mustacchi int
_dwarf_line_context_constructor(Dwarf_Debug dbg,void * m)2097*4d9fdb46SRobert Mustacchi _dwarf_line_context_constructor(Dwarf_Debug dbg, void *m)
209807dc1947SRichard Lowe {
2099*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context = (Dwarf_Line_Context)m;
2100*4d9fdb46SRobert Mustacchi     /*  dwarf_get_alloc ensures the bytes are all zero
2101*4d9fdb46SRobert Mustacchi         when m is passed to us. */
2102*4d9fdb46SRobert Mustacchi     line_context->lc_magic = DW_CONTEXT_MAGIC;
2103*4d9fdb46SRobert Mustacchi     line_context->lc_dbg =  dbg;
2104*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
210507dc1947SRichard Lowe }
210607dc1947SRichard Lowe 
2107*4d9fdb46SRobert Mustacchi /*  This cleans up a contex record.
2108*4d9fdb46SRobert Mustacchi     The lines tables (actuals and logicals)
2109*4d9fdb46SRobert Mustacchi     are themselves items that will
2110*4d9fdb46SRobert Mustacchi     be dealloc'd either manually
2111*4d9fdb46SRobert Mustacchi     or, at closing the libdwarf dbg,
2112*4d9fdb46SRobert Mustacchi     automatically.  So we DO NOT
2113*4d9fdb46SRobert Mustacchi     touch the lines tables here
2114*4d9fdb46SRobert Mustacchi     See also: delete_line_context_itself()
2115*4d9fdb46SRobert Mustacchi */
211607dc1947SRichard Lowe void
_dwarf_line_context_destructor(void * m)2117*4d9fdb46SRobert Mustacchi _dwarf_line_context_destructor(void *m)
211807dc1947SRichard Lowe {
2119*4d9fdb46SRobert Mustacchi     Dwarf_Line_Context line_context = (Dwarf_Line_Context)m;
2120*4d9fdb46SRobert Mustacchi     if (line_context->lc_magic != DW_CONTEXT_MAGIC) {
2121*4d9fdb46SRobert Mustacchi         /* Nothing is safe, do nothing. */
2122*4d9fdb46SRobert Mustacchi         return;
212307dc1947SRichard Lowe     }
2124*4d9fdb46SRobert Mustacchi     if (line_context->lc_include_directories) {
2125*4d9fdb46SRobert Mustacchi         free(line_context->lc_include_directories);
2126*4d9fdb46SRobert Mustacchi         line_context->lc_include_directories = 0;
2127*4d9fdb46SRobert Mustacchi         line_context->lc_include_directories_count = 0;
2128*4d9fdb46SRobert Mustacchi     }
2129*4d9fdb46SRobert Mustacchi     if (line_context->lc_file_entries) {
2130*4d9fdb46SRobert Mustacchi         Dwarf_File_Entry fe = line_context->lc_file_entries;
2131*4d9fdb46SRobert Mustacchi         while(fe) {
2132*4d9fdb46SRobert Mustacchi             Dwarf_File_Entry t = fe;
2133*4d9fdb46SRobert Mustacchi             fe = t->fi_next;
2134*4d9fdb46SRobert Mustacchi             t->fi_next = 0;
2135*4d9fdb46SRobert Mustacchi             free(t);
2136*4d9fdb46SRobert Mustacchi         }
2137*4d9fdb46SRobert Mustacchi         line_context->lc_file_entries     = 0;
2138*4d9fdb46SRobert Mustacchi         line_context->lc_last_entry       = 0;
2139*4d9fdb46SRobert Mustacchi         line_context->lc_file_entry_count = 0;
2140*4d9fdb46SRobert Mustacchi         line_context->lc_file_entry_baseindex   = 0;
2141*4d9fdb46SRobert Mustacchi         line_context->lc_file_entry_endindex    = 0;
2142*4d9fdb46SRobert Mustacchi     }
2143*4d9fdb46SRobert Mustacchi     free(line_context->lc_directory_format_values);
2144*4d9fdb46SRobert Mustacchi     line_context->lc_directory_format_values = 0;
2145*4d9fdb46SRobert Mustacchi     free(line_context->lc_file_format_values);
2146*4d9fdb46SRobert Mustacchi     line_context->lc_file_format_values = 0;
2147*4d9fdb46SRobert Mustacchi 
2148*4d9fdb46SRobert Mustacchi     if (line_context->lc_subprogs) {
2149*4d9fdb46SRobert Mustacchi         free(line_context->lc_subprogs);
2150*4d9fdb46SRobert Mustacchi         line_context->lc_subprogs = 0;
2151*4d9fdb46SRobert Mustacchi         line_context->lc_subprogs_count = 0;
2152*4d9fdb46SRobert Mustacchi     }
2153*4d9fdb46SRobert Mustacchi     line_context->lc_magic = 0;
215407dc1947SRichard Lowe     return;
215507dc1947SRichard Lowe }
2156