diff options
Diffstat (limited to 'gdb/dwarf2/leb.c')
-rw-r--r-- | gdb/dwarf2/leb.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gdb/dwarf2/leb.c b/gdb/dwarf2/leb.c new file mode 100644 index 0000000..d26b48b --- /dev/null +++ b/gdb/dwarf2/leb.c @@ -0,0 +1,85 @@ +/* Low-level DWARF 2 reading code + + Copyright (C) 1994-2020 Free Software Foundation, Inc. + + Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, + Inc. with support from Florida State University (under contract + with the Ada Joint Program Office), and Silicon Graphics, Inc. + Initial contribution by Brent Benson, Harris Computer Systems, Inc., + based on Fred Fish's (Cygnus Support) implementation of DWARF 1 + support. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "defs.h" +#include "dwarf2/leb.h" + +ULONGEST +read_unsigned_leb128 (bfd *abfd, const gdb_byte *buf, + unsigned int *bytes_read_ptr) +{ + ULONGEST result; + unsigned int num_read; + int shift; + unsigned char byte; + + result = 0; + shift = 0; + num_read = 0; + while (1) + { + byte = bfd_get_8 (abfd, buf); + buf++; + num_read++; + result |= ((ULONGEST) (byte & 127) << shift); + if ((byte & 128) == 0) + { + break; + } + shift += 7; + } + *bytes_read_ptr = num_read; + return result; +} + +LONGEST +read_signed_leb128 (bfd *abfd, const gdb_byte *buf, + unsigned int *bytes_read_ptr) +{ + ULONGEST result; + int shift, num_read; + unsigned char byte; + + result = 0; + shift = 0; + num_read = 0; + while (1) + { + byte = bfd_get_8 (abfd, buf); + buf++; + num_read++; + result |= ((ULONGEST) (byte & 127) << shift); + shift += 7; + if ((byte & 128) == 0) + { + break; + } + } + if ((shift < 8 * sizeof (result)) && (byte & 0x40)) + result |= -(((ULONGEST) 1) << shift); + *bytes_read_ptr = num_read; + return result; +} |