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 <string.h> 41*7fd79137SRobert Mustacchi #include "pro_incl.h" 42*7fd79137SRobert Mustacchi 43*7fd79137SRobert Mustacchi #define MORE_BYTES 0x80 44*7fd79137SRobert Mustacchi #define DATA_MASK 0x7f 45*7fd79137SRobert Mustacchi #define DIGIT_WIDTH 7 46*7fd79137SRobert Mustacchi #define SIGN_BIT 0x40 47*7fd79137SRobert Mustacchi 48*7fd79137SRobert Mustacchi 49*7fd79137SRobert Mustacchi /*------------------------------------------------------------- 50*7fd79137SRobert Mustacchi Encode val as a leb128. This encodes it as an unsigned 51*7fd79137SRobert Mustacchi number. 52*7fd79137SRobert Mustacchi ---------------------------------------------------------------*/ 53*7fd79137SRobert Mustacchi /* return DW_DLV_ERROR or DW_DLV_OK. 54*7fd79137SRobert Mustacchi ** space to write leb number is provided by caller, with caller 55*7fd79137SRobert Mustacchi ** passing length. 56*7fd79137SRobert Mustacchi ** number of bytes used returned thru nbytes arg 57*7fd79137SRobert Mustacchi */ 58*7fd79137SRobert Mustacchi int 59*7fd79137SRobert Mustacchi _dwarf_pro_encode_leb128_nm(Dwarf_Unsigned val, int *nbytes, 60*7fd79137SRobert Mustacchi char *space, int splen) 61*7fd79137SRobert Mustacchi { 62*7fd79137SRobert Mustacchi char *a; 63*7fd79137SRobert Mustacchi char *end = space + splen; 64*7fd79137SRobert Mustacchi 65*7fd79137SRobert Mustacchi a = space; 66*7fd79137SRobert Mustacchi do { 67*7fd79137SRobert Mustacchi unsigned char uc; 68*7fd79137SRobert Mustacchi 69*7fd79137SRobert Mustacchi if (a >= end) { 70*7fd79137SRobert Mustacchi return DW_DLV_ERROR; 71*7fd79137SRobert Mustacchi } 72*7fd79137SRobert Mustacchi uc = val & DATA_MASK; 73*7fd79137SRobert Mustacchi val >>= DIGIT_WIDTH; 74*7fd79137SRobert Mustacchi if (val != 0) { 75*7fd79137SRobert Mustacchi uc |= MORE_BYTES; 76*7fd79137SRobert Mustacchi } 77*7fd79137SRobert Mustacchi *a = uc; 78*7fd79137SRobert Mustacchi a++; 79*7fd79137SRobert Mustacchi } while (val); 80*7fd79137SRobert Mustacchi *nbytes = a - space; 81*7fd79137SRobert Mustacchi return DW_DLV_OK; 82*7fd79137SRobert Mustacchi } 83*7fd79137SRobert Mustacchi 84*7fd79137SRobert Mustacchi /* return DW_DLV_ERROR or DW_DLV_OK. 85*7fd79137SRobert Mustacchi ** space to write leb number is provided by caller, with caller 86*7fd79137SRobert Mustacchi ** passing length. 87*7fd79137SRobert Mustacchi ** number of bytes used returned thru nbytes arg 88*7fd79137SRobert Mustacchi ** encodes a signed number. 89*7fd79137SRobert Mustacchi */ 90*7fd79137SRobert Mustacchi int 91*7fd79137SRobert Mustacchi _dwarf_pro_encode_signed_leb128_nm(Dwarf_Signed value, int *nbytes, 92*7fd79137SRobert Mustacchi char *space, int splen) 93*7fd79137SRobert Mustacchi { 94*7fd79137SRobert Mustacchi char *str; 95*7fd79137SRobert Mustacchi Dwarf_Signed sign = -(value < 0); 96*7fd79137SRobert Mustacchi int more = 1; 97*7fd79137SRobert Mustacchi char *end = space + splen; 98*7fd79137SRobert Mustacchi 99*7fd79137SRobert Mustacchi str = space; 100*7fd79137SRobert Mustacchi 101*7fd79137SRobert Mustacchi do { 102*7fd79137SRobert Mustacchi unsigned char byte = value & DATA_MASK; 103*7fd79137SRobert Mustacchi 104*7fd79137SRobert Mustacchi value >>= DIGIT_WIDTH; 105*7fd79137SRobert Mustacchi 106*7fd79137SRobert Mustacchi if (str >= end) { 107*7fd79137SRobert Mustacchi return DW_DLV_ERROR; 108*7fd79137SRobert Mustacchi } 109*7fd79137SRobert Mustacchi /* 110*7fd79137SRobert Mustacchi * Remaining chunks would just contain the sign bit, and this chunk 111*7fd79137SRobert Mustacchi * has already captured at least one sign bit. 112*7fd79137SRobert Mustacchi */ 113*7fd79137SRobert Mustacchi if (value == sign && ((byte & SIGN_BIT) == (sign & SIGN_BIT))) { 114*7fd79137SRobert Mustacchi more = 0; 115*7fd79137SRobert Mustacchi } else { 116*7fd79137SRobert Mustacchi byte |= MORE_BYTES; 117*7fd79137SRobert Mustacchi } 118*7fd79137SRobert Mustacchi *str = byte; 119*7fd79137SRobert Mustacchi str++; 120*7fd79137SRobert Mustacchi } while (more); 121*7fd79137SRobert Mustacchi *nbytes = str - space; 122*7fd79137SRobert Mustacchi return DW_DLV_OK; 123*7fd79137SRobert Mustacchi } 124