Path: blob/main/contrib/llvm-project/lldb/source/API/SBMemoryRegionInfo.cpp
39587 views
//===-- SBMemoryRegionInfo.cpp --------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/API/SBMemoryRegionInfo.h"9#include "Utils.h"10#include "lldb/API/SBDefines.h"11#include "lldb/API/SBError.h"12#include "lldb/API/SBStream.h"13#include "lldb/Target/MemoryRegionInfo.h"14#include "lldb/Utility/Instrumentation.h"15#include "lldb/Utility/StreamString.h"16#include <optional>1718using namespace lldb;19using namespace lldb_private;2021SBMemoryRegionInfo::SBMemoryRegionInfo() : m_opaque_up(new MemoryRegionInfo()) {22LLDB_INSTRUMENT_VA(this);23}2425SBMemoryRegionInfo::SBMemoryRegionInfo(const char *name, lldb::addr_t begin,26lldb::addr_t end, uint32_t permissions,27bool mapped, bool stack_memory)28: SBMemoryRegionInfo() {29LLDB_INSTRUMENT_VA(this, name, begin, end, permissions, mapped, stack_memory);30m_opaque_up->SetName(name);31m_opaque_up->GetRange().SetRangeBase(begin);32m_opaque_up->GetRange().SetRangeEnd(end);33m_opaque_up->SetLLDBPermissions(permissions);34m_opaque_up->SetMapped(mapped ? MemoryRegionInfo::eYes35: MemoryRegionInfo::eNo);36m_opaque_up->SetIsStackMemory(stack_memory ? MemoryRegionInfo::eYes37: MemoryRegionInfo::eNo);38}3940SBMemoryRegionInfo::SBMemoryRegionInfo(const MemoryRegionInfo *lldb_object_ptr)41: m_opaque_up(new MemoryRegionInfo()) {42if (lldb_object_ptr)43ref() = *lldb_object_ptr;44}4546SBMemoryRegionInfo::SBMemoryRegionInfo(const SBMemoryRegionInfo &rhs) {47LLDB_INSTRUMENT_VA(this, rhs);48m_opaque_up = clone(rhs.m_opaque_up);49}5051const SBMemoryRegionInfo &SBMemoryRegionInfo::52operator=(const SBMemoryRegionInfo &rhs) {53LLDB_INSTRUMENT_VA(this, rhs);5455if (this != &rhs)56m_opaque_up = clone(rhs.m_opaque_up);57return *this;58}5960SBMemoryRegionInfo::~SBMemoryRegionInfo() = default;6162void SBMemoryRegionInfo::Clear() {63LLDB_INSTRUMENT_VA(this);6465m_opaque_up->Clear();66}6768bool SBMemoryRegionInfo::operator==(const SBMemoryRegionInfo &rhs) const {69LLDB_INSTRUMENT_VA(this, rhs);7071return ref() == rhs.ref();72}7374bool SBMemoryRegionInfo::operator!=(const SBMemoryRegionInfo &rhs) const {75LLDB_INSTRUMENT_VA(this, rhs);7677return ref() != rhs.ref();78}7980MemoryRegionInfo &SBMemoryRegionInfo::ref() { return *m_opaque_up; }8182const MemoryRegionInfo &SBMemoryRegionInfo::ref() const { return *m_opaque_up; }8384lldb::addr_t SBMemoryRegionInfo::GetRegionBase() {85LLDB_INSTRUMENT_VA(this);8687return m_opaque_up->GetRange().GetRangeBase();88}8990lldb::addr_t SBMemoryRegionInfo::GetRegionEnd() {91LLDB_INSTRUMENT_VA(this);9293return m_opaque_up->GetRange().GetRangeEnd();94}9596bool SBMemoryRegionInfo::IsReadable() {97LLDB_INSTRUMENT_VA(this);9899return m_opaque_up->GetReadable() == MemoryRegionInfo::eYes;100}101102bool SBMemoryRegionInfo::IsWritable() {103LLDB_INSTRUMENT_VA(this);104105return m_opaque_up->GetWritable() == MemoryRegionInfo::eYes;106}107108bool SBMemoryRegionInfo::IsExecutable() {109LLDB_INSTRUMENT_VA(this);110111return m_opaque_up->GetExecutable() == MemoryRegionInfo::eYes;112}113114bool SBMemoryRegionInfo::IsMapped() {115LLDB_INSTRUMENT_VA(this);116117return m_opaque_up->GetMapped() == MemoryRegionInfo::eYes;118}119120const char *SBMemoryRegionInfo::GetName() {121LLDB_INSTRUMENT_VA(this);122123return m_opaque_up->GetName().AsCString();124}125126bool SBMemoryRegionInfo::HasDirtyMemoryPageList() {127LLDB_INSTRUMENT_VA(this);128129return m_opaque_up->GetDirtyPageList().has_value();130}131132uint32_t SBMemoryRegionInfo::GetNumDirtyPages() {133LLDB_INSTRUMENT_VA(this);134135uint32_t num_dirty_pages = 0;136const std::optional<std::vector<addr_t>> &dirty_page_list =137m_opaque_up->GetDirtyPageList();138if (dirty_page_list)139num_dirty_pages = dirty_page_list->size();140141return num_dirty_pages;142}143144addr_t SBMemoryRegionInfo::GetDirtyPageAddressAtIndex(uint32_t idx) {145LLDB_INSTRUMENT_VA(this, idx);146147addr_t dirty_page_addr = LLDB_INVALID_ADDRESS;148const std::optional<std::vector<addr_t>> &dirty_page_list =149m_opaque_up->GetDirtyPageList();150if (dirty_page_list && idx < dirty_page_list->size())151dirty_page_addr = (*dirty_page_list)[idx];152153return dirty_page_addr;154}155156int SBMemoryRegionInfo::GetPageSize() {157LLDB_INSTRUMENT_VA(this);158159return m_opaque_up->GetPageSize();160}161162bool SBMemoryRegionInfo::GetDescription(SBStream &description) {163LLDB_INSTRUMENT_VA(this, description);164165Stream &strm = description.ref();166const addr_t load_addr = m_opaque_up->GetRange().base;167168strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 " ", load_addr,169load_addr + m_opaque_up->GetRange().size);170strm.Printf(m_opaque_up->GetReadable() ? "R" : "-");171strm.Printf(m_opaque_up->GetWritable() ? "W" : "-");172strm.Printf(m_opaque_up->GetExecutable() ? "X" : "-");173strm.Printf("]");174175return true;176}177178179