Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lldb/include/lldb/ValueObject/ValueObjectSynthetic.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,11 @@ class ValueObjectSynthetic : public ValueObject {

void SetLanguageFlags(uint64_t flags) override;

void
GetExpressionPath(Stream &stream,
GetExpressionPathFormat epformat =
eGetExpressionPathFormatDereferencePointers) override;

protected:
bool UpdateValue() override;

Expand Down
12 changes: 12 additions & 0 deletions lldb/source/ValueObject/ValueObjectSynthetic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,3 +443,15 @@ void ValueObjectSynthetic::SetLanguageFlags(uint64_t flags) {
else
this->ValueObject::SetLanguageFlags(flags);
}

void ValueObjectSynthetic::GetExpressionPath(Stream &stream,
GetExpressionPathFormat epformat) {
if (const lldb::ValueType obj_value_type = GetValueType();
IsSynthetic() && (obj_value_type == lldb::eValueTypeRegister ||
obj_value_type == lldb::eValueTypeRegisterSet)) {

if (const lldb::ValueObjectSP raw_value = GetNonSyntheticValue())
return raw_value->GetExpressionPath(stream, epformat);
}
return ValueObject::GetExpressionPath(stream, epformat);
}
3 changes: 3 additions & 0 deletions lldb/test/API/python_api/exprpath_register/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
C_SOURCES := main.c

include Makefile.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
"""
Test Getting the expression path for registers works correctly
"""

import lldb
from lldbsuite.test import lldbutil
from lldbsuite.test.lldbtest import TestBase, VALID_BREAKPOINT, VALID_TARGET


class TestExprPathRegisters(TestBase):
NO_DEBUG_INFO_TESTCASE = True

def verify_register_path(self, reg_value: lldb.SBValue):
stream = lldb.SBStream()
reg_name = reg_value.name
self.assertTrue(
reg_value.GetExpressionPath(stream),
f"Expected an expression path for register {reg_name}.",
)
reg_expr_path = stream.GetData()
self.assertEqual(reg_expr_path, f"${reg_name}")

def test_float_registers(self):
"""Verify the expression path of the registers is valid."""
self.build()
_, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "my_foo")
frame = thread.GetSelectedFrame()
self.assertTrue(frame, "Expected a valid Frame.")

# possible floating point register on some cpus.
register_names = [
"xmm0",
"ymm0",
"v0",
"v1",
"f0",
"f1",
"d0",
"d1",
"vr0",
"vr1",
"st0",
"st1",
]
for name in register_names:
reg_value = frame.FindRegister(name)
# some the register will not be available for the cpu
# only verify if it is valid.
if reg_value:
self.verify_register_path(reg_value)

def test_all_registers(self):
"""Test all the registers that is avaiable on the machine"""
self.build()
_, _, thread, _ = lldbutil.run_to_name_breakpoint(self, "my_foo")
frame = thread.GetSelectedFrame()
self.assertTrue(frame, "Expected a valid Frame.")

register_sets = frame.GetRegisters()
self.assertTrue(register_sets.IsValid(), "Expected Frame Registers")

for register_set in register_sets:
for register in register_set.children:
self.verify_register_path(register)
10 changes: 10 additions & 0 deletions lldb/test/API/python_api/exprpath_register/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

float my_foo() {
float result = 10.0 + 20.0;
return result;
}

int main(void) {
float result = my_foo();
return (int)result;
}
Loading