1e33724f3SSean Callanan //===-- ExpressionVariable.cpp ----------------------------------*- C++ -*-===// 2e33724f3SSean Callanan // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler 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 } 28248a1305SKonrad Kleine return nullptr; 29bc8ac34eSSean Callanan } 308f1f9a1bSSean Callanan 31b9c1b51eSKate Stone PersistentExpressionState::~PersistentExpressionState() {} 32bd4dc693SSean Callanan 330e4c4821SAdrian Prantl lldb::addr_t PersistentExpressionState::LookupSymbol(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 4863e5fb76SJonas Devlieghere LLDB_LOGF(log, "Registering JITted Functions:\n"); 49bd4dc693SSean Callanan 50b9c1b51eSKate Stone for (const IRExecutionUnit::JittedFunction &jitted_function : 51b9c1b51eSKate Stone execution_unit_sp->GetJittedFunctions()) { 52bd4dc693SSean Callanan if (jitted_function.m_external && 53bd4dc693SSean Callanan jitted_function.m_name != execution_unit_sp->GetFunctionName() && 54b9c1b51eSKate Stone jitted_function.m_remote_addr != LLDB_INVALID_ADDRESS) { 55b9c1b51eSKate Stone m_symbol_map[jitted_function.m_name.GetCString()] = 56b9c1b51eSKate Stone jitted_function.m_remote_addr; 5763e5fb76SJonas Devlieghere LLDB_LOGF(log, " Function: %s at 0x%" PRIx64 ".", 58b9c1b51eSKate Stone jitted_function.m_name.GetCString(), 59b9c1b51eSKate Stone jitted_function.m_remote_addr); 60bd4dc693SSean Callanan } 61bd4dc693SSean Callanan } 62bd4dc693SSean Callanan 6363e5fb76SJonas Devlieghere LLDB_LOGF(log, "Registering JIIted Symbols:\n"); 64bd4dc693SSean Callanan 65b9c1b51eSKate Stone for (const IRExecutionUnit::JittedGlobalVariable &global_var : 66b9c1b51eSKate Stone execution_unit_sp->GetJittedGlobalVariables()) { 67b9c1b51eSKate Stone if (global_var.m_remote_addr != LLDB_INVALID_ADDRESS) { 68b9c1b51eSKate Stone // Demangle the name before inserting it, so that lookups by the ConstStr 6905097246SAdrian Prantl // of the demangled name will find the mangled one (needed for looking up 7005097246SAdrian Prantl // metadata pointers.) 71bd4dc693SSean Callanan Mangled mangler(global_var.m_name); 72bd4dc693SSean Callanan mangler.GetDemangledName(lldb::eLanguageTypeUnknown); 73bd4dc693SSean Callanan m_symbol_map[global_var.m_name.GetCString()] = global_var.m_remote_addr; 7463e5fb76SJonas Devlieghere LLDB_LOGF(log, " Symbol: %s at 0x%" PRIx64 ".", 75b9c1b51eSKate Stone global_var.m_name.GetCString(), global_var.m_remote_addr); 76bd4dc693SSean Callanan } 77bd4dc693SSean Callanan } 78bd4dc693SSean Callanan } 79*29db51daSAdrian Prantl 80*29db51daSAdrian Prantl ConstString PersistentExpressionState::GetNextPersistentVariableName( 81*29db51daSAdrian Prantl Target &target, llvm::StringRef Prefix) { 82*29db51daSAdrian Prantl llvm::SmallString<64> name; 83*29db51daSAdrian Prantl { 84*29db51daSAdrian Prantl llvm::raw_svector_ostream os(name); 85*29db51daSAdrian Prantl os << Prefix << target.GetNextPersistentVariableIndex(); 86*29db51daSAdrian Prantl } 87*29db51daSAdrian Prantl return ConstString(name); 88*29db51daSAdrian Prantl } 89