diff options
author | 2020-08-03 14:33:06 +0000 | |
---|---|---|
committer | 2020-08-03 14:33:06 +0000 | |
commit | 061da546b983eb767bad15e67af1174fb0bcf31c (patch) | |
tree | 83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/examples/customization/bin-utils/binutils.py | |
parent | Import LLVM 10.0.0 release including clang, lld and lldb. (diff) | |
download | wireguard-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.py | 124 |
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)) |