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 10e33724f3SSean Callanan #include "lldb/Expression/ExpressionVariable.h" 11bd4dc693SSean Callanan #include "lldb/Expression/IRExecutionUnit.h" 12*03219f7fSAdrian Prantl #include "lldb/Target/Target.h" 136f9e6901SZachary Turner #include "lldb/Utility/Log.h" 14e33724f3SSean Callanan 15bc8ac34eSSean Callanan using namespace lldb_private; 16bc8ac34eSSean Callanan 17b9c1b51eSKate Stone ExpressionVariable::~ExpressionVariable() {} 18bc8ac34eSSean Callanan 19b9c1b51eSKate Stone uint8_t *ExpressionVariable::GetValueBytes() { 20bc8ac34eSSean Callanan const size_t byte_size = m_frozen_sp->GetByteSize(); 21b9c1b51eSKate Stone if (byte_size > 0) { 22b9c1b51eSKate Stone if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size) { 23bc8ac34eSSean Callanan m_frozen_sp->GetValue().ResizeData(byte_size); 24bc8ac34eSSean Callanan m_frozen_sp->GetValue().GetData(m_frozen_sp->GetDataExtractor()); 25bc8ac34eSSean Callanan } 26b9c1b51eSKate Stone return const_cast<uint8_t *>( 27b9c1b51eSKate Stone m_frozen_sp->GetDataExtractor().GetDataStart()); 28bc8ac34eSSean Callanan } 29bc8ac34eSSean Callanan return NULL; 30bc8ac34eSSean Callanan } 318f1f9a1bSSean Callanan 32b9c1b51eSKate Stone PersistentExpressionState::~PersistentExpressionState() {} 33bd4dc693SSean Callanan 34b9c1b51eSKate Stone lldb::addr_t PersistentExpressionState::LookupSymbol(const ConstString &name) { 35bd4dc693SSean Callanan SymbolMap::iterator si = m_symbol_map.find(name.GetCString()); 36bd4dc693SSean Callanan 37bd4dc693SSean Callanan if (si != m_symbol_map.end()) 38bd4dc693SSean Callanan return si->second; 39bd4dc693SSean Callanan else 40bd4dc693SSean Callanan return LLDB_INVALID_ADDRESS; 41bd4dc693SSean Callanan } 42bd4dc693SSean Callanan 43b9c1b51eSKate Stone void PersistentExpressionState::RegisterExecutionUnit( 44b9c1b51eSKate Stone lldb::IRExecutionUnitSP &execution_unit_sp) { 45bd4dc693SSean Callanan Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 46bd4dc693SSean Callanan 47bd4dc693SSean Callanan m_execution_units.insert(execution_unit_sp); 48bd4dc693SSean Callanan 49bd4dc693SSean Callanan if (log) 50bd4dc693SSean Callanan log->Printf("Registering JITted Functions:\n"); 51bd4dc693SSean Callanan 52b9c1b51eSKate Stone for (const IRExecutionUnit::JittedFunction &jitted_function : 53b9c1b51eSKate Stone execution_unit_sp->GetJittedFunctions()) { 54bd4dc693SSean Callanan if (jitted_function.m_external && 55bd4dc693SSean Callanan jitted_function.m_name != execution_unit_sp->GetFunctionName() && 56b9c1b51eSKate Stone jitted_function.m_remote_addr != LLDB_INVALID_ADDRESS) { 57b9c1b51eSKate Stone m_symbol_map[jitted_function.m_name.GetCString()] = 58b9c1b51eSKate Stone jitted_function.m_remote_addr; 59bd4dc693SSean Callanan if (log) 60b9c1b51eSKate Stone log->Printf(" Function: %s at 0x%" PRIx64 ".", 61b9c1b51eSKate Stone jitted_function.m_name.GetCString(), 62b9c1b51eSKate Stone jitted_function.m_remote_addr); 63bd4dc693SSean Callanan } 64bd4dc693SSean Callanan } 65bd4dc693SSean Callanan 66bd4dc693SSean Callanan if (log) 67bd4dc693SSean Callanan log->Printf("Registering JIIted Symbols:\n"); 68bd4dc693SSean Callanan 69b9c1b51eSKate Stone for (const IRExecutionUnit::JittedGlobalVariable &global_var : 70b9c1b51eSKate Stone execution_unit_sp->GetJittedGlobalVariables()) { 71b9c1b51eSKate Stone if (global_var.m_remote_addr != LLDB_INVALID_ADDRESS) { 72b9c1b51eSKate Stone // Demangle the name before inserting it, so that lookups by the ConstStr 7305097246SAdrian Prantl // of the demangled name will find the mangled one (needed for looking up 7405097246SAdrian Prantl // metadata pointers.) 75bd4dc693SSean Callanan Mangled mangler(global_var.m_name); 76bd4dc693SSean Callanan mangler.GetDemangledName(lldb::eLanguageTypeUnknown); 77bd4dc693SSean Callanan m_symbol_map[global_var.m_name.GetCString()] = global_var.m_remote_addr; 78bd4dc693SSean Callanan if (log) 79b9c1b51eSKate Stone log->Printf(" Symbol: %s at 0x%" PRIx64 ".", 80b9c1b51eSKate Stone global_var.m_name.GetCString(), global_var.m_remote_addr); 81bd4dc693SSean Callanan } 82bd4dc693SSean Callanan } 83bd4dc693SSean Callanan } 84*03219f7fSAdrian Prantl 85*03219f7fSAdrian Prantl ConstString PersistentExpressionState::GetNextPersistentVariableName( 86*03219f7fSAdrian Prantl Target &target, llvm::StringRef Prefix) { 87*03219f7fSAdrian Prantl llvm::SmallString<64> name; 88*03219f7fSAdrian Prantl { 89*03219f7fSAdrian Prantl llvm::raw_svector_ostream os(name); 90*03219f7fSAdrian Prantl os << Prefix << target.GetNextPersistentVariableIndex(); 91*03219f7fSAdrian Prantl } 92*03219f7fSAdrian Prantl return ConstString(name); 93*03219f7fSAdrian Prantl } 94