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