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