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 &register_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 &register_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