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