Revert "DWARFExpression: Convert file addresses to load addresses early on."
authorAdrian Prantl <aprantl@apple.com>
Thu, 3 May 2018 20:19:39 +0000 (20:19 +0000)
committerAdrian Prantl <aprantl@apple.com>
Thu, 3 May 2018 20:19:39 +0000 (20:19 +0000)
This reverts commit 331462 while investigating bot breakage.

llvm-svn: 331480

lldb/include/lldb/Core/Value.h
lldb/source/Core/Value.cpp
lldb/source/Core/ValueObjectVariable.cpp
lldb/source/Expression/DWARFExpression.cpp

index e9766a0..6ef2b7d 100644 (file)
@@ -228,9 +228,6 @@ public:
 
   static const char *GetContextTypeAsCString(ContextType context_type);
 
-  /// Convert this value's file address to a load address, if possible.
-  void ConvertToLoadAddress(SymbolContext sc);
-
   bool GetData(DataExtractor &data);
 
   void Clear();
index facee9a..292ba07 100644 (file)
@@ -669,28 +669,6 @@ const char *Value::GetContextTypeAsCString(ContextType context_type) {
   return "???";
 }
 
-void Value::ConvertToLoadAddress(SymbolContext sc) {
-  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;
-
-  Address so_addr;
-  if (!sc.module_sp->ResolveFileAddress(file_addr, so_addr))
-    return;
-  lldb::addr_t load_addr = so_addr.GetLoadAddress(sc.target_sp.get());
-  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 a1c69f4..e089632 100644 (file)
@@ -236,9 +236,23 @@ bool ValueObjectVariable::UpdateValue() {
 
         // If we have a file address, convert it to a load address if we can.
         if (value_type == Value::eValueTypeFileAddress && process_is_alive) {
-          SymbolContext var_sc;
-          variable->CalculateSymbolContext(&var_sc);
-          m_value.ConvertToLoadAddress(var_sc);
+          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;
+                }
+              }
+            }
+          }
         }
 
         if (!CanProvideValue()) {
index 949f2e2..7149571 100644 (file)
@@ -1379,13 +1379,10 @@ bool DWARFExpression::Evaluate(
     // The DW_OP_addr operation has a single operand that encodes a machine
     // address and whose size is the size of an address on the target machine.
     //----------------------------------------------------------------------
-    case DW_OP_addr: {
+    case DW_OP_addr:
       stack.push_back(Scalar(opcodes.GetAddress(&offset)));
       stack.back().SetValueType(Value::eValueTypeFileAddress);
-      auto sc = frame->GetSymbolContext(eSymbolContextFunction);
-      stack.back().ConvertToLoadAddress(sc);
       break;
-    }
 
     //----------------------------------------------------------------------
     // The DW_OP_addr_sect_offset4 is used for any location expressions in