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 "ClangExpressionVariable.h" 11 12 #include "clang/AST/ASTContext.h" 13 #include "lldb/Core/ConstString.h" 14 #include "lldb/Core/DataExtractor.h" 15 #include "lldb/Core/Stream.h" 16 #include "lldb/Core/Value.h" 17 #include "lldb/Core/ValueObjectConstResult.h" 18 #include "lldb/Target/ExecutionContext.h" 19 #include "lldb/Target/Process.h" 20 21 using namespace lldb_private; 22 using namespace clang; 23 24 const char *g_clang_expression_variable_kind_name = "ClangExpressionVariable"; 25 26 ClangExpressionVariable::ClangExpressionVariable(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size) : 27 m_parser_vars(), 28 m_jit_vars (), 29 m_flags (EVNone), 30 m_frozen_sp (ValueObjectConstResult::Create (exe_scope, byte_order, addr_byte_size)) 31 { 32 } 33 34 ClangExpressionVariable::ClangExpressionVariable (ExecutionContextScope *exe_scope, 35 Value &value, 36 const ConstString &name, 37 uint16_t flags) : 38 m_parser_vars(), 39 m_jit_vars (), 40 m_flags (flags), 41 m_frozen_sp (ValueObjectConstResult::Create (exe_scope, value, name)) 42 { 43 } 44 45 ClangExpressionVariable::ClangExpressionVariable (const lldb::ValueObjectSP &valobj_sp) : 46 m_parser_vars(), 47 m_jit_vars (), 48 m_flags (EVNone), 49 m_frozen_sp (valobj_sp) 50 { 51 } 52 53 //---------------------------------------------------------------------- 54 /// Return the variable's size in bytes 55 //---------------------------------------------------------------------- 56 size_t 57 ClangExpressionVariable::GetByteSize () 58 { 59 return m_frozen_sp->GetByteSize(); 60 } 61 62 const ConstString & 63 ClangExpressionVariable::GetName () 64 { 65 return m_frozen_sp->GetName(); 66 } 67 68 lldb::ValueObjectSP 69 ClangExpressionVariable::GetValueObject() 70 { 71 return m_frozen_sp; 72 } 73 74 RegisterInfo * 75 ClangExpressionVariable::GetRegisterInfo() 76 { 77 return m_frozen_sp->GetValue().GetRegisterInfo(); 78 } 79 80 void 81 ClangExpressionVariable::SetRegisterInfo (const RegisterInfo *reg_info) 82 { 83 return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<RegisterInfo *>(reg_info)); 84 } 85 86 CompilerType 87 ClangExpressionVariable::GetCompilerType() 88 { 89 return m_frozen_sp->GetCompilerType(); 90 } 91 92 void 93 ClangExpressionVariable::SetCompilerType(const CompilerType &clang_type) 94 { 95 m_frozen_sp->GetValue().SetCompilerType(clang_type); 96 } 97 98 99 TypeFromUser 100 ClangExpressionVariable::GetTypeFromUser() 101 { 102 TypeFromUser tfu (m_frozen_sp->GetCompilerType()); 103 return tfu; 104 } 105 106 uint8_t * 107 ClangExpressionVariable::GetValueBytes() 108 { 109 const size_t byte_size = m_frozen_sp->GetByteSize(); 110 if (byte_size > 0) 111 { 112 if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size) 113 { 114 m_frozen_sp->GetValue().ResizeData(byte_size); 115 m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor()); 116 } 117 return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart()); 118 } 119 return NULL; 120 } 121 122 void 123 ClangExpressionVariable::SetName (const ConstString &name) 124 { 125 m_frozen_sp->SetName (name); 126 } 127 128 void 129 ClangExpressionVariable::ValueUpdated () 130 { 131 m_frozen_sp->ValueUpdated (); 132 } 133 134 void 135 ClangExpressionVariable::TransferAddress (bool force) 136 { 137 if (m_live_sp.get() == NULL) 138 return; 139 140 if (m_frozen_sp.get() == NULL) 141 return; 142 143 if (force || (m_frozen_sp->GetLiveAddress() == LLDB_INVALID_ADDRESS)) 144 m_frozen_sp->SetLiveAddress(m_live_sp->GetLiveAddress()); 145 } 146