Home | History | Annotate | Download | only in Expression
      1 //===-- ClangExpressionVariable.cpp -----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/Expression/ClangExpressionVariable.h"
     11 
     12 // C Includes
     13 // C++ Includes
     14 // Other libraries and framework includes
     15 // Project includes
     16 #include "clang/AST/ASTContext.h"
     17 #include "lldb/Core/ConstString.h"
     18 #include "lldb/Core/DataExtractor.h"
     19 #include "lldb/Core/Stream.h"
     20 #include "lldb/Core/Value.h"
     21 #include "lldb/Core/ValueObjectConstResult.h"
     22 #include "lldb/Target/ExecutionContext.h"
     23 #include "lldb/Target/Process.h"
     24 
     25 using namespace lldb_private;
     26 using namespace clang;
     27 
     28 ClangExpressionVariable::ClangExpressionVariable(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size) :
     29     m_parser_vars(),
     30     m_jit_vars (),
     31     m_flags (EVNone),
     32     m_frozen_sp (ValueObjectConstResult::Create (exe_scope, byte_order, addr_byte_size))
     33 {
     34 }
     35 
     36 ClangExpressionVariable::ClangExpressionVariable (const lldb::ValueObjectSP &valobj_sp) :
     37     m_parser_vars(),
     38     m_jit_vars (),
     39     m_flags (EVNone),
     40     m_frozen_sp (valobj_sp)
     41 {
     42 }
     43 
     44 //----------------------------------------------------------------------
     45 /// Return the variable's size in bytes
     46 //----------------------------------------------------------------------
     47 size_t
     48 ClangExpressionVariable::GetByteSize ()
     49 {
     50     return m_frozen_sp->GetByteSize();
     51 }
     52 
     53 const ConstString &
     54 ClangExpressionVariable::GetName ()
     55 {
     56     return m_frozen_sp->GetName();
     57 }
     58 
     59 lldb::ValueObjectSP
     60 ClangExpressionVariable::GetValueObject()
     61 {
     62     return m_frozen_sp;
     63 }
     64 
     65 RegisterInfo *
     66 ClangExpressionVariable::GetRegisterInfo()
     67 {
     68     return m_frozen_sp->GetValue().GetRegisterInfo();
     69 }
     70 
     71 void
     72 ClangExpressionVariable::SetRegisterInfo (const RegisterInfo *reg_info)
     73 {
     74     return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_info));
     75 }
     76 
     77 ClangASTType
     78 ClangExpressionVariable::GetClangType()
     79 {
     80     return m_frozen_sp->GetClangType();
     81 }
     82 
     83 void
     84 ClangExpressionVariable::SetClangType(const ClangASTType &clang_type)
     85 {
     86     m_frozen_sp->GetValue().SetClangType(clang_type);
     87 }
     88 
     89 
     90 TypeFromUser
     91 ClangExpressionVariable::GetTypeFromUser()
     92 {
     93     TypeFromUser tfu (m_frozen_sp->GetClangType());
     94     return tfu;
     95 }
     96 
     97 uint8_t *
     98 ClangExpressionVariable::GetValueBytes()
     99 {
    100     const size_t byte_size = m_frozen_sp->GetByteSize();
    101     if (byte_size > 0)
    102     {
    103         if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size)
    104         {
    105             m_frozen_sp->GetValue().ResizeData(byte_size);
    106             m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor());
    107         }
    108         return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart());
    109     }
    110     return NULL;
    111 }
    112 
    113 void
    114 ClangExpressionVariable::SetName (const ConstString &name)
    115 {
    116     m_frozen_sp->SetName (name);
    117 }
    118 
    119 void
    120 ClangExpressionVariable::ValueUpdated ()
    121 {
    122     m_frozen_sp->ValueUpdated ();
    123 }
    124 
    125 void
    126 ClangExpressionVariable::TransferAddress (bool force)
    127 {
    128     if (m_live_sp.get() == NULL)
    129         return;
    130 
    131     if (m_frozen_sp.get() == NULL)
    132         return;
    133 
    134     if (force || (m_frozen_sp->GetLiveAddress() == LLDB_INVALID_ADDRESS))
    135         m_frozen_sp->SetLiveAddress(m_live_sp->GetLiveAddress());
    136 }
    137