diff options
author | Adrian Prantl <aprantl@apple.com> | 2018-05-03 16:51:37 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2018-05-03 16:51:37 +0000 |
commit | c42fa4be1f2c22577756d70cdfeed66399cc56a5 (patch) | |
tree | 8e43e018010a2a815de7672433c169351773c2f5 /lldb/source/Core/ValueObjectVariable.cpp | |
parent | 961fb99894ba453043937ef8dffbb23ca0aba841 (diff) | |
download | bcm5719-llvm-c42fa4be1f2c22577756d70cdfeed66399cc56a5.tar.gz bcm5719-llvm-c42fa4be1f2c22577756d70cdfeed66399cc56a5.zip |
DWARFExpression: Convert file addresses to load addresses early on.
This is a change that only affects Swift and is NFC for the language
plugins on llvm.org. In Swift, we can have global variables with a
location such as DW_OP_addr <addr> DW_OP_deref. The DWARF expression
evaluator doesn't know how to apply a DW_OP_deref to a file address,
but at the very end we convert the file address into a load address.
This patch moves the file->load address conversion to right after the
result of the DW_OP_addr is pushed onto the stack so that a subsequent
DW_OP_deref (and potentially other operations) can be interpreted.
rdar://problem/39767528
Differential revision: https://reviews.llvm.org/D46362
llvm-svn: 331462
Diffstat (limited to 'lldb/source/Core/ValueObjectVariable.cpp')
-rw-r--r-- | lldb/source/Core/ValueObjectVariable.cpp | 22 |
1 files changed, 3 insertions, 19 deletions
diff --git a/lldb/source/Core/ValueObjectVariable.cpp b/lldb/source/Core/ValueObjectVariable.cpp index e08963210ec..e446e2eae07 100644 --- a/lldb/source/Core/ValueObjectVariable.cpp +++ b/lldb/source/Core/ValueObjectVariable.cpp @@ -234,26 +234,10 @@ bool ValueObjectVariable::UpdateValue() { // If this variable is a simple type, we read all data for it into // m_data. Make sure this type has a value before we try and read it + SymbolContext var_sc; + variable->CalculateSymbolContext(&var_sc); // If we have a file address, convert it to a load address if we can. - if (value_type == Value::eValueTypeFileAddress && process_is_alive) { - lldb::addr_t file_addr = - m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); - if (file_addr != LLDB_INVALID_ADDRESS) { - SymbolContext var_sc; - variable->CalculateSymbolContext(&var_sc); - if (var_sc.module_sp) { - ObjectFile *objfile = var_sc.module_sp->GetObjectFile(); - if (objfile) { - Address so_addr(file_addr, objfile->GetSectionList()); - lldb::addr_t load_addr = so_addr.GetLoadAddress(target); - if (load_addr != LLDB_INVALID_ADDRESS) { - m_value.SetValueType(Value::eValueTypeLoadAddress); - m_value.GetScalar() = load_addr; - } - } - } - } - } + m_value.ConvertToLoadAddress(var_sc); if (!CanProvideValue()) { // this value object represents an aggregate type whose children have |