forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			296 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- ValueObjectConstResult.cpp ------------------------------*- C++ -*-===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "lldb/Core/ValueObjectConstResult.h"
 | 
						|
 | 
						|
#include "lldb/Core/Scalar.h" // for Scalar
 | 
						|
#include "lldb/Core/ValueObjectDynamicValue.h"
 | 
						|
#include "lldb/Symbol/CompilerType.h"
 | 
						|
#include "lldb/Target/ExecutionContext.h"
 | 
						|
#include "lldb/Target/ExecutionContextScope.h" // for ExecutionContextScope
 | 
						|
#include "lldb/Target/Process.h"
 | 
						|
#include "lldb/Utility/DataBuffer.h"     // for DataBuffer
 | 
						|
#include "lldb/Utility/DataBufferHeap.h" // for DataBufferHeap
 | 
						|
#include "lldb/Utility/DataExtractor.h"
 | 
						|
 | 
						|
namespace lldb_private {
 | 
						|
class Module;
 | 
						|
}
 | 
						|
 | 
						|
using namespace lldb;
 | 
						|
using namespace lldb_private;
 | 
						|
 | 
						|
ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
 | 
						|
                                             ByteOrder byte_order,
 | 
						|
                                             uint32_t addr_byte_size,
 | 
						|
                                             lldb::addr_t address) {
 | 
						|
  return (new ValueObjectConstResult(exe_scope, byte_order, addr_byte_size,
 | 
						|
                                     address))
 | 
						|
      ->GetSP();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
 | 
						|
                                               ByteOrder byte_order,
 | 
						|
                                               uint32_t addr_byte_size,
 | 
						|
                                               lldb::addr_t address)
 | 
						|
    : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
 | 
						|
      m_impl(this, address) {
 | 
						|
  SetIsConstant();
 | 
						|
  SetValueIsValid(true);
 | 
						|
  m_data.SetByteOrder(byte_order);
 | 
						|
  m_data.SetAddressByteSize(addr_byte_size);
 | 
						|
  SetAddressTypeOfChildren(eAddressTypeLoad);
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
 | 
						|
                                             const CompilerType &compiler_type,
 | 
						|
                                             const ConstString &name,
 | 
						|
                                             const DataExtractor &data,
 | 
						|
                                             lldb::addr_t address) {
 | 
						|
  return (new ValueObjectConstResult(exe_scope, compiler_type, name, data,
 | 
						|
                                     address))
 | 
						|
      ->GetSP();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::ValueObjectConstResult(
 | 
						|
    ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
 | 
						|
    const ConstString &name, const DataExtractor &data, lldb::addr_t address)
 | 
						|
    : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
 | 
						|
      m_impl(this, address) {
 | 
						|
  m_data = data;
 | 
						|
 | 
						|
  if (!m_data.GetSharedDataBuffer()) {
 | 
						|
    DataBufferSP shared_data_buffer(
 | 
						|
        new DataBufferHeap(data.GetDataStart(), data.GetByteSize()));
 | 
						|
    m_data.SetData(shared_data_buffer);
 | 
						|
  }
 | 
						|
 | 
						|
  m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
 | 
						|
  m_value.SetValueType(Value::eValueTypeHostAddress);
 | 
						|
  m_value.SetCompilerType(compiler_type);
 | 
						|
  m_name = name;
 | 
						|
  SetIsConstant();
 | 
						|
  SetValueIsValid(true);
 | 
						|
  SetAddressTypeOfChildren(eAddressTypeLoad);
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
 | 
						|
                                             const CompilerType &compiler_type,
 | 
						|
                                             const ConstString &name,
 | 
						|
                                             const lldb::DataBufferSP &data_sp,
 | 
						|
                                             lldb::ByteOrder data_byte_order,
 | 
						|
                                             uint32_t data_addr_size,
 | 
						|
                                             lldb::addr_t address) {
 | 
						|
  return (new ValueObjectConstResult(exe_scope, compiler_type, name, data_sp,
 | 
						|
                                     data_byte_order, data_addr_size, address))
 | 
						|
      ->GetSP();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
 | 
						|
                                             Value &value,
 | 
						|
                                             const ConstString &name,
 | 
						|
                                             Module *module) {
 | 
						|
  return (new ValueObjectConstResult(exe_scope, value, name, module))->GetSP();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::ValueObjectConstResult(
 | 
						|
    ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
 | 
						|
    const ConstString &name, const lldb::DataBufferSP &data_sp,
 | 
						|
    lldb::ByteOrder data_byte_order, uint32_t data_addr_size,
 | 
						|
    lldb::addr_t address)
 | 
						|
    : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
 | 
						|
      m_impl(this, address) {
 | 
						|
  m_data.SetByteOrder(data_byte_order);
 | 
						|
  m_data.SetAddressByteSize(data_addr_size);
 | 
						|
  m_data.SetData(data_sp);
 | 
						|
  m_value.GetScalar() = (uintptr_t)data_sp->GetBytes();
 | 
						|
  m_value.SetValueType(Value::eValueTypeHostAddress);
 | 
						|
  // m_value.SetContext(Value::eContextTypeClangType, compiler_type);
 | 
						|
  m_value.SetCompilerType(compiler_type);
 | 
						|
  m_name = name;
 | 
						|
  SetIsConstant();
 | 
						|
  SetValueIsValid(true);
 | 
						|
  SetAddressTypeOfChildren(eAddressTypeLoad);
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
 | 
						|
                                             const CompilerType &compiler_type,
 | 
						|
                                             const ConstString &name,
 | 
						|
                                             lldb::addr_t address,
 | 
						|
                                             AddressType address_type,
 | 
						|
                                             uint32_t addr_byte_size) {
 | 
						|
  return (new ValueObjectConstResult(exe_scope, compiler_type, name, address,
 | 
						|
                                     address_type, addr_byte_size))
 | 
						|
      ->GetSP();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::ValueObjectConstResult(
 | 
						|
    ExecutionContextScope *exe_scope, const CompilerType &compiler_type,
 | 
						|
    const ConstString &name, lldb::addr_t address, AddressType address_type,
 | 
						|
    uint32_t addr_byte_size)
 | 
						|
    : ValueObject(exe_scope), m_type_name(), m_byte_size(0),
 | 
						|
      m_impl(this, address) {
 | 
						|
  m_value.GetScalar() = address;
 | 
						|
  m_data.SetAddressByteSize(addr_byte_size);
 | 
						|
  m_value.GetScalar().GetData(m_data, addr_byte_size);
 | 
						|
  // m_value.SetValueType(Value::eValueTypeHostAddress);
 | 
						|
  switch (address_type) {
 | 
						|
  case eAddressTypeInvalid:
 | 
						|
    m_value.SetValueType(Value::eValueTypeScalar);
 | 
						|
    break;
 | 
						|
  case eAddressTypeFile:
 | 
						|
    m_value.SetValueType(Value::eValueTypeFileAddress);
 | 
						|
    break;
 | 
						|
  case eAddressTypeLoad:
 | 
						|
    m_value.SetValueType(Value::eValueTypeLoadAddress);
 | 
						|
    break;
 | 
						|
  case eAddressTypeHost:
 | 
						|
    m_value.SetValueType(Value::eValueTypeHostAddress);
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  //    m_value.SetContext(Value::eContextTypeClangType, compiler_type);
 | 
						|
  m_value.SetCompilerType(compiler_type);
 | 
						|
  m_name = name;
 | 
						|
  SetIsConstant();
 | 
						|
  SetValueIsValid(true);
 | 
						|
  SetAddressTypeOfChildren(eAddressTypeLoad);
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectSP ValueObjectConstResult::Create(ExecutionContextScope *exe_scope,
 | 
						|
                                             const Status &error) {
 | 
						|
  return (new ValueObjectConstResult(exe_scope, error))->GetSP();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
 | 
						|
                                               const Status &error)
 | 
						|
    : ValueObject(exe_scope), m_type_name(), m_byte_size(0), m_impl(this) {
 | 
						|
  m_error = error;
 | 
						|
  SetIsConstant();
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::ValueObjectConstResult(ExecutionContextScope *exe_scope,
 | 
						|
                                               const Value &value,
 | 
						|
                                               const ConstString &name,
 | 
						|
                                               Module *module)
 | 
						|
    : ValueObject(exe_scope), m_type_name(), m_byte_size(0), m_impl(this) {
 | 
						|
  m_value = value;
 | 
						|
  m_name = name;
 | 
						|
  ExecutionContext exe_ctx;
 | 
						|
  exe_scope->CalculateExecutionContext(exe_ctx);
 | 
						|
  m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, module);
 | 
						|
}
 | 
						|
 | 
						|
ValueObjectConstResult::~ValueObjectConstResult() {}
 | 
						|
 | 
						|
CompilerType ValueObjectConstResult::GetCompilerTypeImpl() {
 | 
						|
  return m_value.GetCompilerType();
 | 
						|
}
 | 
						|
 | 
						|
lldb::ValueType ValueObjectConstResult::GetValueType() const {
 | 
						|
  return eValueTypeConstResult;
 | 
						|
}
 | 
						|
 | 
						|
uint64_t ValueObjectConstResult::GetByteSize() {
 | 
						|
  ExecutionContext exe_ctx(GetExecutionContextRef());
 | 
						|
 | 
						|
  if (m_byte_size == 0)
 | 
						|
    SetByteSize(
 | 
						|
        GetCompilerType().GetByteSize(exe_ctx.GetBestExecutionContextScope()));
 | 
						|
  return m_byte_size;
 | 
						|
}
 | 
						|
 | 
						|
void ValueObjectConstResult::SetByteSize(size_t size) { m_byte_size = size; }
 | 
						|
 | 
						|
size_t ValueObjectConstResult::CalculateNumChildren(uint32_t max) {
 | 
						|
  auto children_count = GetCompilerType().GetNumChildren(true);
 | 
						|
  return children_count <= max ? children_count : max;
 | 
						|
}
 | 
						|
 | 
						|
ConstString ValueObjectConstResult::GetTypeName() {
 | 
						|
  if (m_type_name.IsEmpty())
 | 
						|
    m_type_name = GetCompilerType().GetConstTypeName();
 | 
						|
  return m_type_name;
 | 
						|
}
 | 
						|
 | 
						|
ConstString ValueObjectConstResult::GetDisplayTypeName() {
 | 
						|
  return GetCompilerType().GetDisplayTypeName();
 | 
						|
}
 | 
						|
 | 
						|
bool ValueObjectConstResult::UpdateValue() {
 | 
						|
  // Const value is always valid
 | 
						|
  SetValueIsValid(true);
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
bool ValueObjectConstResult::IsInScope() {
 | 
						|
  // A const result value is always in scope since it serializes all
 | 
						|
  // information needed to contain the constant value.
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
lldb::ValueObjectSP ValueObjectConstResult::Dereference(Status &error) {
 | 
						|
  return m_impl.Dereference(error);
 | 
						|
}
 | 
						|
 | 
						|
lldb::ValueObjectSP ValueObjectConstResult::GetSyntheticChildAtOffset(
 | 
						|
    uint32_t offset, const CompilerType &type, bool can_create,
 | 
						|
    ConstString name_const_str) {
 | 
						|
  return m_impl.GetSyntheticChildAtOffset(offset, type, can_create,
 | 
						|
                                          name_const_str);
 | 
						|
}
 | 
						|
 | 
						|
lldb::ValueObjectSP ValueObjectConstResult::AddressOf(Status &error) {
 | 
						|
  return m_impl.AddressOf(error);
 | 
						|
}
 | 
						|
 | 
						|
lldb::addr_t ValueObjectConstResult::GetAddressOf(bool scalar_is_load_address,
 | 
						|
                                                  AddressType *address_type) {
 | 
						|
  return m_impl.GetAddressOf(scalar_is_load_address, address_type);
 | 
						|
}
 | 
						|
 | 
						|
ValueObject *ValueObjectConstResult::CreateChildAtIndex(
 | 
						|
    size_t idx, bool synthetic_array_member, int32_t synthetic_index) {
 | 
						|
  return m_impl.CreateChildAtIndex(idx, synthetic_array_member,
 | 
						|
                                   synthetic_index);
 | 
						|
}
 | 
						|
 | 
						|
size_t ValueObjectConstResult::GetPointeeData(DataExtractor &data,
 | 
						|
                                              uint32_t item_idx,
 | 
						|
                                              uint32_t item_count) {
 | 
						|
  return m_impl.GetPointeeData(data, item_idx, item_count);
 | 
						|
}
 | 
						|
 | 
						|
lldb::ValueObjectSP
 | 
						|
ValueObjectConstResult::GetDynamicValue(lldb::DynamicValueType use_dynamic) {
 | 
						|
  // Always recalculate dynamic values for const results as the memory that
 | 
						|
  // they might point to might have changed at any time.
 | 
						|
  if (use_dynamic != eNoDynamicValues) {
 | 
						|
    if (!IsDynamic()) {
 | 
						|
      ExecutionContext exe_ctx(GetExecutionContextRef());
 | 
						|
      Process *process = exe_ctx.GetProcessPtr();
 | 
						|
      if (process && process->IsPossibleDynamicValue(*this))
 | 
						|
        m_dynamic_value = new ValueObjectDynamicValue(*this, use_dynamic);
 | 
						|
    }
 | 
						|
    if (m_dynamic_value)
 | 
						|
      return m_dynamic_value->GetSP();
 | 
						|
  }
 | 
						|
  return ValueObjectSP();
 | 
						|
}
 | 
						|
 | 
						|
lldb::ValueObjectSP
 | 
						|
ValueObjectConstResult::Cast(const CompilerType &compiler_type) {
 | 
						|
  return m_impl.Cast(compiler_type);
 | 
						|
}
 | 
						|
 | 
						|
lldb::LanguageType ValueObjectConstResult::GetPreferredDisplayLanguage() {
 | 
						|
  if (m_preferred_display_language != lldb::eLanguageTypeUnknown)
 | 
						|
    return m_preferred_display_language;
 | 
						|
  return GetCompilerTypeImpl().GetMinimumLanguage();
 | 
						|
}
 |