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