[Lldb-commits] [lldb] e8ce864 - Revert "[lldb] Add SBProcess methods for get/set/use address masks (#83095)"
Jason Molenda via lldb-commits
lldb-commits at lists.llvm.org
Thu Feb 29 17:30:21 PST 2024
Author: Jason Molenda
Date: 2024-02-29T17:29:24-08:00
New Revision: e8ce864a36ba02ddb63877905d49f1e9ac60b544
URL: https://github.com/llvm/llvm-project/commit/e8ce864a36ba02ddb63877905d49f1e9ac60b544
DIFF: https://github.com/llvm/llvm-project/commit/e8ce864a36ba02ddb63877905d49f1e9ac60b544.diff
LOG: Revert "[lldb] Add SBProcess methods for get/set/use address masks (#83095)"
This reverts commit 9a12b0a60084b2b92f728e1bddec884a47458459.
TestAddressMasks fails its first test on lldb-x86_64-debian,
lldb-arm-ubuntu, lldb-aarch64-ubuntu bots. Reverting while
investigating.
Added:
Modified:
lldb/include/lldb/API/SBProcess.h
lldb/include/lldb/Utility/AddressableBits.h
lldb/include/lldb/lldb-defines.h
lldb/include/lldb/lldb-enumerations.h
lldb/source/API/SBProcess.cpp
lldb/source/Target/Process.cpp
lldb/source/Utility/AddressableBits.cpp
Removed:
lldb/test/API/python_api/process/address-masks/Makefile
lldb/test/API/python_api/process/address-masks/TestAddressMasks.py
lldb/test/API/python_api/process/address-masks/main.c
################################################################################
diff --git a/lldb/include/lldb/API/SBProcess.h b/lldb/include/lldb/API/SBProcess.h
index 7da3335a7234b7..4f92a41f3028a2 100644
--- a/lldb/include/lldb/API/SBProcess.h
+++ b/lldb/include/lldb/API/SBProcess.h
@@ -407,120 +407,6 @@ class LLDB_API SBProcess {
/// the process isn't loaded from a core file.
lldb::SBFileSpec GetCoreFile();
- /// \{
- /// \group Mask Address Methods
- ///
- /// \a type
- /// All of the methods in this group take \a type argument
- /// which is an AddressMaskType enum value.
- /// There can be
diff erent address masks for code addresses and
- /// data addresses, this argument can select which to get/set,
- /// or to use when clearing non-addressable bits from an address.
- /// This choice of mask can be important for example on AArch32
- /// systems. Where instructions where instructions start on even addresses,
- /// the 0th bit may be used to indicate that a function is thumb code. On
- /// such a target, the eAddressMaskTypeCode may clear the 0th bit from an
- /// address to get the actual address Whereas eAddressMaskTypeData would not.
- ///
- /// \a addr_range
- /// Many of the methods in this group take an \a addr_range argument
- /// which is an AddressMaskRange enum value.
- /// Needing to specify the address range is highly unusual, and the
- /// default argument can be used in nearly all circumstances.
- /// On some architectures (e.g., AArch64), it is possible to have
- ///
diff erent page table setups for low and high memory, so
diff erent
- /// numbers of bits relevant to addressing. It is possible to have
- /// a program running in one half of memory and accessing the other
- /// as heap, so we need to maintain two
diff erent sets of address masks
- /// to debug this correctly.
-
- /// Get the current address mask that will be applied to addresses
- /// before reading from memory.
- ///
- /// \param[in] type
- /// See \ref Mask Address Methods description of this argument.
- /// eAddressMaskTypeAny is often a suitable value when code and
- /// data masks are the same on a given target.
- ///
- /// \param[in] addr_range
- /// See \ref Mask Address Methods description of this argument.
- /// This will default to eAddressMaskRangeLow which is the
- /// only set of masks used normally.
- ///
- /// \return
- /// The address mask currently in use. Bits which are not used
- /// for addressing will be set to 1 in the mask.
- lldb::addr_t GetAddressMask(
- lldb::AddressMaskType type,
- lldb::AddressMaskRange addr_range = lldb::eAddressMaskRangeLow);
-
- /// Set the current address mask that can be applied to addresses
- /// before reading from memory.
- ///
- /// \param[in] type
- /// See \ref Mask Address Methods description of this argument.
- /// eAddressMaskTypeAll is often a suitable value when the
- /// same mask is being set for both code and data.
- ///
- /// \param[in] mask
- /// The address mask to set. Bits which are not used for addressing
- /// should be set to 1 in the mask.
- ///
- /// \param[in] addr_range
- /// See \ref Mask Address Methods description of this argument.
- /// This will default to eAddressMaskRangeLow which is the
- /// only set of masks used normally.
- void SetAddressMask(
- lldb::AddressMaskType type, lldb::addr_t mask,
- lldb::AddressMaskRange addr_range = lldb::eAddressMaskRangeLow);
-
- /// Set the number of bits used for addressing in this Process.
- ///
- /// On Darwin and similar systems, the addressable bits are expressed
- /// as the number of low order bits that are relevant to addressing,
- /// instead of a more general address mask.
- /// This method calculates the correct mask value for a given number
- /// of low order addressable bits.
- ///
- /// \param[in] type
- /// See \ref Mask Address Methods description of this argument.
- /// eAddressMaskTypeAll is often a suitable value when the
- /// same mask is being set for both code and data.
- ///
- /// \param[in] num_bits
- /// Number of bits that are used for addressing.
- /// For example, a value of 42 indicates that the low 42 bits
- /// are relevant for addressing, and that higher-order bits may
- /// be used for various metadata like pointer authentication,
- /// Type Byte Ignore, etc.
- ///
- /// \param[in] addr_range
- /// See \ref Mask Address Methods description of this argument.
- /// This will default to eAddressMaskRangeLow which is the
- /// only set of masks used normally.
- void
- SetAddressableBits(AddressMaskType type, uint32_t num_bits,
- AddressMaskRange addr_range = lldb::eAddressMaskRangeLow);
-
- /// Clear the non-address bits of an \a addr value and return a
- /// virtual address in memory.
- ///
- /// Bits that are not used in addressing may be used for other purposes;
- /// pointer authentication, or metadata in the top byte, or the 0th bit
- /// of armv7 code addresses to indicate arm/thumb are common examples.
- ///
- /// \param[in] addr
- /// The address that should be cleared of non-address bits.
- ///
- /// \param[in] type
- /// See \ref Mask Address Methods description of this argument.
- /// eAddressMaskTypeAny is the default value, correct when it
- /// is unknown if the address is a code or data address.
- lldb::addr_t
- FixAddress(lldb::addr_t addr,
- lldb::AddressMaskType type = lldb::eAddressMaskTypeAny);
- /// \}
-
/// Allocate memory within the process.
///
/// This function will allocate memory in the process's address space.
diff --git a/lldb/include/lldb/Utility/AddressableBits.h b/lldb/include/lldb/Utility/AddressableBits.h
index 75752fcf840a44..13c21329a8c617 100644
--- a/lldb/include/lldb/Utility/AddressableBits.h
+++ b/lldb/include/lldb/Utility/AddressableBits.h
@@ -10,7 +10,6 @@
#define LLDB_UTILITY_ADDRESSABLEBITS_H
#include "lldb/lldb-forward.h"
-#include "lldb/lldb-public.h"
namespace lldb_private {
@@ -34,8 +33,6 @@ class AddressableBits {
void SetHighmemAddressableBits(uint32_t highmem_addressing_bits);
- static lldb::addr_t AddressableBitToMask(uint32_t addressable_bits);
-
void SetProcessMasks(lldb_private::Process &process);
private:
diff --git a/lldb/include/lldb/lldb-defines.h b/lldb/include/lldb/lldb-defines.h
index c7bd019c5c90eb..469be92eabecf3 100644
--- a/lldb/include/lldb/lldb-defines.h
+++ b/lldb/include/lldb/lldb-defines.h
@@ -127,11 +127,6 @@
#define MAX_PATH 260
#endif
-/// Address Mask
-/// Bits not used for addressing are set to 1 in the mask;
-/// all mask bits set is an invalid value.
-#define LLDB_INVALID_ADDRESS_MASK UINT64_MAX
-
// ignore GCC function attributes
#if defined(_MSC_VER) && !defined(__clang__)
#define __attribute__(X)
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index 646f7bfda98475..85769071dae785 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -1323,22 +1323,6 @@ enum SymbolDownload {
eSymbolDownloadForeground = 2,
};
-/// Used in the SBProcess AddressMask/FixAddress methods.
-enum AddressMaskType {
- eAddressMaskTypeCode = 0,
- eAddressMaskTypeData,
- eAddressMaskTypeAny,
- eAddressMaskTypeAll = eAddressMaskTypeAny
-};
-
-/// Used in the SBProcess AddressMask/FixAddress methods.
-enum AddressMaskRange {
- eAddressMaskRangeLow = 0,
- eAddressMaskRangeHigh,
- eAddressMaskRangeAny,
- eAddressMaskRangeAll = eAddressMaskRangeAny,
-};
-
} // namespace lldb
#endif // LLDB_LLDB_ENUMERATIONS_H
diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp
index b80664882ebcac..a9fe915324683e 100644
--- a/lldb/source/API/SBProcess.cpp
+++ b/lldb/source/API/SBProcess.cpp
@@ -1255,98 +1255,6 @@ lldb::SBFileSpec SBProcess::GetCoreFile() {
return SBFileSpec(core_file);
}
-addr_t SBProcess::GetAddressMask(AddressMaskType type,
- AddressMaskRange addr_range) {
- LLDB_INSTRUMENT_VA(this, type, addr_range);
-
- if (ProcessSP process_sp = GetSP()) {
- switch (type) {
- case eAddressMaskTypeCode:
- if (addr_range == eAddressMaskRangeHigh)
- return process_sp->GetHighmemCodeAddressMask();
- else
- return process_sp->GetCodeAddressMask();
- case eAddressMaskTypeData:
- if (addr_range == eAddressMaskRangeHigh)
- return process_sp->GetHighmemDataAddressMask();
- else
- return process_sp->GetDataAddressMask();
- case eAddressMaskTypeAny:
- if (addr_range == eAddressMaskRangeHigh)
- return process_sp->GetHighmemDataAddressMask();
- else
- return process_sp->GetDataAddressMask();
- }
- }
- return LLDB_INVALID_ADDRESS_MASK;
-}
-
-void SBProcess::SetAddressMask(AddressMaskType type, addr_t mask,
- AddressMaskRange addr_range) {
- LLDB_INSTRUMENT_VA(this, type, mask, addr_range);
-
- if (ProcessSP process_sp = GetSP()) {
- switch (type) {
- case eAddressMaskTypeCode:
- if (addr_range == eAddressMaskRangeAll) {
- process_sp->SetCodeAddressMask(mask);
- process_sp->SetHighmemCodeAddressMask(mask);
- } else if (addr_range == eAddressMaskRangeHigh) {
- process_sp->SetHighmemCodeAddressMask(mask);
- } else {
- process_sp->SetCodeAddressMask(mask);
- }
- break;
- case eAddressMaskTypeData:
- if (addr_range == eAddressMaskRangeAll) {
- process_sp->SetDataAddressMask(mask);
- process_sp->SetHighmemDataAddressMask(mask);
- } else if (addr_range == eAddressMaskRangeHigh) {
- process_sp->SetHighmemDataAddressMask(mask);
- } else {
- process_sp->SetDataAddressMask(mask);
- }
- break;
- case eAddressMaskTypeAll:
- if (addr_range == eAddressMaskRangeAll) {
- process_sp->SetCodeAddressMask(mask);
- process_sp->SetDataAddressMask(mask);
- process_sp->SetHighmemCodeAddressMask(mask);
- process_sp->SetHighmemDataAddressMask(mask);
- } else if (addr_range == eAddressMaskRangeHigh) {
- process_sp->SetHighmemCodeAddressMask(mask);
- process_sp->SetHighmemDataAddressMask(mask);
- } else {
- process_sp->SetCodeAddressMask(mask);
- process_sp->SetDataAddressMask(mask);
- }
- break;
- }
- }
-}
-
-void SBProcess::SetAddressableBits(AddressMaskType type, uint32_t num_bits,
- AddressMaskRange addr_range) {
- LLDB_INSTRUMENT_VA(this, type, num_bits, addr_range);
-
- SetAddressMask(type, AddressableBits::AddressableBitToMask(num_bits),
- addr_range);
-}
-
-addr_t SBProcess::FixAddress(addr_t addr, AddressMaskType type) {
- LLDB_INSTRUMENT_VA(this, addr, type);
-
- if (ProcessSP process_sp = GetSP()) {
- if (type == eAddressMaskTypeAny)
- return process_sp->FixAnyAddress(addr);
- else if (type == eAddressMaskTypeData)
- return process_sp->FixDataAddress(addr);
- else if (type == eAddressMaskTypeCode)
- return process_sp->FixCodeAddress(addr);
- }
- return addr;
-}
-
lldb::addr_t SBProcess::AllocateMemory(size_t size, uint32_t permissions,
lldb::SBError &sb_error) {
LLDB_INSTRUMENT_VA(this, size, permissions, sb_error);
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 970bcdf5d69b35..137795cb8cec9e 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -5682,22 +5682,21 @@ void Process::Flush() {
lldb::addr_t Process::GetCodeAddressMask() {
if (uint32_t num_bits_setting = GetVirtualAddressableBits())
- return AddressableBits::AddressableBitToMask(num_bits_setting);
+ return ~((1ULL << num_bits_setting) - 1);
return m_code_address_mask;
}
lldb::addr_t Process::GetDataAddressMask() {
if (uint32_t num_bits_setting = GetVirtualAddressableBits())
- return AddressableBits::AddressableBitToMask(num_bits_setting);
+ return ~((1ULL << num_bits_setting) - 1);
return m_data_address_mask;
}
lldb::addr_t Process::GetHighmemCodeAddressMask() {
if (uint32_t num_bits_setting = GetHighmemVirtualAddressableBits())
- return AddressableBits::AddressableBitToMask(num_bits_setting);
-
+ return ~((1ULL << num_bits_setting) - 1);
if (m_highmem_code_address_mask)
return m_highmem_code_address_mask;
return GetCodeAddressMask();
@@ -5705,8 +5704,7 @@ lldb::addr_t Process::GetHighmemCodeAddressMask() {
lldb::addr_t Process::GetHighmemDataAddressMask() {
if (uint32_t num_bits_setting = GetHighmemVirtualAddressableBits())
- return AddressableBits::AddressableBitToMask(num_bits_setting);
-
+ return ~((1ULL << num_bits_setting) - 1);
if (m_highmem_data_address_mask)
return m_highmem_data_address_mask;
return GetDataAddressMask();
diff --git a/lldb/source/Utility/AddressableBits.cpp b/lldb/source/Utility/AddressableBits.cpp
index 7f9d7ec6c1349c..c6e25f608da73d 100644
--- a/lldb/source/Utility/AddressableBits.cpp
+++ b/lldb/source/Utility/AddressableBits.cpp
@@ -33,26 +33,18 @@ void AddressableBits::SetHighmemAddressableBits(
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);
+ addr_t low_addr_mask = ~((1ULL << m_low_memory_addr_bits) - 1);
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);
+ addr_t hi_addr_mask = ~((1ULL << m_high_memory_addr_bits) - 1);
process.SetHighmemCodeAddressMask(hi_addr_mask);
process.SetHighmemDataAddressMask(hi_addr_mask);
}
diff --git a/lldb/test/API/python_api/process/address-masks/Makefile b/lldb/test/API/python_api/process/address-masks/Makefile
deleted file mode 100644
index 10495940055b63..00000000000000
--- a/lldb/test/API/python_api/process/address-masks/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-C_SOURCES := main.c
-
-include Makefile.rules
diff --git a/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py b/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py
deleted file mode 100644
index 5fa6b328ad5229..00000000000000
--- a/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py
+++ /dev/null
@@ -1,74 +0,0 @@
-"""Test Python APIs for setting, getting, and using address masks."""
-
-import os
-import lldb
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-
-
-class AddressMasksTestCase(TestBase):
- NO_DEBUG_INFO_TESTCASE = True
-
- def test_address_masks(self):
- self.build()
- (target, process, t, bp) = lldbutil.run_to_source_breakpoint(
- self, "break here", lldb.SBFileSpec("main.c")
- )
-
- process.SetAddressableBits(lldb.eAddressMaskTypeAll, 42)
- self.assertEqual(0x0000029500003F94, process.FixAddress(0x00265E9500003F94))
-
- # ~((1ULL<<42)-1) == 0xfffffc0000000000
- process.SetAddressMask(lldb.eAddressMaskTypeAll, 0xFFFFFC0000000000)
- self.assertEqual(0x0000029500003F94, process.FixAddress(0x00265E9500003F94))
-
- # Check that all bits can pass through unmodified
- process.SetAddressableBits(lldb.eAddressMaskTypeAll, 64)
- self.assertEqual(0x00265E9500003F94, process.FixAddress(0x00265E9500003F94))
-
- process.SetAddressableBits(
- lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow
- )
- process.SetAddressableBits(
- lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh
- )
- self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))
- self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694))
-
- process.SetAddressableBits(
- lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll
- )
- self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))
- self.assertEqual(0xFFFFFE950000F694, process.FixAddress(0xFFA65E950000F694))
-
- # Set a eAddressMaskTypeCode which has the low 3 bits marked as non-address
- # bits, confirm that they're cleared by FixAddress.
- process.SetAddressableBits(
- lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll
- )
- mask = process.GetAddressMask(lldb.eAddressMaskTypeAny)
- process.SetAddressMask(lldb.eAddressMaskTypeCode, mask | 0x3)
- process.SetAddressMask(lldb.eAddressMaskTypeCode, 0xFFFFFC0000000003)
- self.assertEqual(0x000002950001F697, process.FixAddress(0x00265E950001F697))
- self.assertEqual(0xFFFFFE950000F697, process.FixAddress(0xFFA65E950000F697))
- self.assertEqual(
- 0x000002950001F697,
- process.FixAddress(0x00265E950001F697, lldb.eAddressMaskTypeData),
- )
- self.assertEqual(
- 0x000002950001F694,
- process.FixAddress(0x00265E950001F697, lldb.eAddressMaskTypeCode),
- )
-
- # The user can override whatever settings the Process thinks should be used.
- process.SetAddressableBits(
- lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll
- )
- self.runCmd("settings set target.process.virtual-addressable-bits 15")
- self.runCmd("settings set target.process.highmem-virtual-addressable-bits 15")
- self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694))
- self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694))
- self.runCmd("settings set target.process.virtual-addressable-bits 0")
- self.runCmd("settings set target.process.highmem-virtual-addressable-bits 0")
- self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))
diff --git a/lldb/test/API/python_api/process/address-masks/main.c b/lldb/test/API/python_api/process/address-masks/main.c
deleted file mode 100644
index f21a10a16d5a75..00000000000000
--- a/lldb/test/API/python_api/process/address-masks/main.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include <stdio.h>
-
-int main(int argc, char const *argv[]) {
- puts("Hello address masking world"); // break here
-}
More information about the lldb-commits
mailing list