blob: 17d5d2d0817bb0a820bd6b394c681819d34ec5b2 [file] [log] [blame]
"""
LLDB Formatters for LLVM data types for use in the swift project.
Load into LLDB with 'command script import /path/to/lldbDataFormatters.py'
"""
import sys
def __lldb_init_module(debugger, internal_dict):
tName = 'lldbSwiftDataFormatters.SmallBitVectorSummaryProvider'
debugger.HandleCommand('type summary add -w llvm '
'-F %s -x "^llvm::SmallBitVector$"' % tName)
def SmallBitVectorSummaryProvider(valobj, internal_dict):
underlyingValue = valobj.GetChildMemberWithName('X').GetValueAsUnsigned()
numBaseBits = 32
is64Bit = sys.maxsize > 2**32
if is64Bit:
numBaseBits = 64
smallNumRawBits = numBaseBits - 1
smallNumSizeBits = None
if numBaseBits == 32:
smallNumSizeBits = 5
elif numBaseBits == 64:
smallNumSizeBits = 6
else:
smallNumSizeBits = smallNumRawBits
smallNumDataBits = smallNumRawBits - smallNumSizeBits
# If our underlying value is not small, print we can not dump large values.
isSmallMask = 1
if (underlyingValue & isSmallMask) == 0:
return '<can not read large SmallBitVector>'
smallRawBits = underlyingValue >> 1
smallSize = smallRawBits >> smallNumDataBits
bits = smallRawBits & ((1 << (smallSize + 1)) - 1)
res = "["
for i in reversed(range(0, smallSize)):
if bool(bits & (1 << i)):
res += '1'
else:
res += '0'
res += "]"
return res