Index: include/lldb/Core/Value.h =================================================================== --- include/lldb/Core/Value.h +++ include/lldb/Core/Value.h @@ -228,6 +228,9 @@ static const char *GetContextTypeAsCString(ContextType context_type); + /// Convert this value's file address to a load address, if possible. + void ConvertToLoadAddress(SymbolContext sc, Target *target); + bool GetData(DataExtractor &data); void Clear(); Index: source/Core/Value.cpp =================================================================== --- source/Core/Value.cpp +++ source/Core/Value.cpp @@ -669,6 +669,30 @@ return "???"; } +void Value::ConvertToLoadAddress(SymbolContext sc, Target *target) { + if (GetValueType() != eValueTypeFileAddress) + return; + + if (!sc.module_sp) + return; + + lldb::addr_t file_addr = GetScalar().ULongLong(LLDB_INVALID_ADDRESS); + if (file_addr == LLDB_INVALID_ADDRESS) + return; + + ObjectFile *objfile = sc.module_sp->GetObjectFile(); + if (!objfile) + return; + + Address so_addr(file_addr, objfile->GetSectionList()); + lldb::addr_t load_addr = so_addr.GetLoadAddress(target); + if (load_addr == LLDB_INVALID_ADDRESS) + return; + + SetValueType(Value::eValueTypeLoadAddress); + GetScalar() = load_addr; +} + ValueList::ValueList(const ValueList &rhs) { m_values = rhs.m_values; } const ValueList &ValueList::operator=(const ValueList &rhs) { Index: source/Core/ValueObjectVariable.cpp =================================================================== --- source/Core/ValueObjectVariable.cpp +++ source/Core/ValueObjectVariable.cpp @@ -234,26 +234,10 @@ // 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, target); if (!CanProvideValue()) { // this value object represents an aggregate type whose children have Index: source/Expression/DWARFExpression.cpp =================================================================== --- source/Expression/DWARFExpression.cpp +++ source/Expression/DWARFExpression.cpp @@ -1382,6 +1382,9 @@ case DW_OP_addr: stack.push_back(Scalar(opcodes.GetAddress(&offset))); stack.back().SetValueType(Value::eValueTypeFileAddress); + stack.back().ConvertToLoadAddress( + frame->GetSymbolContext(eSymbolContextFunction), + frame->CalculateTarget().get()); break; //----------------------------------------------------------------------