Home | History | Annotate | Line # | Download | only in dwarf2
      1      1.1  christos /* Low-level DWARF 2 reading code
      2      1.1  christos 
      3  1.1.1.3  christos    Copyright (C) 1994-2024 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    Adapted by Gary Funck (gary (at) intrepid.com), Intrepid Technology,
      6      1.1  christos    Inc.  with support from Florida State University (under contract
      7      1.1  christos    with the Ada Joint Program Office), and Silicon Graphics, Inc.
      8      1.1  christos    Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
      9      1.1  christos    based on Fred Fish's (Cygnus Support) implementation of DWARF 1
     10      1.1  christos    support.
     11      1.1  christos 
     12      1.1  christos    This file is part of GDB.
     13      1.1  christos 
     14      1.1  christos    This program is free software; you can redistribute it and/or modify
     15      1.1  christos    it under the terms of the GNU General Public License as published by
     16      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     17      1.1  christos    (at your option) any later version.
     18      1.1  christos 
     19      1.1  christos    This program is distributed in the hope that it will be useful,
     20      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     21      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22      1.1  christos    GNU General Public License for more details.
     23      1.1  christos 
     24      1.1  christos    You should have received a copy of the GNU General Public License
     25      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     26      1.1  christos 
     27      1.1  christos #include "dwarf2/leb.h"
     28      1.1  christos 
     29      1.1  christos ULONGEST
     30      1.1  christos read_unsigned_leb128 (bfd *abfd, const gdb_byte *buf,
     31      1.1  christos 			  unsigned int *bytes_read_ptr)
     32      1.1  christos {
     33      1.1  christos   ULONGEST result;
     34      1.1  christos   unsigned int num_read;
     35      1.1  christos   int shift;
     36      1.1  christos   unsigned char byte;
     37      1.1  christos 
     38      1.1  christos   result = 0;
     39      1.1  christos   shift = 0;
     40      1.1  christos   num_read = 0;
     41      1.1  christos   while (1)
     42      1.1  christos     {
     43      1.1  christos       byte = bfd_get_8 (abfd, buf);
     44      1.1  christos       buf++;
     45      1.1  christos       num_read++;
     46      1.1  christos       result |= ((ULONGEST) (byte & 127) << shift);
     47      1.1  christos       if ((byte & 128) == 0)
     48      1.1  christos 	{
     49      1.1  christos 	  break;
     50      1.1  christos 	}
     51      1.1  christos       shift += 7;
     52      1.1  christos     }
     53      1.1  christos   *bytes_read_ptr = num_read;
     54      1.1  christos   return result;
     55      1.1  christos }
     56      1.1  christos 
     57      1.1  christos LONGEST
     58      1.1  christos read_signed_leb128 (bfd *abfd, const gdb_byte *buf,
     59      1.1  christos 		    unsigned int *bytes_read_ptr)
     60      1.1  christos {
     61      1.1  christos   ULONGEST result;
     62      1.1  christos   int shift, num_read;
     63      1.1  christos   unsigned char byte;
     64      1.1  christos 
     65      1.1  christos   result = 0;
     66      1.1  christos   shift = 0;
     67      1.1  christos   num_read = 0;
     68      1.1  christos   while (1)
     69      1.1  christos     {
     70      1.1  christos       byte = bfd_get_8 (abfd, buf);
     71      1.1  christos       buf++;
     72      1.1  christos       num_read++;
     73      1.1  christos       result |= ((ULONGEST) (byte & 127) << shift);
     74      1.1  christos       shift += 7;
     75      1.1  christos       if ((byte & 128) == 0)
     76      1.1  christos 	{
     77      1.1  christos 	  break;
     78      1.1  christos 	}
     79      1.1  christos     }
     80      1.1  christos   if ((shift < 8 * sizeof (result)) && (byte & 0x40))
     81      1.1  christos     result |= -(((ULONGEST) 1) << shift);
     82      1.1  christos   *bytes_read_ptr = num_read;
     83      1.1  christos   return result;
     84      1.1  christos }
     85      1.1  christos 
     86      1.1  christos /* See leb.h.  */
     87      1.1  christos 
     88      1.1  christos LONGEST
     89      1.1  christos read_initial_length (bfd *abfd, const gdb_byte *buf, unsigned int *bytes_read,
     90      1.1  christos 		     bool handle_nonstd)
     91      1.1  christos {
     92      1.1  christos   LONGEST length = bfd_get_32 (abfd, buf);
     93      1.1  christos 
     94      1.1  christos   if (length == 0xffffffff)
     95      1.1  christos     {
     96      1.1  christos       length = bfd_get_64 (abfd, buf + 4);
     97      1.1  christos       *bytes_read = 12;
     98      1.1  christos     }
     99      1.1  christos   else if (handle_nonstd && length == 0)
    100      1.1  christos     {
    101      1.1  christos       /* Handle the (non-standard) 64-bit DWARF2 format used by IRIX.  */
    102      1.1  christos       length = bfd_get_64 (abfd, buf);
    103      1.1  christos       *bytes_read = 8;
    104      1.1  christos     }
    105      1.1  christos   else
    106      1.1  christos     {
    107      1.1  christos       *bytes_read = 4;
    108      1.1  christos     }
    109      1.1  christos 
    110      1.1  christos   return length;
    111      1.1  christos }
    112      1.1  christos 
    113      1.1  christos /* See leb.h.  */
    114      1.1  christos 
    115      1.1  christos LONGEST
    116      1.1  christos read_offset (bfd *abfd, const gdb_byte *buf, unsigned int offset_size)
    117      1.1  christos {
    118      1.1  christos   LONGEST retval = 0;
    119      1.1  christos 
    120      1.1  christos   switch (offset_size)
    121      1.1  christos     {
    122      1.1  christos     case 4:
    123      1.1  christos       retval = bfd_get_32 (abfd, buf);
    124      1.1  christos       break;
    125      1.1  christos     case 8:
    126      1.1  christos       retval = bfd_get_64 (abfd, buf);
    127      1.1  christos       break;
    128      1.1  christos     default:
    129  1.1.1.2  christos       internal_error (_("read_offset_1: bad switch [in module %s]"),
    130      1.1  christos 		      bfd_get_filename (abfd));
    131      1.1  christos     }
    132      1.1  christos 
    133      1.1  christos   return retval;
    134      1.1  christos }
    135