From 4135abca897d1b945193f767cbf42a200b55bbdc Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 12 Jul 2022 11:51:33 +0200 Subject: [PATCH] [lldb] add SBSection.alignment to python bindings This commit adds SBSection.GetAlignment(), and SBSection.alignment as a python property to lldb. Reviewed By: clayborg, JDevlieghere, labath Differential Revision: https://reviews.llvm.org/D128069 --- lldb/bindings/interface/SBSection.i | 4 ++++ lldb/include/lldb/API/SBSection.h | 6 ++++++ lldb/source/API/SBSection.cpp | 9 +++++++++ lldb/test/API/python_api/section/TestSectionAPI.py | 11 +++++++++++ lldb/test/API/python_api/section/aligned.yaml | 14 ++++++++++++++ 5 files changed, 44 insertions(+) create mode 100644 lldb/test/API/python_api/section/aligned.yaml diff --git a/lldb/bindings/interface/SBSection.i b/lldb/bindings/interface/SBSection.i index b86d4e99c5ea..a138d81825b5 100644 --- a/lldb/bindings/interface/SBSection.i +++ b/lldb/bindings/interface/SBSection.i @@ -105,6 +105,9 @@ public: uint32_t GetTargetByteSize (); + uint32_t + GetAlignment (); + bool GetDescription (lldb::SBStream &description); @@ -138,6 +141,7 @@ public: data = property(GetSectionData, None, doc='''A read only property that returns an lldb object that represents the bytes for this section (lldb.SBData) for this section.''') type = property(GetSectionType, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eSectionType") that represents the type of this section (code, data, etc.).''') target_byte_size = property(GetTargetByteSize, None, doc='''A read only property that returns the size of a target byte represented by this section as a number of host bytes.''') + alignment = property(GetAlignment, None, doc='''A read only property that returns the alignment of this section as a number of host bytes.''') %} #endif diff --git a/lldb/include/lldb/API/SBSection.h b/lldb/include/lldb/API/SBSection.h index d722dbe4ff1f..94c6614ecfa9 100644 --- a/lldb/include/lldb/API/SBSection.h +++ b/lldb/include/lldb/API/SBSection.h @@ -76,6 +76,12 @@ public: /// The number of host (8-bit) bytes needed to hold a target byte uint32_t GetTargetByteSize(); + /// Return the alignment of the section in bytes + /// + /// \return + /// The alignment of the section in bytes + uint32_t GetAlignment(); + bool operator==(const lldb::SBSection &rhs); bool operator!=(const lldb::SBSection &rhs); diff --git a/lldb/source/API/SBSection.cpp b/lldb/source/API/SBSection.cpp index 733e0db0b5ba..3a9cf20e484a 100644 --- a/lldb/source/API/SBSection.cpp +++ b/lldb/source/API/SBSection.cpp @@ -242,6 +242,15 @@ uint32_t SBSection::GetTargetByteSize() { return 0; } +uint32_t SBSection::GetAlignment() { + LLDB_INSTRUMENT_VA(this); + + SectionSP section_sp(GetSP()); + if (section_sp.get()) + return (1 << section_sp->GetLog2Align()); + return 0; +} + bool SBSection::operator==(const SBSection &rhs) { LLDB_INSTRUMENT_VA(this, rhs); diff --git a/lldb/test/API/python_api/section/TestSectionAPI.py b/lldb/test/API/python_api/section/TestSectionAPI.py index 51a003701924..ab9ae56238c8 100644 --- a/lldb/test/API/python_api/section/TestSectionAPI.py +++ b/lldb/test/API/python_api/section/TestSectionAPI.py @@ -37,3 +37,14 @@ class SectionAPITestCase(TestBase): self.assertIsNotNone(data_section) self.assertEqual(data_section.target_byte_size, 1) + + def test_get_alignment(self): + exe = self.getBuildArtifact("aligned.out") + self.yaml2obj("aligned.yaml", exe) + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + # exe contains a single section aligned to 0x1000 + section = target.modules[0].sections[0] + self.assertEqual(section.GetAlignment(), 0x1000) + self.assertEqual(section.alignment, 0x1000) diff --git a/lldb/test/API/python_api/section/aligned.yaml b/lldb/test/API/python_api/section/aligned.yaml new file mode 100644 index 000000000000..f96d48419c19 --- /dev/null +++ b/lldb/test/API/python_api/section/aligned.yaml @@ -0,0 +1,14 @@ +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000400000 +Sections: + - Name: .text1 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000400000 + AddressAlign: 0x0000000000001000 + Size: 0xb0