124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Value.cpp -----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 193c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen#include "lldb/Core/State.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 29395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Target/Target.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value() : 35801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value (), 3652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_vector (), 3752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type (), 38801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_context (NULL), 3952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value_type (eValueTypeScalar), 40801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_context_type (eContextTypeInvalid), 41801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_data_buffer () 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value(const Scalar& scalar) : 46801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value (scalar), 4752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_vector (), 4852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type (), 49801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_context (NULL), 5052f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value_type (eValueTypeScalar), 51801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_context_type (eContextTypeInvalid), 52801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_data_buffer () 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value(const uint8_t *bytes, int len) : 58801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_value (), 5952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_vector (), 6052f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type (), 61801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_context (NULL), 6252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value_type (eValueTypeHostAddress), 63801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_context_type (eContextTypeInvalid), 64801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton m_data_buffer () 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_buffer.CopyData(bytes, len); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = (uintptr_t)m_data_buffer.GetBytes(); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Value(const Value &v) : 7152f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value (v.m_value), 7252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_vector (v.m_vector), 7352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type (v.m_clang_type), 7452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_context (v.m_context), 7552f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value_type (v.m_value_type), 7652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_context_type (v.m_context_type), 7752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_data_buffer () 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((uintptr_t)v.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)v.m_data_buffer.GetBytes()) 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_buffer.CopyData(v.m_data_buffer.GetBytes(), 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner v.m_data_buffer.GetByteSize()); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = (uintptr_t)m_data_buffer.GetBytes(); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonValue & 89bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg ClaytonValue::operator=(const Value &rhs) 90bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton{ 91bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (this != &rhs) 92bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton { 93bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton m_value = rhs.m_value; 9452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_vector = rhs.m_vector; 9552f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type = rhs.m_clang_type; 96bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton m_context = rhs.m_context; 9752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value_type = rhs.m_value_type; 98bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton m_context_type = rhs.m_context_type; 99bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if ((uintptr_t)rhs.m_value.ULongLong(LLDB_INVALID_ADDRESS) == (uintptr_t)rhs.m_data_buffer.GetBytes()) 100bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton { 101bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton m_data_buffer.CopyData(rhs.m_data_buffer.GetBytes(), 102bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton rhs.m_data_buffer.GetByteSize()); 103bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton 104bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton m_value = (uintptr_t)m_data_buffer.GetBytes(); 105bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton } 106bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton } 107bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton return *this; 108bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton} 109bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::Dump (Stream* strm) 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.GetValue (strm, true); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm->Printf(", value_type = %s, context = %p, context_type = %s", 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Value::GetValueTypeAsCString(m_value_type), 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_context, 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Value::GetContextTypeAsCString(m_context_type)); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::ValueType 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueType() const 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value_type; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonAddressType 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueAddressType () const 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value_type) 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeScalar: 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeLoadAddress: return eAddressTypeLoad; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeFileAddress: return eAddressTypeFile; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeHostAddress: return eAddressTypeHost; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eAddressTypeInvalid; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerRegisterInfo * 14210dc2a161c5a3c939a54ba0f4b98e797c5a29b56Enrico GranataValue::GetRegisterInfo() const 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_context_type == eContextTypeRegisterInfo) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<RegisterInfo *> (m_context); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType * 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetType() 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1526916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_context_type == eContextTypeLLDBType) 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<Type *> (m_context); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonValue::ResizeData(size_t len) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_type = eValueTypeHostAddress; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_buffer.SetByteSize(len); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = (uintptr_t)m_data_buffer.GetBytes(); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 16652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::ValueOf(ExecutionContext *exe_ctx) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_context_type) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eContextTypeInvalid: 171801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeRegisterInfo: // RegisterInfo * 172801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeLLDBType: // Type * 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeVariable: // Variable * 17652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ResolveValue(exe_ctx); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Claytonuint64_t 18352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::GetValueByteSize (Error *error_ptr) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 185fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t byte_size = 0; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_context_type) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case eContextTypeRegisterInfo: // RegisterInfo * 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetRegisterInfo()) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size = GetRegisterInfo()->byte_size; 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeInvalid: 19552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeLLDBType: // Type * 1966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case eContextTypeVariable: // Variable * 19752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 19852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &ast_type = GetClangType(); 19952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast_type.IsValid()) 20052f792329be5db8e38961350589e97e8f2823acdGreg Clayton byte_size = ast_type.GetByteSize(); 201b399653251df1798e16726e89a0d61148f736cbaJim Ingham } 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_ptr) 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size == 0) 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_ptr->Success()) 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_ptr->SetErrorString("Unable to determine byte size."); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_ptr->Clear(); 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22052f792329be5db8e38961350589e97e8f2823acdGreg Claytonconst ClangASTType & 221462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonValue::GetClangType () 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!m_clang_type.IsValid()) 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22552f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (m_context_type) 22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 22752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeInvalid: 22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeRegisterInfo: 23152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; // TODO: Eventually convert into a clang type? 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeLLDBType: 23452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 23552f792329be5db8e38961350589e97e8f2823acdGreg Clayton Type *lldb_type = GetType(); 23652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (lldb_type) 23752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type = lldb_type->GetClangForwardType(); 23852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 23952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeVariable: 24252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 24352f792329be5db8e38961350589e97e8f2823acdGreg Clayton Variable *variable = GetVariable(); 24452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (variable) 24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton Type *variable_type = variable->GetType(); 24752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (variable_type) 24852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type = variable_type->GetClangForwardType(); 24952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 25052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 25152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 25252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return m_clang_type; 25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 25752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 25852f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid 25952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::SetClangType (const ClangASTType &clang_type) 26052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 26152f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type = clang_type; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::Format 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueDefaultFormat () 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_context_type) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case eContextTypeRegisterInfo: 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetRegisterInfo()) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetRegisterInfo()->format; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eContextTypeInvalid: 2756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case eContextTypeLLDBType: 2766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton case eContextTypeVariable: 27752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 27852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &ast_type = GetClangType(); 27952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast_type.IsValid()) 28052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ast_type.GetFormat(); 28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return a good default in case we can't figure anything out 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eFormatHex; 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonbool 291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValue::GetData (DataExtractor &data) 292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton switch (m_value_type) 294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton default: 296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eValueTypeScalar: 299427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_value.GetData (data)) 300427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return true; 301427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eValueTypeLoadAddress: 304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eValueTypeFileAddress: 305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case eValueTypeHostAddress: 306427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (m_data_buffer.GetByteSize()) 307427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton data.SetData(m_data_buffer.GetBytes(), m_data_buffer.GetByteSize(), data.GetByteOrder()); 309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return true; 310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton break; 312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 317427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 3197421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg ClaytonValue::GetValueAsData (ExecutionContext *exe_ctx, 32052f792329be5db8e38961350589e97e8f2823acdGreg Clayton DataExtractor &data, 321801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton uint32_t data_offset, 322801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Module *module) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data.Clear(); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t address = LLDB_INVALID_ADDRESS; 328b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton AddressType address_type = eAddressTypeFile; 329917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton Address file_so_addr; 33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &ast_type = GetClangType(); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value_type) 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3330468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata case eValueTypeVector: 33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast_type.IsValid()) 33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton data.SetAddressByteSize (ast_type.GetPointerByteSize()); 3360468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata else 3370468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata data.SetAddressByteSize(sizeof(void *)); 3380468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata data.SetData(m_vector.bytes, m_vector.length, m_vector.byte_order); 3390468bb2077ab25a289514dc474d6b5a7c537202fEnrico Granata break; 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeScalar: 342cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton data.SetByteOrder (lldb::endian::InlHostByteOrder()); 34352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast_type.IsValid()) 34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton data.SetAddressByteSize (ast_type.GetPointerByteSize()); 345b14b00c825d82286808a0e43f8fe9b7c37c7d3cfJim Ingham else 346b14b00c825d82286808a0e43f8fe9b7c37c7d3cfJim Ingham data.SetAddressByteSize(sizeof(void *)); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_value.GetData (data)) 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; // Success; 349a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton error.SetErrorStringWithFormat("extracting data from value failed"); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeLoadAddress: 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx == NULL) 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 355917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton error.SetErrorString ("can't read load address (no execution context)"); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 357801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 3607421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton if (process == NULL || !process->IsAlive()) 361801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 3627421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton Target *target = exe_ctx->GetTargetPtr(); 3637421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton if (target) 3647421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton { 3657421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton // Allow expressions to run and evaluate things when the target 3667421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton // has memory sections loaded. This allows you to use "target modules load" 3677421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton // to load your executable and any shared libraries, then execute 3687421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton // commands where you can look at types in data sections. 3697421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton const SectionLoadList &target_sections = target->GetSectionLoadList(); 3707421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton if (!target_sections.IsEmpty()) 3717421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton { 3727421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton address = m_value.ULongLong(LLDB_INVALID_ADDRESS); 3737421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton if (target_sections.ResolveLoadAddress(address, file_so_addr)) 3747421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton { 3757421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton address_type = eAddressTypeLoad; 3767421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton data.SetByteOrder(target->GetArchitecture().GetByteOrder()); 3777421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize()); 3787421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton } 3797421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton else 3807421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton address = LLDB_INVALID_ADDRESS; 3817421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton } 3827421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// else 3837421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// { 3847421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// ModuleSP exe_module_sp (target->GetExecutableModule()); 3857421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// if (exe_module_sp) 3867421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// { 3877421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// address = m_value.ULongLong(LLDB_INVALID_ADDRESS); 3887421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// if (address != LLDB_INVALID_ADDRESS) 3897421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// { 3907421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// if (exe_module_sp->ResolveFileAddress(address, file_so_addr)) 3917421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// { 3927421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// data.SetByteOrder(target->GetArchitecture().GetByteOrder()); 3937421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize()); 3947421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// address_type = eAddressTypeFile; 3957421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// } 3967421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// else 3977421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// { 3987421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// address = LLDB_INVALID_ADDRESS; 3997421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// } 4007421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// } 4017421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// } 4027421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton// } 4037421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton } 4047421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton else 4057421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton { 4067421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton error.SetErrorString ("can't read load address (invalid process)"); 4077421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton } 408801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 409801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 410801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 411801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address = m_value.ULongLong(LLDB_INVALID_ADDRESS); 412801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address_type = eAddressTypeLoad; 413801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton data.SetByteOrder(process->GetTarget().GetArchitecture().GetByteOrder()); 414801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton data.SetAddressByteSize(process->GetTarget().GetArchitecture().GetAddressByteSize()); 415801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeFileAddress: 420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (exe_ctx == NULL) 421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton error.SetErrorString ("can't read file address (no execution context)"); 423917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx->GetTargetPtr() == NULL) 425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 426917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton error.SetErrorString ("can't read file address (invalid target)"); 427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 428917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 430801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address = m_value.ULongLong(LLDB_INVALID_ADDRESS); 431801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (address == LLDB_INVALID_ADDRESS) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 433801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton error.SetErrorString ("invalid file address"); 434801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 435801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 436801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 437801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (module == NULL) 438801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 439801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // The only thing we can currently lock down to a module so that 440801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // we can resolve a file address, is a variable. 441801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Variable *variable = GetVariable(); 442801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (variable) 443801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 444801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton SymbolContext var_sc; 445801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton variable->CalculateSymbolContext(&var_sc); 446801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton module = var_sc.module_sp.get(); 447801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 448801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 449801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 450801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (module) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 452917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool resolved = false; 453801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton ObjectFile *objfile = module->GetObjectFile(); 454801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (objfile) 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 456801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Address so_addr(address, objfile->GetSectionList()); 457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton addr_t load_address = so_addr.GetLoadAddress (exe_ctx->GetTargetPtr()); 4583c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen bool process_launched_and_stopped = exe_ctx->GetProcessPtr() 4593c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen ? StateIsStoppedState(exe_ctx->GetProcessPtr()->GetState(), true /* must_exist */) 4603c49d4cd77b36b1c44e05144e23eebc11d67b7adJohnny Chen : false; 4616c49bf469d8b43eaab76a43f7a17ac6137a0380cJohnny Chen // Don't use the load address if the process has exited. 4626c49bf469d8b43eaab76a43f7a17ac6137a0380cJohnny Chen if (load_address != LLDB_INVALID_ADDRESS && process_launched_and_stopped) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 464801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton resolved = true; 465801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address = load_address; 466801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address_type = eAddressTypeLoad; 467567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton data.SetByteOrder(exe_ctx->GetTargetRef().GetArchitecture().GetByteOrder()); 468567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton data.SetAddressByteSize(exe_ctx->GetTargetRef().GetArchitecture().GetAddressByteSize()); 469801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 470801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 471801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 472801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (so_addr.IsSectionOffset()) 473fe9864c516cb8e5b63cf463aecf089b4f9b94ac8Greg Clayton { 474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton resolved = true; 475801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton file_so_addr = so_addr; 476801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton data.SetByteOrder(objfile->GetByteOrder()); 477801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton data.SetAddressByteSize(objfile->GetAddressByteSize()); 478fe9864c516cb8e5b63cf463aecf089b4f9b94ac8Greg Clayton } 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (!resolved) 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 483801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Variable *variable = GetVariable(); 484801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 485801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (module) 486801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 487801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (variable) 48897a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " for variable '%s' in %s", 489801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address, 490801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton variable->GetName().AsCString(""), 49197a19b21dacd9063bb5475812df7781777262198Greg Clayton module->GetFileSpec().GetPath().c_str()); 492801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 49397a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " in %s", 494801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address, 49597a19b21dacd9063bb5475812df7781777262198Greg Clayton module->GetFileSpec().GetPath().c_str()); 496801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 498801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 499801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (variable) 5005f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64 " for variable '%s'", 501801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton address, 502801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton variable->GetName().AsCString("")); 503801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 5045f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat ("unable to resolve the module for file address 0x%" PRIx64, address); 505801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 510801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // Can't convert a file address to anything valid without more 511801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // context (which Module it came from) 512801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton error.SetErrorString ("can't read memory from file address without more context"); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeHostAddress: 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address = m_value.ULongLong(LLDB_INVALID_ADDRESS); 5202d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata address_type = eAddressTypeHost; 5212d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata if (exe_ctx) 5222d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata { 5232d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata Target *target = exe_ctx->GetTargetPtr(); 5242d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata if (target) 5252d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata { 5262d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata data.SetByteOrder(target->GetArchitecture().GetByteOrder()); 5272d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize()); 5282d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata break; 5292d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata } 5302d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata } 5312d34a500cdf66468c12bc7f0cb3d7be77e99e805Enrico Granata // fallback to host settings 532cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton data.SetByteOrder(lldb::endian::InlHostByteOrder()); 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data.SetAddressByteSize(sizeof(void *)); 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Bail if we encountered any errors 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (address == LLDB_INVALID_ADDRESS) 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 543a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton error.SetErrorStringWithFormat ("invalid %s address", address_type == eAddressTypeHost ? "host" : "load"); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we got here, we need to read the value from memory 54852f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t byte_size = GetValueByteSize (&error); 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Bail if we encountered any errors getting the byte size 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have enough room within "data", and if we don't make 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // something large enough that does 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!data.ValidOffsetForDataOfSize (data_offset, byte_size)) 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP data_sp(new DataBufferHeap (data_offset + byte_size, '\0')); 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data.SetData(data_sp); 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t* dst = const_cast<uint8_t*>(data.PeekData (data_offset, byte_size)); 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst != NULL) 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (address_type == eAddressTypeHost) 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The address is an address in this process, so just copy it 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner memcpy (dst, (uint8_t*)NULL + address, byte_size); 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 570917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else if ((address_type == eAddressTypeLoad) || (address_type == eAddressTypeFile)) 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 572917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (file_so_addr.IsValid()) 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 574917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We have a file address that we were able to translate into a 575917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // section offset address so we might be able to read this from 576917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // the object files if we don't have a live process. Lets always 577917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // try and read from the process if we have one though since we 578917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // want to read the actual value by setting "prefer_file_cache" 579917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // to false. 580917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const bool prefer_file_cache = false; 581567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx->GetTargetRef().ReadMemory(file_so_addr, prefer_file_cache, dst, byte_size, error) != byte_size) 582917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 5835f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", (uint64_t)address); 584917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 585917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 586917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 587917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 588801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // The execution context might have a NULL process, but it 589801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // might have a valid process in the exe_ctx->target, so use 590801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // the ExecutionContext::GetProcess accessor to ensure we 591801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton // get the process if there is one. 592567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 593801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton 594801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (process) 595917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 596801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton const size_t bytes_read = process->ReadMemory(address, dst, byte_size, error); 597801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton if (bytes_read != byte_size) 5985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed (%u of %u bytes read)", 599801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton (uint64_t)address, 600801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton (uint32_t)bytes_read, 601801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton (uint32_t)byte_size); 602801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton } 603801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton else 604801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton { 6055f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed (invalid process)", (uint64_t)address); 606917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 611b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton error.SetErrorStringWithFormat ("unsupported AddressType value (%i)", address_type); 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 616a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton error.SetErrorStringWithFormat ("out of memory"); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScalar & 62352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::ResolveValue(ExecutionContext *exe_ctx) 62452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 62552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &clang_type = GetClangType(); 62652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsValid()) 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_value_type) 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeScalar: // raw scalar value 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeFileAddress: 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeLoadAddress: // load address value 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeHostAddress: // host address value (for memory in the process that is using liblldb) 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataExtractor data; 6397421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS); 64052f792329be5db8e38961350589e97e8f2823acdGreg Clayton Error error (GetValueAsData (exe_ctx, data, 0, NULL)); 6417421da6745cb56b37f2fa6e7aa57210a263bc0c0Greg Clayton if (error.Success()) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 643801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton Scalar scalar; 64452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.GetValueAsScalar (data, 0, data.GetByteSize(), scalar)) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value = scalar; 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_type = eValueTypeScalar; 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes()) 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.Clear(); 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_type = eValueTypeScalar; 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes()) 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value.Clear(); 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_value_type = eValueTypeScalar; 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_value; 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVariable * 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetVariable() 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (m_context_type == eContextTypeVariable) 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<Variable *> (m_context); 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68152f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid 68252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonValue::Clear() 68352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 68452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value.Clear(); 68552f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_vector.Clear(); 68652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_clang_type.Clear(); 68752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_value_type = eValueTypeScalar; 68852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_context = NULL; 68952f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_context_type = eContextTypeInvalid; 69052f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_data_buffer.Clear(); 69152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 69252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 69352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetValueTypeAsCString (ValueType value_type) 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (value_type) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeScalar: return "scalar"; 700f0fab4fcabd0aa5a60425b430206d1b5b2bef96fGreg Clayton case eValueTypeVector: return "vector"; 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeFileAddress: return "file address"; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeLoadAddress: return "load address"; 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eValueTypeHostAddress: return "host address"; 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "???"; 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue::GetContextTypeAsCString (ContextType context_type) 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (context_type) 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 713801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeInvalid: return "invalid"; 714801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeRegisterInfo: return "RegisterInfo *"; 715801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeLLDBType: return "Type *"; 716801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton case eContextTypeVariable: return "Variable *"; 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "???"; 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::ValueList (const ValueList &rhs) 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_values = rhs.m_values; 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ValueList & 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::operator= (const ValueList &rhs) 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_values = rhs.m_values; 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::PushValue (const Value &value) 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_values.push_back (value); 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::GetSize() 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_values.size(); 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue * 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::GetValueAtIndex (size_t idx) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < GetSize()) 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &(m_values[idx]); 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueList::Clear () 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_values.clear(); 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 762