summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/examples/customization/bin-utils/binutils.py
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
commit061da546b983eb767bad15e67af1174fb0bcf31c (patch)
tree83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/examples/customization/bin-utils/binutils.py
parentImport LLVM 10.0.0 release including clang, lld and lldb. (diff)
downloadwireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz
wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/examples/customization/bin-utils/binutils.py')
-rw-r--r--gnu/llvm/lldb/examples/customization/bin-utils/binutils.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/examples/customization/bin-utils/binutils.py b/gnu/llvm/lldb/examples/customization/bin-utils/binutils.py
new file mode 100644
index 00000000000..f1aa48fa26d
--- /dev/null
+++ b/gnu/llvm/lldb/examples/customization/bin-utils/binutils.py
@@ -0,0 +1,124 @@
+"Collection of tools for displaying bit representation of numbers."""
+
+from __future__ import print_function
+
+def binary(n, width=None):
+ """
+ Return a list of (0|1)'s for the binary representation of n where n >= 0.
+ If you specify a width, it must be > 0, otherwise it is ignored. The list
+ could be padded with 0 bits if width is specified.
+ """
+ l = []
+ if width and width <= 0:
+ width = None
+ while n > 0:
+ l.append(1 if n & 1 else 0)
+ n = n >> 1
+
+ if width:
+ for i in range(width - len(l)):
+ l.append(0)
+
+ l.reverse()
+ return l
+
+
+def twos_complement(n, width):
+ """
+ Return a list of (0|1)'s for the binary representation of a width-bit two's
+ complement numeral system of an integer n which may be negative.
+ """
+ val = 2**(width - 1)
+ if n >= 0:
+ if n > (val - 1):
+ return None
+ # It is safe to represent n with width-bits.
+ return binary(n, width)
+
+ if n < 0:
+ if abs(n) > val:
+ return None
+ # It is safe to represent n (a negative int) with width-bits.
+ return binary(val * 2 - abs(n))
+
+# print binary(0xABCD)
+# [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1]
+# print binary(0x1F, 8)
+# [0, 0, 0, 1, 1, 1, 1, 1]
+# print twos_complement(-5, 4)
+# [1, 0, 1, 1]
+# print twos_complement(7, 4)
+# [0, 1, 1, 1]
+# print binary(7)
+# [1, 1, 1]
+# print twos_complement(-5, 64)
+# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1]
+
+
+def positions(width):
+ """Helper function returning a list describing the bit positions.
+ Bit positions greater than 99 are truncated to 2 digits, for example,
+ 100 -> 00 and 127 -> 27."""
+ return ['{0:2}'.format(i)[-2:] for i in reversed(range(width))]
+
+
+def utob(debugger, command_line, result, dict):
+ """Convert the unsigned integer to print its binary representation.
+ args[0] (mandatory) is the unsigned integer to be converted
+ args[1] (optional) is the bit width of the binary representation
+ args[2] (optional) if specified, turns on verbose printing"""
+ args = command_line.split()
+ try:
+ n = int(args[0], 0)
+ width = None
+ if len(args) > 1:
+ width = int(args[1], 0)
+ if width < 0:
+ width = 0
+ except:
+ print(utob.__doc__)
+ return
+
+ if len(args) > 2:
+ verbose = True
+ else:
+ verbose = False
+
+ bits = binary(n, width)
+ if not bits:
+ print("insufficient width value: %d" % width)
+ return
+ if verbose and width > 0:
+ pos = positions(width)
+ print(' ' + ' '.join(pos))
+ print(' %s' % str(bits))
+
+
+def itob(debugger, command_line, result, dict):
+ """Convert the integer to print its two's complement representation.
+ args[0] (mandatory) is the integer to be converted
+ args[1] (mandatory) is the bit width of the two's complement representation
+ args[2] (optional) if specified, turns on verbose printing"""
+ args = command_line.split()
+ try:
+ n = int(args[0], 0)
+ width = int(args[1], 0)
+ if width < 0:
+ width = 0
+ except:
+ print(itob.__doc__)
+ return
+
+ if len(args) > 2:
+ verbose = True
+ else:
+ verbose = False
+
+ bits = twos_complement(n, width)
+ if not bits:
+ print("insufficient width value: %d" % width)
+ return
+ if verbose and width > 0:
+ pos = positions(width)
+ print(' ' + ' '.join(pos))
+ print(' %s' % str(bits))