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
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/>. */
28 #include "dwarf2/leb.h"
31 read_unsigned_leb128 (bfd
*abfd
, const gdb_byte
*buf
,
32 unsigned int *bytes_read_ptr
)
35 unsigned int num_read
;
44 byte
= bfd_get_8 (abfd
, buf
);
47 result
|= ((ULONGEST
) (byte
& 127) << shift
);
48 if ((byte
& 128) == 0)
54 *bytes_read_ptr
= num_read
;
59 read_signed_leb128 (bfd
*abfd
, const gdb_byte
*buf
,
60 unsigned int *bytes_read_ptr
)
71 byte
= bfd_get_8 (abfd
, buf
);
74 result
|= ((ULONGEST
) (byte
& 127) << shift
);
76 if ((byte
& 128) == 0)
81 if ((shift
< 8 * sizeof (result
)) && (byte
& 0x40))
82 result
|= -(((ULONGEST
) 1) << shift
);
83 *bytes_read_ptr
= num_read
;
90 read_initial_length (bfd
*abfd
, const gdb_byte
*buf
, unsigned int *bytes_read
,
93 LONGEST length
= bfd_get_32 (abfd
, buf
);
95 if (length
== 0xffffffff)
97 length
= bfd_get_64 (abfd
, buf
+ 4);
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
);
117 read_offset (bfd
*abfd
, const gdb_byte
*buf
, unsigned int offset_size
)
124 retval
= bfd_get_32 (abfd
, buf
);
127 retval
= bfd_get_64 (abfd
, buf
);
130 internal_error (__FILE__
, __LINE__
,
131 _("read_offset_1: bad switch [in module %s]"),
132 bfd_get_filename (abfd
));