1e33724f3SSean Callanan //===-- ExpressionVariable.cpp ----------------------------------*- C++ -*-===// 2e33724f3SSean Callanan // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e33724f3SSean Callanan // 7e33724f3SSean Callanan //===----------------------------------------------------------------------===// 8e33724f3SSean Callanan 9e33724f3SSean Callanan #include "lldb/Expression/ExpressionVariable.h" 10bd4dc693SSean Callanan #include "lldb/Expression/IRExecutionUnit.h" 1103219f7fSAdrian Prantl #include "lldb/Target/Target.h" 126f9e6901SZachary Turner #include "lldb/Utility/Log.h" 13e33724f3SSean Callanan 14bc8ac34eSSean Callanan using namespace lldb_private; 15bc8ac34eSSean Callanan 16b9c1b51eSKate Stone ExpressionVariable::~ExpressionVariable() {} 17bc8ac34eSSean Callanan 18b9c1b51eSKate Stone uint8_t *ExpressionVariable::GetValueBytes() { 19bc8ac34eSSean Callanan const size_t byte_size = m_frozen_sp->GetByteSize(); 20b9c1b51eSKate Stone if (byte_size > 0) { 21b9c1b51eSKate Stone if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size) { 22bc8ac34eSSean Callanan m_frozen_sp->GetValue().ResizeData(byte_size); 23bc8ac34eSSean Callanan m_frozen_sp->GetValue().GetData(m_frozen_sp->GetDataExtractor()); 24bc8ac34eSSean Callanan } 25b9c1b51eSKate Stone return const_cast<uint8_t *>( 26b9c1b51eSKate Stone m_frozen_sp->GetDataExtractor().GetDataStart()); 27bc8ac34eSSean Callanan } 28bc8ac34eSSean Callanan return NULL; 29bc8ac34eSSean Callanan } 308f1f9a1bSSean Callanan 31b9c1b51eSKate Stone PersistentExpressionState::~PersistentExpressionState() {} 32bd4dc693SSean Callanan 33b9c1b51eSKate Stone lldb::addr_t PersistentExpressionState::LookupSymbol(const ConstString &name) { 34bd4dc693SSean Callanan SymbolMap::iterator si = m_symbol_map.find(name.GetCString()); 35bd4dc693SSean Callanan 36bd4dc693SSean Callanan if (si != m_symbol_map.end()) 37bd4dc693SSean Callanan return si->second; 38bd4dc693SSean Callanan else 39bd4dc693SSean Callanan return LLDB_INVALID_ADDRESS; 40bd4dc693SSean Callanan } 41bd4dc693SSean Callanan 42b9c1b51eSKate Stone void PersistentExpressionState::RegisterExecutionUnit( 43b9c1b51eSKate Stone lldb::IRExecutionUnitSP &execution_unit_sp) { 44bd4dc693SSean Callanan Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 45bd4dc693SSean Callanan 46bd4dc693SSean Callanan m_execution_units.insert(execution_unit_sp); 47bd4dc693SSean Callanan 48bd4dc693SSean Callanan if (log) 49bd4dc693SSean Callanan log->Printf("Registering JITted Functions:\n"); 50bd4dc693SSean Callanan 51b9c1b51eSKate Stone for (const IRExecutionUnit::JittedFunction &jitted_function : 52b9c1b51eSKate Stone execution_unit_sp->GetJittedFunctions()) { 53bd4dc693SSean Callanan if (jitted_function.m_external && 54bd4dc693SSean Callanan jitted_function.m_name != execution_unit_sp->GetFunctionName() && 55b9c1b51eSKate Stone jitted_function.m_remote_addr != LLDB_INVALID_ADDRESS) { 56b9c1b51eSKate Stone m_symbol_map[jitted_function.m_name.GetCString()] = 57b9c1b51eSKate Stone jitted_function.m_remote_addr; 58bd4dc693SSean Callanan if (log) 59b9c1b51eSKate Stone log->Printf(" Function: %s at 0x%" PRIx64 ".", 60b9c1b51eSKate Stone jitted_function.m_name.GetCString(), 61b9c1b51eSKate Stone jitted_function.m_remote_addr); 62bd4dc693SSean Callanan } 63bd4dc693SSean Callanan } 64bd4dc693SSean Callanan 65bd4dc693SSean Callanan if (log) 66bd4dc693SSean Callanan log->Printf("Registering JIIted Symbols:\n"); 67bd4dc693SSean Callanan 68b9c1b51eSKate Stone for (const IRExecutionUnit::JittedGlobalVariable &global_var : 69b9c1b51eSKate Stone execution_unit_sp->GetJittedGlobalVariables()) { 70b9c1b51eSKate Stone if (global_var.m_remote_addr != LLDB_INVALID_ADDRESS) { 71b9c1b51eSKate Stone // Demangle the name before inserting it, so that lookups by the ConstStr 7205097246SAdrian Prantl // of the demangled name will find the mangled one (needed for looking up 7305097246SAdrian Prantl // metadata pointers.) 74bd4dc693SSean Callanan Mangled mangler(global_var.m_name); 75bd4dc693SSean Callanan mangler.GetDemangledName(lldb::eLanguageTypeUnknown); 76bd4dc693SSean Callanan m_symbol_map[global_var.m_name.GetCString()] = global_var.m_remote_addr; 77bd4dc693SSean Callanan if (log) 78b9c1b51eSKate Stone log->Printf(" Symbol: %s at 0x%" PRIx64 ".", 79b9c1b51eSKate Stone global_var.m_name.GetCString(), global_var.m_remote_addr); 80bd4dc693SSean Callanan } 81bd4dc693SSean Callanan } 82bd4dc693SSean Callanan } 8303219f7fSAdrian Prantl 8403219f7fSAdrian Prantl ConstString PersistentExpressionState::GetNextPersistentVariableName( 8503219f7fSAdrian Prantl Target &target, llvm::StringRef Prefix) { 8603219f7fSAdrian Prantl llvm::SmallString<64> name; 8703219f7fSAdrian Prantl { 8803219f7fSAdrian Prantl llvm::raw_svector_ostream os(name); 8903219f7fSAdrian Prantl os << Prefix << target.GetNextPersistentVariableIndex(); 9003219f7fSAdrian Prantl } 9103219f7fSAdrian Prantl return ConstString(name); 9203219f7fSAdrian Prantl } 93