mirror of
https://github.com/intel/llvm.git
synced 2026-01-17 06:40:01 +08:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user