]> Git Repo - binutils.git/blob - gdb/dwarf2/leb.c
Automatic date update in version.in
[binutils.git] / gdb / dwarf2 / leb.c
1 /* Low-level DWARF 2 reading code
2
3    Copyright (C) 1994-2022 Free Software Foundation, Inc.
4
5    Adapted by Gary Funck ([email protected]), 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 (_("read_offset_1: bad switch [in module %s]"),
131                       bfd_get_filename (abfd));
132     }
133
134   return retval;
135 }
This page took 0.030234 seconds and 4 git commands to generate.