gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / dwarf2 / leb.c
1 /* Low-level DWARF 2 reading code
2
3 Copyright (C) 1994-2020 Free Software Foundation, Inc.
4
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.
11
12 This file is part of GDB.
13
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.
18
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.
23
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/>. */
26
27 #include "defs.h"
28 #include "dwarf2/leb.h"
29
30 ULONGEST
31 read_unsigned_leb128 (bfd *abfd, const gdb_byte *buf,
32 unsigned int *bytes_read_ptr)
33 {
34 ULONGEST result;
35 unsigned int num_read;
36 int shift;
37 unsigned char byte;
38
39 result = 0;
40 shift = 0;
41 num_read = 0;
42 while (1)
43 {
44 byte = bfd_get_8 (abfd, buf);
45 buf++;
46 num_read++;
47 result |= ((ULONGEST) (byte & 127) << shift);
48 if ((byte & 128) == 0)
49 {
50 break;
51 }
52 shift += 7;
53 }
54 *bytes_read_ptr = num_read;
55 return result;
56 }
57
58 LONGEST
59 read_signed_leb128 (bfd *abfd, const gdb_byte *buf,
60 unsigned int *bytes_read_ptr)
61 {
62 ULONGEST result;
63 int shift, num_read;
64 unsigned char byte;
65
66 result = 0;
67 shift = 0;
68 num_read = 0;
69 while (1)
70 {
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)
77 {
78 break;
79 }
80 }
81 if ((shift < 8 * sizeof (result)) && (byte & 0x40))
82 result |= -(((ULONGEST) 1) << shift);
83 *bytes_read_ptr = num_read;
84 return result;
85 }
86
87 /* See leb.h. */
88
89 LONGEST
90 read_initial_length (bfd *abfd, const gdb_byte *buf, unsigned int *bytes_read,
91 bool handle_nonstd)
92 {
93 LONGEST length = bfd_get_32 (abfd, buf);
94
95 if (length == 0xffffffff)
96 {
97 length = bfd_get_64 (abfd, buf + 4);
98 *bytes_read = 12;
99 }
100 else if (handle_nonstd && length == 0)
101 {
102 /* Handle the (non-standard) 64-bit DWARF2 format used by IRIX. */
103 length = bfd_get_64 (abfd, buf);
104 *bytes_read = 8;
105 }
106 else
107 {
108 *bytes_read = 4;
109 }
110
111 return length;
112 }
113
114 /* See leb.h. */
115
116 LONGEST
117 read_offset (bfd *abfd, const gdb_byte *buf, unsigned int offset_size)
118 {
119 LONGEST retval = 0;
120
121 switch (offset_size)
122 {
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));
133 }
134
135 return retval;
136 }
This page took 0.049623 seconds and 4 git commands to generate.