Skip to content

Commit d9ee89c

Browse files
Merge pull request #11925 from da-viper/cherry-pick-#169210
[lldb] Fix GetExpressionPath for vector registers (llvm#169210)
2 parents 6c861ea + 9e592d7 commit d9ee89c

File tree

5 files changed

+97
-0
lines changed

5 files changed

+97
-0
lines changed

lldb/include/lldb/ValueObject/ValueObjectSynthetic.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ class ValueObjectSynthetic : public ValueObject {
139139

140140
void SetLanguageFlags(uint64_t flags) override;
141141

142+
void
143+
GetExpressionPath(Stream &stream,
144+
GetExpressionPathFormat epformat =
145+
eGetExpressionPathFormatDereferencePointers) override;
146+
142147
protected:
143148
bool UpdateValue() override;
144149

lldb/source/ValueObject/ValueObjectSynthetic.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,3 +443,18 @@ void ValueObjectSynthetic::SetLanguageFlags(uint64_t flags) {
443443
else
444444
this->ValueObject::SetLanguageFlags(flags);
445445
}
446+
447+
void ValueObjectSynthetic::GetExpressionPath(Stream &stream,
448+
GetExpressionPathFormat epformat) {
449+
// A synthetic ValueObject may wrap an underlying Register or RegisterSet
450+
// ValueObject, which requires a different approach to generating the
451+
// expression path. In such cases, delegate to the non-synthetic value object.
452+
if (const lldb::ValueType obj_value_type = GetValueType();
453+
IsSynthetic() && (obj_value_type == lldb::eValueTypeRegister ||
454+
obj_value_type == lldb::eValueTypeRegisterSet)) {
455+
456+
if (const lldb::ValueObjectSP raw_value = GetNonSyntheticValue())
457+
return raw_value->GetExpressionPath(stream, epformat);
458+
}
459+
return ValueObject::GetExpressionPath(stream, epformat);
460+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
C_SOURCES := main.c
2+
3+
include Makefile.rules
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
"""
2+
Test Getting the expression path for registers works correctly
3+
"""
4+
5+
import lldb
6+
from lldbsuite.test import lldbutil
7+
from lldbsuite.test.lldbtest import TestBase, VALID_BREAKPOINT, VALID_TARGET
8+
9+
10+
class TestExprPathRegisters(TestBase):
11+
NO_DEBUG_INFO_TESTCASE = True
12+
13+
def verify_register_path(self, reg_value: lldb.SBValue):
14+
stream = lldb.SBStream()
15+
reg_name = reg_value.name
16+
self.assertTrue(
17+
reg_value.GetExpressionPath(stream),
18+
f"Expected an expression path for register {reg_name}.",
19+
)
20+
reg_expr_path = stream.GetData()
21+
self.assertEqual(reg_expr_path, f"${reg_name}")
22+
23+
def test_float_registers(self):
24+
"""Verify the expression path of the registers is valid."""
25+
self.build()
26+
_, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "my_foo")
27+
frame = thread.GetSelectedFrame()
28+
self.assertTrue(frame, "Expected a valid Frame.")
29+
30+
# possible floating point register on some cpus.
31+
register_names = [
32+
"xmm0",
33+
"ymm0",
34+
"v0",
35+
"v1",
36+
"f0",
37+
"f1",
38+
"d0",
39+
"d1",
40+
"vr0",
41+
"vr1",
42+
"st0",
43+
"st1",
44+
]
45+
for name in register_names:
46+
reg_value = frame.FindRegister(name)
47+
# some the register will not be available for the cpu
48+
# only verify if it is valid.
49+
if reg_value:
50+
self.verify_register_path(reg_value)
51+
52+
def test_all_registers(self):
53+
"""Test all the registers that is avaiable on the machine"""
54+
self.build()
55+
_, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "my_foo")
56+
frame = thread.GetSelectedFrame()
57+
self.assertTrue(frame, "Expected a valid Frame.")
58+
59+
register_sets = frame.GetRegisters()
60+
self.assertTrue(register_sets.IsValid(), "Expected Frame Registers")
61+
62+
for register_set in register_sets:
63+
for register in register_set.children:
64+
self.verify_register_path(register)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
float my_foo() {
3+
float result = 10.0 + 20.0;
4+
return result;
5+
}
6+
7+
int main(void) {
8+
float result = my_foo();
9+
return (int)result;
10+
}

0 commit comments

Comments
 (0)