1e33724f3SSean Callanan //===-- ExpressionVariable.cpp ----------------------------------*- C++ -*-===// 2e33724f3SSean Callanan // 3e33724f3SSean Callanan // The LLVM Compiler Infrastructure 4e33724f3SSean Callanan // 5e33724f3SSean Callanan // This file is distributed under the University of Illinois Open Source 6e33724f3SSean Callanan // License. See LICENSE.TXT for details. 7e33724f3SSean Callanan // 8e33724f3SSean Callanan //===----------------------------------------------------------------------===// 9e33724f3SSean Callanan 10*bd4dc693SSean Callanan #include "lldb/Core/Log.h" 11e33724f3SSean Callanan #include "lldb/Expression/ExpressionVariable.h" 12*bd4dc693SSean Callanan #include "lldb/Expression/IRExecutionUnit.h" 13e33724f3SSean Callanan 14bc8ac34eSSean Callanan using namespace lldb_private; 15bc8ac34eSSean Callanan 16bc8ac34eSSean Callanan ExpressionVariable::~ExpressionVariable() 17bc8ac34eSSean Callanan { 18bc8ac34eSSean Callanan } 19bc8ac34eSSean Callanan 20bc8ac34eSSean Callanan uint8_t * 21bc8ac34eSSean Callanan ExpressionVariable::GetValueBytes() 22bc8ac34eSSean Callanan { 23bc8ac34eSSean Callanan const size_t byte_size = m_frozen_sp->GetByteSize(); 24bc8ac34eSSean Callanan if (byte_size > 0) 25bc8ac34eSSean Callanan { 26bc8ac34eSSean Callanan if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size) 27bc8ac34eSSean Callanan { 28bc8ac34eSSean Callanan m_frozen_sp->GetValue().ResizeData(byte_size); 29bc8ac34eSSean Callanan m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor()); 30bc8ac34eSSean Callanan } 31bc8ac34eSSean Callanan return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart()); 32bc8ac34eSSean Callanan } 33bc8ac34eSSean Callanan return NULL; 34bc8ac34eSSean Callanan } 358f1f9a1bSSean Callanan 368f1f9a1bSSean Callanan PersistentExpressionState::~PersistentExpressionState () 378f1f9a1bSSean Callanan { 388f1f9a1bSSean Callanan } 39*bd4dc693SSean Callanan 40*bd4dc693SSean Callanan lldb::addr_t 41*bd4dc693SSean Callanan PersistentExpressionState::LookupSymbol (const ConstString &name) 42*bd4dc693SSean Callanan { 43*bd4dc693SSean Callanan SymbolMap::iterator si = m_symbol_map.find(name.GetCString()); 44*bd4dc693SSean Callanan 45*bd4dc693SSean Callanan if (si != m_symbol_map.end()) 46*bd4dc693SSean Callanan return si->second; 47*bd4dc693SSean Callanan else 48*bd4dc693SSean Callanan return LLDB_INVALID_ADDRESS; 49*bd4dc693SSean Callanan } 50*bd4dc693SSean Callanan 51*bd4dc693SSean Callanan 52*bd4dc693SSean Callanan void 53*bd4dc693SSean Callanan PersistentExpressionState::RegisterExecutionUnit (lldb::IRExecutionUnitSP &execution_unit_sp) 54*bd4dc693SSean Callanan { 55*bd4dc693SSean Callanan Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 56*bd4dc693SSean Callanan 57*bd4dc693SSean Callanan m_execution_units.insert(execution_unit_sp); 58*bd4dc693SSean Callanan 59*bd4dc693SSean Callanan if (log) 60*bd4dc693SSean Callanan log->Printf ("Registering JITted Functions:\n"); 61*bd4dc693SSean Callanan 62*bd4dc693SSean Callanan for (const IRExecutionUnit::JittedFunction &jitted_function : execution_unit_sp->GetJittedFunctions()) 63*bd4dc693SSean Callanan { 64*bd4dc693SSean Callanan if (jitted_function.m_external && 65*bd4dc693SSean Callanan jitted_function.m_name != execution_unit_sp->GetFunctionName() && 66*bd4dc693SSean Callanan jitted_function.m_remote_addr != LLDB_INVALID_ADDRESS) 67*bd4dc693SSean Callanan { 68*bd4dc693SSean Callanan m_symbol_map[jitted_function.m_name.GetCString()] = jitted_function.m_remote_addr; 69*bd4dc693SSean Callanan if (log) 70*bd4dc693SSean Callanan log->Printf (" Function: %s at 0x%" PRIx64 ".", jitted_function.m_name.GetCString(), jitted_function.m_remote_addr); 71*bd4dc693SSean Callanan } 72*bd4dc693SSean Callanan } 73*bd4dc693SSean Callanan 74*bd4dc693SSean Callanan if (log) 75*bd4dc693SSean Callanan log->Printf ("Registering JIIted Symbols:\n"); 76*bd4dc693SSean Callanan 77*bd4dc693SSean Callanan for (const IRExecutionUnit::JittedGlobalVariable &global_var : execution_unit_sp->GetJittedGlobalVariables()) 78*bd4dc693SSean Callanan { 79*bd4dc693SSean Callanan if (global_var.m_remote_addr != LLDB_INVALID_ADDRESS) 80*bd4dc693SSean Callanan { 81*bd4dc693SSean Callanan // Demangle the name before inserting it, so that lookups by the ConstStr of the demangled name 82*bd4dc693SSean Callanan // will find the mangled one (needed for looking up metadata pointers.) 83*bd4dc693SSean Callanan Mangled mangler(global_var.m_name); 84*bd4dc693SSean Callanan mangler.GetDemangledName(lldb::eLanguageTypeUnknown); 85*bd4dc693SSean Callanan m_symbol_map[global_var.m_name.GetCString()] = global_var.m_remote_addr; 86*bd4dc693SSean Callanan if (log) 87*bd4dc693SSean Callanan log->Printf (" Symbol: %s at 0x%" PRIx64 ".", global_var.m_name.GetCString(), global_var.m_remote_addr); 88*bd4dc693SSean Callanan } 89*bd4dc693SSean Callanan } 90*bd4dc693SSean Callanan } 91