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