diff --git a/lldb/bindings/interface/SBSection.i b/lldb/bindings/interface/SBSection.i --- a/lldb/bindings/interface/SBSection.i +++ b/lldb/bindings/interface/SBSection.i @@ -105,6 +105,9 @@ uint32_t GetTargetByteSize (); + uint32_t + GetAlignment (); + bool GetDescription (lldb::SBStream &description); @@ -138,6 +141,7 @@ 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 --- a/lldb/include/lldb/API/SBSection.h +++ b/lldb/include/lldb/API/SBSection.h @@ -76,6 +76,12 @@ /// 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 --- a/lldb/source/API/SBSection.cpp +++ b/lldb/source/API/SBSection.cpp @@ -242,6 +242,15 @@ 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 --- a/lldb/test/API/python_api/section/TestSectionAPI.py +++ b/lldb/test/API/python_api/section/TestSectionAPI.py @@ -37,3 +37,14 @@ 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 --- /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