xref: /titanic_52/usr/src/lib/libdwarf/common/pro_macinfo.c (revision 7fd791373689a6af05e27efec3b1ab556e02aa23)
1*7fd79137SRobert Mustacchi /*
2*7fd79137SRobert Mustacchi 
3*7fd79137SRobert Mustacchi   Copyright (C) 2000,2004 Silicon Graphics, Inc.  All Rights Reserved.
4*7fd79137SRobert Mustacchi 
5*7fd79137SRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
6*7fd79137SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
7*7fd79137SRobert Mustacchi   as published by the Free Software Foundation.
8*7fd79137SRobert Mustacchi 
9*7fd79137SRobert Mustacchi   This program is distributed in the hope that it would be useful, but
10*7fd79137SRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
11*7fd79137SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*7fd79137SRobert Mustacchi 
13*7fd79137SRobert Mustacchi   Further, this software is distributed without any warranty that it is
14*7fd79137SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
15*7fd79137SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
16*7fd79137SRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
17*7fd79137SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
18*7fd79137SRobert Mustacchi   other software, or any other product whatsoever.
19*7fd79137SRobert Mustacchi 
20*7fd79137SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
21*7fd79137SRobert Mustacchi   License along with this program; if not, write the Free Software
22*7fd79137SRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
23*7fd79137SRobert Mustacchi   USA.
24*7fd79137SRobert Mustacchi 
25*7fd79137SRobert Mustacchi   Contact information:  Silicon Graphics, Inc., 1500 Crittenden Lane,
26*7fd79137SRobert Mustacchi   Mountain View, CA 94043, or:
27*7fd79137SRobert Mustacchi 
28*7fd79137SRobert Mustacchi   http://www.sgi.com
29*7fd79137SRobert Mustacchi 
30*7fd79137SRobert Mustacchi   For further information regarding this notice, see:
31*7fd79137SRobert Mustacchi 
32*7fd79137SRobert Mustacchi   http://oss.sgi.com/projects/GenInfo/NoticeExplan
33*7fd79137SRobert Mustacchi 
34*7fd79137SRobert Mustacchi */
35*7fd79137SRobert Mustacchi 
36*7fd79137SRobert Mustacchi 
37*7fd79137SRobert Mustacchi 
38*7fd79137SRobert Mustacchi #include "config.h"
39*7fd79137SRobert Mustacchi #include "libdwarfdefs.h"
40*7fd79137SRobert Mustacchi #include <stdio.h>
41*7fd79137SRobert Mustacchi #include <string.h>
42*7fd79137SRobert Mustacchi #include "pro_incl.h"
43*7fd79137SRobert Mustacchi #include "pro_section.h"
44*7fd79137SRobert Mustacchi #include "pro_macinfo.h"
45*7fd79137SRobert Mustacchi 
46*7fd79137SRobert Mustacchi /*
47*7fd79137SRobert Mustacchi         I don't much like the error strings this generates, since
48*7fd79137SRobert Mustacchi         like the rest of libdwarf they are simple strings with
49*7fd79137SRobert Mustacchi         no useful numbers in them. But that's not something I can
50*7fd79137SRobert Mustacchi         fix without more work than I have time for
51*7fd79137SRobert Mustacchi         right now.  davea Nov 94.
52*7fd79137SRobert Mustacchi */
53*7fd79137SRobert Mustacchi 
54*7fd79137SRobert Mustacchi /* these are gross overestimates of the number of
55*7fd79137SRobert Mustacchi ** bytes needed to store a number in LEB form.
56*7fd79137SRobert Mustacchi ** Just estimates, and since blocks are reasonable size,
57*7fd79137SRobert Mustacchi ** the end-block waste is small.
58*7fd79137SRobert Mustacchi ** Of course the waste is NOT present on disk.
59*7fd79137SRobert Mustacchi */
60*7fd79137SRobert Mustacchi 
61*7fd79137SRobert Mustacchi #define COMMAND_LEN ENCODE_SPACE_NEEDED
62*7fd79137SRobert Mustacchi #define LINE_LEN    ENCODE_SPACE_NEEDED
63*7fd79137SRobert Mustacchi #define BASE_MACINFO_MALLOC_LEN 2048
64*7fd79137SRobert Mustacchi 
65*7fd79137SRobert Mustacchi static int
66*7fd79137SRobert Mustacchi libdwarf_compose_begin(Dwarf_P_Debug dbg, int code,
67*7fd79137SRobert Mustacchi                        size_t maxlen, int *compose_error_type)
68*7fd79137SRobert Mustacchi {
69*7fd79137SRobert Mustacchi     unsigned char *nextchar;
70*7fd79137SRobert Mustacchi     struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo;
71*7fd79137SRobert Mustacchi 
72*7fd79137SRobert Mustacchi     if (curblk == 0) {
73*7fd79137SRobert Mustacchi         struct dw_macinfo_block_s *newb;
74*7fd79137SRobert Mustacchi         size_t len;
75*7fd79137SRobert Mustacchi 
76*7fd79137SRobert Mustacchi         /* initial allocation */
77*7fd79137SRobert Mustacchi         size_t blen = BASE_MACINFO_MALLOC_LEN;
78*7fd79137SRobert Mustacchi 
79*7fd79137SRobert Mustacchi         if (blen < maxlen) {
80*7fd79137SRobert Mustacchi             blen = 2 * maxlen;
81*7fd79137SRobert Mustacchi         }
82*7fd79137SRobert Mustacchi         len = sizeof(struct dw_macinfo_block_s) + blen;
83*7fd79137SRobert Mustacchi         newb =
84*7fd79137SRobert Mustacchi             (struct dw_macinfo_block_s *) _dwarf_p_get_alloc(dbg, len);
85*7fd79137SRobert Mustacchi         if (!newb) {
86*7fd79137SRobert Mustacchi             *compose_error_type = DW_DLE_MACINFO_MALLOC_FAIL;
87*7fd79137SRobert Mustacchi             return DW_DLV_ERROR;
88*7fd79137SRobert Mustacchi         }
89*7fd79137SRobert Mustacchi         newb->mb_data =
90*7fd79137SRobert Mustacchi             (char *) newb + sizeof(struct dw_macinfo_block_s);
91*7fd79137SRobert Mustacchi         newb->mb_avail_len = blen;
92*7fd79137SRobert Mustacchi         newb->mb_used_len = 0;
93*7fd79137SRobert Mustacchi         newb->mb_macinfo_data_space_len = blen;
94*7fd79137SRobert Mustacchi         dbg->de_first_macinfo = newb;
95*7fd79137SRobert Mustacchi         dbg->de_current_macinfo = newb;
96*7fd79137SRobert Mustacchi         curblk = newb;
97*7fd79137SRobert Mustacchi     } else if (curblk->mb_avail_len < maxlen) {
98*7fd79137SRobert Mustacchi         struct dw_macinfo_block_s *newb;
99*7fd79137SRobert Mustacchi         size_t len;
100*7fd79137SRobert Mustacchi 
101*7fd79137SRobert Mustacchi         /* no space left in block: allocate a new block */
102*7fd79137SRobert Mustacchi         size_t blen =
103*7fd79137SRobert Mustacchi             dbg->de_current_macinfo->mb_macinfo_data_space_len * 2;
104*7fd79137SRobert Mustacchi         if (blen < maxlen) {
105*7fd79137SRobert Mustacchi             blen = 2 * maxlen;
106*7fd79137SRobert Mustacchi         }
107*7fd79137SRobert Mustacchi         len = sizeof(struct dw_macinfo_block_s) + blen;
108*7fd79137SRobert Mustacchi         newb =
109*7fd79137SRobert Mustacchi             (struct dw_macinfo_block_s *) _dwarf_p_get_alloc(dbg, len);
110*7fd79137SRobert Mustacchi         if (!newb) {
111*7fd79137SRobert Mustacchi             *compose_error_type = DW_DLE_MACINFO_MALLOC_FAIL;
112*7fd79137SRobert Mustacchi             return DW_DLV_ERROR;
113*7fd79137SRobert Mustacchi         }
114*7fd79137SRobert Mustacchi         newb->mb_data =
115*7fd79137SRobert Mustacchi             (char *) newb + sizeof(struct dw_macinfo_block_s);
116*7fd79137SRobert Mustacchi         newb->mb_avail_len = blen;
117*7fd79137SRobert Mustacchi         newb->mb_used_len = 0;
118*7fd79137SRobert Mustacchi         newb->mb_macinfo_data_space_len = blen;
119*7fd79137SRobert Mustacchi         dbg->de_first_macinfo->mb_next = newb;
120*7fd79137SRobert Mustacchi         dbg->de_current_macinfo = newb;
121*7fd79137SRobert Mustacchi         curblk = newb;
122*7fd79137SRobert Mustacchi     }
123*7fd79137SRobert Mustacchi     /* now curblk has enough room */
124*7fd79137SRobert Mustacchi     dbg->de_compose_avail = curblk->mb_avail_len;
125*7fd79137SRobert Mustacchi     dbg->de_compose_used_len = curblk->mb_used_len;
126*7fd79137SRobert Mustacchi     nextchar =
127*7fd79137SRobert Mustacchi         (unsigned char *) (curblk->mb_data + dbg->de_compose_used_len);
128*7fd79137SRobert Mustacchi     *nextchar = code;
129*7fd79137SRobert Mustacchi     dbg->de_compose_avail--;
130*7fd79137SRobert Mustacchi     ++dbg->de_compose_used_len;
131*7fd79137SRobert Mustacchi     return DW_DLV_OK;
132*7fd79137SRobert Mustacchi }
133*7fd79137SRobert Mustacchi 
134*7fd79137SRobert Mustacchi 
135*7fd79137SRobert Mustacchi 
136*7fd79137SRobert Mustacchi static void
137*7fd79137SRobert Mustacchi libdwarf_compose_add_string(Dwarf_P_Debug dbg, char *string, size_t len)
138*7fd79137SRobert Mustacchi {
139*7fd79137SRobert Mustacchi     struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo;
140*7fd79137SRobert Mustacchi     unsigned char *nextchar;
141*7fd79137SRobert Mustacchi 
142*7fd79137SRobert Mustacchi     nextchar =
143*7fd79137SRobert Mustacchi         (unsigned char *) (curblk->mb_data + dbg->de_compose_used_len);
144*7fd79137SRobert Mustacchi 
145*7fd79137SRobert Mustacchi     len += 1;                   /* count the null terminator */
146*7fd79137SRobert Mustacchi 
147*7fd79137SRobert Mustacchi     memcpy(nextchar, string, len);
148*7fd79137SRobert Mustacchi     dbg->de_compose_avail -= len;
149*7fd79137SRobert Mustacchi     dbg->de_compose_used_len += len;
150*7fd79137SRobert Mustacchi     return;
151*7fd79137SRobert Mustacchi 
152*7fd79137SRobert Mustacchi }
153*7fd79137SRobert Mustacchi static int
154*7fd79137SRobert Mustacchi libdwarf_compose_add_line(Dwarf_P_Debug dbg,
155*7fd79137SRobert Mustacchi                           Dwarf_Unsigned line, int *compose_error_type)
156*7fd79137SRobert Mustacchi {
157*7fd79137SRobert Mustacchi     struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo;
158*7fd79137SRobert Mustacchi     unsigned char *nextchar;
159*7fd79137SRobert Mustacchi     int res;
160*7fd79137SRobert Mustacchi     int nbytes;
161*7fd79137SRobert Mustacchi 
162*7fd79137SRobert Mustacchi     nextchar =
163*7fd79137SRobert Mustacchi         (unsigned char *) (curblk->mb_data + dbg->de_compose_used_len);
164*7fd79137SRobert Mustacchi 
165*7fd79137SRobert Mustacchi     /* Put the created leb number directly into the macro buffer If
166*7fd79137SRobert Mustacchi        dbg->de_compose_avail is > INT_MAX this will not work as the
167*7fd79137SRobert Mustacchi        'int' will look negative to _dwarf_pro_encode_leb128_nm! */
168*7fd79137SRobert Mustacchi 
169*7fd79137SRobert Mustacchi     res = _dwarf_pro_encode_leb128_nm(line, &nbytes,
170*7fd79137SRobert Mustacchi                                       (char *) nextchar,
171*7fd79137SRobert Mustacchi                                       (int) dbg->de_compose_avail);
172*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
173*7fd79137SRobert Mustacchi         *compose_error_type = DW_DLE_MACINFO_INTERNAL_ERROR_SPACE;
174*7fd79137SRobert Mustacchi         return DW_DLV_ERROR;
175*7fd79137SRobert Mustacchi     }
176*7fd79137SRobert Mustacchi 
177*7fd79137SRobert Mustacchi     dbg->de_compose_avail -= nbytes;
178*7fd79137SRobert Mustacchi     dbg->de_compose_used_len += nbytes;
179*7fd79137SRobert Mustacchi     return DW_DLV_OK;
180*7fd79137SRobert Mustacchi }
181*7fd79137SRobert Mustacchi 
182*7fd79137SRobert Mustacchi /*
183*7fd79137SRobert Mustacchi    This function actually 'commits' the space used by the
184*7fd79137SRobert Mustacchi    preceeding calls.
185*7fd79137SRobert Mustacchi */
186*7fd79137SRobert Mustacchi static int
187*7fd79137SRobert Mustacchi libdwarf_compose_complete(Dwarf_P_Debug dbg, int *compose_error_type)
188*7fd79137SRobert Mustacchi {
189*7fd79137SRobert Mustacchi     struct dw_macinfo_block_s *curblk = dbg->de_current_macinfo;
190*7fd79137SRobert Mustacchi 
191*7fd79137SRobert Mustacchi     if (dbg->de_compose_used_len > curblk->mb_macinfo_data_space_len) {
192*7fd79137SRobert Mustacchi         *compose_error_type = DW_DLE_MACINFO_INTERNAL_ERROR_SPACE;
193*7fd79137SRobert Mustacchi         return DW_DLV_ERROR;
194*7fd79137SRobert Mustacchi     }
195*7fd79137SRobert Mustacchi     curblk->mb_avail_len = dbg->de_compose_avail;
196*7fd79137SRobert Mustacchi     curblk->mb_used_len = dbg->de_compose_used_len;
197*7fd79137SRobert Mustacchi     return DW_DLV_OK;
198*7fd79137SRobert Mustacchi }
199*7fd79137SRobert Mustacchi 
200*7fd79137SRobert Mustacchi 
201*7fd79137SRobert Mustacchi 
202*7fd79137SRobert Mustacchi int
203*7fd79137SRobert Mustacchi dwarf_def_macro(Dwarf_P_Debug dbg,
204*7fd79137SRobert Mustacchi                 Dwarf_Unsigned line,
205*7fd79137SRobert Mustacchi                 char *macname, char *macvalue, Dwarf_Error * error)
206*7fd79137SRobert Mustacchi {
207*7fd79137SRobert Mustacchi     size_t len;
208*7fd79137SRobert Mustacchi     size_t len2;
209*7fd79137SRobert Mustacchi     size_t length_est;
210*7fd79137SRobert Mustacchi     int res;
211*7fd79137SRobert Mustacchi     int compose_error_type;
212*7fd79137SRobert Mustacchi 
213*7fd79137SRobert Mustacchi     if (dbg == NULL) {
214*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
215*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
216*7fd79137SRobert Mustacchi     }
217*7fd79137SRobert Mustacchi     if (macname == 0) {
218*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_NULL);
219*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
220*7fd79137SRobert Mustacchi     }
221*7fd79137SRobert Mustacchi     len = strlen(macname) + 1;
222*7fd79137SRobert Mustacchi     if (len == 0) {
223*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_EMPTY);
224*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
225*7fd79137SRobert Mustacchi     }
226*7fd79137SRobert Mustacchi     if (macvalue) {
227*7fd79137SRobert Mustacchi         len2 = strlen(macvalue) + 1;
228*7fd79137SRobert Mustacchi     } else {
229*7fd79137SRobert Mustacchi         len2 = 0;
230*7fd79137SRobert Mustacchi     }
231*7fd79137SRobert Mustacchi     length_est = COMMAND_LEN + LINE_LEN + len + len2 + 1;       /* 1
232*7fd79137SRobert Mustacchi                                                                    for
233*7fd79137SRobert Mustacchi                                                                    space
234*7fd79137SRobert Mustacchi                                                                    character
235*7fd79137SRobert Mustacchi                                                                    we
236*7fd79137SRobert Mustacchi                                                                    add */
237*7fd79137SRobert Mustacchi     res = libdwarf_compose_begin(dbg, DW_MACINFO_define, length_est,
238*7fd79137SRobert Mustacchi                                  &compose_error_type);
239*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
240*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
241*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
242*7fd79137SRobert Mustacchi     }
243*7fd79137SRobert Mustacchi     res = libdwarf_compose_add_line(dbg, line, &compose_error_type);
244*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
245*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
246*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
247*7fd79137SRobert Mustacchi     }
248*7fd79137SRobert Mustacchi     libdwarf_compose_add_string(dbg, macname, len);
249*7fd79137SRobert Mustacchi     libdwarf_compose_add_string(dbg, " ", 1);
250*7fd79137SRobert Mustacchi     if (macvalue) {
251*7fd79137SRobert Mustacchi         libdwarf_compose_add_string(dbg, " ", 1);
252*7fd79137SRobert Mustacchi         libdwarf_compose_add_string(dbg, macvalue, len2);
253*7fd79137SRobert Mustacchi     }
254*7fd79137SRobert Mustacchi     res = libdwarf_compose_complete(dbg, &compose_error_type);
255*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
256*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
257*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
258*7fd79137SRobert Mustacchi     }
259*7fd79137SRobert Mustacchi     return DW_DLV_OK;
260*7fd79137SRobert Mustacchi }
261*7fd79137SRobert Mustacchi 
262*7fd79137SRobert Mustacchi int
263*7fd79137SRobert Mustacchi dwarf_undef_macro(Dwarf_P_Debug dbg,
264*7fd79137SRobert Mustacchi                   Dwarf_Unsigned line,
265*7fd79137SRobert Mustacchi                   char *macname, Dwarf_Error * error)
266*7fd79137SRobert Mustacchi {
267*7fd79137SRobert Mustacchi 
268*7fd79137SRobert Mustacchi     size_t len;
269*7fd79137SRobert Mustacchi     size_t length_est;
270*7fd79137SRobert Mustacchi     int res;
271*7fd79137SRobert Mustacchi     int compose_error_type;
272*7fd79137SRobert Mustacchi 
273*7fd79137SRobert Mustacchi     if (dbg == NULL) {
274*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
275*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
276*7fd79137SRobert Mustacchi     }
277*7fd79137SRobert Mustacchi     if (macname == 0) {
278*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_NULL);
279*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
280*7fd79137SRobert Mustacchi     }
281*7fd79137SRobert Mustacchi     len = strlen(macname) + 1;
282*7fd79137SRobert Mustacchi     if (len == 0) {
283*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_EMPTY);
284*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
285*7fd79137SRobert Mustacchi     }
286*7fd79137SRobert Mustacchi     length_est = COMMAND_LEN + LINE_LEN + len;
287*7fd79137SRobert Mustacchi     res = libdwarf_compose_begin(dbg, DW_MACINFO_undef, length_est,
288*7fd79137SRobert Mustacchi                                  &compose_error_type);
289*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
290*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
291*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
292*7fd79137SRobert Mustacchi     }
293*7fd79137SRobert Mustacchi     res = libdwarf_compose_add_line(dbg, line, &compose_error_type);
294*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
295*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
296*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
297*7fd79137SRobert Mustacchi     }
298*7fd79137SRobert Mustacchi     libdwarf_compose_add_string(dbg, macname, len);
299*7fd79137SRobert Mustacchi     res = libdwarf_compose_complete(dbg, &compose_error_type);
300*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
301*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
302*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
303*7fd79137SRobert Mustacchi     }
304*7fd79137SRobert Mustacchi     return DW_DLV_OK;
305*7fd79137SRobert Mustacchi }
306*7fd79137SRobert Mustacchi 
307*7fd79137SRobert Mustacchi int
308*7fd79137SRobert Mustacchi dwarf_start_macro_file(Dwarf_P_Debug dbg,
309*7fd79137SRobert Mustacchi                        Dwarf_Unsigned fileindex,
310*7fd79137SRobert Mustacchi                        Dwarf_Unsigned linenumber, Dwarf_Error * error)
311*7fd79137SRobert Mustacchi {
312*7fd79137SRobert Mustacchi     size_t length_est;
313*7fd79137SRobert Mustacchi     int res;
314*7fd79137SRobert Mustacchi     int compose_error_type;
315*7fd79137SRobert Mustacchi 
316*7fd79137SRobert Mustacchi     if (dbg == NULL) {
317*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
318*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
319*7fd79137SRobert Mustacchi     }
320*7fd79137SRobert Mustacchi     length_est = COMMAND_LEN + LINE_LEN + LINE_LEN;
321*7fd79137SRobert Mustacchi     res = libdwarf_compose_begin(dbg, DW_MACINFO_start_file, length_est,
322*7fd79137SRobert Mustacchi                                  &compose_error_type);
323*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
324*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
325*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
326*7fd79137SRobert Mustacchi     }
327*7fd79137SRobert Mustacchi     res = libdwarf_compose_add_line(dbg, fileindex,
328*7fd79137SRobert Mustacchi                                     &compose_error_type);
329*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
330*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
331*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
332*7fd79137SRobert Mustacchi     }
333*7fd79137SRobert Mustacchi     res = libdwarf_compose_add_line(dbg, linenumber,
334*7fd79137SRobert Mustacchi                                     &compose_error_type);
335*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
336*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
337*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
338*7fd79137SRobert Mustacchi     }
339*7fd79137SRobert Mustacchi     return DW_DLV_OK;
340*7fd79137SRobert Mustacchi }
341*7fd79137SRobert Mustacchi 
342*7fd79137SRobert Mustacchi int
343*7fd79137SRobert Mustacchi dwarf_end_macro_file(Dwarf_P_Debug dbg, Dwarf_Error * error)
344*7fd79137SRobert Mustacchi {
345*7fd79137SRobert Mustacchi     size_t length_est;
346*7fd79137SRobert Mustacchi     int res;
347*7fd79137SRobert Mustacchi     int compose_error_type;
348*7fd79137SRobert Mustacchi 
349*7fd79137SRobert Mustacchi     if (dbg == NULL) {
350*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
351*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
352*7fd79137SRobert Mustacchi     }
353*7fd79137SRobert Mustacchi     length_est = COMMAND_LEN;
354*7fd79137SRobert Mustacchi     res = libdwarf_compose_begin(dbg, DW_MACINFO_end_file, length_est,
355*7fd79137SRobert Mustacchi                                  &compose_error_type);
356*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
357*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
358*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
359*7fd79137SRobert Mustacchi     }
360*7fd79137SRobert Mustacchi     res = libdwarf_compose_complete(dbg, &compose_error_type);
361*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
362*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
363*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
364*7fd79137SRobert Mustacchi     }
365*7fd79137SRobert Mustacchi     return DW_DLV_OK;
366*7fd79137SRobert Mustacchi }
367*7fd79137SRobert Mustacchi 
368*7fd79137SRobert Mustacchi int
369*7fd79137SRobert Mustacchi dwarf_vendor_ext(Dwarf_P_Debug dbg,
370*7fd79137SRobert Mustacchi                  Dwarf_Unsigned constant,
371*7fd79137SRobert Mustacchi                  char *string, Dwarf_Error * error)
372*7fd79137SRobert Mustacchi {
373*7fd79137SRobert Mustacchi     size_t len;
374*7fd79137SRobert Mustacchi     size_t length_est;
375*7fd79137SRobert Mustacchi     int res;
376*7fd79137SRobert Mustacchi     int compose_error_type;
377*7fd79137SRobert Mustacchi 
378*7fd79137SRobert Mustacchi     if (dbg == NULL) {
379*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_DBG_NULL);
380*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
381*7fd79137SRobert Mustacchi     }
382*7fd79137SRobert Mustacchi     if (string == 0) {
383*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_NULL);
384*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
385*7fd79137SRobert Mustacchi     }
386*7fd79137SRobert Mustacchi     len = strlen(string) + 1;
387*7fd79137SRobert Mustacchi     if (len == 0) {
388*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, DW_DLE_MACINFO_STRING_EMPTY);
389*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
390*7fd79137SRobert Mustacchi     }
391*7fd79137SRobert Mustacchi     length_est = COMMAND_LEN + LINE_LEN + len;
392*7fd79137SRobert Mustacchi     res = libdwarf_compose_begin(dbg, DW_MACINFO_vendor_ext, length_est,
393*7fd79137SRobert Mustacchi                                  &compose_error_type);
394*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
395*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
396*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
397*7fd79137SRobert Mustacchi     }
398*7fd79137SRobert Mustacchi     res = libdwarf_compose_add_line(dbg, constant, &compose_error_type);
399*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
400*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
401*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
402*7fd79137SRobert Mustacchi     }
403*7fd79137SRobert Mustacchi     libdwarf_compose_add_string(dbg, string, len);
404*7fd79137SRobert Mustacchi     libdwarf_compose_complete(dbg, &compose_error_type);
405*7fd79137SRobert Mustacchi     if (res != DW_DLV_OK) {
406*7fd79137SRobert Mustacchi         _dwarf_p_error(NULL, error, compose_error_type);
407*7fd79137SRobert Mustacchi         return (DW_DLV_ERROR);
408*7fd79137SRobert Mustacchi     }
409*7fd79137SRobert Mustacchi     return DW_DLV_OK;
410*7fd79137SRobert Mustacchi }
411*7fd79137SRobert Mustacchi 
412*7fd79137SRobert Mustacchi 
413*7fd79137SRobert Mustacchi 
414*7fd79137SRobert Mustacchi int
415*7fd79137SRobert Mustacchi _dwarf_pro_transform_macro_info_to_disk(Dwarf_P_Debug dbg,
416*7fd79137SRobert Mustacchi                                         Dwarf_Error * error)
417*7fd79137SRobert Mustacchi {
418*7fd79137SRobert Mustacchi     /* Total num of bytes in .debug_macinfo section. */
419*7fd79137SRobert Mustacchi     Dwarf_Unsigned mac_num_bytes;
420*7fd79137SRobert Mustacchi 
421*7fd79137SRobert Mustacchi     /* Points to first byte of .debug_macinfo buffer. */
422*7fd79137SRobert Mustacchi     Dwarf_Small *macinfo;
423*7fd79137SRobert Mustacchi 
424*7fd79137SRobert Mustacchi     /* Fills in the .debug_macinfo buffer. */
425*7fd79137SRobert Mustacchi     Dwarf_Small *macinfo_ptr;
426*7fd79137SRobert Mustacchi 
427*7fd79137SRobert Mustacchi 
428*7fd79137SRobert Mustacchi     /* Used to scan the section data buffers. */
429*7fd79137SRobert Mustacchi     struct dw_macinfo_block_s *m_prev;
430*7fd79137SRobert Mustacchi     struct dw_macinfo_block_s *m_sect;
431*7fd79137SRobert Mustacchi 
432*7fd79137SRobert Mustacchi 
433*7fd79137SRobert Mustacchi     /* Get the size of the debug_macinfo data */
434*7fd79137SRobert Mustacchi     mac_num_bytes = 0;
435*7fd79137SRobert Mustacchi     for (m_sect = dbg->de_first_macinfo; m_sect != NULL;
436*7fd79137SRobert Mustacchi          m_sect = m_sect->mb_next) {
437*7fd79137SRobert Mustacchi         mac_num_bytes += m_sect->mb_used_len;
438*7fd79137SRobert Mustacchi     }
439*7fd79137SRobert Mustacchi     /* Tthe final entry has a type code of 0 to indicate It is final
440*7fd79137SRobert Mustacchi        for this CU Takes just 1 byte. */
441*7fd79137SRobert Mustacchi     mac_num_bytes += 1;
442*7fd79137SRobert Mustacchi 
443*7fd79137SRobert Mustacchi     GET_CHUNK(dbg, dbg->de_elf_sects[DEBUG_MACINFO],
444*7fd79137SRobert Mustacchi               macinfo, (unsigned long) mac_num_bytes, error);
445*7fd79137SRobert Mustacchi     if (macinfo == NULL) {
446*7fd79137SRobert Mustacchi         _dwarf_p_error(dbg, error, DW_DLE_ALLOC_FAIL);
447*7fd79137SRobert Mustacchi         return (0);
448*7fd79137SRobert Mustacchi     }
449*7fd79137SRobert Mustacchi 
450*7fd79137SRobert Mustacchi     macinfo_ptr = macinfo;
451*7fd79137SRobert Mustacchi     m_prev = 0;
452*7fd79137SRobert Mustacchi     for (m_sect = dbg->de_first_macinfo; m_sect != NULL;
453*7fd79137SRobert Mustacchi          m_sect = m_sect->mb_next) {
454*7fd79137SRobert Mustacchi         memcpy(macinfo_ptr, m_sect->mb_data, m_sect->mb_used_len);
455*7fd79137SRobert Mustacchi         macinfo_ptr += m_sect->mb_used_len;
456*7fd79137SRobert Mustacchi         if (m_prev) {
457*7fd79137SRobert Mustacchi             _dwarf_p_dealloc(dbg, (Dwarf_Small *) m_prev);
458*7fd79137SRobert Mustacchi             m_prev = 0;
459*7fd79137SRobert Mustacchi         }
460*7fd79137SRobert Mustacchi         m_prev = m_sect;
461*7fd79137SRobert Mustacchi     }
462*7fd79137SRobert Mustacchi     *macinfo_ptr = 0;           /* the type code of 0 as last entry */
463*7fd79137SRobert Mustacchi     if (m_prev) {
464*7fd79137SRobert Mustacchi         _dwarf_p_dealloc(dbg, (Dwarf_Small *) m_prev);
465*7fd79137SRobert Mustacchi         m_prev = 0;
466*7fd79137SRobert Mustacchi     }
467*7fd79137SRobert Mustacchi 
468*7fd79137SRobert Mustacchi     dbg->de_first_macinfo = NULL;
469*7fd79137SRobert Mustacchi     dbg->de_current_macinfo = NULL;
470*7fd79137SRobert Mustacchi 
471*7fd79137SRobert Mustacchi     return (int) dbg->de_n_debug_sect;
472*7fd79137SRobert Mustacchi }
473