[lldb] Add SBProcess methods for get/set/use address masks (#83095) I'm reviving a patch from phabracator, https://reviews.llvm.org/D155905 which was approved but I wasn't thrilled with all the API I was adding to SBProcess for all of the address mask types / memory regions. In this update, I added enums to control type address mask type (code, data, any) and address space specifiers (low, high, all) with defaulted arguments for the most common case. I originally landed this via https://github.com/llvm/llvm-project/pull/83095 but it failed on CIs outside of arm64 Darwin so I had to debug it on more environments and update the patch. This patch is also fixing a bug in the "addressable bits to address mask" calculation I added in AddressableBits::SetProcessMasks. If lldb were told that 64 bits are valid for addressing, this method would overflow the calculation and set an invalid mask. Added tests to check this specific bug while I was adding these APIs. This patch changes the value of "no mask set" from 0 to LLDB_INVALID_ADDRESS_MASK, which is UINT64_MAX. A mask of all 1's means "no bits are used for addressing" which is an impossible mask, whereas a mask of 0 means "all bits are used for addressing" which is possible. I added a base class implementation of ABI::FixCodeAddress and ABI::FixDataAddress that will apply the Process mask values if they are set to a value other than LLDB_INVALID_ADDRESS_MASK. I updated all the callers/users of the Mask methods which were handling a value of 0 to mean invalid mask to use LLDB_INVALID_ADDRESS_MASK. I added code to the all AArch64 ABI Fix* methods to apply the Highmem masks if they have been set. These will not be set on a Linux environment, but in TestAddressMasks.py I test the highmem masks feature for any AArch64 target, so all AArch64 ABI plugins must handle it. rdar://123530562
60 lines
2.0 KiB
C++
60 lines
2.0 KiB
C++
//===-- AddressableBits.cpp -----------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Utility/AddressableBits.h"
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/lldb-types.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
void AddressableBits::SetAddressableBits(uint32_t addressing_bits) {
|
|
m_low_memory_addr_bits = m_high_memory_addr_bits = addressing_bits;
|
|
}
|
|
|
|
void AddressableBits::SetAddressableBits(uint32_t lowmem_addressing_bits,
|
|
uint32_t highmem_addressing_bits) {
|
|
m_low_memory_addr_bits = lowmem_addressing_bits;
|
|
m_high_memory_addr_bits = highmem_addressing_bits;
|
|
}
|
|
|
|
void AddressableBits::SetLowmemAddressableBits(
|
|
uint32_t lowmem_addressing_bits) {
|
|
m_low_memory_addr_bits = lowmem_addressing_bits;
|
|
}
|
|
|
|
void AddressableBits::SetHighmemAddressableBits(
|
|
uint32_t highmem_addressing_bits) {
|
|
m_high_memory_addr_bits = highmem_addressing_bits;
|
|
}
|
|
|
|
addr_t AddressableBits::AddressableBitToMask(uint32_t addressable_bits) {
|
|
assert(addressable_bits <= sizeof(addr_t) * 8);
|
|
if (addressable_bits == 64)
|
|
return 0; // all bits used for addressing
|
|
else
|
|
return ~((1ULL << addressable_bits) - 1);
|
|
}
|
|
|
|
void AddressableBits::SetProcessMasks(Process &process) {
|
|
if (m_low_memory_addr_bits == 0 && m_high_memory_addr_bits == 0)
|
|
return;
|
|
|
|
if (m_low_memory_addr_bits != 0) {
|
|
addr_t low_addr_mask = AddressableBitToMask(m_low_memory_addr_bits);
|
|
process.SetCodeAddressMask(low_addr_mask);
|
|
process.SetDataAddressMask(low_addr_mask);
|
|
}
|
|
|
|
if (m_high_memory_addr_bits != 0) {
|
|
addr_t hi_addr_mask = AddressableBitToMask(m_high_memory_addr_bits);
|
|
process.SetHighmemCodeAddressMask(hi_addr_mask);
|
|
process.SetHighmemDataAddressMask(hi_addr_mask);
|
|
}
|
|
}
|