| //===-- 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/Expression/ExpressionVariable.h" |
| #include "lldb/Expression/IRExecutionUnit.h" |
| #include "lldb/Target/Target.h" |
| #include "lldb/Utility/Log.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); |
| } |
| } |
| } |
| |
| ConstString PersistentExpressionState::GetNextPersistentVariableName( |
| Target &target, llvm::StringRef Prefix) { |
| llvm::SmallString<64> name; |
| { |
| llvm::raw_svector_ostream os(name); |
| os << Prefix << target.GetNextPersistentVariableIndex(); |
| } |
| return ConstString(name); |
| } |