aboutsummaryrefslogtreecommitdiff
path: root/examples/customization/bin-utils
diff options
context:
space:
mode:
Diffstat (limited to 'examples/customization/bin-utils')
-rw-r--r--examples/customization/bin-utils/.lldbinit5
-rw-r--r--examples/customization/bin-utils/README36
-rw-r--r--examples/customization/bin-utils/binutils.py122
3 files changed, 163 insertions, 0 deletions
diff --git a/examples/customization/bin-utils/.lldbinit b/examples/customization/bin-utils/.lldbinit
new file mode 100644
index 000000000000..5a2f6feb94df
--- /dev/null
+++ b/examples/customization/bin-utils/.lldbinit
@@ -0,0 +1,5 @@
+# So that ~/binutils.py takes precedence.
+script sys.path[:0] = [os.path.expanduser('~')]
+script import binutils
+command script add -f binutils.itob itob
+command script add -f binutils.utob utob
diff --git a/examples/customization/bin-utils/README b/examples/customization/bin-utils/README
new file mode 100644
index 000000000000..1352d93b2787
--- /dev/null
+++ b/examples/customization/bin-utils/README
@@ -0,0 +1,36 @@
+Files in this directory:
+
+o .lldbinit:
+
+An example lldb init file that imports the binutils.py module and adds the
+following commands: 'itob' and 'utob'.
+
+o binutils.py:
+
+Python module which provides implementation for the 'itob' and 'utob' commands.
+
+o README:
+
+The file you are reading now.
+
+================================================================================
+The following terminal output shows an interaction with lldb using the .lldbinit
+and the binutils.py files which are located in my HOME directory. The lldb init
+file imports the utils Python module and adds the 'itob' and 'utob' commands.
+
+$ /Volumes/data/lldb/svn/trunk/build/Debug/lldb
+(lldb) help itob
+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
+Syntax: itob
+(lldb) itob -5 4
+ [1, 0, 1, 1]
+(lldb) itob -5 32 v
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ [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]
+(lldb) utob 0xABCD 32 v
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1]
+(lldb)
diff --git a/examples/customization/bin-utils/binutils.py b/examples/customization/bin-utils/binutils.py
new file mode 100644
index 000000000000..313a354ec3a5
--- /dev/null
+++ b/examples/customization/bin-utils/binutils.py
@@ -0,0 +1,122 @@
+"Collection of tools for displaying bit representation of numbers."""
+
+import StringIO
+
+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)
+