forked from OSchip/llvm-project
Reland "[lldb] Remove non address bits when looking up memory regions"
This reverts commit 5fbcf67734
.
ProcessDebugger is used in ProcessWindows and NativeProcessWindows.
I thought I was simplifying things by renaming to DoGetMemoryRegionInfo
in ProcessDebugger but the Native process side expects "GetMemoryRegionInfo".
Follow the pattern that WriteMemory uses. So:
* ProcessWindows::DoGetMemoryRegioninfo calls ProcessDebugger::GetMemoryRegionInfo
* NativeProcessWindows::GetMemoryRegionInfo does the same
This commit is contained in:
parent
7a34145f40
commit
fac3f20de5
|
@ -1792,7 +1792,7 @@ public:
|
|||
///
|
||||
/// If load_addr is within the address space the process has mapped
|
||||
/// range_info will be filled in with the start and end of that range as
|
||||
/// well as the permissions for that range and range_info.GetMapped will
|
||||
/// well as the permissions for that range and range_info. GetMapped will
|
||||
/// return true.
|
||||
///
|
||||
/// If load_addr is outside any mapped region then range_info will have its
|
||||
|
@ -1801,23 +1801,21 @@ public:
|
|||
/// there are no valid mapped ranges between load_addr and the end of the
|
||||
/// process address space.
|
||||
///
|
||||
/// GetMemoryRegionInfo will only return an error if it is unimplemented for
|
||||
/// the current process.
|
||||
/// GetMemoryRegionInfo calls DoGetMemoryRegionInfo. Override that function in
|
||||
/// process subclasses.
|
||||
///
|
||||
/// \param[in] load_addr
|
||||
/// The load address to query the range_info for.
|
||||
/// The load address to query the range_info for. May include non
|
||||
/// address bits, these will be removed by the the ABI plugin if there is
|
||||
/// one.
|
||||
///
|
||||
/// \param[out] range_info
|
||||
/// An range_info value containing the details of the range.
|
||||
///
|
||||
/// \return
|
||||
/// An error value.
|
||||
virtual Status GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) {
|
||||
Status error;
|
||||
error.SetErrorString("Process::GetMemoryRegionInfo() not supported");
|
||||
return error;
|
||||
}
|
||||
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info);
|
||||
|
||||
/// Obtain all the mapped memory regions within this process.
|
||||
///
|
||||
|
@ -2637,6 +2635,26 @@ protected:
|
|||
virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
|
||||
Status &error) = 0;
|
||||
|
||||
/// DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has
|
||||
/// removed non address bits from load_addr. Override this method in
|
||||
/// subclasses of Process.
|
||||
///
|
||||
/// See GetMemoryRegionInfo for details of the logic.
|
||||
///
|
||||
/// \param[in] load_addr
|
||||
/// The load address to query the range_info for. (non address bits
|
||||
/// removed)
|
||||
///
|
||||
/// \param[out] range_info
|
||||
/// An range_info value containing the details of the range.
|
||||
///
|
||||
/// \return
|
||||
/// An error value.
|
||||
virtual Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) {
|
||||
return Status("Process::DoGetMemoryRegionInfo() not supported");
|
||||
}
|
||||
|
||||
lldb::StateType GetPrivateState();
|
||||
|
||||
/// The "private" side of resuming a process. This doesn't alter the state
|
||||
|
|
|
@ -601,8 +601,8 @@ Status ProcessWindows::DoDeallocateMemory(lldb::addr_t ptr) {
|
|||
return ProcessDebugger::DeallocateMemory(ptr);
|
||||
}
|
||||
|
||||
Status ProcessWindows::GetMemoryRegionInfo(lldb::addr_t vm_addr,
|
||||
MemoryRegionInfo &info) {
|
||||
Status ProcessWindows::DoGetMemoryRegionInfo(lldb::addr_t vm_addr,
|
||||
MemoryRegionInfo &info) {
|
||||
return ProcessDebugger::GetMemoryRegionInfo(vm_addr, info);
|
||||
}
|
||||
|
||||
|
|
|
@ -78,8 +78,6 @@ public:
|
|||
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
|
||||
Status &error) override;
|
||||
Status DoDeallocateMemory(lldb::addr_t ptr) override;
|
||||
Status GetMemoryRegionInfo(lldb::addr_t vm_addr,
|
||||
MemoryRegionInfo &info) override;
|
||||
|
||||
lldb::addr_t GetImageInfoAddress() override;
|
||||
|
||||
|
@ -103,6 +101,10 @@ public:
|
|||
Status EnableWatchpoint(Watchpoint *wp, bool notify = true) override;
|
||||
Status DisableWatchpoint(Watchpoint *wp, bool notify = true) override;
|
||||
|
||||
protected:
|
||||
Status DoGetMemoryRegionInfo(lldb::addr_t vm_addr,
|
||||
MemoryRegionInfo &info) override;
|
||||
|
||||
private:
|
||||
struct WatchpointInfo {
|
||||
uint32_t slot_id;
|
||||
|
|
|
@ -281,8 +281,8 @@ size_t ProcessElfCore::ReadMemory(lldb::addr_t addr, void *buf, size_t size,
|
|||
return DoReadMemory(addr, buf, size, error);
|
||||
}
|
||||
|
||||
Status ProcessElfCore::GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) {
|
||||
Status ProcessElfCore::DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) {
|
||||
region_info.Clear();
|
||||
const VMRangeToPermissions::Entry *permission_entry =
|
||||
m_core_range_infos.FindEntryThatContainsOrFollows(load_addr);
|
||||
|
|
|
@ -86,10 +86,6 @@ public:
|
|||
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
|
||||
lldb_private::Status &error) override;
|
||||
|
||||
lldb_private::Status
|
||||
GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
lldb_private::MemoryRegionInfo ®ion_info) override;
|
||||
|
||||
lldb::addr_t GetImageInfoAddress() override;
|
||||
|
||||
lldb_private::ArchSpec GetArchitecture();
|
||||
|
@ -105,6 +101,10 @@ protected:
|
|||
bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list,
|
||||
lldb_private::ThreadList &new_thread_list) override;
|
||||
|
||||
lldb_private::Status
|
||||
DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
lldb_private::MemoryRegionInfo ®ion_info) override;
|
||||
|
||||
private:
|
||||
struct NT_FILE_Entry {
|
||||
lldb::addr_t start;
|
||||
|
|
|
@ -2903,8 +2903,8 @@ lldb::addr_t ProcessGDBRemote::DoAllocateMemory(size_t size,
|
|||
return allocated_addr;
|
||||
}
|
||||
|
||||
Status ProcessGDBRemote::GetMemoryRegionInfo(addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) {
|
||||
Status ProcessGDBRemote::DoGetMemoryRegionInfo(addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) {
|
||||
|
||||
Status error(m_gdb_comm.GetMemoryRegionInfo(load_addr, region_info));
|
||||
return error;
|
||||
|
|
|
@ -144,9 +144,6 @@ public:
|
|||
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
|
||||
Status &error) override;
|
||||
|
||||
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) override;
|
||||
|
||||
Status DoDeallocateMemory(lldb::addr_t ptr) override;
|
||||
|
||||
// Process STDIO
|
||||
|
@ -424,6 +421,9 @@ protected:
|
|||
Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type,
|
||||
const std::vector<uint8_t> &tags) override;
|
||||
|
||||
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) override;
|
||||
|
||||
private:
|
||||
// For ProcessGDBRemote only
|
||||
std::string m_partial_profile_data;
|
||||
|
|
|
@ -633,8 +633,8 @@ size_t ProcessMachCore::DoReadMemory(addr_t addr, void *buf, size_t size,
|
|||
return bytes_read;
|
||||
}
|
||||
|
||||
Status ProcessMachCore::GetMemoryRegionInfo(addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) {
|
||||
Status ProcessMachCore::DoGetMemoryRegionInfo(addr_t load_addr,
|
||||
MemoryRegionInfo ®ion_info) {
|
||||
region_info.Clear();
|
||||
const VMRangeToPermissions::Entry *permission_entry =
|
||||
m_core_range_infos.FindEntryThatContainsOrFollows(load_addr);
|
||||
|
|
|
@ -68,10 +68,6 @@ public:
|
|||
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
|
||||
lldb_private::Status &error) override;
|
||||
|
||||
lldb_private::Status
|
||||
GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
lldb_private::MemoryRegionInfo ®ion_info) override;
|
||||
|
||||
lldb::addr_t GetImageInfoAddress() override;
|
||||
|
||||
protected:
|
||||
|
@ -84,6 +80,10 @@ protected:
|
|||
|
||||
lldb_private::ObjectFile *GetCoreObjectFile();
|
||||
|
||||
lldb_private::Status
|
||||
DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
lldb_private::MemoryRegionInfo ®ion_info) override;
|
||||
|
||||
private:
|
||||
bool GetDynamicLoaderAddress(lldb::addr_t addr);
|
||||
|
||||
|
|
|
@ -439,8 +439,8 @@ void ProcessMinidump::BuildMemoryRegions() {
|
|||
llvm::sort(*m_memory_regions);
|
||||
}
|
||||
|
||||
Status ProcessMinidump::GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion) {
|
||||
Status ProcessMinidump::DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion) {
|
||||
BuildMemoryRegions();
|
||||
region = MinidumpParser::GetMemoryRegionInfo(*m_memory_regions, load_addr);
|
||||
return Status();
|
||||
|
|
|
@ -75,9 +75,6 @@ public:
|
|||
|
||||
ArchSpec GetArchitecture();
|
||||
|
||||
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) override;
|
||||
|
||||
Status GetMemoryRegions(
|
||||
lldb_private::MemoryRegionInfos ®ion_list) override;
|
||||
|
||||
|
@ -98,6 +95,9 @@ protected:
|
|||
bool DoUpdateThreadList(ThreadList &old_thread_list,
|
||||
ThreadList &new_thread_list) override;
|
||||
|
||||
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) override;
|
||||
|
||||
void ReadModuleList();
|
||||
|
||||
lldb::ModuleSP GetOrCreateModule(lldb_private::UUID minidump_uuid,
|
||||
|
|
|
@ -249,8 +249,8 @@ ArchSpec ScriptedProcess::GetArchitecture() {
|
|||
return GetTarget().GetArchitecture();
|
||||
}
|
||||
|
||||
Status ScriptedProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion) {
|
||||
Status ScriptedProcess::DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo ®ion) {
|
||||
CheckInterpreterAndScriptObject();
|
||||
|
||||
Status error;
|
||||
|
|
|
@ -86,9 +86,6 @@ public:
|
|||
|
||||
ArchSpec GetArchitecture();
|
||||
|
||||
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) override;
|
||||
|
||||
Status
|
||||
GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) override;
|
||||
|
||||
|
@ -102,6 +99,9 @@ protected:
|
|||
bool DoUpdateThreadList(ThreadList &old_thread_list,
|
||||
ThreadList &new_thread_list) override;
|
||||
|
||||
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) override;
|
||||
|
||||
private:
|
||||
friend class ScriptedThread;
|
||||
|
||||
|
|
|
@ -5896,6 +5896,13 @@ Process::AdvanceAddressToNextBranchInstruction(Address default_stop_addr,
|
|||
return retval;
|
||||
}
|
||||
|
||||
Status Process::GetMemoryRegionInfo(lldb::addr_t load_addr,
|
||||
MemoryRegionInfo &range_info) {
|
||||
if (auto abi = GetABI())
|
||||
load_addr = abi->FixDataAddress(load_addr);
|
||||
return DoGetMemoryRegionInfo(load_addr, range_info);
|
||||
}
|
||||
|
||||
Status
|
||||
Process::GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) {
|
||||
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
C_SOURCES := main.c
|
||||
|
||||
include Makefile.rules
|
|
@ -0,0 +1,42 @@
|
|||
"""
|
||||
Test that "memory region" lookup uses the ABI plugin to remove
|
||||
non address bits from addresses before lookup.
|
||||
"""
|
||||
|
||||
|
||||
|
||||
import lldb
|
||||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
|
||||
class AArch64LinuxTaggedMemoryRegionTestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
NO_DEBUG_INFO_TESTCASE = True
|
||||
|
||||
# AArch64 Linux always enables the top byte ignore feature
|
||||
@skipUnlessArch("aarch64")
|
||||
@skipUnlessPlatform(["linux"])
|
||||
def test_mte_regions(self):
|
||||
self.build()
|
||||
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
|
||||
|
||||
lldbutil.run_break_set_by_file_and_line(self, "main.c",
|
||||
line_number('main.c', '// Set break point at this line.'),
|
||||
num_expected_locations=1)
|
||||
|
||||
self.runCmd("run", RUN_SUCCEEDED)
|
||||
|
||||
if self.process().GetState() == lldb.eStateExited:
|
||||
self.fail("Test program failed to run.")
|
||||
|
||||
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
|
||||
substrs=['stopped',
|
||||
'stop reason = breakpoint'])
|
||||
|
||||
# Despite the non address bits we should find a region
|
||||
self.expect("memory region the_page", patterns=[
|
||||
"\[0x[0-9A-Fa-f]+-0x[0-9A-Fa-f]+\) r-x"])
|
|
@ -0,0 +1,17 @@
|
|||
#include <asm/hwcap.h>
|
||||
#include <sys/auxv.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(int argc, char const *argv[]) {
|
||||
void *the_page = mmap(0, sysconf(_SC_PAGESIZE), PROT_READ | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (the_page == MAP_FAILED)
|
||||
return 1;
|
||||
|
||||
// Put something in the top byte (AArch64 Linux always enables top byte
|
||||
// ignore)
|
||||
the_page = (void *)((size_t)the_page | ((size_t)0x34 << 56));
|
||||
|
||||
return 0; // Set break point at this line.
|
||||
}
|
Loading…
Reference in New Issue