summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2018-04-30 13:23:47 +0000
committerPavel Labath <labath@google.com>2018-04-30 13:23:47 +0000
commitedb012762914c36314aa96a4635570340131bda8 (patch)
tree71faf7ffe9b4147bb6a4e2d8aa6ecbc9d2928ab1
parent410c5acf27167e482d5cdb83adeda3ea4714426d (diff)
downloadbcm5719-llvm-edb012762914c36314aa96a4635570340131bda8.tar.gz
bcm5719-llvm-edb012762914c36314aa96a4635570340131bda8.zip
ObjectFileELF: Add support for arbitrarily named code sections
ObjectFileELF assumes that code section has ".text" name. There is an exception for kalimba toolchain that can use arbitrary names, but other toolchains also could use arbitrary names for code sections. For example, corert uses separate section for compiled managed code. As lldb doesn't recognize such section it leads to problem with breakpoints on arm, because debugger cannot determine instruction set (arm/thumb) and uses incorrect breakpoint opcode that breaks program execution. This change allows debugger to correctly handle such code sections. We assume that section is a code section if it has SHF_EXECINSTR flag set and has SHT_PROGBITS type. Patch by Konstantin Baladurin <k.baladurin@partner.samsung.com>. Differential Revision: https://reviews.llvm.org/D44998 llvm-svn: 331173
-rw-r--r--lldb/lit/Modules/elf-section-types.yaml (renamed from lldb/lit/Modules/dwarf-gnu-debugaltlink.yaml)14
-rw-r--r--lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile6
-rw-r--r--lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py35
-rw-r--r--lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c8
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp10
5 files changed, 73 insertions, 0 deletions
diff --git a/lldb/lit/Modules/dwarf-gnu-debugaltlink.yaml b/lldb/lit/Modules/elf-section-types.yaml
index 65f8cc7a3a3..a331917f6b7 100644
--- a/lldb/lit/Modules/dwarf-gnu-debugaltlink.yaml
+++ b/lldb/lit/Modules/elf-section-types.yaml
@@ -1,11 +1,17 @@
# 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
@@ -14,6 +20,10 @@ FileHeader:
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
@@ -22,4 +32,8 @@ Sections:
Type: SHT_PROGBITS
AddressAlign: 0x0000000000000001
Content: DEADBEEFBAADF00D
+ - Name: __codesection
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Content: DEADBEEFBAADF00D
...
diff --git a/lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile b/lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/Makefile
new file mode 100644
index 00000000000..ea79c55cd4a
--- /dev/null
+++ b/lldb/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
diff --git a/lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py b/lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/TestBreakpointThumbCodesection.py
new file mode 100644
index 00000000000..f020a653852
--- /dev/null
+++ b/lldb/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)
diff --git a/lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c b/lldb/packages/Python/lldbsuite/test/arm/breakpoint-thumb-codesection/main.c
new file mode 100644
index 00000000000..38ea7be6bfc
--- /dev/null
+++ b/lldb/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);
+}
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index a5f577f653c..61186aebfc6 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -1950,6 +1950,16 @@ void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
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()
OpenPOWER on IntegriCloud