Skip to content

Commit d6eebe9

Browse files
authored
Merge pull request #29014 from gottesmm/pr-7bb36ab61862a9f62e7f347bbf45481d43ce40a3
2 parents 52a736e + 475917d commit d6eebe9

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

utils/lldb/lldbSwiftDataFormatters.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""
2+
LLDB Formatters for LLVM data types for use in the swift project.
3+
4+
Load into LLDB with 'command script import /path/to/lldbDataFormatters.py'
5+
"""
6+
7+
import sys
8+
9+
10+
def __lldb_init_module(debugger, internal_dict):
11+
tName = 'lldbSwiftDataFormatters.SmallBitVectorSummaryProvider'
12+
debugger.HandleCommand('type summary add -w llvm '
13+
'-F %s -x "^llvm::SmallBitVector$"' % tName)
14+
15+
16+
def SmallBitVectorSummaryProvider(valobj, internal_dict):
17+
underlyingValue = valobj.GetChildMemberWithName('X').GetValueAsUnsigned()
18+
numBaseBits = 32
19+
is64Bit = sys.maxsize > 2**32
20+
if is64Bit:
21+
numBaseBits = 64
22+
smallNumRawBits = numBaseBits - 1
23+
smallNumSizeBits = None
24+
if numBaseBits == 32:
25+
smallNumSizeBits = 5
26+
elif numBaseBits == 64:
27+
smallNumSizeBits = 6
28+
else:
29+
smallNumSizeBits = smallNumRawBits
30+
smallNumDataBits = smallNumRawBits - smallNumSizeBits
31+
32+
# If our underlying value is not small, print we can not dump large values.
33+
isSmallMask = 1
34+
if (underlyingValue & isSmallMask) == 0:
35+
return '<can not read large SmallBitVector>'
36+
37+
smallRawBits = underlyingValue >> 1
38+
smallSize = smallRawBits >> smallNumDataBits
39+
bits = smallRawBits & ((1 << (smallSize + 1)) - 1)
40+
res = "["
41+
for i in reversed(range(0, smallSize)):
42+
if bool(bits & (1 << i)):
43+
res += '1'
44+
else:
45+
res += '0'
46+
res += "]"
47+
return res

utils/lldb/lldbToolBox.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
LLVM_REPO = os.path.join(REPO_BASE, "llvm")
2323
LLVM_DATAFORMATTER_PATH = os.path.join(LLVM_REPO, "utils",
2424
"lldbDataFormatters.py")
25+
SWIFT_DATAFORMATTER_PATH = os.path.join(SWIFT_REPO, "utils",
26+
"lldb", "lldbSwiftDataFormatters.py")
2527

2628

2729
def import_llvm_dataformatters(debugger):
@@ -33,6 +35,15 @@ def import_llvm_dataformatters(debugger):
3335
print("Loaded LLVM data formatters.")
3436

3537

38+
def import_swift_dataformatters(debugger):
39+
if not os.access(SWIFT_DATAFORMATTER_PATH, os.F_OK):
40+
print("WARNING! Could not find Swift data formatters!")
41+
return
42+
cmd = 'command script import {}'.format(SWIFT_DATAFORMATTER_PATH)
43+
debugger.HandleCommand(cmd)
44+
print("Loaded Swift data formatters.")
45+
46+
3647
VIEWCFG_PATH = os.path.join(SWIFT_REPO, "utils", "viewcfg")
3748
BLOCKIFYASM_PATH = os.path.join(SWIFT_REPO, "utils", "dev-scripts",
3849
"blockifyasm")
@@ -107,6 +118,7 @@ def sequence(debugger, command, exec_ctx, result, internal_dict):
107118

108119
def __lldb_init_module(debugger, internal_dict):
109120
import_llvm_dataformatters(debugger)
121+
import_swift_dataformatters(debugger)
110122
debugger.HandleCommand('command script add disassemble-asm-cfg '
111123
'-f lldbToolBox.disassemble_asm_cfg')
112124
debugger.HandleCommand('command script add disassemble-to-file '

0 commit comments

Comments
 (0)