Author: ted
Date: Tue Mar  1 15:53:26 2016
New Revision: 262407

URL: http://llvm.org/viewvc/llvm-project?rev=262407&view=rev
Log:
Fix bug with function resolution when using IR Interpreter

Summary: Recent changes to the expression parser broke function name resolution 
when using the IR interpreter instead of JIT. This patch changes the 
IRMemoryMap ivar in InterpreterStackFrame to an IRExecutionUnitSP (which is a 
subclass), allowing InterpreterStackFrame::ResolveConstantValue() to call 
FindSymbol() on the name of the Value when it's a FunctionVal. It also changes 
IRExecutionUnit::FindInSymbols() to call GetFileAddress() on the symball if 
ResolveCallableAddress() fails and there is no valid Process.

Reviewers: spyffe

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D17745

Modified:
    lldb/trunk/include/lldb/Expression/IRInterpreter.h
    lldb/trunk/source/Expression/IRExecutionUnit.cpp
    lldb/trunk/source/Expression/IRInterpreter.cpp
    lldb/trunk/source/Expression/LLVMUserExpression.cpp

Modified: lldb/trunk/include/lldb/Expression/IRInterpreter.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/IRInterpreter.h?rev=262407&r1=262406&r2=262407&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Expression/IRInterpreter.h (original)
+++ lldb/trunk/include/lldb/Expression/IRInterpreter.h Tue Mar  1 15:53:26 2016
@@ -50,7 +50,7 @@ public:
     Interpret (llvm::Module &module,
                llvm::Function &function,
                llvm::ArrayRef<lldb::addr_t> args,
-               lldb_private::IRMemoryMap &memory_map,
+               lldb_private::IRExecutionUnit &execution_unit,
                lldb_private::Error &error,
                lldb::addr_t stack_frame_bottom,
                lldb::addr_t stack_frame_top,

Modified: lldb/trunk/source/Expression/IRExecutionUnit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRExecutionUnit.cpp?rev=262407&r1=262406&r2=262407&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRExecutionUnit.cpp (original)
+++ lldb/trunk/source/Expression/IRExecutionUnit.cpp Tue Mar  1 15:53:26 2016
@@ -802,7 +802,10 @@ IRExecutionUnit::FindInSymbols(const std
                 load_address = 
candidate_sc.symbol->ResolveCallableAddress(*target);
 
                 if (load_address == LLDB_INVALID_ADDRESS)
-                    load_address = 
candidate_sc.symbol->GetAddress().GetLoadAddress(target);
+                    if (target->GetProcessSP())
+                        load_address = 
candidate_sc.symbol->GetAddress().GetLoadAddress(target);
+                    else
+                        load_address = 
candidate_sc.symbol->GetAddress().GetFileAddress();
 
                 if (load_address != LLDB_INVALID_ADDRESS)
                 {

Modified: lldb/trunk/source/Expression/IRInterpreter.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRInterpreter.cpp?rev=262407&r1=262406&r2=262407&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRInterpreter.cpp (original)
+++ lldb/trunk/source/Expression/IRInterpreter.cpp Tue Mar  1 15:53:26 2016
@@ -7,6 +7,7 @@
 //
 
//===----------------------------------------------------------------------===//
 
+#include "lldb/Core/ConstString.h"
 #include "lldb/Core/DataExtractor.h"
 #include "lldb/Core/Error.h"
 #include "lldb/Core/Log.h"
@@ -15,6 +16,7 @@
 #include "lldb/Core/Scalar.h"
 #include "lldb/Core/StreamString.h"
 #include "lldb/Core/ValueObject.h"
+#include "lldb/Expression/IRExecutionUnit.h"
 #include "lldb/Expression/IRMemoryMap.h"
 #include "lldb/Expression/IRInterpreter.h"
 #include "lldb/Host/Endian.h"
@@ -101,7 +103,7 @@ public:
 
     ValueMap                                m_values;
     DataLayout                             &m_target_data;
-    lldb_private::IRMemoryMap              &m_memory_map;
+    lldb_private::IRExecutionUnit          &m_execution_unit;
     const BasicBlock                       *m_bb;
     BasicBlock::const_iterator              m_ii;
     BasicBlock::const_iterator              m_ie;
@@ -114,11 +116,11 @@ public:
     size_t                                  m_addr_byte_size;
 
     InterpreterStackFrame (DataLayout &target_data,
-                           lldb_private::IRMemoryMap &memory_map,
+                           lldb_private::IRExecutionUnit &execution_unit,
                            lldb::addr_t stack_frame_bottom,
                            lldb::addr_t stack_frame_top) :
         m_target_data (target_data),
-        m_memory_map (memory_map)
+        m_execution_unit (execution_unit)
     {
         m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle 
: lldb::eByteOrderBig);
         m_addr_byte_size = (target_data.getPointerSize(0));
@@ -203,7 +205,7 @@ public:
             lldb_private::DataExtractor value_extractor;
             lldb_private::Error extract_error;
 
-            m_memory_map.GetMemoryData(value_extractor, process_address, 
value_size, extract_error);
+            m_execution_unit.GetMemoryData(value_extractor, process_address, 
value_size, extract_error);
 
             if (!extract_error.Success())
                 return false;
@@ -242,7 +244,7 @@ public:
 
         lldb_private::Error write_error;
 
-        m_memory_map.WriteMemory(process_address, buf.GetBytes(), 
buf.GetByteSize(), write_error);
+        m_execution_unit.WriteMemory(process_address, buf.GetBytes(), 
buf.GetByteSize(), write_error);
 
         return write_error.Success();
     }
@@ -253,6 +255,17 @@ public:
         {
         default:
             break;
+        case Value::FunctionVal:
+            if (const Function *constant_func = dyn_cast<Function>(constant))
+            {
+                lldb_private::ConstString name(constant_func->getName());
+                lldb::addr_t addr = m_execution_unit.FindSymbol(name);
+                if (addr == LLDB_INVALID_ADDRESS)
+                    return false;
+                value = APInt(m_target_data.getPointerSizeInBits(), addr);
+                return true;
+            }
+            break;
         case Value::ConstantIntVal:
             if (const ConstantInt *constant_int = 
dyn_cast<ConstantInt>(constant))
             {
@@ -329,12 +342,12 @@ public:
 
         lldb_private::Error write_error;
 
-        m_memory_map.WritePointerToMemory(data_address, address, write_error);
+        m_execution_unit.WritePointerToMemory(data_address, address, 
write_error);
 
         if (!write_error.Success())
         {
             lldb_private::Error free_error;
-            m_memory_map.Free(data_address, free_error);
+            m_execution_unit.Free(data_address, free_error);
             return false;
         }
 
@@ -360,8 +373,8 @@ public:
             return false;
 
         lldb_private::StreamString buffer (lldb_private::Stream::eBinary,
-                                           m_memory_map.GetAddressByteSize(),
-                                           m_memory_map.GetByteOrder());
+                                           
m_execution_unit.GetAddressByteSize(),
+                                           m_execution_unit.GetByteOrder());
 
         size_t constant_size = 
m_target_data.getTypeStoreSize(constant->getType());
 
@@ -371,7 +384,7 @@ public:
 
         lldb_private::Error write_error;
 
-        m_memory_map.WriteMemory(process_address, (const 
uint8_t*)buffer.GetData(), constant_size, write_error);
+        m_execution_unit.WriteMemory(process_address, (const 
uint8_t*)buffer.GetData(), constant_size, write_error);
 
         return write_error.Success();
     }
@@ -410,7 +423,7 @@ public:
 
         lldb_private::Error read_error;
 
-        m_memory_map.ReadMemory(buf.GetBytes(), addr, length, read_error);
+        m_execution_unit.ReadMemory(buf.GetBytes(), addr, length, read_error);
 
         if (!read_error.Success())
             return std::string("<couldn't read data>");
@@ -444,7 +457,7 @@ public:
             if (!ResolveConstant (data_address, constant))
             {
                 lldb_private::Error free_error;
-                m_memory_map.Free(data_address, free_error);
+                m_execution_unit.Free(data_address, free_error);
                 return LLDB_INVALID_ADDRESS;
             }
         }
@@ -474,6 +487,7 @@ CanResolveConstant (llvm::Constant *cons
         return false;
     case Value::ConstantIntVal:
     case Value::ConstantFPVal:
+    case Value::FunctionVal:
         return true;
     case Value::ConstantExprVal:
         if (const ConstantExpr *constant_expr = 
dyn_cast<ConstantExpr>(constant))
@@ -672,7 +686,7 @@ bool
 IRInterpreter::Interpret (llvm::Module &module,
                           llvm::Function &function,
                           llvm::ArrayRef<lldb::addr_t> args,
-                          lldb_private::IRMemoryMap &memory_map,
+                          lldb_private::IRExecutionUnit &execution_unit,
                           lldb_private::Error &error,
                           lldb::addr_t stack_frame_bottom,
                           lldb::addr_t stack_frame_top,
@@ -694,7 +708,7 @@ IRInterpreter::Interpret (llvm::Module &
 
     DataLayout data_layout(&module);
 
-    InterpreterStackFrame frame(data_layout, memory_map, stack_frame_bottom, 
stack_frame_top);
+    InterpreterStackFrame frame(data_layout, execution_unit, 
stack_frame_bottom, stack_frame_top);
 
     if (frame.m_frame_process_address == LLDB_INVALID_ADDRESS)
     {
@@ -900,7 +914,7 @@ IRInterpreter::Interpret (llvm::Module &
 
                 lldb_private::Error write_error;
 
-                memory_map.WritePointerToMemory(P, R, write_error);
+                execution_unit.WritePointerToMemory(P, R, write_error);
 
                 if (!write_error.Success())
                 {
@@ -909,8 +923,8 @@ IRInterpreter::Interpret (llvm::Module &
                     error.SetErrorToGenericError();
                     error.SetErrorString(memory_write_error);
                     lldb_private::Error free_error;
-                    memory_map.Free(P, free_error);
-                    memory_map.Free(R, free_error);
+                    execution_unit.Free(P, free_error);
+                    execution_unit.Free(R, free_error);
                     return false;
                 }
 
@@ -1374,7 +1388,7 @@ IRInterpreter::Interpret (llvm::Module &
 
                 lldb::addr_t R;
                 lldb_private::Error read_error;
-                memory_map.ReadPointerFromMemory(&R, P, read_error);
+                execution_unit.ReadPointerFromMemory(&R, P, read_error);
 
                 if (!read_error.Success())
                 {
@@ -1389,7 +1403,7 @@ IRInterpreter::Interpret (llvm::Module &
                 lldb_private::DataBufferHeap buffer(target_size, 0);
 
                 read_error.Clear();
-                memory_map.ReadMemory(buffer.GetBytes(), R, 
buffer.GetByteSize(), read_error);
+                execution_unit.ReadMemory(buffer.GetBytes(), R, 
buffer.GetByteSize(), read_error);
                 if (!read_error.Success())
                 {
                     if (log)
@@ -1400,7 +1414,7 @@ IRInterpreter::Interpret (llvm::Module &
                 }
 
                 lldb_private::Error write_error;
-                memory_map.WriteMemory(D, buffer.GetBytes(), 
buffer.GetByteSize(), write_error);
+                execution_unit.WriteMemory(D, buffer.GetBytes(), 
buffer.GetByteSize(), write_error);
                 if (!write_error.Success())
                 {
                     if (log)
@@ -1474,7 +1488,7 @@ IRInterpreter::Interpret (llvm::Module &
 
                 lldb::addr_t R;
                 lldb_private::Error read_error;
-                memory_map.ReadPointerFromMemory(&R, P, read_error);
+                execution_unit.ReadPointerFromMemory(&R, P, read_error);
 
                 if (!read_error.Success())
                 {
@@ -1489,7 +1503,7 @@ IRInterpreter::Interpret (llvm::Module &
                 lldb_private::DataBufferHeap buffer(target_size, 0);
 
                 read_error.Clear();
-                memory_map.ReadMemory(buffer.GetBytes(), D, 
buffer.GetByteSize(), read_error);
+                execution_unit.ReadMemory(buffer.GetBytes(), D, 
buffer.GetByteSize(), read_error);
                 if (!read_error.Success())
                 {
                     if (log)
@@ -1500,7 +1514,7 @@ IRInterpreter::Interpret (llvm::Module &
                 }
 
                 lldb_private::Error write_error;
-                memory_map.WriteMemory(R, buffer.GetBytes(), 
buffer.GetByteSize(), write_error);
+                execution_unit.WriteMemory(R, buffer.GetBytes(), 
buffer.GetByteSize(), write_error);
                 if (!write_error.Success())
                 {
                     if (log)
@@ -1649,14 +1663,14 @@ IRInterpreter::Interpret (llvm::Module &
                         lldb::addr_t addr = tmp_op.ULongLong();
                         size_t dataSize = 0;
 
-                        if (memory_map.GetAllocSize(addr, dataSize))
+                        if (execution_unit.GetAllocSize(addr, dataSize))
                         {
                             // Create the required buffer
                             rawArgs[i].size = dataSize;
                             rawArgs[i].data_ap.reset(new uint8_t[dataSize + 
1]);
 
                             // Read string from host memory
-                            memory_map.ReadMemory(rawArgs[i].data_ap.get(), 
addr, dataSize, error);
+                            
execution_unit.ReadMemory(rawArgs[i].data_ap.get(), addr, dataSize, error);
                             if (error.Fail())
                             {
                                 assert(!"we have failed to read the string 
from memory");

Modified: lldb/trunk/source/Expression/LLVMUserExpression.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/LLVMUserExpression.cpp?rev=262407&r1=262406&r2=262407&view=diff
==============================================================================
--- lldb/trunk/source/Expression/LLVMUserExpression.cpp (original)
+++ lldb/trunk/source/Expression/LLVMUserExpression.cpp Tue Mar  1 15:53:26 2016
@@ -121,7 +121,7 @@ LLVMUserExpression::Execute(Stream &erro
             function_stack_top = m_stack_frame_top;
 
             IRInterpreter::Interpret(*module, *function, args, 
*m_execution_unit_sp.get(), interpreter_error,
-                                     function_stack_bottom, 
function_stack_top, exe_ctx);
+                function_stack_bottom, function_stack_top, exe_ctx);
 
             if (!interpreter_error.Success())
             {


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to