llvm-project/lldb/source/Expression/ExpressionVariable.cpp
Sean Callanan bd4dc69308 Collect IRExecutionUnits as part of persistent expression state.
IRExecutionUnits contain code and data that persistent declarations can
depend on.  In order to keep them alive and provide for lookup of these
symbols, we now allow any PersistentExpressionState to keep a list of
execution units.  Then, when doing symbol lookup on behalf of an 
expression, any IRExecutionUnit can consult the persistent expression
states on a particular Target to find the appropriate symbol.

<rdar://problem/22864976>

llvm-svn: 263995
2016-03-21 22:23:38 +00:00

91 lines
3.0 KiB
C++

//===-- ExpressionVariable.cpp ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Core/Log.h"
#include "lldb/Expression/ExpressionVariable.h"
#include "lldb/Expression/IRExecutionUnit.h"
using namespace lldb_private;
ExpressionVariable::~ExpressionVariable()
{
}
uint8_t *
ExpressionVariable::GetValueBytes()
{
const size_t byte_size = m_frozen_sp->GetByteSize();
if (byte_size > 0)
{
if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size)
{
m_frozen_sp->GetValue().ResizeData(byte_size);
m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor());
}
return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart());
}
return NULL;
}
PersistentExpressionState::~PersistentExpressionState ()
{
}
lldb::addr_t
PersistentExpressionState::LookupSymbol (const ConstString &name)
{
SymbolMap::iterator si = m_symbol_map.find(name.GetCString());
if (si != m_symbol_map.end())
return si->second;
else
return LLDB_INVALID_ADDRESS;
}
void
PersistentExpressionState::RegisterExecutionUnit (lldb::IRExecutionUnitSP &execution_unit_sp)
{
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
m_execution_units.insert(execution_unit_sp);
if (log)
log->Printf ("Registering JITted Functions:\n");
for (const IRExecutionUnit::JittedFunction &jitted_function : execution_unit_sp->GetJittedFunctions())
{
if (jitted_function.m_external &&
jitted_function.m_name != execution_unit_sp->GetFunctionName() &&
jitted_function.m_remote_addr != LLDB_INVALID_ADDRESS)
{
m_symbol_map[jitted_function.m_name.GetCString()] = jitted_function.m_remote_addr;
if (log)
log->Printf (" Function: %s at 0x%" PRIx64 ".", jitted_function.m_name.GetCString(), jitted_function.m_remote_addr);
}
}
if (log)
log->Printf ("Registering JIIted Symbols:\n");
for (const IRExecutionUnit::JittedGlobalVariable &global_var : execution_unit_sp->GetJittedGlobalVariables())
{
if (global_var.m_remote_addr != LLDB_INVALID_ADDRESS)
{
// Demangle the name before inserting it, so that lookups by the ConstStr of the demangled name
// will find the mangled one (needed for looking up metadata pointers.)
Mangled mangler(global_var.m_name);
mangler.GetDemangledName(lldb::eLanguageTypeUnknown);
m_symbol_map[global_var.m_name.GetCString()] = global_var.m_remote_addr;
if (log)
log->Printf (" Symbol: %s at 0x%" PRIx64 ".", global_var.m_name.GetCString(), global_var.m_remote_addr);
}
}
}