ClangExpressionVariable.cpp revision 296373
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 25using namespace lldb_private; 26using namespace clang; 27 28ClangExpressionVariable::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 36ClangExpressionVariable::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//---------------------------------------------------------------------- 47size_t 48ClangExpressionVariable::GetByteSize () 49{ 50 return m_frozen_sp->GetByteSize(); 51} 52 53const ConstString & 54ClangExpressionVariable::GetName () 55{ 56 return m_frozen_sp->GetName(); 57} 58 59lldb::ValueObjectSP 60ClangExpressionVariable::GetValueObject() 61{ 62 return m_frozen_sp; 63} 64 65RegisterInfo * 66ClangExpressionVariable::GetRegisterInfo() 67{ 68 return m_frozen_sp->GetValue().GetRegisterInfo(); 69} 70 71void 72ClangExpressionVariable::SetRegisterInfo (const RegisterInfo *reg_info) 73{ 74 return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_info)); 75} 76 77ClangASTType 78ClangExpressionVariable::GetClangType() 79{ 80 return m_frozen_sp->GetClangType(); 81} 82 83void 84ClangExpressionVariable::SetClangType(const ClangASTType &clang_type) 85{ 86 m_frozen_sp->GetValue().SetClangType(clang_type); 87} 88 89 90TypeFromUser 91ClangExpressionVariable::GetTypeFromUser() 92{ 93 TypeFromUser tfu (m_frozen_sp->GetClangType()); 94 return tfu; 95} 96 97uint8_t * 98ClangExpressionVariable::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 113void 114ClangExpressionVariable::SetName (const ConstString &name) 115{ 116 m_frozen_sp->SetName (name); 117} 118 119void 120ClangExpressionVariable::ValueUpdated () 121{ 122 m_frozen_sp->ValueUpdated (); 123} 124 125void 126ClangExpressionVariable::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