Index: lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml =================================================================== --- lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml +++ lldb/trunk/lit/Modules/dwarf-gnu-debugaltlink.yaml @@ -1,25 +0,0 @@ -# RUN: yaml2obj %s > %t -# RUN: lldb-test module-sections %t | FileCheck %s - -# CHECK: Name: .gnu_debugaltlink -# CHECK-NEXT: Type: dwarf-gnu-debugaltlink -# CHECK-NEXT: VM size: 0 -# CHECK-NEXT: File size: 8 - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_DYN - Machine: EM_X86_64 - Entry: 0x00000000000007A0 -Sections: - - Name: .debug_info - Type: SHT_PROGBITS - AddressAlign: 0x0000000000000001 - Content: DEADBEEFBAADF00D - - Name: .gnu_debugaltlink - Type: SHT_PROGBITS - AddressAlign: 0x0000000000000001 - Content: DEADBEEFBAADF00D -... Index: lldb/trunk/lit/Modules/elf-section-types.yaml =================================================================== --- lldb/trunk/lit/Modules/elf-section-types.yaml +++ lldb/trunk/lit/Modules/elf-section-types.yaml @@ -0,0 +1,39 @@ +# RUN: yaml2obj %s > %t +# RUN: lldb-test module-sections %t | FileCheck %s + +# CHECK: Name: .text +# CHECK-NEXT: Type: code + +# CHECK: Name: .gnu_debugaltlink +# CHECK-NEXT: Type: dwarf-gnu-debugaltlink +# CHECK-NEXT: VM size: 0 +# CHECK-NEXT: File size: 8 + +# CHECK: Name: __codesection +# CHECK-NEXT: Type: code + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x00000000000007A0 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: DEADBEEFBAADF00D + - Name: .debug_info + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: DEADBEEFBAADF00D + - Name: .gnu_debugaltlink + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: DEADBEEFBAADF00D + - Name: __codesection + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: DEADBEEFBAADF00D +... Index: lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile +++ lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile @@ -0,0 +1,6 @@ +LEVEL = ../../make + +C_SOURCES := main.c +CFLAGS_EXTRAS = -mthumb + +include $(LEVEL)/Makefile.rules \ No newline at end of file Index: lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py +++ lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py @@ -0,0 +1,35 @@ +""" +Test that breakpoints correctly work in an thumb function in an arbitrary +named codesection. +""" +from __future__ import print_function + + +import lldb +import os +import time +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestBreakpointThumbCodesection(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @skipIf(archs=no_match(["arm"])) + def test_breakpoint(self): + self.build() + exe = self.getBuildArtifact("a.out") + line = line_number('main.c', '// Set break point at this line.') + + self.runCmd("target create %s" % exe) + bpid = lldbutil.run_break_set_by_file_and_line(self, "main.c", line) + + self.runCmd("run") + + self.assertIsNotNone(lldbutil.get_one_thread_stopped_at_breakpoint_id( + self.process(), bpid), "Process is not stopped at breakpoint") + + self.process().Continue() + self.assertEqual(self.process().GetState(), lldb.eStateExited, PROCESS_EXITED) Index: lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c +++ lldb/trunk/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c @@ -0,0 +1,8 @@ +__attribute__((section("__codesection"))) +int f(int a) { + return a + 1; // Set break point at this line. +} + +int main() { + return f(10); +} Index: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp =================================================================== --- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -1950,6 +1950,16 @@ sect_type = kalimbaSectionType(m_header, header); } + // In common case ELF code section can have arbitrary name (for example, + // we can specify it using section attribute for particular function) so + // assume that section is a code section if it has SHF_EXECINSTR flag set + // and has SHT_PROGBITS type. + if (eSectionTypeOther == sect_type && + llvm::ELF::SHT_PROGBITS == header.sh_type && + (header.sh_flags & SHF_EXECINSTR)) { + sect_type = eSectionTypeCode; + } + const uint32_t target_bytes_size = (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type) ? m_arch_spec.GetDataByteSize()