Skip to content

Commit 1a789a9

Browse files
kuilpdIanWood1
authored andcommitted
[LLDB] Fix ValueObject::AddressOf() return value (llvm#137688)
`ValueObject::AddressOf()` used to return address as a value which has it's own address, allowing to do `value.AddressOf().AddressOf()`. This patch makes the return address a simple const value.
1 parent cb2facf commit 1a789a9

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

lldb/source/ValueObject/ValueObject.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,10 +2907,13 @@ ValueObjectSP ValueObject::AddressOf(Status &error) {
29072907
std::string name(1, '&');
29082908
name.append(m_name.AsCString(""));
29092909
ExecutionContext exe_ctx(GetExecutionContextRef());
2910+
2911+
lldb::DataBufferSP buffer(
2912+
new lldb_private::DataBufferHeap(&addr, sizeof(lldb::addr_t)));
29102913
m_addr_of_valobj_sp = ValueObjectConstResult::Create(
29112914
exe_ctx.GetBestExecutionContextScope(),
2912-
compiler_type.GetPointerType(), ConstString(name.c_str()), addr,
2913-
eAddressTypeInvalid, m_data.GetAddressByteSize());
2915+
compiler_type.GetPointerType(), ConstString(name.c_str()), buffer,
2916+
endian::InlHostByteOrder(), exe_ctx.GetAddressByteSize());
29142917
}
29152918
} break;
29162919
default:

lldb/test/API/python_api/sbvalue_const_addrof/main.cpp

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33

44
struct RegisterContext
55
{
6-
uintptr_t r0;
7-
uintptr_t r1;
8-
uintptr_t r2;
9-
uintptr_t r3;
10-
uintptr_t r4;
11-
uintptr_t pc;
12-
uintptr_t fp;
13-
uintptr_t sp;
6+
uintptr_t r0;
7+
uintptr_t r1;
8+
uintptr_t r2;
9+
uintptr_t r3;
10+
uintptr_t r4;
11+
uintptr_t pc;
12+
uintptr_t fp;
13+
uintptr_t sp;
1414
};
1515

1616
struct ThreadInfo {
17-
uint32_t tid;
18-
const char *name;
19-
RegisterContext regs;
20-
ThreadInfo *next;
17+
uint32_t tid;
18+
const char *name;
19+
RegisterContext regs;
20+
ThreadInfo *next;
2121
};
2222
int main (int argc, char const *argv[], char const *envp[]);
2323

@@ -27,14 +27,17 @@ ThreadInfo *g_thread_list_ptr = &g_thread1;
2727

2828
int main (int argc, char const *argv[], char const *envp[])
2929
{
30-
printf ("g_thread_list is %p\n", g_thread_list_ptr);
31-
return 0; //% v = self.dbg.GetSelectedTarget().FindFirstGlobalVariable('g_thread_list_ptr')
32-
//% v_gla = v.GetChildMemberWithName('regs').GetLoadAddress()
33-
//% v_aof = v.GetChildMemberWithName('regs').AddressOf().GetValueAsUnsigned(lldb.LLDB_INVALID_ADDRESS)
34-
//% expr = '(%s)0x%x' % (v.GetType().GetName(), v.GetValueAsUnsigned(0))
35-
//% e = v.CreateValueFromExpression('e', expr)
36-
//% e_gla = e.GetChildMemberWithName('regs').GetLoadAddress()
37-
//% e_aof = e.GetChildMemberWithName('regs').AddressOf().GetValueAsUnsigned(lldb.LLDB_INVALID_ADDRESS)
38-
//% self.assertTrue(v_gla == e_gla, "GetLoadAddress() differs")
39-
//% self.assertTrue(v_aof == e_aof, "AddressOf() differs")
30+
// clang-format off
31+
printf ("g_thread_list is %p\n", g_thread_list_ptr);
32+
return 0; //% v = self.dbg.GetSelectedTarget().FindFirstGlobalVariable('g_thread_list_ptr')
33+
//% self.assertTrue(v.AddressOf().IsValid())
34+
//% self.assertFalse(v.AddressOf().AddressOf().IsValid())
35+
//% v_gla = v.GetChildMemberWithName('regs').GetLoadAddress()
36+
//% v_aof = v.GetChildMemberWithName('regs').AddressOf().GetValueAsUnsigned(lldb.LLDB_INVALID_ADDRESS)
37+
//% expr = '(%s)0x%x' % (v.GetType().GetName(), v.GetValueAsUnsigned(0))
38+
//% e = v.CreateValueFromExpression('e', expr)
39+
//% e_gla = e.GetChildMemberWithName('regs').GetLoadAddress()
40+
//% e_aof = e.GetChildMemberWithName('regs').AddressOf().GetValueAsUnsigned(lldb.LLDB_INVALID_ADDRESS)
41+
//% self.assertTrue(v_gla == e_gla, "GetLoadAddress() differs")
42+
//% self.assertTrue(v_aof == e_aof, "AddressOf() differs")
4043
}

0 commit comments

Comments
 (0)