]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - include/leb128.h
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / include / leb128.h
index f0ff3520bea0a162e03f5418e14680f4bf4878d3..0ce531b6fd54af1e9a85edddda30b3a90c97d099 100644 (file)
@@ -1,5 +1,5 @@
 /* Utilities for reading leb128 values.
-   Copyright (C) 2012 Free Software Foundation, Inc.
+   Copyright (C) 2012-2024 Free Software Foundation, Inc.
 
 This file is part of the libiberty library.
 Libiberty is free software; you can redistribute it and/or
@@ -19,7 +19,12 @@ Boston, MA 02110-1301, USA.  */
 
 /* The functions defined here can be speed critical.
    Since they are all pretty small we keep things simple and just define
-   them all as "static inline".  */
+   them all as "static inline".
+
+   WARNING: This file is used by GDB which is stuck at C90. :-(
+   Though it can use stdint.h, inttypes.h.
+   Therefore if you want to add support for "long long" you need
+   to wrap it in #ifdef CC_HAS_LONG_LONG.  */
 
 #ifndef LEB128_H
 #define LEB128_H
@@ -30,6 +35,13 @@ Boston, MA 02110-1301, USA.  */
 /* Get a definition for NULL, size_t.  */
 #include <stddef.h>
 
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
 /* Decode the unsigned LEB128 constant at BUF into the variable pointed to
    by R, and return the number of bytes read.
    If we read off the end of the buffer, zero is returned,
@@ -39,12 +51,12 @@ Boston, MA 02110-1301, USA.  */
    read to avoid const-vs-non-const problems.  */
 
 static inline size_t
-read_uleb128_to_ull (const unsigned char *buf, const unsigned char *buf_end,
-                    unsigned long long *r)
+read_uleb128_to_uint64 (const unsigned char *buf, const unsigned char *buf_end,
+                       uint64_t *r)
 {
   const unsigned char *p = buf;
   unsigned int shift = 0;
-  unsigned long long result = 0;
+  uint64_t result = 0;
   unsigned char byte;
 
   while (1)
@@ -53,7 +65,7 @@ read_uleb128_to_ull (const unsigned char *buf, const unsigned char *buf_end,
        return 0;
 
       byte = *p++;
-      result |= ((unsigned long long) (byte & 0x7f)) << shift;
+      result |= ((uint64_t) (byte & 0x7f)) << shift;
       if ((byte & 0x80) == 0)
        break;
       shift += 7;
@@ -72,12 +84,12 @@ read_uleb128_to_ull (const unsigned char *buf, const unsigned char *buf_end,
    read to avoid const-vs-non-const problems.  */
 
 static inline size_t
-read_sleb128_to_ll (const unsigned char *buf, const unsigned char *buf_end,
-                   long long *r)
+read_sleb128_to_int64 (const unsigned char *buf, const unsigned char *buf_end,
+                      int64_t *r)
 {
   const unsigned char *p = buf;
   unsigned int shift = 0;
-  long long result = 0;
+  int64_t result = 0;
   unsigned char byte;
 
   while (1)
@@ -86,13 +98,13 @@ read_sleb128_to_ll (const unsigned char *buf, const unsigned char *buf_end,
        return 0;
 
       byte = *p++;
-      result |= ((unsigned long long) (byte & 0x7f)) << shift;
+      result |= ((uint64_t) (byte & 0x7f)) << shift;
       shift += 7;
       if ((byte & 0x80) == 0)
        break;
     }
   if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0)
-    result |= -(((unsigned long long) 1) << shift);
+    result |= -(((uint64_t) 1) << shift);
 
   *r = result;
   return p - buf;