Materializer.cpp revision 3b16eb9d424068446fea9cd0e0fe5e7d435f5b6e
13b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan//===-- Materializer.cpp ----------------------------------------*- C++ -*-===// 23b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan// 33b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan// The LLVM Compiler Infrastructure 43b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan// 53b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan// This file is distributed under the University of Illinois Open Source 63b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan// License. See LICENSE.TXT for details. 73b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan// 83b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan//===----------------------------------------------------------------------===// 93b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 103b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Expression/ClangExpressionVariable.h" 113b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Expression/Materializer.h" 123b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Symbol/ClangASTContext.h" 133b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Symbol/Symbol.h" 143b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Symbol/Type.h" 153b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Symbol/Variable.h" 163b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Target/ExecutionContext.h" 173b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 183b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananusing namespace lldb_private; 193b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 203b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananuint32_t 213b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::AddStructMember (Entity &entity) 223b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 233b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t size = entity.GetSize(); 243b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t alignment = entity.GetAlignment(); 253b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 263b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t ret; 273b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 283b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (!m_current_offset) 293b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_struct_alignment = alignment; 303b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 313b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (m_current_offset % alignment) 323b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_current_offset += (alignment - (m_current_offset % alignment)); 333b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 343b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan ret = m_current_offset; 353b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 363b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_current_offset += size; 373b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 383b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return ret; 393b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 403b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 413b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananvoid 423b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::Entity::SetSizeAndAlignmentFromType (ClangASTType &type) 433b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 443b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_size = type.GetTypeByteSize(); 453b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 463b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t bit_alignment = type.GetTypeBitAlign(); 473b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 483b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (bit_alignment % 8) 493b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 503b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan bit_alignment += 8; 513b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan bit_alignment &= ~((uint32_t)0x111u); 523b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 533b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 543b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_alignment = bit_alignment / 8; 553b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 563b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 573b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananclass EntityPersistentVariable : public Materializer::Entity 583b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 593b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananpublic: 603b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp) : 613b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Entity(), 623b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_persistent_variable_sp(persistent_variable_sp) 633b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 643b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan ClangASTType type(m_persistent_variable_sp->GetClangAST(), 653b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_persistent_variable_sp->GetClangType()); 663b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 673b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan SetSizeAndAlignmentFromType(type); 683b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 693b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 703b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 713b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 723b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 733b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 743b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 753b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 763b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 773b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananprivate: 783b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan lldb::ClangExpressionVariableSP m_persistent_variable_sp; 793b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan}; 803b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 813b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananuint32_t 823b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err) 833b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 843b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityVector::iterator iter = m_entities.insert(m_entities.end(), EntityUP()); 853b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan iter->reset (new EntityPersistentVariable (persistent_variable_sp)); 863b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t ret = AddStructMember(**iter); 873b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan (*iter)->SetOffset(ret); 883b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return ret; 893b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 903b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 913b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananclass EntityVariable : public Materializer::Entity 923b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 933b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananpublic: 943b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityVariable (lldb::VariableSP &variable_sp) : 953b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Entity(), 963b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_variable_sp(variable_sp) 973b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 983b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Type *type = variable_sp->GetType(); 993b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1003b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan assert(type); 1013b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1023b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (type) 1033b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1043b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan ClangASTType clang_type(type->GetClangAST(), 1053b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan type->GetClangLayoutType()); 1063b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1073b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan SetSizeAndAlignmentFromType(clang_type); 1083b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1093b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1103b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1113b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 1123b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1133b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1143b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1153b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 1163b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1173b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1183b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananprivate: 1193b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan lldb::VariableSP m_variable_sp; 1203b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan}; 1213b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1223b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananuint32_t 1233b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::AddVariable (lldb::VariableSP &variable_sp, Error &err) 1243b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 1253b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityVector::iterator iter = m_entities.insert(m_entities.end(), EntityUP()); 1263b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan iter->reset (new EntityVariable (variable_sp)); 1273b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t ret = AddStructMember(**iter); 1283b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan (*iter)->SetOffset(ret); 1293b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return ret; 1303b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 1313b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1323b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananclass EntityResultVariable : public Materializer::Entity 1333b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 1343b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananpublic: 1353b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityResultVariable (const ClangASTType &type) : 1363b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Entity(), 1373b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_type(type) 1383b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1393b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan SetSizeAndAlignmentFromType(m_type); 1403b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1413b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1423b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 1433b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1443b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1453b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1463b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 1473b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1483b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1493b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananprivate: 1503b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan ClangASTType m_type; 1513b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan}; 1523b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1533b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananuint32_t 1543b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::AddResultVariable (const ClangASTType &type, Error &err) 1553b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 1563b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityVector::iterator iter = m_entities.insert(m_entities.end(), EntityUP()); 1573b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan iter->reset (new EntityResultVariable (type)); 1583b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t ret = AddStructMember(**iter); 1593b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan (*iter)->SetOffset(ret); 1603b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return ret; 1613b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 1623b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1633b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananclass EntitySymbol : public Materializer::Entity 1643b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 1653b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananpublic: 1663b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntitySymbol (const Symbol &symbol) : 1673b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Entity(), 1683b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_symbol(symbol) 1693b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1703b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan // Hard-coding to maximum size of a symbol 1713b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_size = 8; 1723b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_alignment = 8; 1733b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1743b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1753b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 1763b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1773b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1783b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1793b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 1803b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 1813b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 1823b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananprivate: 1833b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Symbol m_symbol; 1843b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan}; 1853b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1863b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananuint32_t 1873b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::AddSymbol (const Symbol &symbol_sp, Error &err) 1883b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 1893b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityVector::iterator iter = m_entities.insert(m_entities.end(), EntityUP()); 1903b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan iter->reset (new EntitySymbol (symbol_sp)); 1913b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t ret = AddStructMember(**iter); 1923b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan (*iter)->SetOffset(ret); 1933b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return ret; 1943b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 1953b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 1963b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananclass EntityRegister : public Materializer::Entity 1973b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 1983b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananpublic: 1993b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityRegister (const RegisterInfo ®ister_info) : 2003b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Entity(), 2013b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_register_info(register_info) 2023b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2033b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan // Hard-coding alignment conservatively 2043b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_size = m_register_info.byte_size; 2053b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_alignment = m_register_info.byte_size; 2063b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2073b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2083b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 2093b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2103b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2113b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2123b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) 2133b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2143b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2153b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananprivate: 2163b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan RegisterInfo m_register_info; 2173b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan}; 2183b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2193b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananuint32_t 2203b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::AddRegister (const RegisterInfo ®ister_info, Error &err) 2213b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 2223b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan EntityVector::iterator iter = m_entities.insert(m_entities.end(), EntityUP()); 2233b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan iter->reset (new EntityRegister (register_info)); 2243b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan uint32_t ret = AddStructMember(**iter); 2253b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan (*iter)->SetOffset(ret); 2263b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return ret; 2273b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 2283b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2293b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::Materializer () : 2303b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_needs_dematerialize(Mutex::eMutexTypeNormal), 2313b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_current_offset(0), 2323b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_struct_alignment(8) 2333b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 2343b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 2353b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2363b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2373b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::Dematerializer 2383b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::Materialize (lldb::StackFrameSP &frame_sp, lldb::ClangExpressionVariableSP &result_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &error) 2393b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 2403b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan for (EntityUP &entity_up : m_entities) 2413b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2423b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan entity_up->Materialize(frame_sp, map, process_address, error); 2433b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2443b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (!error.Success()) 2453b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return Dematerializer (*this, frame_sp, map, LLDB_INVALID_ADDRESS); 2463b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2473b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2483b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_needs_dematerialize.Lock(); 2493b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2503b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan return Dematerializer (*this, frame_sp, map, process_address); 2513b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 2523b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2533b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananvoid 2543b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananMaterializer::Dematerializer::Dematerialize (Error &error) 2553b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan{ 2563b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan lldb::StackFrameSP frame_sp = m_frame_wp.lock(); 2573b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2583b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (!frame_sp) 2593b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2603b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan error.SetErrorToGenericError(); 2613b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan error.SetErrorString("Couldn't dematerialize: frame is gone"); 2623b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2633b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan else 2643b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2653b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan for (EntityUP &entity_up : m_materializer.m_entities) 2663b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan { 2673b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan entity_up->Dematerialize (frame_sp, m_map, m_process_address, error); 2683b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2693b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan if (!error.Success()) 2703b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan break; 2713b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2723b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan } 2733b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 2743b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_materializer.m_needs_dematerialize.Unlock(); 2753b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan} 276