1*bc1f688bSRobert Mustacchi /*
2*bc1f688bSRobert Mustacchi   Copyright (C) 2000-2006 Silicon Graphics, Inc.  All Rights Reserved.
3*bc1f688bSRobert Mustacchi   Portions Copyright (C) 2007-2010 David Anderson. All Rights Reserved.
4*bc1f688bSRobert Mustacchi 
5*bc1f688bSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
6*bc1f688bSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
7*bc1f688bSRobert Mustacchi   as published by the Free Software Foundation.
8*bc1f688bSRobert Mustacchi 
9*bc1f688bSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
10*bc1f688bSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
11*bc1f688bSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*bc1f688bSRobert Mustacchi 
13*bc1f688bSRobert Mustacchi   Further, this software is distributed without any warranty that it is
14*bc1f688bSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
15*bc1f688bSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
16*bc1f688bSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
17*bc1f688bSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
18*bc1f688bSRobert Mustacchi   other software, or any other product whatsoever.
19*bc1f688bSRobert Mustacchi 
20*bc1f688bSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
21*bc1f688bSRobert Mustacchi   License along with this program; if not, write the Free Software
22*bc1f688bSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23*bc1f688bSRobert Mustacchi   USA.
24*bc1f688bSRobert Mustacchi 
25*bc1f688bSRobert Mustacchi   Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
26*bc1f688bSRobert Mustacchi   Mountain View, CA 94043, or:
27*bc1f688bSRobert Mustacchi 
28*bc1f688bSRobert Mustacchi   http://www.sgi.com
29*bc1f688bSRobert Mustacchi 
30*bc1f688bSRobert Mustacchi   For further information regarding this notice, see:
31*bc1f688bSRobert Mustacchi 
32*bc1f688bSRobert Mustacchi   http://oss.sgi.com/projects/GenInfo/NoticeExplan
33*bc1f688bSRobert Mustacchi 
34*bc1f688bSRobert Mustacchi */
35*bc1f688bSRobert Mustacchi /* The address of the Free Software Foundation is
36*bc1f688bSRobert Mustacchi    Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
37*bc1f688bSRobert Mustacchi    Boston, MA 02110-1301, USA.
38*bc1f688bSRobert Mustacchi    SGI has moved from the Crittenden Lane address.
39*bc1f688bSRobert Mustacchi */
40*bc1f688bSRobert Mustacchi 
41*bc1f688bSRobert Mustacchi 
42*bc1f688bSRobert Mustacchi 
43*bc1f688bSRobert Mustacchi 
44*bc1f688bSRobert Mustacchi #include "config.h"
45*bc1f688bSRobert Mustacchi #include "dwarf_incl.h"
46*bc1f688bSRobert Mustacchi #include <stdio.h>
47*bc1f688bSRobert Mustacchi #include <stdlib.h>
48*bc1f688bSRobert Mustacchi #include "dwarf_line.h"
49*bc1f688bSRobert Mustacchi 
50*bc1f688bSRobert Mustacchi static int
51*bc1f688bSRobert Mustacchi is_path_separator(Dwarf_Small s)
52*bc1f688bSRobert Mustacchi {
53*bc1f688bSRobert Mustacchi     if(s == '/') {
54*bc1f688bSRobert Mustacchi         return 1;
55*bc1f688bSRobert Mustacchi     }
56*bc1f688bSRobert Mustacchi #ifdef HAVE_WINDOWS_PATH
57*bc1f688bSRobert Mustacchi     if(s == '\\') {
58*bc1f688bSRobert Mustacchi         return 1;
59*bc1f688bSRobert Mustacchi     }
60*bc1f688bSRobert Mustacchi #endif
61*bc1f688bSRobert Mustacchi     return 0;
62*bc1f688bSRobert Mustacchi }
63*bc1f688bSRobert Mustacchi 
64*bc1f688bSRobert Mustacchi /* Return 0 if false, 1 if true.
65*bc1f688bSRobert Mustacchi    If HAVE_WINDOWS_PATH is defined we
66*bc1f688bSRobert Mustacchi    attempt to handle windows full paths:
67*bc1f688bSRobert Mustacchi    \\something   or  C:cwdpath.c
68*bc1f688bSRobert Mustacchi */
69*bc1f688bSRobert Mustacchi static int
70*bc1f688bSRobert Mustacchi file_name_is_full_path(Dwarf_Small  *fname)
71*bc1f688bSRobert Mustacchi {
72*bc1f688bSRobert Mustacchi     Dwarf_Small firstc = *fname;
73*bc1f688bSRobert Mustacchi     if(is_path_separator(firstc)) {
74*bc1f688bSRobert Mustacchi         /* Full path. */
75*bc1f688bSRobert Mustacchi         return 1;
76*bc1f688bSRobert Mustacchi     }
77*bc1f688bSRobert Mustacchi     if(!firstc) {
78*bc1f688bSRobert Mustacchi         return 0;
79*bc1f688bSRobert Mustacchi     }
80*bc1f688bSRobert Mustacchi #ifdef HAVE_WINDOWS_PATH
81*bc1f688bSRobert Mustacchi     if((firstc >= 'A' && firstc <= 'Z') ||
82*bc1f688bSRobert Mustacchi        (firstc >= 'a' && firstc <= 'z')) {
83*bc1f688bSRobert Mustacchi          Dwarf_Small secondc = fname[1];
84*bc1f688bSRobert Mustacchi          if (secondc == ':') {
85*bc1f688bSRobert Mustacchi              return 1;
86*bc1f688bSRobert Mustacchi          }
87*bc1f688bSRobert Mustacchi     }
88*bc1f688bSRobert Mustacchi #endif
89*bc1f688bSRobert Mustacchi     return 0;
90*bc1f688bSRobert Mustacchi }
91*bc1f688bSRobert Mustacchi 
92*bc1f688bSRobert Mustacchi /*
93*bc1f688bSRobert Mustacchi     Although source files is supposed to return the
94*bc1f688bSRobert Mustacchi     source files in the compilation-unit, it does
95*bc1f688bSRobert Mustacchi     not look for any in the statement program.  In
96*bc1f688bSRobert Mustacchi     other words, it ignores those defined using the
97*bc1f688bSRobert Mustacchi     extended opcode DW_LNE_define_file.
98*bc1f688bSRobert Mustacchi */
99*bc1f688bSRobert Mustacchi int
100*bc1f688bSRobert Mustacchi dwarf_srcfiles(Dwarf_Die die,
101*bc1f688bSRobert Mustacchi                char ***srcfiles,
102*bc1f688bSRobert Mustacchi                Dwarf_Signed * srcfilecount, Dwarf_Error * error)
103*bc1f688bSRobert Mustacchi {
104*bc1f688bSRobert Mustacchi     /* This pointer is used to scan the portion of the .debug_line
105*bc1f688bSRobert Mustacchi        section for the current cu. */
106*bc1f688bSRobert Mustacchi     Dwarf_Small *line_ptr;
107*bc1f688bSRobert Mustacchi 
108*bc1f688bSRobert Mustacchi     /* Pointer to a DW_AT_stmt_list attribute in case it exists in the
109*bc1f688bSRobert Mustacchi        die. */
110*bc1f688bSRobert Mustacchi     Dwarf_Attribute stmt_list_attr;
111*bc1f688bSRobert Mustacchi 
112*bc1f688bSRobert Mustacchi     /* Pointer to DW_AT_comp_dir attribute in die. */
113*bc1f688bSRobert Mustacchi     Dwarf_Attribute comp_dir_attr;
114*bc1f688bSRobert Mustacchi 
115*bc1f688bSRobert Mustacchi     /* Pointer to name of compilation directory. */
116*bc1f688bSRobert Mustacchi     Dwarf_Small *comp_dir = 0;
117*bc1f688bSRobert Mustacchi 
118*bc1f688bSRobert Mustacchi     /* Offset into .debug_line specified by a DW_AT_stmt_list
119*bc1f688bSRobert Mustacchi        attribute. */
120*bc1f688bSRobert Mustacchi     Dwarf_Unsigned line_offset = 0;
121*bc1f688bSRobert Mustacchi 
122*bc1f688bSRobert Mustacchi     /* This points to a block of char *'s, each of which points to a
123*bc1f688bSRobert Mustacchi        file name. */
124*bc1f688bSRobert Mustacchi     char **ret_files = 0;
125*bc1f688bSRobert Mustacchi 
126*bc1f688bSRobert Mustacchi     /* The Dwarf_Debug this die belongs to. */
127*bc1f688bSRobert Mustacchi     Dwarf_Debug dbg = 0;
128*bc1f688bSRobert Mustacchi 
129*bc1f688bSRobert Mustacchi     /* Used to chain the file names. */
130*bc1f688bSRobert Mustacchi     Dwarf_Chain curr_chain = NULL;
131*bc1f688bSRobert Mustacchi     Dwarf_Chain prev_chain = NULL;
132*bc1f688bSRobert Mustacchi     Dwarf_Chain head_chain = NULL;
133*bc1f688bSRobert Mustacchi     Dwarf_Half attrform = 0;
134*bc1f688bSRobert Mustacchi     int resattr = DW_DLV_ERROR;
135*bc1f688bSRobert Mustacchi     int lres = DW_DLV_ERROR;
136*bc1f688bSRobert Mustacchi     struct Line_Table_Prefix_s line_prefix;
137*bc1f688bSRobert Mustacchi     int i = 0;
138*bc1f688bSRobert Mustacchi     int res = DW_DLV_ERROR;
139*bc1f688bSRobert Mustacchi 
140*bc1f688bSRobert Mustacchi     /* ***** BEGIN CODE ***** */
141*bc1f688bSRobert Mustacchi     /* Reset error. */
142*bc1f688bSRobert Mustacchi     if (error != NULL)
143*bc1f688bSRobert Mustacchi         *error = NULL;
144*bc1f688bSRobert Mustacchi 
145*bc1f688bSRobert Mustacchi     CHECK_DIE(die, DW_DLV_ERROR);
146*bc1f688bSRobert Mustacchi     dbg = die->di_cu_context->cc_dbg;
147*bc1f688bSRobert Mustacchi 
148*bc1f688bSRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
149*bc1f688bSRobert Mustacchi     if (resattr != DW_DLV_OK) {
150*bc1f688bSRobert Mustacchi         return resattr;
151*bc1f688bSRobert Mustacchi     }
152*bc1f688bSRobert Mustacchi 
153*bc1f688bSRobert Mustacchi     if (dbg->de_debug_line.dss_index == 0) {
154*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_DEBUG_LINE_NULL);
155*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
156*bc1f688bSRobert Mustacchi     }
157*bc1f688bSRobert Mustacchi 
158*bc1f688bSRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
159*bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
160*bc1f688bSRobert Mustacchi         return res;
161*bc1f688bSRobert Mustacchi     }
162*bc1f688bSRobert Mustacchi 
163*bc1f688bSRobert Mustacchi     lres = dwarf_whatform(stmt_list_attr,&attrform,error);
164*bc1f688bSRobert Mustacchi     if (lres != DW_DLV_OK) {
165*bc1f688bSRobert Mustacchi         return lres;
166*bc1f688bSRobert Mustacchi     }
167*bc1f688bSRobert Mustacchi     if (attrform != DW_FORM_data4 && attrform != DW_FORM_data8 &&
168*bc1f688bSRobert Mustacchi         attrform != DW_FORM_sec_offset ) {
169*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
170*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
171*bc1f688bSRobert Mustacchi     }
172*bc1f688bSRobert Mustacchi     lres = dwarf_global_formref(stmt_list_attr, &line_offset, error);
173*bc1f688bSRobert Mustacchi     if (lres != DW_DLV_OK) {
174*bc1f688bSRobert Mustacchi         return lres;
175*bc1f688bSRobert Mustacchi     }
176*bc1f688bSRobert Mustacchi     if (line_offset >= dbg->de_debug_line.dss_size) {
177*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
178*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
179*bc1f688bSRobert Mustacchi     }
180*bc1f688bSRobert Mustacchi     line_ptr = dbg->de_debug_line.dss_data + line_offset;
181*bc1f688bSRobert Mustacchi     dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
182*bc1f688bSRobert Mustacchi 
183*bc1f688bSRobert Mustacchi     /*
184*bc1f688bSRobert Mustacchi        If die has DW_AT_comp_dir attribute, get the string that names
185*bc1f688bSRobert Mustacchi        the compilation directory. */
186*bc1f688bSRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
187*bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_ERROR) {
188*bc1f688bSRobert Mustacchi         return resattr;
189*bc1f688bSRobert Mustacchi     }
190*bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_OK) {
191*bc1f688bSRobert Mustacchi         int cres = DW_DLV_ERROR;
192*bc1f688bSRobert Mustacchi         char *cdir = 0;
193*bc1f688bSRobert Mustacchi 
194*bc1f688bSRobert Mustacchi         cres = dwarf_formstring(comp_dir_attr, &cdir, error);
195*bc1f688bSRobert Mustacchi         if (cres == DW_DLV_ERROR) {
196*bc1f688bSRobert Mustacchi             return cres;
197*bc1f688bSRobert Mustacchi         } else if (cres == DW_DLV_OK) {
198*bc1f688bSRobert Mustacchi             comp_dir = (Dwarf_Small *) cdir;
199*bc1f688bSRobert Mustacchi         }
200*bc1f688bSRobert Mustacchi     }
201*bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_OK) {
202*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
203*bc1f688bSRobert Mustacchi     }
204*bc1f688bSRobert Mustacchi     dwarf_init_line_table_prefix(&line_prefix);
205*bc1f688bSRobert Mustacchi     {
206*bc1f688bSRobert Mustacchi         Dwarf_Small *line_ptr_out = 0;
207*bc1f688bSRobert Mustacchi         int dres = dwarf_read_line_table_prefix(dbg,
208*bc1f688bSRobert Mustacchi             line_ptr,
209*bc1f688bSRobert Mustacchi             dbg->de_debug_line.dss_size,
210*bc1f688bSRobert Mustacchi             &line_ptr_out,
211*bc1f688bSRobert Mustacchi             &line_prefix,
212*bc1f688bSRobert Mustacchi             NULL, NULL,error,
213*bc1f688bSRobert Mustacchi             0);
214*bc1f688bSRobert Mustacchi 
215*bc1f688bSRobert Mustacchi         if (dres == DW_DLV_ERROR) {
216*bc1f688bSRobert Mustacchi             dwarf_free_line_table_prefix(&line_prefix);
217*bc1f688bSRobert Mustacchi             return dres;
218*bc1f688bSRobert Mustacchi         }
219*bc1f688bSRobert Mustacchi         if (dres == DW_DLV_NO_ENTRY) {
220*bc1f688bSRobert Mustacchi             dwarf_free_line_table_prefix(&line_prefix);
221*bc1f688bSRobert Mustacchi             return dres;
222*bc1f688bSRobert Mustacchi         }
223*bc1f688bSRobert Mustacchi 
224*bc1f688bSRobert Mustacchi         line_ptr = line_ptr_out;
225*bc1f688bSRobert Mustacchi     }
226*bc1f688bSRobert Mustacchi 
227*bc1f688bSRobert Mustacchi     for (i = 0; i < line_prefix.pf_files_count; ++i) {
228*bc1f688bSRobert Mustacchi         struct Line_Table_File_Entry_s *fe =
229*bc1f688bSRobert Mustacchi             line_prefix.pf_line_table_file_entries + i;
230*bc1f688bSRobert Mustacchi         char *file_name = (char *) fe->lte_filename;
231*bc1f688bSRobert Mustacchi         char *dir_name = 0;
232*bc1f688bSRobert Mustacchi         char *full_name = 0;
233*bc1f688bSRobert Mustacchi         Dwarf_Unsigned dir_index = fe->lte_directory_index;
234*bc1f688bSRobert Mustacchi 
235*bc1f688bSRobert Mustacchi         if (dir_index == 0) {
236*bc1f688bSRobert Mustacchi             dir_name = (char *) comp_dir;
237*bc1f688bSRobert Mustacchi         } else {
238*bc1f688bSRobert Mustacchi             dir_name =
239*bc1f688bSRobert Mustacchi                 (char *) line_prefix.pf_include_directories[
240*bc1f688bSRobert Mustacchi                     fe->lte_directory_index - 1];
241*bc1f688bSRobert Mustacchi         }
242*bc1f688bSRobert Mustacchi 
243*bc1f688bSRobert Mustacchi         /* dir_name can be NULL if there is no DW_AT_comp_dir */
244*bc1f688bSRobert Mustacchi         if(dir_name == 0 || file_name_is_full_path((unsigned char *)file_name)) {
245*bc1f688bSRobert Mustacchi             /* This is safe because dwarf_dealloc is careful to not
246*bc1f688bSRobert Mustacchi                dealloc strings which are part of the raw .debug_* data.
247*bc1f688bSRobert Mustacchi              */
248*bc1f688bSRobert Mustacchi             full_name = file_name;
249*bc1f688bSRobert Mustacchi         } else {
250*bc1f688bSRobert Mustacchi             full_name = (char *) _dwarf_get_alloc(dbg, DW_DLA_STRING,
251*bc1f688bSRobert Mustacchi                                                   strlen(dir_name) + 1 +
252*bc1f688bSRobert Mustacchi                                                   strlen(file_name) +
253*bc1f688bSRobert Mustacchi                                                   1);
254*bc1f688bSRobert Mustacchi             if (full_name == NULL) {
255*bc1f688bSRobert Mustacchi                 dwarf_free_line_table_prefix(&line_prefix);
256*bc1f688bSRobert Mustacchi                 _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
257*bc1f688bSRobert Mustacchi                 return (DW_DLV_ERROR);
258*bc1f688bSRobert Mustacchi             }
259*bc1f688bSRobert Mustacchi 
260*bc1f688bSRobert Mustacchi             /* This is not careful to avoid // in the output, Nothing
261*bc1f688bSRobert Mustacchi                forces a 'canonical' name format here. Unclear if this
262*bc1f688bSRobert Mustacchi                needs to be fixed. */
263*bc1f688bSRobert Mustacchi             strcpy(full_name, dir_name);
264*bc1f688bSRobert Mustacchi             strcat(full_name, "/");
265*bc1f688bSRobert Mustacchi             strcat(full_name, file_name);
266*bc1f688bSRobert Mustacchi         }
267*bc1f688bSRobert Mustacchi         curr_chain =
268*bc1f688bSRobert Mustacchi             (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
269*bc1f688bSRobert Mustacchi         if (curr_chain == NULL) {
270*bc1f688bSRobert Mustacchi             dwarf_free_line_table_prefix(&line_prefix);
271*bc1f688bSRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
272*bc1f688bSRobert Mustacchi             return (DW_DLV_ERROR);
273*bc1f688bSRobert Mustacchi         }
274*bc1f688bSRobert Mustacchi         curr_chain->ch_item = full_name;
275*bc1f688bSRobert Mustacchi         if (head_chain == NULL)
276*bc1f688bSRobert Mustacchi             head_chain = prev_chain = curr_chain;
277*bc1f688bSRobert Mustacchi         else {
278*bc1f688bSRobert Mustacchi             prev_chain->ch_next = curr_chain;
279*bc1f688bSRobert Mustacchi             prev_chain = curr_chain;
280*bc1f688bSRobert Mustacchi         }
281*bc1f688bSRobert Mustacchi     }
282*bc1f688bSRobert Mustacchi 
283*bc1f688bSRobert Mustacchi     curr_chain = (Dwarf_Chain) _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
284*bc1f688bSRobert Mustacchi     if (curr_chain == NULL) {
285*bc1f688bSRobert Mustacchi         dwarf_free_line_table_prefix(&line_prefix);
286*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
287*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
288*bc1f688bSRobert Mustacchi     }
289*bc1f688bSRobert Mustacchi 
290*bc1f688bSRobert Mustacchi 
291*bc1f688bSRobert Mustacchi 
292*bc1f688bSRobert Mustacchi 
293*bc1f688bSRobert Mustacchi     if (line_prefix.pf_files_count == 0) {
294*bc1f688bSRobert Mustacchi         *srcfiles = NULL;
295*bc1f688bSRobert Mustacchi         *srcfilecount = 0;
296*bc1f688bSRobert Mustacchi         dwarf_free_line_table_prefix(&line_prefix);
297*bc1f688bSRobert Mustacchi         return (DW_DLV_NO_ENTRY);
298*bc1f688bSRobert Mustacchi     }
299*bc1f688bSRobert Mustacchi 
300*bc1f688bSRobert Mustacchi     ret_files = (char **)
301*bc1f688bSRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LIST, line_prefix.pf_files_count);
302*bc1f688bSRobert Mustacchi     if (ret_files == NULL) {
303*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
304*bc1f688bSRobert Mustacchi         dwarf_free_line_table_prefix(&line_prefix);
305*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
306*bc1f688bSRobert Mustacchi     }
307*bc1f688bSRobert Mustacchi 
308*bc1f688bSRobert Mustacchi     curr_chain = head_chain;
309*bc1f688bSRobert Mustacchi     for (i = 0; i < line_prefix.pf_files_count; i++) {
310*bc1f688bSRobert Mustacchi         *(ret_files + i) = curr_chain->ch_item;
311*bc1f688bSRobert Mustacchi         prev_chain = curr_chain;
312*bc1f688bSRobert Mustacchi         curr_chain = curr_chain->ch_next;
313*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, prev_chain, DW_DLA_CHAIN);
314*bc1f688bSRobert Mustacchi     }
315*bc1f688bSRobert Mustacchi 
316*bc1f688bSRobert Mustacchi     *srcfiles = ret_files;
317*bc1f688bSRobert Mustacchi     *srcfilecount = line_prefix.pf_files_count;
318*bc1f688bSRobert Mustacchi     dwarf_free_line_table_prefix(&line_prefix);
319*bc1f688bSRobert Mustacchi     return (DW_DLV_OK);
320*bc1f688bSRobert Mustacchi }
321*bc1f688bSRobert Mustacchi 
322*bc1f688bSRobert Mustacchi 
323*bc1f688bSRobert Mustacchi /*
324*bc1f688bSRobert Mustacchi         return DW_DLV_OK if ok. else DW_DLV_NO_ENTRY or DW_DLV_ERROR
325*bc1f688bSRobert Mustacchi */
326*bc1f688bSRobert Mustacchi int
327*bc1f688bSRobert Mustacchi _dwarf_internal_srclines(Dwarf_Die die,
328*bc1f688bSRobert Mustacchi     Dwarf_Line ** linebuf,
329*bc1f688bSRobert Mustacchi     Dwarf_Signed * count,
330*bc1f688bSRobert Mustacchi     Dwarf_Bool doaddrs,
331*bc1f688bSRobert Mustacchi     Dwarf_Bool dolines, Dwarf_Error * error)
332*bc1f688bSRobert Mustacchi {
333*bc1f688bSRobert Mustacchi     /* This pointer is used to scan the portion of the .debug_line
334*bc1f688bSRobert Mustacchi        section for the current cu. */
335*bc1f688bSRobert Mustacchi     Dwarf_Small *line_ptr = 0;
336*bc1f688bSRobert Mustacchi 
337*bc1f688bSRobert Mustacchi     /* This points to the last byte of the .debug_line portion for the
338*bc1f688bSRobert Mustacchi        current cu. */
339*bc1f688bSRobert Mustacchi     Dwarf_Small *line_ptr_end = 0;
340*bc1f688bSRobert Mustacchi 
341*bc1f688bSRobert Mustacchi     /* Pointer to a DW_AT_stmt_list attribute in case it exists in the
342*bc1f688bSRobert Mustacchi        die. */
343*bc1f688bSRobert Mustacchi     Dwarf_Attribute stmt_list_attr = 0;
344*bc1f688bSRobert Mustacchi 
345*bc1f688bSRobert Mustacchi     /* Pointer to DW_AT_comp_dir attribute in die. */
346*bc1f688bSRobert Mustacchi     Dwarf_Attribute comp_dir_attr = 0;
347*bc1f688bSRobert Mustacchi 
348*bc1f688bSRobert Mustacchi     /* Pointer to name of compilation directory. */
349*bc1f688bSRobert Mustacchi     Dwarf_Small *comp_dir = NULL;
350*bc1f688bSRobert Mustacchi 
351*bc1f688bSRobert Mustacchi     /* Offset into .debug_line specified by a DW_AT_stmt_list
352*bc1f688bSRobert Mustacchi        attribute. */
353*bc1f688bSRobert Mustacchi     Dwarf_Unsigned line_offset = 0;
354*bc1f688bSRobert Mustacchi 
355*bc1f688bSRobert Mustacchi     Dwarf_File_Entry file_entries = 0;
356*bc1f688bSRobert Mustacchi 
357*bc1f688bSRobert Mustacchi     /* These are the state machine state variables. */
358*bc1f688bSRobert Mustacchi     Dwarf_Addr address = 0;
359*bc1f688bSRobert Mustacchi     Dwarf_Word file = 1;
360*bc1f688bSRobert Mustacchi     Dwarf_Word line = 1;
361*bc1f688bSRobert Mustacchi     Dwarf_Word column = 0;
362*bc1f688bSRobert Mustacchi 
363*bc1f688bSRobert Mustacchi     /* Phony init. See below for true initialization. */
364*bc1f688bSRobert Mustacchi     Dwarf_Bool is_stmt = false;
365*bc1f688bSRobert Mustacchi 
366*bc1f688bSRobert Mustacchi     Dwarf_Bool basic_block = false;
367*bc1f688bSRobert Mustacchi     Dwarf_Bool prologue_end = false;
368*bc1f688bSRobert Mustacchi     Dwarf_Bool epilogue_begin = false;
369*bc1f688bSRobert Mustacchi     Dwarf_Small isa = 0;
370*bc1f688bSRobert Mustacchi     Dwarf_Bool end_sequence = false;
371*bc1f688bSRobert Mustacchi 
372*bc1f688bSRobert Mustacchi     /* These pointers are used to build the list of files names by this
373*bc1f688bSRobert Mustacchi        cu.  cur_file_entry points to the file name being added, and
374*bc1f688bSRobert Mustacchi        prev_file_entry to the previous one. */
375*bc1f688bSRobert Mustacchi     Dwarf_File_Entry cur_file_entry, prev_file_entry;
376*bc1f688bSRobert Mustacchi 
377*bc1f688bSRobert Mustacchi     Dwarf_Sword i = 0;
378*bc1f688bSRobert Mustacchi     Dwarf_Sword file_entry_count = 0;
379*bc1f688bSRobert Mustacchi 
380*bc1f688bSRobert Mustacchi     /* This is the current opcode read from the statement program. */
381*bc1f688bSRobert Mustacchi     Dwarf_Small opcode = 0;
382*bc1f688bSRobert Mustacchi 
383*bc1f688bSRobert Mustacchi     /* Pointer to a Dwarf_Line_Context_s structure that contains the
384*bc1f688bSRobert Mustacchi        context such as file names and include directories for the set
385*bc1f688bSRobert Mustacchi        of lines being generated. */
386*bc1f688bSRobert Mustacchi     Dwarf_Line_Context line_context = 0;
387*bc1f688bSRobert Mustacchi 
388*bc1f688bSRobert Mustacchi     /* This is a pointer to the current line being added to the line
389*bc1f688bSRobert Mustacchi        matrix. */
390*bc1f688bSRobert Mustacchi     Dwarf_Line curr_line = 0;
391*bc1f688bSRobert Mustacchi 
392*bc1f688bSRobert Mustacchi     /* These variables are used to decode leb128 numbers. Leb128_num
393*bc1f688bSRobert Mustacchi        holds the decoded number, and leb128_length is its length in
394*bc1f688bSRobert Mustacchi        bytes. */
395*bc1f688bSRobert Mustacchi     Dwarf_Word leb128_num = 0;
396*bc1f688bSRobert Mustacchi     Dwarf_Word leb128_length = 0;
397*bc1f688bSRobert Mustacchi     Dwarf_Sword advance_line = 0;
398*bc1f688bSRobert Mustacchi 
399*bc1f688bSRobert Mustacchi     /* This is the operand of the latest fixed_advance_pc extended
400*bc1f688bSRobert Mustacchi        opcode. */
401*bc1f688bSRobert Mustacchi     Dwarf_Half fixed_advance_pc = 0;
402*bc1f688bSRobert Mustacchi 
403*bc1f688bSRobert Mustacchi     /* Counts the number of lines in the line matrix. */
404*bc1f688bSRobert Mustacchi     Dwarf_Sword line_count = 0;
405*bc1f688bSRobert Mustacchi 
406*bc1f688bSRobert Mustacchi     /* This is the length of an extended opcode instr.  */
407*bc1f688bSRobert Mustacchi     Dwarf_Word instr_length = 0;
408*bc1f688bSRobert Mustacchi     Dwarf_Small ext_opcode = 0;
409*bc1f688bSRobert Mustacchi     struct Line_Table_Prefix_s prefix;
410*bc1f688bSRobert Mustacchi 
411*bc1f688bSRobert Mustacchi     /* Used to chain together pointers to line table entries that are
412*bc1f688bSRobert Mustacchi        later used to create a block of Dwarf_Line entries. */
413*bc1f688bSRobert Mustacchi     Dwarf_Chain chain_line = NULL;
414*bc1f688bSRobert Mustacchi     Dwarf_Chain head_chain = NULL;
415*bc1f688bSRobert Mustacchi     Dwarf_Chain curr_chain = NULL;
416*bc1f688bSRobert Mustacchi 
417*bc1f688bSRobert Mustacchi     /* This points to a block of Dwarf_Lines, a pointer to which is
418*bc1f688bSRobert Mustacchi        returned in linebuf. */
419*bc1f688bSRobert Mustacchi     Dwarf_Line *block_line = 0;
420*bc1f688bSRobert Mustacchi 
421*bc1f688bSRobert Mustacchi     /* The Dwarf_Debug this die belongs to. */
422*bc1f688bSRobert Mustacchi     Dwarf_Debug dbg = 0;
423*bc1f688bSRobert Mustacchi     int resattr = DW_DLV_ERROR;
424*bc1f688bSRobert Mustacchi     int lres = DW_DLV_ERROR;
425*bc1f688bSRobert Mustacchi     Dwarf_Half address_size = 0;
426*bc1f688bSRobert Mustacchi 
427*bc1f688bSRobert Mustacchi     int res = DW_DLV_ERROR;
428*bc1f688bSRobert Mustacchi 
429*bc1f688bSRobert Mustacchi     /* ***** BEGIN CODE ***** */
430*bc1f688bSRobert Mustacchi     if (error != NULL)
431*bc1f688bSRobert Mustacchi         *error = NULL;
432*bc1f688bSRobert Mustacchi 
433*bc1f688bSRobert Mustacchi     CHECK_DIE(die, DW_DLV_ERROR);
434*bc1f688bSRobert Mustacchi     dbg = die->di_cu_context->cc_dbg;
435*bc1f688bSRobert Mustacchi 
436*bc1f688bSRobert Mustacchi     res = _dwarf_load_section(dbg, &dbg->de_debug_line,error);
437*bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
438*bc1f688bSRobert Mustacchi         return res;
439*bc1f688bSRobert Mustacchi     }
440*bc1f688bSRobert Mustacchi     address_size = _dwarf_get_address_size(dbg, die);
441*bc1f688bSRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_stmt_list, &stmt_list_attr, error);
442*bc1f688bSRobert Mustacchi     if (resattr != DW_DLV_OK) {
443*bc1f688bSRobert Mustacchi         return resattr;
444*bc1f688bSRobert Mustacchi     }
445*bc1f688bSRobert Mustacchi 
446*bc1f688bSRobert Mustacchi     lres = dwarf_formudata(stmt_list_attr, &line_offset, error);
447*bc1f688bSRobert Mustacchi     if (lres != DW_DLV_OK) {
448*bc1f688bSRobert Mustacchi         return lres;
449*bc1f688bSRobert Mustacchi     }
450*bc1f688bSRobert Mustacchi 
451*bc1f688bSRobert Mustacchi     if (line_offset >= dbg->de_debug_line.dss_size) {
452*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_OFFSET_BAD);
453*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
454*bc1f688bSRobert Mustacchi     }
455*bc1f688bSRobert Mustacchi     line_ptr = dbg->de_debug_line.dss_data + line_offset;
456*bc1f688bSRobert Mustacchi     dwarf_dealloc(dbg, stmt_list_attr, DW_DLA_ATTR);
457*bc1f688bSRobert Mustacchi 
458*bc1f688bSRobert Mustacchi     /* If die has DW_AT_comp_dir attribute, get the string that names
459*bc1f688bSRobert Mustacchi        the compilation directory. */
460*bc1f688bSRobert Mustacchi     resattr = dwarf_attr(die, DW_AT_comp_dir, &comp_dir_attr, error);
461*bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_ERROR) {
462*bc1f688bSRobert Mustacchi         return resattr;
463*bc1f688bSRobert Mustacchi     }
464*bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_OK) {
465*bc1f688bSRobert Mustacchi         int cres = DW_DLV_ERROR;
466*bc1f688bSRobert Mustacchi         char *cdir = 0;
467*bc1f688bSRobert Mustacchi 
468*bc1f688bSRobert Mustacchi         cres = dwarf_formstring(comp_dir_attr, &cdir, error);
469*bc1f688bSRobert Mustacchi         if (cres == DW_DLV_ERROR) {
470*bc1f688bSRobert Mustacchi             return cres;
471*bc1f688bSRobert Mustacchi         } else if (cres == DW_DLV_OK) {
472*bc1f688bSRobert Mustacchi             comp_dir = (Dwarf_Small *) cdir;
473*bc1f688bSRobert Mustacchi         }
474*bc1f688bSRobert Mustacchi     }
475*bc1f688bSRobert Mustacchi     if (resattr == DW_DLV_OK) {
476*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, comp_dir_attr, DW_DLA_ATTR);
477*bc1f688bSRobert Mustacchi     }
478*bc1f688bSRobert Mustacchi     dwarf_init_line_table_prefix(&prefix);
479*bc1f688bSRobert Mustacchi 
480*bc1f688bSRobert Mustacchi     {
481*bc1f688bSRobert Mustacchi         Dwarf_Small *newlinep = 0;
482*bc1f688bSRobert Mustacchi         int res = dwarf_read_line_table_prefix(dbg,
483*bc1f688bSRobert Mustacchi             line_ptr,
484*bc1f688bSRobert Mustacchi             dbg->de_debug_line.dss_size,
485*bc1f688bSRobert Mustacchi             &newlinep,
486*bc1f688bSRobert Mustacchi             &prefix,
487*bc1f688bSRobert Mustacchi             NULL,NULL,
488*bc1f688bSRobert Mustacchi             error,
489*bc1f688bSRobert Mustacchi             0);
490*bc1f688bSRobert Mustacchi 
491*bc1f688bSRobert Mustacchi         if (res == DW_DLV_ERROR) {
492*bc1f688bSRobert Mustacchi             dwarf_free_line_table_prefix(&prefix);
493*bc1f688bSRobert Mustacchi             return res;
494*bc1f688bSRobert Mustacchi         }
495*bc1f688bSRobert Mustacchi         if (res == DW_DLV_NO_ENTRY) {
496*bc1f688bSRobert Mustacchi             dwarf_free_line_table_prefix(&prefix);
497*bc1f688bSRobert Mustacchi             return res;
498*bc1f688bSRobert Mustacchi         }
499*bc1f688bSRobert Mustacchi         line_ptr_end = prefix.pf_line_ptr_end;
500*bc1f688bSRobert Mustacchi         line_ptr = newlinep;
501*bc1f688bSRobert Mustacchi     }
502*bc1f688bSRobert Mustacchi 
503*bc1f688bSRobert Mustacchi 
504*bc1f688bSRobert Mustacchi     /* Set up context structure for this set of lines. */
505*bc1f688bSRobert Mustacchi     line_context = (Dwarf_Line_Context)
506*bc1f688bSRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LINE_CONTEXT, 1);
507*bc1f688bSRobert Mustacchi     if (line_context == NULL) {
508*bc1f688bSRobert Mustacchi         dwarf_free_line_table_prefix(&prefix);
509*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
510*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
511*bc1f688bSRobert Mustacchi     }
512*bc1f688bSRobert Mustacchi 
513*bc1f688bSRobert Mustacchi     /* Fill out a Dwarf_File_Entry list as we use that to implement the
514*bc1f688bSRobert Mustacchi        define_file operation. */
515*bc1f688bSRobert Mustacchi     file_entries = prev_file_entry = NULL;
516*bc1f688bSRobert Mustacchi     for (i = 0; i < prefix.pf_files_count; ++i) {
517*bc1f688bSRobert Mustacchi         struct Line_Table_File_Entry_s *pfxfile =
518*bc1f688bSRobert Mustacchi             prefix.pf_line_table_file_entries + i;
519*bc1f688bSRobert Mustacchi 
520*bc1f688bSRobert Mustacchi         cur_file_entry = (Dwarf_File_Entry)
521*bc1f688bSRobert Mustacchi             _dwarf_get_alloc(dbg, DW_DLA_FILE_ENTRY, 1);
522*bc1f688bSRobert Mustacchi         if (cur_file_entry == NULL) {
523*bc1f688bSRobert Mustacchi             dwarf_free_line_table_prefix(&prefix);
524*bc1f688bSRobert Mustacchi             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
525*bc1f688bSRobert Mustacchi             return (DW_DLV_ERROR);
526*bc1f688bSRobert Mustacchi         }
527*bc1f688bSRobert Mustacchi 
528*bc1f688bSRobert Mustacchi         cur_file_entry->fi_file_name = pfxfile->lte_filename;
529*bc1f688bSRobert Mustacchi         cur_file_entry->fi_dir_index = pfxfile->lte_directory_index;
530*bc1f688bSRobert Mustacchi         cur_file_entry->fi_time_last_mod =
531*bc1f688bSRobert Mustacchi             pfxfile->lte_last_modification_time;
532*bc1f688bSRobert Mustacchi 
533*bc1f688bSRobert Mustacchi         cur_file_entry->fi_file_length = pfxfile->lte_length_of_file;
534*bc1f688bSRobert Mustacchi 
535*bc1f688bSRobert Mustacchi         if (file_entries == NULL)
536*bc1f688bSRobert Mustacchi             file_entries = cur_file_entry;
537*bc1f688bSRobert Mustacchi         else
538*bc1f688bSRobert Mustacchi             prev_file_entry->fi_next = cur_file_entry;
539*bc1f688bSRobert Mustacchi         prev_file_entry = cur_file_entry;
540*bc1f688bSRobert Mustacchi 
541*bc1f688bSRobert Mustacchi         file_entry_count++;
542*bc1f688bSRobert Mustacchi     }
543*bc1f688bSRobert Mustacchi 
544*bc1f688bSRobert Mustacchi 
545*bc1f688bSRobert Mustacchi     /* Initialize the one state machine variable that depends on the
546*bc1f688bSRobert Mustacchi        prefix.  */
547*bc1f688bSRobert Mustacchi     is_stmt = prefix.pf_default_is_stmt;
548*bc1f688bSRobert Mustacchi 
549*bc1f688bSRobert Mustacchi 
550*bc1f688bSRobert Mustacchi     /* Start of statement program.  */
551*bc1f688bSRobert Mustacchi     while (line_ptr < line_ptr_end) {
552*bc1f688bSRobert Mustacchi         int type;
553*bc1f688bSRobert Mustacchi 
554*bc1f688bSRobert Mustacchi         opcode = *(Dwarf_Small *) line_ptr;
555*bc1f688bSRobert Mustacchi         line_ptr++;
556*bc1f688bSRobert Mustacchi 
557*bc1f688bSRobert Mustacchi 
558*bc1f688bSRobert Mustacchi         /* 'type' is the output */
559*bc1f688bSRobert Mustacchi         WHAT_IS_OPCODE(type, opcode, prefix.pf_opcode_base,
560*bc1f688bSRobert Mustacchi                        prefix.pf_opcode_length_table, line_ptr,
561*bc1f688bSRobert Mustacchi                        prefix.pf_std_op_count);
562*bc1f688bSRobert Mustacchi 
563*bc1f688bSRobert Mustacchi         if (type == LOP_DISCARD) {
564*bc1f688bSRobert Mustacchi             int oc;
565*bc1f688bSRobert Mustacchi             int opcnt = prefix.pf_opcode_length_table[opcode];
566*bc1f688bSRobert Mustacchi 
567*bc1f688bSRobert Mustacchi             for (oc = 0; oc < opcnt; oc++) {
568*bc1f688bSRobert Mustacchi                 /*
569*bc1f688bSRobert Mustacchi                  ** Read and discard operands we don't
570*bc1f688bSRobert Mustacchi                  ** understand.
571*bc1f688bSRobert Mustacchi                  ** arbitrary choice of unsigned read.
572*bc1f688bSRobert Mustacchi                  ** signed read would work as well.
573*bc1f688bSRobert Mustacchi                  */
574*bc1f688bSRobert Mustacchi                 Dwarf_Unsigned utmp2;
575*bc1f688bSRobert Mustacchi 
576*bc1f688bSRobert Mustacchi                 DECODE_LEB128_UWORD(line_ptr, utmp2);
577*bc1f688bSRobert Mustacchi             }
578*bc1f688bSRobert Mustacchi         } else if (type == LOP_SPECIAL) {
579*bc1f688bSRobert Mustacchi             /* This op code is a special op in the object, no matter
580*bc1f688bSRobert Mustacchi                that it might fall into the standard op range in this
581*bc1f688bSRobert Mustacchi                compile. That is, these are special opcodes between
582*bc1f688bSRobert Mustacchi                opcode_base and MAX_LINE_OP_CODE.  (including
583*bc1f688bSRobert Mustacchi                opcode_base and MAX_LINE_OP_CODE) */
584*bc1f688bSRobert Mustacchi 
585*bc1f688bSRobert Mustacchi             opcode = opcode - prefix.pf_opcode_base;
586*bc1f688bSRobert Mustacchi             address = address + prefix.pf_minimum_instruction_length *
587*bc1f688bSRobert Mustacchi                 (opcode / prefix.pf_line_range);
588*bc1f688bSRobert Mustacchi             line =
589*bc1f688bSRobert Mustacchi                 line + prefix.pf_line_base +
590*bc1f688bSRobert Mustacchi                 opcode % prefix.pf_line_range;
591*bc1f688bSRobert Mustacchi 
592*bc1f688bSRobert Mustacchi             if (dolines) {
593*bc1f688bSRobert Mustacchi                 curr_line =
594*bc1f688bSRobert Mustacchi                     (Dwarf_Line) _dwarf_get_alloc(dbg, DW_DLA_LINE, 1);
595*bc1f688bSRobert Mustacchi                 if (curr_line == NULL) {
596*bc1f688bSRobert Mustacchi                     dwarf_free_line_table_prefix(&prefix);
597*bc1f688bSRobert Mustacchi                     _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
598*bc1f688bSRobert Mustacchi                     return (DW_DLV_ERROR);
599*bc1f688bSRobert Mustacchi                 }
600*bc1f688bSRobert Mustacchi 
601*bc1f688bSRobert Mustacchi                 curr_line->li_address = address;
602*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_file =
603*bc1f688bSRobert Mustacchi                     (Dwarf_Sword) file;
604*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_line =
605*bc1f688bSRobert Mustacchi                     (Dwarf_Sword) line;
606*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_column =
607*bc1f688bSRobert Mustacchi                     (Dwarf_Half) column;
608*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_is_stmt = is_stmt;
609*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_basic_block =
610*bc1f688bSRobert Mustacchi                     basic_block;
611*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_end_sequence =
612*bc1f688bSRobert Mustacchi                     curr_line->li_addr_line.li_l_data.
613*bc1f688bSRobert Mustacchi                     li_epilogue_begin = epilogue_begin;
614*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_prologue_end =
615*bc1f688bSRobert Mustacchi                     prologue_end;
616*bc1f688bSRobert Mustacchi                 curr_line->li_addr_line.li_l_data.li_isa = isa;
617*bc1f688bSRobert Mustacchi                 curr_line->li_context = line_context;
618*bc1f688bSRobert Mustacchi                 line_count++;
619*bc1f688bSRobert Mustacchi 
620*bc1f688bSRobert Mustacchi                 chain_line = (Dwarf_Chain)
621*bc1f688bSRobert Mustacchi                     _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
622*bc1f688bSRobert Mustacchi                 if (chain_line == NULL) {
623*bc1f688bSRobert Mustacchi                     dwarf_free_line_table_prefix(&prefix);
624*bc1f688bSRobert Mustacchi                     _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
625*bc1f688bSRobert Mustacchi                     return (DW_DLV_ERROR);
626*bc1f688bSRobert Mustacchi                 }
627*bc1f688bSRobert Mustacchi                 chain_line->ch_item = curr_line;
628*bc1f688bSRobert Mustacchi 
629*bc1f688bSRobert Mustacchi                 if (head_chain == NULL)
630*bc1f688bSRobert Mustacchi                     head_chain = curr_chain = chain_line;
631*bc1f688bSRobert Mustacchi                 else {
632*bc1f688bSRobert Mustacchi                     curr_chain->ch_next = chain_line;
633*bc1f688bSRobert Mustacchi                     curr_chain = chain_line;
634*bc1f688bSRobert Mustacchi                 }
635*bc1f688bSRobert Mustacchi             }
636*bc1f688bSRobert Mustacchi 
637*bc1f688bSRobert Mustacchi             basic_block = false;
638*bc1f688bSRobert Mustacchi         } else if (type == LOP_STANDARD) {
639*bc1f688bSRobert Mustacchi             switch (opcode) {
640*bc1f688bSRobert Mustacchi 
641*bc1f688bSRobert Mustacchi             case DW_LNS_copy:{
642*bc1f688bSRobert Mustacchi                     if (dolines) {
643*bc1f688bSRobert Mustacchi 
644*bc1f688bSRobert Mustacchi                         curr_line =
645*bc1f688bSRobert Mustacchi                             (Dwarf_Line) _dwarf_get_alloc(dbg,
646*bc1f688bSRobert Mustacchi                                                           DW_DLA_LINE,
647*bc1f688bSRobert Mustacchi                                                           1);
648*bc1f688bSRobert Mustacchi                         if (curr_line == NULL) {
649*bc1f688bSRobert Mustacchi                             dwarf_free_line_table_prefix(&prefix);
650*bc1f688bSRobert Mustacchi                             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
651*bc1f688bSRobert Mustacchi                             return (DW_DLV_ERROR);
652*bc1f688bSRobert Mustacchi                         }
653*bc1f688bSRobert Mustacchi 
654*bc1f688bSRobert Mustacchi                         curr_line->li_address = address;
655*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_file =
656*bc1f688bSRobert Mustacchi                             (Dwarf_Sword) file;
657*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_line =
658*bc1f688bSRobert Mustacchi                             (Dwarf_Sword) line;
659*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_column =
660*bc1f688bSRobert Mustacchi                             (Dwarf_Half) column;
661*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_is_stmt =
662*bc1f688bSRobert Mustacchi                             is_stmt;
663*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
664*bc1f688bSRobert Mustacchi                             li_basic_block = basic_block;
665*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
666*bc1f688bSRobert Mustacchi                             li_end_sequence = end_sequence;
667*bc1f688bSRobert Mustacchi                         curr_line->li_context = line_context;
668*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
669*bc1f688bSRobert Mustacchi                             li_epilogue_begin = epilogue_begin;
670*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
671*bc1f688bSRobert Mustacchi                             li_prologue_end = prologue_end;
672*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_isa = isa;
673*bc1f688bSRobert Mustacchi                         line_count++;
674*bc1f688bSRobert Mustacchi 
675*bc1f688bSRobert Mustacchi                         chain_line = (Dwarf_Chain)
676*bc1f688bSRobert Mustacchi                             _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
677*bc1f688bSRobert Mustacchi                         if (chain_line == NULL) {
678*bc1f688bSRobert Mustacchi                             dwarf_free_line_table_prefix(&prefix);
679*bc1f688bSRobert Mustacchi                             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
680*bc1f688bSRobert Mustacchi                             return (DW_DLV_ERROR);
681*bc1f688bSRobert Mustacchi                         }
682*bc1f688bSRobert Mustacchi                         chain_line->ch_item = curr_line;
683*bc1f688bSRobert Mustacchi                         if (head_chain == NULL)
684*bc1f688bSRobert Mustacchi                             head_chain = curr_chain = chain_line;
685*bc1f688bSRobert Mustacchi                         else {
686*bc1f688bSRobert Mustacchi                             curr_chain->ch_next = chain_line;
687*bc1f688bSRobert Mustacchi                             curr_chain = chain_line;
688*bc1f688bSRobert Mustacchi                         }
689*bc1f688bSRobert Mustacchi                     }
690*bc1f688bSRobert Mustacchi 
691*bc1f688bSRobert Mustacchi                     basic_block = false;
692*bc1f688bSRobert Mustacchi                     prologue_end = false;
693*bc1f688bSRobert Mustacchi                     epilogue_begin = false;
694*bc1f688bSRobert Mustacchi                     break;
695*bc1f688bSRobert Mustacchi                 }
696*bc1f688bSRobert Mustacchi 
697*bc1f688bSRobert Mustacchi             case DW_LNS_advance_pc:{
698*bc1f688bSRobert Mustacchi                     Dwarf_Unsigned utmp2;
699*bc1f688bSRobert Mustacchi 
700*bc1f688bSRobert Mustacchi                     DECODE_LEB128_UWORD(line_ptr, utmp2);
701*bc1f688bSRobert Mustacchi                     leb128_num = (Dwarf_Word) utmp2;
702*bc1f688bSRobert Mustacchi                     address =
703*bc1f688bSRobert Mustacchi                         address +
704*bc1f688bSRobert Mustacchi                         prefix.pf_minimum_instruction_length *
705*bc1f688bSRobert Mustacchi                         leb128_num;
706*bc1f688bSRobert Mustacchi                     break;
707*bc1f688bSRobert Mustacchi                 }
708*bc1f688bSRobert Mustacchi 
709*bc1f688bSRobert Mustacchi             case DW_LNS_advance_line:{
710*bc1f688bSRobert Mustacchi                     Dwarf_Signed stmp;
711*bc1f688bSRobert Mustacchi 
712*bc1f688bSRobert Mustacchi                     DECODE_LEB128_SWORD(line_ptr, stmp);
713*bc1f688bSRobert Mustacchi                     advance_line = (Dwarf_Sword) stmp;
714*bc1f688bSRobert Mustacchi                     line = line + advance_line;
715*bc1f688bSRobert Mustacchi                     break;
716*bc1f688bSRobert Mustacchi                 }
717*bc1f688bSRobert Mustacchi 
718*bc1f688bSRobert Mustacchi             case DW_LNS_set_file:{
719*bc1f688bSRobert Mustacchi                     Dwarf_Unsigned utmp2;
720*bc1f688bSRobert Mustacchi 
721*bc1f688bSRobert Mustacchi                     DECODE_LEB128_UWORD(line_ptr, utmp2);
722*bc1f688bSRobert Mustacchi                     file = (Dwarf_Word) utmp2;
723*bc1f688bSRobert Mustacchi                     break;
724*bc1f688bSRobert Mustacchi                 }
725*bc1f688bSRobert Mustacchi 
726*bc1f688bSRobert Mustacchi             case DW_LNS_set_column:{
727*bc1f688bSRobert Mustacchi                     Dwarf_Unsigned utmp2;
728*bc1f688bSRobert Mustacchi 
729*bc1f688bSRobert Mustacchi                     DECODE_LEB128_UWORD(line_ptr, utmp2);
730*bc1f688bSRobert Mustacchi                     column = (Dwarf_Word) utmp2;
731*bc1f688bSRobert Mustacchi                     break;
732*bc1f688bSRobert Mustacchi                 }
733*bc1f688bSRobert Mustacchi 
734*bc1f688bSRobert Mustacchi             case DW_LNS_negate_stmt:{
735*bc1f688bSRobert Mustacchi 
736*bc1f688bSRobert Mustacchi                     is_stmt = !is_stmt;
737*bc1f688bSRobert Mustacchi                     break;
738*bc1f688bSRobert Mustacchi                 }
739*bc1f688bSRobert Mustacchi 
740*bc1f688bSRobert Mustacchi             case DW_LNS_set_basic_block:{
741*bc1f688bSRobert Mustacchi 
742*bc1f688bSRobert Mustacchi                     basic_block = true;
743*bc1f688bSRobert Mustacchi                     break;
744*bc1f688bSRobert Mustacchi                 }
745*bc1f688bSRobert Mustacchi 
746*bc1f688bSRobert Mustacchi             case DW_LNS_const_add_pc:{
747*bc1f688bSRobert Mustacchi                     opcode = MAX_LINE_OP_CODE - prefix.pf_opcode_base;
748*bc1f688bSRobert Mustacchi                     address = address +
749*bc1f688bSRobert Mustacchi                         prefix.pf_minimum_instruction_length * (opcode /
750*bc1f688bSRobert Mustacchi                             prefix.
751*bc1f688bSRobert Mustacchi                             pf_line_range);
752*bc1f688bSRobert Mustacchi                     break;
753*bc1f688bSRobert Mustacchi                 }
754*bc1f688bSRobert Mustacchi 
755*bc1f688bSRobert Mustacchi             case DW_LNS_fixed_advance_pc:{
756*bc1f688bSRobert Mustacchi 
757*bc1f688bSRobert Mustacchi                     READ_UNALIGNED(dbg, fixed_advance_pc, Dwarf_Half,
758*bc1f688bSRobert Mustacchi                                    line_ptr, sizeof(Dwarf_Half));
759*bc1f688bSRobert Mustacchi                     line_ptr += sizeof(Dwarf_Half);
760*bc1f688bSRobert Mustacchi                     address = address + fixed_advance_pc;
761*bc1f688bSRobert Mustacchi                     break;
762*bc1f688bSRobert Mustacchi                 }
763*bc1f688bSRobert Mustacchi 
764*bc1f688bSRobert Mustacchi                 /* New in DWARF3 */
765*bc1f688bSRobert Mustacchi             case DW_LNS_set_prologue_end:{
766*bc1f688bSRobert Mustacchi 
767*bc1f688bSRobert Mustacchi                     prologue_end = true;
768*bc1f688bSRobert Mustacchi                     break;
769*bc1f688bSRobert Mustacchi 
770*bc1f688bSRobert Mustacchi 
771*bc1f688bSRobert Mustacchi                 }
772*bc1f688bSRobert Mustacchi                 /* New in DWARF3 */
773*bc1f688bSRobert Mustacchi             case DW_LNS_set_epilogue_begin:{
774*bc1f688bSRobert Mustacchi                     epilogue_begin = true;
775*bc1f688bSRobert Mustacchi                     break;
776*bc1f688bSRobert Mustacchi                 }
777*bc1f688bSRobert Mustacchi 
778*bc1f688bSRobert Mustacchi                 /* New in DWARF3 */
779*bc1f688bSRobert Mustacchi             case DW_LNS_set_isa:{
780*bc1f688bSRobert Mustacchi                     Dwarf_Unsigned utmp2;
781*bc1f688bSRobert Mustacchi 
782*bc1f688bSRobert Mustacchi                     DECODE_LEB128_UWORD(line_ptr, utmp2);
783*bc1f688bSRobert Mustacchi                     isa = utmp2;
784*bc1f688bSRobert Mustacchi                     if (isa != utmp2) {
785*bc1f688bSRobert Mustacchi                         /* The value of the isa did not fit in our
786*bc1f688bSRobert Mustacchi                            local so we record it wrong. declare an
787*bc1f688bSRobert Mustacchi                            error. */
788*bc1f688bSRobert Mustacchi                         dwarf_free_line_table_prefix(&prefix);
789*bc1f688bSRobert Mustacchi 
790*bc1f688bSRobert Mustacchi                         _dwarf_error(dbg, error,
791*bc1f688bSRobert Mustacchi                                      DW_DLE_LINE_NUM_OPERANDS_BAD);
792*bc1f688bSRobert Mustacchi                         return (DW_DLV_ERROR);
793*bc1f688bSRobert Mustacchi                     }
794*bc1f688bSRobert Mustacchi                     break;
795*bc1f688bSRobert Mustacchi                 }
796*bc1f688bSRobert Mustacchi             }
797*bc1f688bSRobert Mustacchi 
798*bc1f688bSRobert Mustacchi         } else if (type == LOP_EXTENDED) {
799*bc1f688bSRobert Mustacchi             Dwarf_Unsigned utmp3;
800*bc1f688bSRobert Mustacchi 
801*bc1f688bSRobert Mustacchi             DECODE_LEB128_UWORD(line_ptr, utmp3);
802*bc1f688bSRobert Mustacchi             instr_length = (Dwarf_Word) utmp3;
803*bc1f688bSRobert Mustacchi             /* Dwarf_Small is a ubyte and the extended opcode is a
804*bc1f688bSRobert Mustacchi                ubyte, though not stated as clearly in the 2.0.0 spec as
805*bc1f688bSRobert Mustacchi                one might hope. */
806*bc1f688bSRobert Mustacchi             ext_opcode = *(Dwarf_Small *) line_ptr;
807*bc1f688bSRobert Mustacchi             line_ptr++;
808*bc1f688bSRobert Mustacchi             switch (ext_opcode) {
809*bc1f688bSRobert Mustacchi 
810*bc1f688bSRobert Mustacchi             case DW_LNE_end_sequence:{
811*bc1f688bSRobert Mustacchi                     end_sequence = true;
812*bc1f688bSRobert Mustacchi 
813*bc1f688bSRobert Mustacchi                     if (dolines) {
814*bc1f688bSRobert Mustacchi                         curr_line = (Dwarf_Line)
815*bc1f688bSRobert Mustacchi                             _dwarf_get_alloc(dbg, DW_DLA_LINE, 1);
816*bc1f688bSRobert Mustacchi                         if (curr_line == NULL) {
817*bc1f688bSRobert Mustacchi                             dwarf_free_line_table_prefix(&prefix);
818*bc1f688bSRobert Mustacchi                             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
819*bc1f688bSRobert Mustacchi                             return (DW_DLV_ERROR);
820*bc1f688bSRobert Mustacchi                         }
821*bc1f688bSRobert Mustacchi 
822*bc1f688bSRobert Mustacchi                         curr_line->li_address = address;
823*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_file =
824*bc1f688bSRobert Mustacchi                             (Dwarf_Sword) file;
825*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_line =
826*bc1f688bSRobert Mustacchi                             (Dwarf_Sword) line;
827*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_column =
828*bc1f688bSRobert Mustacchi                             (Dwarf_Half) column;
829*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_is_stmt =
830*bc1f688bSRobert Mustacchi                             prefix.pf_default_is_stmt;
831*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
832*bc1f688bSRobert Mustacchi                             li_basic_block = basic_block;
833*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
834*bc1f688bSRobert Mustacchi                             li_end_sequence = end_sequence;
835*bc1f688bSRobert Mustacchi                         curr_line->li_context = line_context;
836*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
837*bc1f688bSRobert Mustacchi                             li_epilogue_begin = epilogue_begin;
838*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.
839*bc1f688bSRobert Mustacchi                             li_prologue_end = prologue_end;
840*bc1f688bSRobert Mustacchi                         curr_line->li_addr_line.li_l_data.li_isa = isa;
841*bc1f688bSRobert Mustacchi                         line_count++;
842*bc1f688bSRobert Mustacchi 
843*bc1f688bSRobert Mustacchi                         chain_line = (Dwarf_Chain)
844*bc1f688bSRobert Mustacchi                             _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
845*bc1f688bSRobert Mustacchi                         if (chain_line == NULL) {
846*bc1f688bSRobert Mustacchi                             dwarf_free_line_table_prefix(&prefix);
847*bc1f688bSRobert Mustacchi                             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
848*bc1f688bSRobert Mustacchi                             return (DW_DLV_ERROR);
849*bc1f688bSRobert Mustacchi                         }
850*bc1f688bSRobert Mustacchi                         chain_line->ch_item = curr_line;
851*bc1f688bSRobert Mustacchi 
852*bc1f688bSRobert Mustacchi                         if (head_chain == NULL)
853*bc1f688bSRobert Mustacchi                             head_chain = curr_chain = chain_line;
854*bc1f688bSRobert Mustacchi                         else {
855*bc1f688bSRobert Mustacchi                             curr_chain->ch_next = chain_line;
856*bc1f688bSRobert Mustacchi                             curr_chain = chain_line;
857*bc1f688bSRobert Mustacchi                         }
858*bc1f688bSRobert Mustacchi                     }
859*bc1f688bSRobert Mustacchi 
860*bc1f688bSRobert Mustacchi                     address = 0;
861*bc1f688bSRobert Mustacchi                     file = 1;
862*bc1f688bSRobert Mustacchi                     line = 1;
863*bc1f688bSRobert Mustacchi                     column = 0;
864*bc1f688bSRobert Mustacchi                     is_stmt = prefix.pf_default_is_stmt;
865*bc1f688bSRobert Mustacchi                     basic_block = false;
866*bc1f688bSRobert Mustacchi                     end_sequence = false;
867*bc1f688bSRobert Mustacchi                     prologue_end = false;
868*bc1f688bSRobert Mustacchi                     epilogue_begin = false;
869*bc1f688bSRobert Mustacchi 
870*bc1f688bSRobert Mustacchi 
871*bc1f688bSRobert Mustacchi                     break;
872*bc1f688bSRobert Mustacchi                 }
873*bc1f688bSRobert Mustacchi 
874*bc1f688bSRobert Mustacchi             case DW_LNE_set_address:{
875*bc1f688bSRobert Mustacchi                     {
876*bc1f688bSRobert Mustacchi                         READ_UNALIGNED(dbg, address, Dwarf_Addr,
877*bc1f688bSRobert Mustacchi                                        line_ptr, address_size);
878*bc1f688bSRobert Mustacchi                         if (doaddrs) {
879*bc1f688bSRobert Mustacchi                             curr_line =
880*bc1f688bSRobert Mustacchi                                 (Dwarf_Line) _dwarf_get_alloc(dbg,
881*bc1f688bSRobert Mustacchi                                                               DW_DLA_LINE,
882*bc1f688bSRobert Mustacchi                                                               1);
883*bc1f688bSRobert Mustacchi                             if (curr_line == NULL) {
884*bc1f688bSRobert Mustacchi                                 dwarf_free_line_table_prefix(&prefix);
885*bc1f688bSRobert Mustacchi                                 _dwarf_error(dbg, error,
886*bc1f688bSRobert Mustacchi                                              DW_DLE_ALLOC_FAIL);
887*bc1f688bSRobert Mustacchi                                 return (DW_DLV_ERROR);
888*bc1f688bSRobert Mustacchi                             }
889*bc1f688bSRobert Mustacchi 
890*bc1f688bSRobert Mustacchi                             curr_line->li_address = address;
891*bc1f688bSRobert Mustacchi                             curr_line->li_addr_line.li_offset =
892*bc1f688bSRobert Mustacchi                                 line_ptr - dbg->de_debug_line.dss_data;
893*bc1f688bSRobert Mustacchi 
894*bc1f688bSRobert Mustacchi                             line_count++;
895*bc1f688bSRobert Mustacchi 
896*bc1f688bSRobert Mustacchi                             chain_line = (Dwarf_Chain)
897*bc1f688bSRobert Mustacchi                                 _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
898*bc1f688bSRobert Mustacchi                             if (chain_line == NULL) {
899*bc1f688bSRobert Mustacchi                                 dwarf_free_line_table_prefix(&prefix);
900*bc1f688bSRobert Mustacchi                                 _dwarf_error(dbg, error,
901*bc1f688bSRobert Mustacchi                                              DW_DLE_ALLOC_FAIL);
902*bc1f688bSRobert Mustacchi                                 return (DW_DLV_ERROR);
903*bc1f688bSRobert Mustacchi                             }
904*bc1f688bSRobert Mustacchi                             chain_line->ch_item = curr_line;
905*bc1f688bSRobert Mustacchi 
906*bc1f688bSRobert Mustacchi                             if (head_chain == NULL)
907*bc1f688bSRobert Mustacchi                                 head_chain = curr_chain = chain_line;
908*bc1f688bSRobert Mustacchi                             else {
909*bc1f688bSRobert Mustacchi                                 curr_chain->ch_next = chain_line;
910*bc1f688bSRobert Mustacchi                                 curr_chain = chain_line;
911*bc1f688bSRobert Mustacchi                             }
912*bc1f688bSRobert Mustacchi                         }
913*bc1f688bSRobert Mustacchi 
914*bc1f688bSRobert Mustacchi                         line_ptr += address_size;
915*bc1f688bSRobert Mustacchi                     }
916*bc1f688bSRobert Mustacchi 
917*bc1f688bSRobert Mustacchi                     break;
918*bc1f688bSRobert Mustacchi                 }
919*bc1f688bSRobert Mustacchi 
920*bc1f688bSRobert Mustacchi             case DW_LNE_define_file:{
921*bc1f688bSRobert Mustacchi 
922*bc1f688bSRobert Mustacchi                     if (dolines) {
923*bc1f688bSRobert Mustacchi                         cur_file_entry = (Dwarf_File_Entry)
924*bc1f688bSRobert Mustacchi                             _dwarf_get_alloc(dbg, DW_DLA_FILE_ENTRY, 1);
925*bc1f688bSRobert Mustacchi                         if (cur_file_entry == NULL) {
926*bc1f688bSRobert Mustacchi                             dwarf_free_line_table_prefix(&prefix);
927*bc1f688bSRobert Mustacchi                             _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
928*bc1f688bSRobert Mustacchi                             return (DW_DLV_ERROR);
929*bc1f688bSRobert Mustacchi                         }
930*bc1f688bSRobert Mustacchi 
931*bc1f688bSRobert Mustacchi                         cur_file_entry->fi_file_name =
932*bc1f688bSRobert Mustacchi                             (Dwarf_Small *) line_ptr;
933*bc1f688bSRobert Mustacchi                         line_ptr =
934*bc1f688bSRobert Mustacchi                             line_ptr + strlen((char *) line_ptr) + 1;
935*bc1f688bSRobert Mustacchi 
936*bc1f688bSRobert Mustacchi                         cur_file_entry->fi_dir_index = (Dwarf_Sword)
937*bc1f688bSRobert Mustacchi                             _dwarf_decode_u_leb128(line_ptr,
938*bc1f688bSRobert Mustacchi                                                    &leb128_length);
939*bc1f688bSRobert Mustacchi                         line_ptr = line_ptr + leb128_length;
940*bc1f688bSRobert Mustacchi 
941*bc1f688bSRobert Mustacchi                         cur_file_entry->fi_time_last_mod =
942*bc1f688bSRobert Mustacchi                             _dwarf_decode_u_leb128(line_ptr,
943*bc1f688bSRobert Mustacchi                                                    &leb128_length);
944*bc1f688bSRobert Mustacchi                         line_ptr = line_ptr + leb128_length;
945*bc1f688bSRobert Mustacchi 
946*bc1f688bSRobert Mustacchi                         cur_file_entry->fi_file_length =
947*bc1f688bSRobert Mustacchi                             _dwarf_decode_u_leb128(line_ptr,
948*bc1f688bSRobert Mustacchi                                                    &leb128_length);
949*bc1f688bSRobert Mustacchi                         line_ptr = line_ptr + leb128_length;
950*bc1f688bSRobert Mustacchi 
951*bc1f688bSRobert Mustacchi                         if (file_entries == NULL)
952*bc1f688bSRobert Mustacchi                             file_entries = cur_file_entry;
953*bc1f688bSRobert Mustacchi                         else
954*bc1f688bSRobert Mustacchi                             prev_file_entry->fi_next = cur_file_entry;
955*bc1f688bSRobert Mustacchi                         prev_file_entry = cur_file_entry;
956*bc1f688bSRobert Mustacchi 
957*bc1f688bSRobert Mustacchi                         file_entry_count++;
958*bc1f688bSRobert Mustacchi                     }
959*bc1f688bSRobert Mustacchi                     break;
960*bc1f688bSRobert Mustacchi                 }
961*bc1f688bSRobert Mustacchi 
962*bc1f688bSRobert Mustacchi             default:{
963*bc1f688bSRobert Mustacchi                  /* This is an extended op code we do not know about,
964*bc1f688bSRobert Mustacchi                     other than we know now many bytes it is
965*bc1f688bSRobert Mustacchi                     and the op code and the bytes of operand. */
966*bc1f688bSRobert Mustacchi                  Dwarf_Unsigned remaining_bytes = instr_length -1;
967*bc1f688bSRobert Mustacchi                  if(instr_length < 1 || remaining_bytes > DW_LNE_LEN_MAX) {
968*bc1f688bSRobert Mustacchi                       dwarf_free_line_table_prefix(&prefix);
969*bc1f688bSRobert Mustacchi                       _dwarf_error(dbg, error,
970*bc1f688bSRobert Mustacchi                                  DW_DLE_LINE_EXT_OPCODE_BAD);
971*bc1f688bSRobert Mustacchi                       return (DW_DLV_ERROR);
972*bc1f688bSRobert Mustacchi                  }
973*bc1f688bSRobert Mustacchi                  line_ptr += remaining_bytes;
974*bc1f688bSRobert Mustacchi                  break;
975*bc1f688bSRobert Mustacchi                 }
976*bc1f688bSRobert Mustacchi             }
977*bc1f688bSRobert Mustacchi 
978*bc1f688bSRobert Mustacchi         }
979*bc1f688bSRobert Mustacchi     }
980*bc1f688bSRobert Mustacchi 
981*bc1f688bSRobert Mustacchi     block_line = (Dwarf_Line *)
982*bc1f688bSRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LIST, line_count);
983*bc1f688bSRobert Mustacchi     if (block_line == NULL) {
984*bc1f688bSRobert Mustacchi         dwarf_free_line_table_prefix(&prefix);
985*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
986*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
987*bc1f688bSRobert Mustacchi     }
988*bc1f688bSRobert Mustacchi 
989*bc1f688bSRobert Mustacchi     curr_chain = head_chain;
990*bc1f688bSRobert Mustacchi     for (i = 0; i < line_count; i++) {
991*bc1f688bSRobert Mustacchi         *(block_line + i) = curr_chain->ch_item;
992*bc1f688bSRobert Mustacchi         head_chain = curr_chain;
993*bc1f688bSRobert Mustacchi         curr_chain = curr_chain->ch_next;
994*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, head_chain, DW_DLA_CHAIN);
995*bc1f688bSRobert Mustacchi     }
996*bc1f688bSRobert Mustacchi 
997*bc1f688bSRobert Mustacchi     line_context->lc_file_entries = file_entries;
998*bc1f688bSRobert Mustacchi     line_context->lc_file_entry_count = file_entry_count;
999*bc1f688bSRobert Mustacchi     line_context->lc_include_directories_count =
1000*bc1f688bSRobert Mustacchi         prefix.pf_include_directories_count;
1001*bc1f688bSRobert Mustacchi     if (prefix.pf_include_directories_count > 0) {
1002*bc1f688bSRobert Mustacchi         /* This gets a pointer to the *first* include dir. The others
1003*bc1f688bSRobert Mustacchi            follow directly with the standard DWARF2/3 NUL byte
1004*bc1f688bSRobert Mustacchi            following the last. */
1005*bc1f688bSRobert Mustacchi         line_context->lc_include_directories =
1006*bc1f688bSRobert Mustacchi             prefix.pf_include_directories[0];
1007*bc1f688bSRobert Mustacchi     }
1008*bc1f688bSRobert Mustacchi 
1009*bc1f688bSRobert Mustacchi     line_context->lc_line_count = line_count;
1010*bc1f688bSRobert Mustacchi     line_context->lc_compilation_directory = comp_dir;
1011*bc1f688bSRobert Mustacchi     line_context->lc_version_number = prefix.pf_version;
1012*bc1f688bSRobert Mustacchi     line_context->lc_dbg = dbg;
1013*bc1f688bSRobert Mustacchi     *count = line_count;
1014*bc1f688bSRobert Mustacchi 
1015*bc1f688bSRobert Mustacchi     *linebuf = block_line;
1016*bc1f688bSRobert Mustacchi     dwarf_free_line_table_prefix(&prefix);
1017*bc1f688bSRobert Mustacchi     return (DW_DLV_OK);
1018*bc1f688bSRobert Mustacchi }
1019*bc1f688bSRobert Mustacchi 
1020*bc1f688bSRobert Mustacchi int
1021*bc1f688bSRobert Mustacchi dwarf_srclines(Dwarf_Die die,
1022*bc1f688bSRobert Mustacchi                Dwarf_Line ** linebuf,
1023*bc1f688bSRobert Mustacchi                Dwarf_Signed * linecount, Dwarf_Error * error)
1024*bc1f688bSRobert Mustacchi {
1025*bc1f688bSRobert Mustacchi     Dwarf_Signed count = 0;
1026*bc1f688bSRobert Mustacchi     int res  = _dwarf_internal_srclines(die, linebuf, &count,
1027*bc1f688bSRobert Mustacchi         /* addrlist= */ false,
1028*bc1f688bSRobert Mustacchi         /* linelist= */ true, error);
1029*bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
1030*bc1f688bSRobert Mustacchi         return res;
1031*bc1f688bSRobert Mustacchi     }
1032*bc1f688bSRobert Mustacchi     *linecount = count;
1033*bc1f688bSRobert Mustacchi     return res;
1034*bc1f688bSRobert Mustacchi }
1035*bc1f688bSRobert Mustacchi 
1036*bc1f688bSRobert Mustacchi 
1037*bc1f688bSRobert Mustacchi 
1038*bc1f688bSRobert Mustacchi /* Every line table entry (except DW_DLE_end_sequence,
1039*bc1f688bSRobert Mustacchi    which is returned using dwarf_lineendsequence())
1040*bc1f688bSRobert Mustacchi    potentially has the begin-statement
1041*bc1f688bSRobert Mustacchi    flag marked 'on'.   This returns thru *return_bool,
1042*bc1f688bSRobert Mustacchi    the begin-statement flag.
1043*bc1f688bSRobert Mustacchi */
1044*bc1f688bSRobert Mustacchi 
1045*bc1f688bSRobert Mustacchi int
1046*bc1f688bSRobert Mustacchi dwarf_linebeginstatement(Dwarf_Line line,
1047*bc1f688bSRobert Mustacchi     Dwarf_Bool * return_bool, Dwarf_Error * error)
1048*bc1f688bSRobert Mustacchi {
1049*bc1f688bSRobert Mustacchi     if (line == NULL || return_bool == 0) {
1050*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1051*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1052*bc1f688bSRobert Mustacchi     }
1053*bc1f688bSRobert Mustacchi 
1054*bc1f688bSRobert Mustacchi     *return_bool = (line->li_addr_line.li_l_data.li_is_stmt);
1055*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1056*bc1f688bSRobert Mustacchi }
1057*bc1f688bSRobert Mustacchi 
1058*bc1f688bSRobert Mustacchi /* At the end of any contiguous line-table there may be
1059*bc1f688bSRobert Mustacchi    a DW_LNE_end_sequence operator.
1060*bc1f688bSRobert Mustacchi    This returns non-zero thru *return_bool
1061*bc1f688bSRobert Mustacchi    if and only if this 'line' entry was a DW_LNE_end_sequence.
1062*bc1f688bSRobert Mustacchi 
1063*bc1f688bSRobert Mustacchi    Within a compilation unit or function there may be multiple
1064*bc1f688bSRobert Mustacchi    line tables, each ending with a DW_LNE_end_sequence.
1065*bc1f688bSRobert Mustacchi    Each table describes a contiguous region.
1066*bc1f688bSRobert Mustacchi    Because compilers may split function code up in arbitrary ways
1067*bc1f688bSRobert Mustacchi    compilers may need to emit multiple contigous regions (ie
1068*bc1f688bSRobert Mustacchi    line tables) for a single function.
1069*bc1f688bSRobert Mustacchi    See the DWARF3 spec section 6.2.
1070*bc1f688bSRobert Mustacchi */
1071*bc1f688bSRobert Mustacchi int
1072*bc1f688bSRobert Mustacchi dwarf_lineendsequence(Dwarf_Line line,
1073*bc1f688bSRobert Mustacchi     Dwarf_Bool * return_bool, Dwarf_Error * error)
1074*bc1f688bSRobert Mustacchi {
1075*bc1f688bSRobert Mustacchi     if (line == NULL) {
1076*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1077*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1078*bc1f688bSRobert Mustacchi     }
1079*bc1f688bSRobert Mustacchi 
1080*bc1f688bSRobert Mustacchi     *return_bool = (line->li_addr_line.li_l_data.li_end_sequence);
1081*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1082*bc1f688bSRobert Mustacchi }
1083*bc1f688bSRobert Mustacchi 
1084*bc1f688bSRobert Mustacchi 
1085*bc1f688bSRobert Mustacchi /* Each 'line' entry has a line-number.
1086*bc1f688bSRobert Mustacchi    If the entry is a DW_LNE_end_sequence the line-number is
1087*bc1f688bSRobert Mustacchi    meaningless (see dwarf_lineendsequence(), just above).
1088*bc1f688bSRobert Mustacchi */
1089*bc1f688bSRobert Mustacchi int
1090*bc1f688bSRobert Mustacchi dwarf_lineno(Dwarf_Line line,
1091*bc1f688bSRobert Mustacchi     Dwarf_Unsigned * ret_lineno, Dwarf_Error * error)
1092*bc1f688bSRobert Mustacchi {
1093*bc1f688bSRobert Mustacchi     if (line == NULL || ret_lineno == 0) {
1094*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1095*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1096*bc1f688bSRobert Mustacchi     }
1097*bc1f688bSRobert Mustacchi 
1098*bc1f688bSRobert Mustacchi     *ret_lineno = (line->li_addr_line.li_l_data.li_line);
1099*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1100*bc1f688bSRobert Mustacchi }
1101*bc1f688bSRobert Mustacchi 
1102*bc1f688bSRobert Mustacchi /* Each 'line' entry has a file-number, and index into the file table.
1103*bc1f688bSRobert Mustacchi    If the entry is a DW_LNE_end_sequence the index is
1104*bc1f688bSRobert Mustacchi    meaningless (see dwarf_lineendsequence(), just above).
1105*bc1f688bSRobert Mustacchi    The file number returned is an index into the file table
1106*bc1f688bSRobert Mustacchi    produced by dwarf_srcfiles(), but care is required: the
1107*bc1f688bSRobert Mustacchi    li_file begins with 1 for real files, so that the li_file returned here
1108*bc1f688bSRobert Mustacchi    is 1 greater than its index into the dwarf_srcfiles() output array.
1109*bc1f688bSRobert Mustacchi    And entries from DW_LNE_define_file don't appear in
1110*bc1f688bSRobert Mustacchi    the dwarf_srcfiles() output so file indexes from here may exceed
1111*bc1f688bSRobert Mustacchi    the size of the dwarf_srcfiles() output array size.
1112*bc1f688bSRobert Mustacchi */
1113*bc1f688bSRobert Mustacchi int
1114*bc1f688bSRobert Mustacchi dwarf_line_srcfileno(Dwarf_Line line,
1115*bc1f688bSRobert Mustacchi     Dwarf_Unsigned * ret_fileno, Dwarf_Error * error)
1116*bc1f688bSRobert Mustacchi {
1117*bc1f688bSRobert Mustacchi     if (line == NULL || ret_fileno == 0) {
1118*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1119*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1120*bc1f688bSRobert Mustacchi     }
1121*bc1f688bSRobert Mustacchi     /* li_file must be <= line->li_context->lc_file_entry_count else it
1122*bc1f688bSRobert Mustacchi        is trash. li_file 0 means not attributable to any source file
1123*bc1f688bSRobert Mustacchi        per dwarf2/3 spec. */
1124*bc1f688bSRobert Mustacchi 
1125*bc1f688bSRobert Mustacchi     *ret_fileno = (line->li_addr_line.li_l_data.li_file);
1126*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1127*bc1f688bSRobert Mustacchi }
1128*bc1f688bSRobert Mustacchi 
1129*bc1f688bSRobert Mustacchi 
1130*bc1f688bSRobert Mustacchi /* Each 'line' entry has a line-address.
1131*bc1f688bSRobert Mustacchi    If the entry is a DW_LNE_end_sequence the adddress
1132*bc1f688bSRobert Mustacchi    is one-beyond the last address this contigous region
1133*bc1f688bSRobert Mustacchi    covers, so the address is not inside the region,
1134*bc1f688bSRobert Mustacchi    but is just outside it.
1135*bc1f688bSRobert Mustacchi */
1136*bc1f688bSRobert Mustacchi int
1137*bc1f688bSRobert Mustacchi dwarf_lineaddr(Dwarf_Line line,
1138*bc1f688bSRobert Mustacchi     Dwarf_Addr * ret_lineaddr, Dwarf_Error * error)
1139*bc1f688bSRobert Mustacchi {
1140*bc1f688bSRobert Mustacchi     if (line == NULL || ret_lineaddr == 0) {
1141*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1142*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1143*bc1f688bSRobert Mustacchi     }
1144*bc1f688bSRobert Mustacchi 
1145*bc1f688bSRobert Mustacchi     *ret_lineaddr = (line->li_address);
1146*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1147*bc1f688bSRobert Mustacchi }
1148*bc1f688bSRobert Mustacchi 
1149*bc1f688bSRobert Mustacchi 
1150*bc1f688bSRobert Mustacchi /* Each 'line' entry has a column-within-line (offset
1151*bc1f688bSRobert Mustacchi    within the line) where the
1152*bc1f688bSRobert Mustacchi    source text begins.
1153*bc1f688bSRobert Mustacchi    If the entry is a DW_LNE_end_sequence the line-number is
1154*bc1f688bSRobert Mustacchi    meaningless (see dwarf_lineendsequence(), just above).
1155*bc1f688bSRobert Mustacchi    Lines of text begin at column 1.  The value 0
1156*bc1f688bSRobert Mustacchi    means the line begins at the left edge of the line.
1157*bc1f688bSRobert Mustacchi    (See the DWARF3 spec, section 6.2.2).
1158*bc1f688bSRobert Mustacchi */
1159*bc1f688bSRobert Mustacchi int
1160*bc1f688bSRobert Mustacchi dwarf_lineoff(Dwarf_Line line,
1161*bc1f688bSRobert Mustacchi     Dwarf_Signed * ret_lineoff, Dwarf_Error * error)
1162*bc1f688bSRobert Mustacchi {
1163*bc1f688bSRobert Mustacchi     if (line == NULL || ret_lineoff == 0) {
1164*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1165*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1166*bc1f688bSRobert Mustacchi     }
1167*bc1f688bSRobert Mustacchi 
1168*bc1f688bSRobert Mustacchi     *ret_lineoff =
1169*bc1f688bSRobert Mustacchi         (line->li_addr_line.li_l_data.li_column ==
1170*bc1f688bSRobert Mustacchi          0 ? -1 : line->li_addr_line.li_l_data.li_column);
1171*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1172*bc1f688bSRobert Mustacchi }
1173*bc1f688bSRobert Mustacchi 
1174*bc1f688bSRobert Mustacchi 
1175*bc1f688bSRobert Mustacchi int
1176*bc1f688bSRobert Mustacchi dwarf_linesrc(Dwarf_Line line, char **ret_linesrc, Dwarf_Error * error)
1177*bc1f688bSRobert Mustacchi {
1178*bc1f688bSRobert Mustacchi     Dwarf_Signed i = 0;
1179*bc1f688bSRobert Mustacchi     Dwarf_File_Entry file_entry;
1180*bc1f688bSRobert Mustacchi     Dwarf_Small *name_buffer = 0;
1181*bc1f688bSRobert Mustacchi     Dwarf_Small *include_directories = 0;
1182*bc1f688bSRobert Mustacchi     Dwarf_Small include_direc_full_path = 0;
1183*bc1f688bSRobert Mustacchi     Dwarf_Small file_name_full_path = 0;
1184*bc1f688bSRobert Mustacchi     Dwarf_Debug dbg = 0;
1185*bc1f688bSRobert Mustacchi     unsigned int comp_dir_len = 0;
1186*bc1f688bSRobert Mustacchi 
1187*bc1f688bSRobert Mustacchi     if (line == NULL) {
1188*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1189*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1190*bc1f688bSRobert Mustacchi     }
1191*bc1f688bSRobert Mustacchi 
1192*bc1f688bSRobert Mustacchi     if (line->li_context == NULL) {
1193*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_LINE_CONTEXT_NULL);
1194*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1195*bc1f688bSRobert Mustacchi     }
1196*bc1f688bSRobert Mustacchi     dbg = line->li_context->lc_dbg;
1197*bc1f688bSRobert Mustacchi 
1198*bc1f688bSRobert Mustacchi     if (line->li_addr_line.li_l_data.li_file >
1199*bc1f688bSRobert Mustacchi         line->li_context->lc_file_entry_count) {
1200*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LINE_FILE_NUM_BAD);
1201*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1202*bc1f688bSRobert Mustacchi     }
1203*bc1f688bSRobert Mustacchi 
1204*bc1f688bSRobert Mustacchi     if (line->li_addr_line.li_l_data.li_file == 0) {
1205*bc1f688bSRobert Mustacchi         /* No file name known: see dwarf2/3 spec. */
1206*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME);
1207*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1208*bc1f688bSRobert Mustacchi     }
1209*bc1f688bSRobert Mustacchi     file_entry = line->li_context->lc_file_entries;
1210*bc1f688bSRobert Mustacchi     /* ASSERT: li_file > 0, dwarf correctness issue, see line table
1211*bc1f688bSRobert Mustacchi        definition of dwarf2/3 spec. */
1212*bc1f688bSRobert Mustacchi     /* Example: if li_file is 2 and lc_file_entry_count is 3,
1213*bc1f688bSRobert Mustacchi        file_entry is file 3 (1 based), aka 2( 0 based) file_entry->next
1214*bc1f688bSRobert Mustacchi        is file 2 (1 based), aka 1( 0 based) file_entry->next->next is
1215*bc1f688bSRobert Mustacchi        file 1 (1 based), aka 0( 0 based) file_entry->next->next->next
1216*bc1f688bSRobert Mustacchi        is NULL.
1217*bc1f688bSRobert Mustacchi 
1218*bc1f688bSRobert Mustacchi        and this loop finds the file_entry we need (2 (1 based) in this
1219*bc1f688bSRobert Mustacchi        case). Because lc_file_entries are in reverse order and
1220*bc1f688bSRobert Mustacchi        effectively zero based as a count whereas li_file is 1 based. */
1221*bc1f688bSRobert Mustacchi     for (i = line->li_addr_line.li_l_data.li_file - 1; i > 0; i--)
1222*bc1f688bSRobert Mustacchi         file_entry = file_entry->fi_next;
1223*bc1f688bSRobert Mustacchi 
1224*bc1f688bSRobert Mustacchi     if (file_entry->fi_file_name == NULL) {
1225*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_NO_FILE_NAME);
1226*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1227*bc1f688bSRobert Mustacchi     }
1228*bc1f688bSRobert Mustacchi 
1229*bc1f688bSRobert Mustacchi     file_name_full_path = file_name_is_full_path(file_entry->fi_file_name);
1230*bc1f688bSRobert Mustacchi     if (file_name_full_path) {
1231*bc1f688bSRobert Mustacchi         *ret_linesrc = ((char *) file_entry->fi_file_name);
1232*bc1f688bSRobert Mustacchi         return DW_DLV_OK;
1233*bc1f688bSRobert Mustacchi     }
1234*bc1f688bSRobert Mustacchi 
1235*bc1f688bSRobert Mustacchi     if (file_entry->fi_dir_index == 0) {
1236*bc1f688bSRobert Mustacchi 
1237*bc1f688bSRobert Mustacchi         /* dir_index of 0 means that the compilation was in the
1238*bc1f688bSRobert Mustacchi            'current directory of compilation' */
1239*bc1f688bSRobert Mustacchi         if (line->li_context->lc_compilation_directory == NULL) {
1240*bc1f688bSRobert Mustacchi             /* we don't actually *have* a current directory of
1241*bc1f688bSRobert Mustacchi                compilation: DW_AT_comp_dir was not present Rather than
1242*bc1f688bSRobert Mustacchi                emitting DW_DLE_NO_COMP_DIR lets just make an empty name
1243*bc1f688bSRobert Mustacchi                here. In other words, do the best we can with what we do
1244*bc1f688bSRobert Mustacchi                have instead of reporting an error. _dwarf_error(dbg,
1245*bc1f688bSRobert Mustacchi                error, DW_DLE_NO_COMP_DIR); return(DW_DLV_ERROR); */
1246*bc1f688bSRobert Mustacchi             comp_dir_len = 0;
1247*bc1f688bSRobert Mustacchi         } else {
1248*bc1f688bSRobert Mustacchi             comp_dir_len = strlen((char *)
1249*bc1f688bSRobert Mustacchi                                   (line->li_context->
1250*bc1f688bSRobert Mustacchi                                    lc_compilation_directory));
1251*bc1f688bSRobert Mustacchi         }
1252*bc1f688bSRobert Mustacchi 
1253*bc1f688bSRobert Mustacchi         name_buffer =
1254*bc1f688bSRobert Mustacchi             _dwarf_get_alloc(line->li_context->lc_dbg, DW_DLA_STRING,
1255*bc1f688bSRobert Mustacchi                              comp_dir_len + 1 +
1256*bc1f688bSRobert Mustacchi                              strlen((char *) file_entry->fi_file_name) +
1257*bc1f688bSRobert Mustacchi                              1);
1258*bc1f688bSRobert Mustacchi         if (name_buffer == NULL) {
1259*bc1f688bSRobert Mustacchi             _dwarf_error(line->li_context->lc_dbg, error,
1260*bc1f688bSRobert Mustacchi                          DW_DLE_ALLOC_FAIL);
1261*bc1f688bSRobert Mustacchi             return (DW_DLV_ERROR);
1262*bc1f688bSRobert Mustacchi         }
1263*bc1f688bSRobert Mustacchi 
1264*bc1f688bSRobert Mustacchi         if (comp_dir_len > 0) {
1265*bc1f688bSRobert Mustacchi             /* if comp_dir_len is 0 we do not want to put a / in front
1266*bc1f688bSRobert Mustacchi                of the fi_file_name as we just don't know anything. */
1267*bc1f688bSRobert Mustacchi             strcpy((char *) name_buffer,
1268*bc1f688bSRobert Mustacchi                    (char *) (line->li_context->
1269*bc1f688bSRobert Mustacchi                              lc_compilation_directory));
1270*bc1f688bSRobert Mustacchi             strcat((char *) name_buffer, "/");
1271*bc1f688bSRobert Mustacchi         }
1272*bc1f688bSRobert Mustacchi         strcat((char *) name_buffer, (char *) file_entry->fi_file_name);
1273*bc1f688bSRobert Mustacchi         *ret_linesrc = ((char *) name_buffer);
1274*bc1f688bSRobert Mustacchi         return DW_DLV_OK;
1275*bc1f688bSRobert Mustacchi     }
1276*bc1f688bSRobert Mustacchi 
1277*bc1f688bSRobert Mustacchi     if (file_entry->fi_dir_index >
1278*bc1f688bSRobert Mustacchi         line->li_context->lc_include_directories_count) {
1279*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_INCL_DIR_NUM_BAD);
1280*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1281*bc1f688bSRobert Mustacchi     }
1282*bc1f688bSRobert Mustacchi 
1283*bc1f688bSRobert Mustacchi     include_directories = line->li_context->lc_include_directories;
1284*bc1f688bSRobert Mustacchi     for (i = file_entry->fi_dir_index - 1; i > 0; i--)
1285*bc1f688bSRobert Mustacchi         include_directories += strlen((char *) include_directories) + 1;
1286*bc1f688bSRobert Mustacchi 
1287*bc1f688bSRobert Mustacchi     if (line->li_context->lc_compilation_directory) {
1288*bc1f688bSRobert Mustacchi         comp_dir_len = strlen((char *)
1289*bc1f688bSRobert Mustacchi             (line->li_context->lc_compilation_directory));
1290*bc1f688bSRobert Mustacchi     } else {
1291*bc1f688bSRobert Mustacchi         /* No DW_AT_comp_dir present. Do the best we can without it. */
1292*bc1f688bSRobert Mustacchi         comp_dir_len = 0;
1293*bc1f688bSRobert Mustacchi     }
1294*bc1f688bSRobert Mustacchi 
1295*bc1f688bSRobert Mustacchi     include_direc_full_path = file_name_is_full_path(include_directories);
1296*bc1f688bSRobert Mustacchi     name_buffer = _dwarf_get_alloc(dbg, DW_DLA_STRING,
1297*bc1f688bSRobert Mustacchi         (include_direc_full_path ?  0 : comp_dir_len + 1) +
1298*bc1f688bSRobert Mustacchi             strlen((char *)include_directories) + 1 +
1299*bc1f688bSRobert Mustacchi             strlen((char *)file_entry->fi_file_name) + 1);
1300*bc1f688bSRobert Mustacchi     if (name_buffer == NULL) {
1301*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
1302*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1303*bc1f688bSRobert Mustacchi     }
1304*bc1f688bSRobert Mustacchi 
1305*bc1f688bSRobert Mustacchi     if (!include_direc_full_path) {
1306*bc1f688bSRobert Mustacchi         if (comp_dir_len > 0) {
1307*bc1f688bSRobert Mustacchi             strcpy((char *)name_buffer,
1308*bc1f688bSRobert Mustacchi                 (char *)line->li_context->lc_compilation_directory);
1309*bc1f688bSRobert Mustacchi             /* Who provides the / needed after the compilation
1310*bc1f688bSRobert Mustacchi                directory? */
1311*bc1f688bSRobert Mustacchi             if (!is_path_separator(name_buffer[comp_dir_len - 1])) {
1312*bc1f688bSRobert Mustacchi                 /* Here we provide the / separator. It
1313*bc1f688bSRobert Mustacchi                    should work ok for Windows */
1314*bc1f688bSRobert Mustacchi                 /* Overwrite previous nul terminator with needed / */
1315*bc1f688bSRobert Mustacchi                 name_buffer[comp_dir_len] = '/';
1316*bc1f688bSRobert Mustacchi                 name_buffer[comp_dir_len + 1] = 0;
1317*bc1f688bSRobert Mustacchi             }
1318*bc1f688bSRobert Mustacchi         }
1319*bc1f688bSRobert Mustacchi     } else {
1320*bc1f688bSRobert Mustacchi         strcpy((char *) name_buffer, "");
1321*bc1f688bSRobert Mustacchi     }
1322*bc1f688bSRobert Mustacchi     strcat((char *) name_buffer, (char *) include_directories);
1323*bc1f688bSRobert Mustacchi     strcat((char *) name_buffer, "/");
1324*bc1f688bSRobert Mustacchi     strcat((char *) name_buffer, (char *) file_entry->fi_file_name);
1325*bc1f688bSRobert Mustacchi     *ret_linesrc = ((char *) name_buffer);
1326*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1327*bc1f688bSRobert Mustacchi }
1328*bc1f688bSRobert Mustacchi 
1329*bc1f688bSRobert Mustacchi /* Every line table entry potentially has the basic-block-start
1330*bc1f688bSRobert Mustacchi    flag marked 'on'.   This returns thru *return_bool,
1331*bc1f688bSRobert Mustacchi    the basic-block-start flag.
1332*bc1f688bSRobert Mustacchi */
1333*bc1f688bSRobert Mustacchi int
1334*bc1f688bSRobert Mustacchi dwarf_lineblock(Dwarf_Line line,
1335*bc1f688bSRobert Mustacchi     Dwarf_Bool * return_bool, Dwarf_Error * error)
1336*bc1f688bSRobert Mustacchi {
1337*bc1f688bSRobert Mustacchi     if (line == NULL) {
1338*bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_DWARF_LINE_NULL);
1339*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1340*bc1f688bSRobert Mustacchi     }
1341*bc1f688bSRobert Mustacchi     *return_bool = (line->li_addr_line.li_l_data.li_basic_block);
1342*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1343*bc1f688bSRobert Mustacchi }
1344*bc1f688bSRobert Mustacchi 
1345*bc1f688bSRobert Mustacchi 
1346*bc1f688bSRobert Mustacchi #if 0                           /* Ignore this.  This needs major
1347*bc1f688bSRobert Mustacchi                                    re-work. */
1348*bc1f688bSRobert Mustacchi /*
1349*bc1f688bSRobert Mustacchi     This routine works by looking for exact matches between
1350*bc1f688bSRobert Mustacchi     the current line address and pc, and crossovers from
1351*bc1f688bSRobert Mustacchi     from less than pc value to greater than.  At each line
1352*bc1f688bSRobert Mustacchi     that satisfies the above, it records a pointer to the
1353*bc1f688bSRobert Mustacchi     line, and the difference between the address and pc.
1354*bc1f688bSRobert Mustacchi     It then scans these pointers and picks out those with
1355*bc1f688bSRobert Mustacchi     the smallest difference between pc and address.
1356*bc1f688bSRobert Mustacchi */
1357*bc1f688bSRobert Mustacchi int
1358*bc1f688bSRobert Mustacchi dwarf_pclines(Dwarf_Debug dbg,
1359*bc1f688bSRobert Mustacchi               Dwarf_Addr pc,
1360*bc1f688bSRobert Mustacchi               Dwarf_Line ** linebuf,
1361*bc1f688bSRobert Mustacchi               Dwarf_Signed slide,
1362*bc1f688bSRobert Mustacchi               Dwarf_Signed * linecount, Dwarf_Error * error)
1363*bc1f688bSRobert Mustacchi {
1364*bc1f688bSRobert Mustacchi     /*
1365*bc1f688bSRobert Mustacchi        Scans the line matrix for the current cu to which a pointer
1366*bc1f688bSRobert Mustacchi        exists in dbg. */
1367*bc1f688bSRobert Mustacchi     Dwarf_Line line;
1368*bc1f688bSRobert Mustacchi     Dwarf_Line prev_line;
1369*bc1f688bSRobert Mustacchi 
1370*bc1f688bSRobert Mustacchi     /*
1371*bc1f688bSRobert Mustacchi        These flags are for efficiency reasons. Check_line is true
1372*bc1f688bSRobert Mustacchi        initially, but set false when the address of the current line is
1373*bc1f688bSRobert Mustacchi        greater than pc.  It is set true only when the address of the
1374*bc1f688bSRobert Mustacchi        current line falls below pc.  This assumes that addresses within
1375*bc1f688bSRobert Mustacchi        the same segment increase, and we are only interested in the
1376*bc1f688bSRobert Mustacchi        switch from a less than pc address to a greater than. First_line
1377*bc1f688bSRobert Mustacchi        is set true initially, but set false after the first line is
1378*bc1f688bSRobert Mustacchi        scanned.  This is to prevent looking at the address of previous
1379*bc1f688bSRobert Mustacchi        line when slide is DW_DLS_BACKWARD, and the first line is being
1380*bc1f688bSRobert Mustacchi        scanned. */
1381*bc1f688bSRobert Mustacchi     Dwarf_Bool check_line, first_line;
1382*bc1f688bSRobert Mustacchi 
1383*bc1f688bSRobert Mustacchi     /*
1384*bc1f688bSRobert Mustacchi        Diff tracks the smallest difference a line address and the input
1385*bc1f688bSRobert Mustacchi        pc value. */
1386*bc1f688bSRobert Mustacchi     Dwarf_Signed diff, i;
1387*bc1f688bSRobert Mustacchi 
1388*bc1f688bSRobert Mustacchi     /*
1389*bc1f688bSRobert Mustacchi        For the slide = DW_DLS_BACKWARD case, pc_less is the value of
1390*bc1f688bSRobert Mustacchi        the address of the line immediately preceding the first line
1391*bc1f688bSRobert Mustacchi        that has value greater than pc. For the slide = DW_DLS_FORWARD
1392*bc1f688bSRobert Mustacchi        case, pc_more is the values of address for the first line that
1393*bc1f688bSRobert Mustacchi        is greater than pc. Diff is the difference between either of the
1394*bc1f688bSRobert Mustacchi        these values and pc. */
1395*bc1f688bSRobert Mustacchi     Dwarf_Addr pc_less, pc_more;
1396*bc1f688bSRobert Mustacchi 
1397*bc1f688bSRobert Mustacchi     /*
1398*bc1f688bSRobert Mustacchi        Pc_line_buf points to a chain of pointers to lines of which
1399*bc1f688bSRobert Mustacchi        those with a diff equal to the smallest difference will be
1400*bc1f688bSRobert Mustacchi        returned. */
1401*bc1f688bSRobert Mustacchi     Dwarf_Line *pc_line_buf, *pc_line;
1402*bc1f688bSRobert Mustacchi 
1403*bc1f688bSRobert Mustacchi     /*
1404*bc1f688bSRobert Mustacchi        Chain_count counts the number of lines in the above chain for
1405*bc1f688bSRobert Mustacchi        which the diff is equal to the smallest difference This is the
1406*bc1f688bSRobert Mustacchi        number returned by this routine. */
1407*bc1f688bSRobert Mustacchi     Dwarf_Signed chain_count;
1408*bc1f688bSRobert Mustacchi 
1409*bc1f688bSRobert Mustacchi     chain_head = NULL;
1410*bc1f688bSRobert Mustacchi 
1411*bc1f688bSRobert Mustacchi     check_line = true;
1412*bc1f688bSRobert Mustacchi     first_line = true;
1413*bc1f688bSRobert Mustacchi     diff = MAX_LINE_DIFF;
1414*bc1f688bSRobert Mustacchi 
1415*bc1f688bSRobert Mustacchi     for (i = 0; i < dbg->de_cu_line_count; i++) {
1416*bc1f688bSRobert Mustacchi 
1417*bc1f688bSRobert Mustacchi         line = *(dbg->de_cu_line_ptr + i);
1418*bc1f688bSRobert Mustacchi         prev_line = first_line ? NULL : *(dbg->de_cu_line_ptr + i - 1);
1419*bc1f688bSRobert Mustacchi 
1420*bc1f688bSRobert Mustacchi         if (line->li_address == pc) {
1421*bc1f688bSRobert Mustacchi             chain_ptr = (struct chain *)
1422*bc1f688bSRobert Mustacchi                 _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
1423*bc1f688bSRobert Mustacchi             if (chain_ptr == NULL) {
1424*bc1f688bSRobert Mustacchi                 _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL);
1425*bc1f688bSRobert Mustacchi                 return (DW_DLV_ERROR);
1426*bc1f688bSRobert Mustacchi             }
1427*bc1f688bSRobert Mustacchi 
1428*bc1f688bSRobert Mustacchi             chain_ptr->line = line;
1429*bc1f688bSRobert Mustacchi             chain_ptr->diff = diff = 0;
1430*bc1f688bSRobert Mustacchi             chain_ptr->next = chain_head;
1431*bc1f688bSRobert Mustacchi             chain_head = chain_ptr;
1432*bc1f688bSRobert Mustacchi         } else
1433*bc1f688bSRobert Mustacchi             /*
1434*bc1f688bSRobert Mustacchi                Look for crossover from less than pc address to greater
1435*bc1f688bSRobert Mustacchi                than. */
1436*bc1f688bSRobert Mustacchi         if (check_line && line->li_address > pc &&
1437*bc1f688bSRobert Mustacchi                 (first_line ? 0 : prev_line->li_address) < pc)
1438*bc1f688bSRobert Mustacchi 
1439*bc1f688bSRobert Mustacchi             if (slide == DW_DLS_BACKWARD && !first_line) {
1440*bc1f688bSRobert Mustacchi                 pc_less = prev_line->li_address;
1441*bc1f688bSRobert Mustacchi                 if (pc - pc_less <= diff) {
1442*bc1f688bSRobert Mustacchi                     chain_ptr = (struct chain *)
1443*bc1f688bSRobert Mustacchi                         _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
1444*bc1f688bSRobert Mustacchi                     if (chain_ptr == NULL) {
1445*bc1f688bSRobert Mustacchi                         _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL);
1446*bc1f688bSRobert Mustacchi                         return (DW_DLV_ERROR);
1447*bc1f688bSRobert Mustacchi                     }
1448*bc1f688bSRobert Mustacchi 
1449*bc1f688bSRobert Mustacchi                     chain_ptr->line = prev_line;
1450*bc1f688bSRobert Mustacchi                     chain_ptr->diff = diff = pc - pc_less;
1451*bc1f688bSRobert Mustacchi                     chain_ptr->next = chain_head;
1452*bc1f688bSRobert Mustacchi                     chain_head = chain_ptr;
1453*bc1f688bSRobert Mustacchi                 }
1454*bc1f688bSRobert Mustacchi                 check_line = false;
1455*bc1f688bSRobert Mustacchi             } else if (slide == DW_DLS_FORWARD) {
1456*bc1f688bSRobert Mustacchi                 pc_more = line->li_address;
1457*bc1f688bSRobert Mustacchi                 if (pc_more - pc <= diff) {
1458*bc1f688bSRobert Mustacchi                     chain_ptr = (struct chain *)
1459*bc1f688bSRobert Mustacchi                         _dwarf_get_alloc(dbg, DW_DLA_CHAIN, 1);
1460*bc1f688bSRobert Mustacchi                     if (chain_ptr == NULL) {
1461*bc1f688bSRobert Mustacchi                         _dwarf_error(NULL, error, DW_DLE_ALLOC_FAIL);
1462*bc1f688bSRobert Mustacchi                         return (DW_DLV_ERROR);
1463*bc1f688bSRobert Mustacchi                     }
1464*bc1f688bSRobert Mustacchi 
1465*bc1f688bSRobert Mustacchi                     chain_ptr->line = line;
1466*bc1f688bSRobert Mustacchi                     chain_ptr->diff = diff = pc_more - pc;
1467*bc1f688bSRobert Mustacchi                     chain_ptr->next = chain_head;
1468*bc1f688bSRobert Mustacchi                     chain_head = chain_ptr;
1469*bc1f688bSRobert Mustacchi                 }
1470*bc1f688bSRobert Mustacchi                 check_line = false;
1471*bc1f688bSRobert Mustacchi             } else
1472*bc1f688bSRobert Mustacchi                 /* Check addresses only when they go */
1473*bc1f688bSRobert Mustacchi                 /* below pc.  */
1474*bc1f688bSRobert Mustacchi             if (line->li_address < pc)
1475*bc1f688bSRobert Mustacchi                 check_line = true;
1476*bc1f688bSRobert Mustacchi 
1477*bc1f688bSRobert Mustacchi         first_line = false;
1478*bc1f688bSRobert Mustacchi     }
1479*bc1f688bSRobert Mustacchi 
1480*bc1f688bSRobert Mustacchi     chain_count = 0;
1481*bc1f688bSRobert Mustacchi     for (chain_ptr = chain_head; chain_ptr != NULL;
1482*bc1f688bSRobert Mustacchi          chain_ptr = chain_ptr->next)
1483*bc1f688bSRobert Mustacchi         if (chain_ptr->diff == diff)
1484*bc1f688bSRobert Mustacchi             chain_count++;
1485*bc1f688bSRobert Mustacchi 
1486*bc1f688bSRobert Mustacchi     pc_line_buf = pc_line = (Dwarf_Line)
1487*bc1f688bSRobert Mustacchi         _dwarf_get_alloc(dbg, DW_DLA_LIST, chain_count);
1488*bc1f688bSRobert Mustacchi     for (chain_ptr = chain_head; chain_ptr != NULL;
1489*bc1f688bSRobert Mustacchi          chain_ptr = chain_ptr->next)
1490*bc1f688bSRobert Mustacchi         if (chain_ptr->diff == diff) {
1491*bc1f688bSRobert Mustacchi             *pc_line = chain_ptr->line;
1492*bc1f688bSRobert Mustacchi             pc_line++;
1493*bc1f688bSRobert Mustacchi         }
1494*bc1f688bSRobert Mustacchi 
1495*bc1f688bSRobert Mustacchi     for (chain_ptr = chain_head; chain_ptr != NULL;) {
1496*bc1f688bSRobert Mustacchi         chain_head = chain_ptr;
1497*bc1f688bSRobert Mustacchi         chain_ptr = chain_ptr->next;
1498*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, chain_head, DW_DLA_CHAIN);
1499*bc1f688bSRobert Mustacchi     }
1500*bc1f688bSRobert Mustacchi 
1501*bc1f688bSRobert Mustacchi     *linebuf = pc_line_buf;
1502*bc1f688bSRobert Mustacchi     return (chain_count);
1503*bc1f688bSRobert Mustacchi }
1504*bc1f688bSRobert Mustacchi #endif
1505*bc1f688bSRobert Mustacchi 
1506*bc1f688bSRobert Mustacchi 
1507*bc1f688bSRobert Mustacchi 
1508*bc1f688bSRobert Mustacchi /*
1509*bc1f688bSRobert Mustacchi    It's impossible for callers of dwarf_srclines() to get to and
1510*bc1f688bSRobert Mustacchi    free all the resources (in particular, the li_context and its
1511*bc1f688bSRobert Mustacchi    lc_file_entries).
1512*bc1f688bSRobert Mustacchi    So this function, new July 2005, does it.
1513*bc1f688bSRobert Mustacchi */
1514*bc1f688bSRobert Mustacchi 
1515*bc1f688bSRobert Mustacchi void
1516*bc1f688bSRobert Mustacchi dwarf_srclines_dealloc(Dwarf_Debug dbg, Dwarf_Line * linebuf,
1517*bc1f688bSRobert Mustacchi     Dwarf_Signed count)
1518*bc1f688bSRobert Mustacchi {
1519*bc1f688bSRobert Mustacchi 
1520*bc1f688bSRobert Mustacchi     Dwarf_Signed i = 0;
1521*bc1f688bSRobert Mustacchi     struct Dwarf_Line_Context_s *context = 0;
1522*bc1f688bSRobert Mustacchi 
1523*bc1f688bSRobert Mustacchi     if (count > 0) {
1524*bc1f688bSRobert Mustacchi         /* All these entries share a single context */
1525*bc1f688bSRobert Mustacchi         context = linebuf[0]->li_context;
1526*bc1f688bSRobert Mustacchi     }
1527*bc1f688bSRobert Mustacchi     for (i = 0; i < count; ++i) {
1528*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);
1529*bc1f688bSRobert Mustacchi     }
1530*bc1f688bSRobert Mustacchi     dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);
1531*bc1f688bSRobert Mustacchi 
1532*bc1f688bSRobert Mustacchi     if (context) {
1533*bc1f688bSRobert Mustacchi         Dwarf_File_Entry fe = context->lc_file_entries;
1534*bc1f688bSRobert Mustacchi 
1535*bc1f688bSRobert Mustacchi         while (fe) {
1536*bc1f688bSRobert Mustacchi             Dwarf_File_Entry fenext = fe->fi_next;
1537*bc1f688bSRobert Mustacchi 
1538*bc1f688bSRobert Mustacchi             dwarf_dealloc(dbg, fe, DW_DLA_FILE_ENTRY);
1539*bc1f688bSRobert Mustacchi             fe = fenext;
1540*bc1f688bSRobert Mustacchi         }
1541*bc1f688bSRobert Mustacchi         dwarf_dealloc(dbg, context, DW_DLA_LINE_CONTEXT);
1542*bc1f688bSRobert Mustacchi     }
1543*bc1f688bSRobert Mustacchi 
1544*bc1f688bSRobert Mustacchi     return;
1545*bc1f688bSRobert Mustacchi }
1546*bc1f688bSRobert Mustacchi 
1547*bc1f688bSRobert Mustacchi /* Operand counts per standard operand.
1548*bc1f688bSRobert Mustacchi    The initial zero is for DW_LNS_copy.
1549*bc1f688bSRobert Mustacchi    This is an economical way to verify we understand the table
1550*bc1f688bSRobert Mustacchi    of standard-opcode-lengths in the line table prologue.  */
1551*bc1f688bSRobert Mustacchi #define STANDARD_OPERAND_COUNT_DWARF2 9
1552*bc1f688bSRobert Mustacchi #define STANDARD_OPERAND_COUNT_DWARF3 12
1553*bc1f688bSRobert Mustacchi static unsigned char
1554*bc1f688bSRobert Mustacchi   dwarf_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = {
1555*bc1f688bSRobert Mustacchi     /* DWARF2 */
1556*bc1f688bSRobert Mustacchi     0,
1557*bc1f688bSRobert Mustacchi     1, 1, 1, 1,
1558*bc1f688bSRobert Mustacchi     0, 0, 0,
1559*bc1f688bSRobert Mustacchi     1,
1560*bc1f688bSRobert Mustacchi     /* Following are new for DWARF3. */
1561*bc1f688bSRobert Mustacchi     0, 0, 1
1562*bc1f688bSRobert Mustacchi };
1563*bc1f688bSRobert Mustacchi 
1564*bc1f688bSRobert Mustacchi /* We have a normal standard opcode base, but
1565*bc1f688bSRobert Mustacchi    an arm compiler emitted a non-standard table!
1566*bc1f688bSRobert Mustacchi    This could lead to problems...
1567*bc1f688bSRobert Mustacchi    ARM C/C++ Compiler, RVCT4.0 [Build 4
1568*bc1f688bSRobert Mustacchi    00] seems to get the table wrong .  */
1569*bc1f688bSRobert Mustacchi static unsigned char
1570*bc1f688bSRobert Mustacchi dwarf_arm_standard_opcode_operand_count[STANDARD_OPERAND_COUNT_DWARF3] = {
1571*bc1f688bSRobert Mustacchi     /* DWARF2 */
1572*bc1f688bSRobert Mustacchi     0,
1573*bc1f688bSRobert Mustacchi     1, 1, 1, 1,
1574*bc1f688bSRobert Mustacchi     0, 0, 0,
1575*bc1f688bSRobert Mustacchi     0,  /* <<< --- this is wrong */
1576*bc1f688bSRobert Mustacchi     /* Following are new for DWARF3. */
1577*bc1f688bSRobert Mustacchi     0, 0, 1
1578*bc1f688bSRobert Mustacchi };
1579*bc1f688bSRobert Mustacchi 
1580*bc1f688bSRobert Mustacchi static void
1581*bc1f688bSRobert Mustacchi print_header_issue(Dwarf_Debug dbg,
1582*bc1f688bSRobert Mustacchi     char *specific_msg,
1583*bc1f688bSRobert Mustacchi     Dwarf_Small *data_start,
1584*bc1f688bSRobert Mustacchi     int *err_count_out)
1585*bc1f688bSRobert Mustacchi {
1586*bc1f688bSRobert Mustacchi     if(!err_count_out)
1587*bc1f688bSRobert Mustacchi         return;
1588*bc1f688bSRobert Mustacchi     printf("*** DWARF CHECK: "
1589*bc1f688bSRobert Mustacchi         "line table header: %s",
1590*bc1f688bSRobert Mustacchi         specific_msg);
1591*bc1f688bSRobert Mustacchi     if( data_start >= dbg->de_debug_line.dss_data &&
1592*bc1f688bSRobert Mustacchi         (data_start < (dbg->de_debug_line.dss_data +
1593*bc1f688bSRobert Mustacchi         dbg->de_debug_line.dss_size))) {
1594*bc1f688bSRobert Mustacchi         Dwarf_Unsigned off = data_start - dbg->de_debug_line.dss_data;
1595*bc1f688bSRobert Mustacchi         printf(" at .debug_line section offset 0x%" DW_PR_DUx
1596*bc1f688bSRobert Mustacchi             "  ( %" DW_PR_DUu " ) ",
1597*bc1f688bSRobert Mustacchi             off,off);
1598*bc1f688bSRobert Mustacchi     } else {
1599*bc1f688bSRobert Mustacchi         printf(" (unknown section location) ");
1600*bc1f688bSRobert Mustacchi     }
1601*bc1f688bSRobert Mustacchi     printf("***\n");
1602*bc1f688bSRobert Mustacchi     *err_count_out += 1;
1603*bc1f688bSRobert Mustacchi }
1604*bc1f688bSRobert Mustacchi 
1605*bc1f688bSRobert Mustacchi 
1606*bc1f688bSRobert Mustacchi 
1607*bc1f688bSRobert Mustacchi /* Common line table prefix reading code.
1608*bc1f688bSRobert Mustacchi    Returns DW_DLV_OK, DW_DLV_ERROR.
1609*bc1f688bSRobert Mustacchi    DW_DLV_NO_ENTRY cannot be returned, but callers should
1610*bc1f688bSRobert Mustacchi    assume it is possible.
1611*bc1f688bSRobert Mustacchi 
1612*bc1f688bSRobert Mustacchi    The prefix_out area must be initialized properly before calling this.
1613*bc1f688bSRobert Mustacchi 
1614*bc1f688bSRobert Mustacchi    Has the side effect of allocating arrays which
1615*bc1f688bSRobert Mustacchi    must be freed (see the Line_Table_Prefix_s struct which
1616*bc1f688bSRobert Mustacchi    holds the pointers to space we allocate here).
1617*bc1f688bSRobert Mustacchi 
1618*bc1f688bSRobert Mustacchi    bogus_bytes_ptr and bogus_bytes are output values which
1619*bc1f688bSRobert Mustacchi    let a print-program notify the user of some surprising bytes
1620*bc1f688bSRobert Mustacchi    after a line table header and before the line table instructions.
1621*bc1f688bSRobert Mustacchi    These can be ignored unless one is printing.
1622*bc1f688bSRobert Mustacchi    And are ignored if NULL passed as the pointer.
1623*bc1f688bSRobert Mustacchi */
1624*bc1f688bSRobert Mustacchi 
1625*bc1f688bSRobert Mustacchi /* err_count_out may be NULL, in which case we
1626*bc1f688bSRobert Mustacchi    make no attempt to count checking-type errors.
1627*bc1f688bSRobert Mustacchi    Checking-type errors do not stop us, we just report them.
1628*bc1f688bSRobert Mustacchi */
1629*bc1f688bSRobert Mustacchi int
1630*bc1f688bSRobert Mustacchi dwarf_read_line_table_prefix(Dwarf_Debug dbg,
1631*bc1f688bSRobert Mustacchi     Dwarf_Small * data_start,
1632*bc1f688bSRobert Mustacchi     Dwarf_Unsigned data_length,
1633*bc1f688bSRobert Mustacchi     Dwarf_Small ** updated_data_start_out,
1634*bc1f688bSRobert Mustacchi     struct Line_Table_Prefix_s *prefix_out,
1635*bc1f688bSRobert Mustacchi     Dwarf_Small ** bogus_bytes_ptr,
1636*bc1f688bSRobert Mustacchi     Dwarf_Unsigned *bogus_bytes,
1637*bc1f688bSRobert Mustacchi     Dwarf_Error * err,
1638*bc1f688bSRobert Mustacchi     int *err_count_out)
1639*bc1f688bSRobert Mustacchi {
1640*bc1f688bSRobert Mustacchi     Dwarf_Small *line_ptr = data_start;
1641*bc1f688bSRobert Mustacchi     Dwarf_Unsigned total_length = 0;
1642*bc1f688bSRobert Mustacchi     int local_length_size = 0;
1643*bc1f688bSRobert Mustacchi     int local_extension_size = 0;
1644*bc1f688bSRobert Mustacchi     Dwarf_Unsigned prologue_length = 0;
1645*bc1f688bSRobert Mustacchi     Dwarf_Half version = 0;
1646*bc1f688bSRobert Mustacchi     Dwarf_Unsigned directories_count = 0;
1647*bc1f688bSRobert Mustacchi     Dwarf_Unsigned directories_malloc = 0;
1648*bc1f688bSRobert Mustacchi     Dwarf_Unsigned files_count = 0;
1649*bc1f688bSRobert Mustacchi     Dwarf_Unsigned files_malloc = 0;
1650*bc1f688bSRobert Mustacchi     Dwarf_Small *line_ptr_end = 0;
1651*bc1f688bSRobert Mustacchi     Dwarf_Small *lp_begin = 0;
1652*bc1f688bSRobert Mustacchi     if(bogus_bytes_ptr) *bogus_bytes_ptr = 0;
1653*bc1f688bSRobert Mustacchi     if(bogus_bytes) *bogus_bytes= 0;
1654*bc1f688bSRobert Mustacchi 
1655*bc1f688bSRobert Mustacchi     prefix_out->pf_line_ptr_start = line_ptr;
1656*bc1f688bSRobert Mustacchi     /* READ_AREA_LENGTH updates line_ptr for consumed bytes */
1657*bc1f688bSRobert Mustacchi     READ_AREA_LENGTH(dbg, total_length, Dwarf_Unsigned,
1658*bc1f688bSRobert Mustacchi                      line_ptr, local_length_size, local_extension_size);
1659*bc1f688bSRobert Mustacchi 
1660*bc1f688bSRobert Mustacchi 
1661*bc1f688bSRobert Mustacchi     line_ptr_end = line_ptr + total_length;
1662*bc1f688bSRobert Mustacchi     prefix_out->pf_line_ptr_end = line_ptr_end;
1663*bc1f688bSRobert Mustacchi     prefix_out->pf_length_field_length = local_length_size +
1664*bc1f688bSRobert Mustacchi         local_extension_size;
1665*bc1f688bSRobert Mustacchi     /* ASSERT: prefix_out->pf_length_field_length == line_ptr
1666*bc1f688bSRobert Mustacchi        -prefix_out->pf_line_ptr_start; */
1667*bc1f688bSRobert Mustacchi     if (line_ptr_end > dbg->de_debug_line.dss_data +
1668*bc1f688bSRobert Mustacchi         dbg->de_debug_line.dss_size) {
1669*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
1670*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1671*bc1f688bSRobert Mustacchi     }
1672*bc1f688bSRobert Mustacchi     if (line_ptr_end > data_start + data_length) {
1673*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, err, DW_DLE_DEBUG_LINE_LENGTH_BAD);
1674*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1675*bc1f688bSRobert Mustacchi     }
1676*bc1f688bSRobert Mustacchi     prefix_out->pf_total_length = total_length;
1677*bc1f688bSRobert Mustacchi 
1678*bc1f688bSRobert Mustacchi     READ_UNALIGNED(dbg, version, Dwarf_Half,
1679*bc1f688bSRobert Mustacchi                    line_ptr, sizeof(Dwarf_Half));
1680*bc1f688bSRobert Mustacchi     prefix_out->pf_version = version;
1681*bc1f688bSRobert Mustacchi     line_ptr += sizeof(Dwarf_Half);
1682*bc1f688bSRobert Mustacchi     if (version != CURRENT_VERSION_STAMP &&
1683*bc1f688bSRobert Mustacchi         version != CURRENT_VERSION_STAMP3) {
1684*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, err, DW_DLE_VERSION_STAMP_ERROR);
1685*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1686*bc1f688bSRobert Mustacchi     }
1687*bc1f688bSRobert Mustacchi 
1688*bc1f688bSRobert Mustacchi     READ_UNALIGNED(dbg, prologue_length, Dwarf_Unsigned,
1689*bc1f688bSRobert Mustacchi                    line_ptr, local_length_size);
1690*bc1f688bSRobert Mustacchi     prefix_out->pf_prologue_length = prologue_length;
1691*bc1f688bSRobert Mustacchi     line_ptr += local_length_size;
1692*bc1f688bSRobert Mustacchi     prefix_out->pf_line_prologue_start = line_ptr;
1693*bc1f688bSRobert Mustacchi 
1694*bc1f688bSRobert Mustacchi     prefix_out->pf_minimum_instruction_length =
1695*bc1f688bSRobert Mustacchi         *(unsigned char *) line_ptr;
1696*bc1f688bSRobert Mustacchi     line_ptr = line_ptr + sizeof(Dwarf_Small);
1697*bc1f688bSRobert Mustacchi 
1698*bc1f688bSRobert Mustacchi     prefix_out->pf_default_is_stmt = *(unsigned char *) line_ptr;
1699*bc1f688bSRobert Mustacchi     line_ptr = line_ptr + sizeof(Dwarf_Small);
1700*bc1f688bSRobert Mustacchi 
1701*bc1f688bSRobert Mustacchi     prefix_out->pf_line_base = *(signed char *) line_ptr;
1702*bc1f688bSRobert Mustacchi     line_ptr = line_ptr + sizeof(Dwarf_Sbyte);
1703*bc1f688bSRobert Mustacchi 
1704*bc1f688bSRobert Mustacchi     prefix_out->pf_line_range = *(unsigned char *) line_ptr;
1705*bc1f688bSRobert Mustacchi     line_ptr = line_ptr + sizeof(Dwarf_Small);
1706*bc1f688bSRobert Mustacchi 
1707*bc1f688bSRobert Mustacchi     prefix_out->pf_opcode_base = *(unsigned char *) line_ptr;
1708*bc1f688bSRobert Mustacchi     line_ptr = line_ptr + sizeof(Dwarf_Small);
1709*bc1f688bSRobert Mustacchi 
1710*bc1f688bSRobert Mustacchi     /* Set up the array of standard opcode lengths. */
1711*bc1f688bSRobert Mustacchi     /* We think this works ok even for cross-endian processing of
1712*bc1f688bSRobert Mustacchi        objects.  It might be wrong, we might need to specially process
1713*bc1f688bSRobert Mustacchi        the array of ubyte into host order.  */
1714*bc1f688bSRobert Mustacchi     prefix_out->pf_opcode_length_table = line_ptr;
1715*bc1f688bSRobert Mustacchi 
1716*bc1f688bSRobert Mustacchi     /* pf_opcode_base is one greater than the size of the array. */
1717*bc1f688bSRobert Mustacchi     line_ptr += prefix_out->pf_opcode_base - 1;
1718*bc1f688bSRobert Mustacchi 
1719*bc1f688bSRobert Mustacchi     {
1720*bc1f688bSRobert Mustacchi         /* Determine (as best we can) whether the
1721*bc1f688bSRobert Mustacchi            pf_opcode_length_table holds 9 or 12 standard-conforming
1722*bc1f688bSRobert Mustacchi            entries.  gcc4 upped to DWARF3's 12 without updating the
1723*bc1f688bSRobert Mustacchi            version number.   */
1724*bc1f688bSRobert Mustacchi         int operand_ck_fail = true;
1725*bc1f688bSRobert Mustacchi 
1726*bc1f688bSRobert Mustacchi         if (prefix_out->pf_opcode_base >= STANDARD_OPERAND_COUNT_DWARF3) {
1727*bc1f688bSRobert Mustacchi             int mismatch = memcmp(dwarf_standard_opcode_operand_count,
1728*bc1f688bSRobert Mustacchi                                   prefix_out->pf_opcode_length_table,
1729*bc1f688bSRobert Mustacchi                                   STANDARD_OPERAND_COUNT_DWARF3);
1730*bc1f688bSRobert Mustacchi             if(mismatch) {
1731*bc1f688bSRobert Mustacchi                  if(err_count_out) {
1732*bc1f688bSRobert Mustacchi                      print_header_issue(dbg,"standard-operands did not match",
1733*bc1f688bSRobert Mustacchi                          data_start,err_count_out);
1734*bc1f688bSRobert Mustacchi                  }
1735*bc1f688bSRobert Mustacchi                  mismatch = memcmp(dwarf_arm_standard_opcode_operand_count,
1736*bc1f688bSRobert Mustacchi                                   prefix_out->pf_opcode_length_table,
1737*bc1f688bSRobert Mustacchi                                   STANDARD_OPERAND_COUNT_DWARF3);
1738*bc1f688bSRobert Mustacchi                  if(!mismatch && err_count_out) {
1739*bc1f688bSRobert Mustacchi                      print_header_issue(dbg,"arm (incorrect) operands in use",
1740*bc1f688bSRobert Mustacchi                          data_start,err_count_out);
1741*bc1f688bSRobert Mustacchi                  }
1742*bc1f688bSRobert Mustacchi             }
1743*bc1f688bSRobert Mustacchi             if (!mismatch) {
1744*bc1f688bSRobert Mustacchi                 if (version == 2) {
1745*bc1f688bSRobert Mustacchi                     if(err_count_out) {
1746*bc1f688bSRobert Mustacchi                         print_header_issue(dbg,
1747*bc1f688bSRobert Mustacchi                         "standard DWARF3 operands matched, but is DWARF2 linetable",
1748*bc1f688bSRobert Mustacchi                             data_start,err_count_out);
1749*bc1f688bSRobert Mustacchi                     }
1750*bc1f688bSRobert Mustacchi                 }
1751*bc1f688bSRobert Mustacchi                 operand_ck_fail = false;
1752*bc1f688bSRobert Mustacchi                 prefix_out->pf_std_op_count =
1753*bc1f688bSRobert Mustacchi                     STANDARD_OPERAND_COUNT_DWARF3;
1754*bc1f688bSRobert Mustacchi             }
1755*bc1f688bSRobert Mustacchi         }
1756*bc1f688bSRobert Mustacchi         if (operand_ck_fail) {
1757*bc1f688bSRobert Mustacchi             if (prefix_out->pf_opcode_base >=
1758*bc1f688bSRobert Mustacchi                 STANDARD_OPERAND_COUNT_DWARF2) {
1759*bc1f688bSRobert Mustacchi 
1760*bc1f688bSRobert Mustacchi                 int mismatch =
1761*bc1f688bSRobert Mustacchi                     memcmp(dwarf_standard_opcode_operand_count,
1762*bc1f688bSRobert Mustacchi                            prefix_out->pf_opcode_length_table,
1763*bc1f688bSRobert Mustacchi                            STANDARD_OPERAND_COUNT_DWARF2);
1764*bc1f688bSRobert Mustacchi                 if(mismatch) {
1765*bc1f688bSRobert Mustacchi                     if(err_count_out) {
1766*bc1f688bSRobert Mustacchi                         print_header_issue(dbg,"standard-operands-lengths did not match",
1767*bc1f688bSRobert Mustacchi                             data_start,err_count_out);
1768*bc1f688bSRobert Mustacchi                     }
1769*bc1f688bSRobert Mustacchi                     mismatch = memcmp(dwarf_arm_standard_opcode_operand_count,
1770*bc1f688bSRobert Mustacchi                                   prefix_out->pf_opcode_length_table,
1771*bc1f688bSRobert Mustacchi                                   STANDARD_OPERAND_COUNT_DWARF2);
1772*bc1f688bSRobert Mustacchi                     if(!mismatch && err_count_out) {
1773*bc1f688bSRobert Mustacchi                         print_header_issue(dbg,"arm (incorrect) operand in use",
1774*bc1f688bSRobert Mustacchi                             data_start,err_count_out);
1775*bc1f688bSRobert Mustacchi                     }
1776*bc1f688bSRobert Mustacchi                 }
1777*bc1f688bSRobert Mustacchi 
1778*bc1f688bSRobert Mustacchi                 if (!mismatch) {
1779*bc1f688bSRobert Mustacchi                     operand_ck_fail = false;
1780*bc1f688bSRobert Mustacchi                     prefix_out->pf_std_op_count =
1781*bc1f688bSRobert Mustacchi                         STANDARD_OPERAND_COUNT_DWARF2;
1782*bc1f688bSRobert Mustacchi                 }
1783*bc1f688bSRobert Mustacchi             }
1784*bc1f688bSRobert Mustacchi         }
1785*bc1f688bSRobert Mustacchi         if (operand_ck_fail) {
1786*bc1f688bSRobert Mustacchi             /* Here we are not sure what the pf_std_op_count is. */
1787*bc1f688bSRobert Mustacchi             _dwarf_error(dbg, err, DW_DLE_LINE_NUM_OPERANDS_BAD);
1788*bc1f688bSRobert Mustacchi             return (DW_DLV_ERROR);
1789*bc1f688bSRobert Mustacchi         }
1790*bc1f688bSRobert Mustacchi     }
1791*bc1f688bSRobert Mustacchi     /* At this point we no longer need to check operand counts. */
1792*bc1f688bSRobert Mustacchi 
1793*bc1f688bSRobert Mustacchi 
1794*bc1f688bSRobert Mustacchi     directories_count = 0;
1795*bc1f688bSRobert Mustacchi     directories_malloc = 5;
1796*bc1f688bSRobert Mustacchi     prefix_out->pf_include_directories = malloc(sizeof(Dwarf_Small *) *
1797*bc1f688bSRobert Mustacchi                                                 directories_malloc);
1798*bc1f688bSRobert Mustacchi     if (prefix_out->pf_include_directories == NULL) {
1799*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
1800*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1801*bc1f688bSRobert Mustacchi     }
1802*bc1f688bSRobert Mustacchi     memset(prefix_out->pf_include_directories, 0,
1803*bc1f688bSRobert Mustacchi            sizeof(Dwarf_Small *) * directories_malloc);
1804*bc1f688bSRobert Mustacchi 
1805*bc1f688bSRobert Mustacchi     while ((*(char *) line_ptr) != '\0') {
1806*bc1f688bSRobert Mustacchi         if (directories_count >= directories_malloc) {
1807*bc1f688bSRobert Mustacchi             Dwarf_Unsigned expand = 2 * directories_malloc;
1808*bc1f688bSRobert Mustacchi             Dwarf_Unsigned bytesalloc = sizeof(Dwarf_Small *) * expand;
1809*bc1f688bSRobert Mustacchi             Dwarf_Small **newdirs =
1810*bc1f688bSRobert Mustacchi                 realloc(prefix_out->pf_include_directories,
1811*bc1f688bSRobert Mustacchi                         bytesalloc);
1812*bc1f688bSRobert Mustacchi 
1813*bc1f688bSRobert Mustacchi             if (!newdirs) {
1814*bc1f688bSRobert Mustacchi                 _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
1815*bc1f688bSRobert Mustacchi                 return (DW_DLV_ERROR);
1816*bc1f688bSRobert Mustacchi             }
1817*bc1f688bSRobert Mustacchi             /* Doubled size, zero out second half. */
1818*bc1f688bSRobert Mustacchi             memset(newdirs + directories_malloc, 0,
1819*bc1f688bSRobert Mustacchi                    sizeof(Dwarf_Small *) * directories_malloc);
1820*bc1f688bSRobert Mustacchi             directories_malloc = expand;
1821*bc1f688bSRobert Mustacchi             prefix_out->pf_include_directories = newdirs;
1822*bc1f688bSRobert Mustacchi         }
1823*bc1f688bSRobert Mustacchi         prefix_out->pf_include_directories[directories_count] =
1824*bc1f688bSRobert Mustacchi             line_ptr;
1825*bc1f688bSRobert Mustacchi         line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
1826*bc1f688bSRobert Mustacchi         directories_count++;
1827*bc1f688bSRobert Mustacchi     }
1828*bc1f688bSRobert Mustacchi     prefix_out->pf_include_directories_count = directories_count;
1829*bc1f688bSRobert Mustacchi     line_ptr++;
1830*bc1f688bSRobert Mustacchi 
1831*bc1f688bSRobert Mustacchi     files_count = 0;
1832*bc1f688bSRobert Mustacchi     files_malloc = 5;
1833*bc1f688bSRobert Mustacchi     prefix_out->pf_line_table_file_entries =
1834*bc1f688bSRobert Mustacchi         malloc(sizeof(struct Line_Table_File_Entry_s) * files_malloc);
1835*bc1f688bSRobert Mustacchi     if (prefix_out->pf_line_table_file_entries == NULL) {
1836*bc1f688bSRobert Mustacchi         _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
1837*bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
1838*bc1f688bSRobert Mustacchi     }
1839*bc1f688bSRobert Mustacchi     memset(prefix_out->pf_line_table_file_entries, 0,
1840*bc1f688bSRobert Mustacchi            sizeof(struct Line_Table_File_Entry_s) * files_malloc);
1841*bc1f688bSRobert Mustacchi 
1842*bc1f688bSRobert Mustacchi     while (*(char *) line_ptr != '\0') {
1843*bc1f688bSRobert Mustacchi         Dwarf_Unsigned utmp;
1844*bc1f688bSRobert Mustacchi         Dwarf_Unsigned dir_index = 0;
1845*bc1f688bSRobert Mustacchi         Dwarf_Unsigned lastmod = 0;
1846*bc1f688bSRobert Mustacchi         Dwarf_Unsigned file_length = 0;
1847*bc1f688bSRobert Mustacchi         struct Line_Table_File_Entry_s *curline;
1848*bc1f688bSRobert Mustacchi         Dwarf_Word leb128_length = 0;
1849*bc1f688bSRobert Mustacchi 
1850*bc1f688bSRobert Mustacchi 
1851*bc1f688bSRobert Mustacchi         if (files_count >= files_malloc) {
1852*bc1f688bSRobert Mustacchi             Dwarf_Unsigned expand = 2 * files_malloc;
1853*bc1f688bSRobert Mustacchi             struct Line_Table_File_Entry_s *newfiles =
1854*bc1f688bSRobert Mustacchi                 realloc(prefix_out->pf_line_table_file_entries,
1855*bc1f688bSRobert Mustacchi                         sizeof(struct Line_Table_File_Entry_s) *
1856*bc1f688bSRobert Mustacchi                         expand);
1857*bc1f688bSRobert Mustacchi             if (!newfiles) {
1858*bc1f688bSRobert Mustacchi                 _dwarf_error(dbg, err, DW_DLE_ALLOC_FAIL);
1859*bc1f688bSRobert Mustacchi                 return (DW_DLV_ERROR);
1860*bc1f688bSRobert Mustacchi             }
1861*bc1f688bSRobert Mustacchi             memset(newfiles + files_malloc, 0,
1862*bc1f688bSRobert Mustacchi                    sizeof(struct Line_Table_File_Entry_s) *
1863*bc1f688bSRobert Mustacchi                    files_malloc);
1864*bc1f688bSRobert Mustacchi             files_malloc = expand;
1865*bc1f688bSRobert Mustacchi             prefix_out->pf_line_table_file_entries = newfiles;
1866*bc1f688bSRobert Mustacchi         }
1867*bc1f688bSRobert Mustacchi         curline = prefix_out->pf_line_table_file_entries + files_count;
1868*bc1f688bSRobert Mustacchi 
1869*bc1f688bSRobert Mustacchi         curline->lte_filename = line_ptr;
1870*bc1f688bSRobert Mustacchi         line_ptr = line_ptr + strlen((char *) line_ptr) + 1;
1871*bc1f688bSRobert Mustacchi 
1872*bc1f688bSRobert Mustacchi         DECODE_LEB128_UWORD(line_ptr, utmp);
1873*bc1f688bSRobert Mustacchi         dir_index = (Dwarf_Sword) utmp;
1874*bc1f688bSRobert Mustacchi         if (dir_index > directories_count) {
1875*bc1f688bSRobert Mustacchi             _dwarf_error(dbg, err, DW_DLE_DIR_INDEX_BAD);
1876*bc1f688bSRobert Mustacchi             return (DW_DLV_ERROR);
1877*bc1f688bSRobert Mustacchi         }
1878*bc1f688bSRobert Mustacchi         curline->lte_directory_index = dir_index;
1879*bc1f688bSRobert Mustacchi 
1880*bc1f688bSRobert Mustacchi         lastmod = _dwarf_decode_u_leb128(line_ptr, &leb128_length);
1881*bc1f688bSRobert Mustacchi         line_ptr = line_ptr + leb128_length;
1882*bc1f688bSRobert Mustacchi         curline->lte_last_modification_time = lastmod;
1883*bc1f688bSRobert Mustacchi 
1884*bc1f688bSRobert Mustacchi         /* Skip over file length. */
1885*bc1f688bSRobert Mustacchi         file_length = _dwarf_decode_u_leb128(line_ptr, &leb128_length);
1886*bc1f688bSRobert Mustacchi         line_ptr = line_ptr + leb128_length;
1887*bc1f688bSRobert Mustacchi         curline->lte_length_of_file = file_length;
1888*bc1f688bSRobert Mustacchi 
1889*bc1f688bSRobert Mustacchi         ++files_count;
1890*bc1f688bSRobert Mustacchi 
1891*bc1f688bSRobert Mustacchi     }
1892*bc1f688bSRobert Mustacchi     prefix_out->pf_files_count = files_count;
1893*bc1f688bSRobert Mustacchi     /* Skip trailing nul byte */
1894*bc1f688bSRobert Mustacchi     ++line_ptr;
1895*bc1f688bSRobert Mustacchi 
1896*bc1f688bSRobert Mustacchi 
1897*bc1f688bSRobert Mustacchi     lp_begin = prefix_out->pf_line_prologue_start +
1898*bc1f688bSRobert Mustacchi                      prefix_out->pf_prologue_length;
1899*bc1f688bSRobert Mustacchi     if (line_ptr != lp_begin) {
1900*bc1f688bSRobert Mustacchi         if(line_ptr > lp_begin) {
1901*bc1f688bSRobert Mustacchi             _dwarf_error(dbg, err, DW_DLE_LINE_PROLOG_LENGTH_BAD);
1902*bc1f688bSRobert Mustacchi             return (DW_DLV_ERROR);
1903*bc1f688bSRobert Mustacchi         } else {
1904*bc1f688bSRobert Mustacchi             /* Bug in compiler. These
1905*bc1f688bSRobert Mustacchi              * bytes are really part of the instruction
1906*bc1f688bSRobert Mustacchi              * stream.  The prefix_out->pf_prologue_length is
1907*bc1f688bSRobert Mustacchi              * wrong (12 too high).  */
1908*bc1f688bSRobert Mustacchi             if(bogus_bytes_ptr) {
1909*bc1f688bSRobert Mustacchi                *bogus_bytes_ptr = line_ptr;
1910*bc1f688bSRobert Mustacchi             }
1911*bc1f688bSRobert Mustacchi             if(bogus_bytes) {
1912*bc1f688bSRobert Mustacchi                /* How far off things are. We expect the
1913*bc1f688bSRobert Mustacchi                   value 12 ! */
1914*bc1f688bSRobert Mustacchi                *bogus_bytes = (lp_begin - line_ptr);
1915*bc1f688bSRobert Mustacchi             }
1916*bc1f688bSRobert Mustacchi         }
1917*bc1f688bSRobert Mustacchi         /* Ignore the lp_begin calc. Assume line_ptr right.
1918*bc1f688bSRobert Mustacchi            Making up for compiler bug. */
1919*bc1f688bSRobert Mustacchi         lp_begin = line_ptr;
1920*bc1f688bSRobert Mustacchi 
1921*bc1f688bSRobert Mustacchi     }
1922*bc1f688bSRobert Mustacchi 
1923*bc1f688bSRobert Mustacchi     *updated_data_start_out = lp_begin;
1924*bc1f688bSRobert Mustacchi     return DW_DLV_OK;
1925*bc1f688bSRobert Mustacchi }
1926*bc1f688bSRobert Mustacchi 
1927*bc1f688bSRobert Mustacchi 
1928*bc1f688bSRobert Mustacchi /* Initialize the Line_Table_Prefix_s struct.
1929*bc1f688bSRobert Mustacchi    memset is not guaranteed a portable initializer, but works
1930*bc1f688bSRobert Mustacchi    fine for current architectures.   AFAIK.
1931*bc1f688bSRobert Mustacchi */
1932*bc1f688bSRobert Mustacchi void
1933*bc1f688bSRobert Mustacchi dwarf_init_line_table_prefix(struct Line_Table_Prefix_s *pf)
1934*bc1f688bSRobert Mustacchi {
1935*bc1f688bSRobert Mustacchi     memset(pf, 0, sizeof(*pf));
1936*bc1f688bSRobert Mustacchi }
1937*bc1f688bSRobert Mustacchi 
1938*bc1f688bSRobert Mustacchi /* Free any malloc'd area.  of the Line_Table_Prefix_s struct. */
1939*bc1f688bSRobert Mustacchi void
1940*bc1f688bSRobert Mustacchi dwarf_free_line_table_prefix(struct Line_Table_Prefix_s *pf)
1941*bc1f688bSRobert Mustacchi {
1942*bc1f688bSRobert Mustacchi     if (pf->pf_include_directories) {
1943*bc1f688bSRobert Mustacchi         free(pf->pf_include_directories);
1944*bc1f688bSRobert Mustacchi         pf->pf_include_directories = 0;
1945*bc1f688bSRobert Mustacchi     }
1946*bc1f688bSRobert Mustacchi     if (pf->pf_line_table_file_entries) {
1947*bc1f688bSRobert Mustacchi         free(pf->pf_line_table_file_entries);
1948*bc1f688bSRobert Mustacchi         pf->pf_line_table_file_entries = 0;
1949*bc1f688bSRobert Mustacchi     }
1950*bc1f688bSRobert Mustacchi     return;
1951*bc1f688bSRobert Mustacchi }
1952