lldb: fix slice index expression

This commit is contained in:
Li Jie
2024-10-05 17:46:54 +08:00
parent 2732f6036e
commit 227dda38a2
2 changed files with 32 additions and 2 deletions

View File

@@ -20,6 +20,27 @@ def is_llgo_compiler(_target: lldb.SBTarget) -> bool:
return True return True
def get_indexed_value(value: lldb.SBValue, index: int) -> Optional[lldb.SBValue]:
if not value or not value.IsValid():
return None
type_name = value.GetType().GetName()
if type_name.startswith('[]'): # Slice
data_ptr = value.GetChildMemberWithName('data')
element_type = data_ptr.GetType().GetPointeeType()
element_size = element_type.GetByteSize()
ptr_value = int(data_ptr.GetValue(), 16)
element_address = ptr_value + index * element_size
target = value.GetTarget()
return target.CreateValueFromAddress(
f"element_{index}", lldb.SBAddress(element_address, target), element_type)
elif value.GetType().IsArrayType(): # Array
return value.GetChildAtIndex(index)
else:
return None
def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.SBValue]: def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.SBValue]:
parts = re.findall(r'\*|\w+|\(|\)|\[.*?\]|\.', expression) parts = re.findall(r'\*|\w+|\(|\)|\[.*?\]|\.', expression)
@@ -56,7 +77,7 @@ def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.S
i += 2 i += 2
elif part.startswith('['): elif part.startswith('['):
index = int(part[1:-1]) index = int(part[1:-1])
value = value.GetChildAtIndex(index) value = get_indexed_value(value, index)
i += 1 i += 1
else: else:
if value is None: if value is None:

View File

@@ -129,6 +129,15 @@ func FuncWithAllTypeParams(
// slice: []int{21, 22, 23} // slice: []int{21, 22, 23}
// arr: [3]int{24, 25, 26} // arr: [3]int{24, 25, 26}
// arr2: [3]github.com/goplus/llgo/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}} // arr2: [3]github.com/goplus/llgo/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}}
// slice[0]: 21
// slice[1]: 22
// slice[2]: 23
// arr[0]: 24
// arr[1]: 25
// arr[2]: 26
// arr2[0].i: 27
// arr2[1].i: 28
// arr2[2].i: 29
// e: github.com/goplus/llgo/cl/_testdata/debug.E{i = 30} // e: github.com/goplus/llgo/cl/_testdata/debug.E{i = 30}
// Expected(skip): // Expected(skip):
@@ -375,7 +384,7 @@ func ScopeIf(branch int) {
// c: 3 // c: 3
// d: 4 // d: 4
// branch: 0 // branch: 0
println(c, d) println(a, c, d)
} }
// Expected: // Expected:
// all variables: a branch // all variables: a branch