[PATCH] D32899: [RuntimeDyld] Fix debug section relocation (pr20457)

Pavel Labath via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 15 02:59:20 PDT 2017


labath updated this revision to Diff 98967.
labath added a comment.
Herald added a subscriber: krytarowski.

Add llvm-rtdyld test case


https://reviews.llvm.org/D32899

Files:
  lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
  test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s


Index: test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s
===================================================================
--- /dev/null
+++ test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s
@@ -0,0 +1,20 @@
+# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj -o %T/ELF_x86-64_debug_frame.o %s
+# RUN: llvm-rtdyld -triple=x86_64-pc-linux -verify -check=%s %T/ELF_x86-64_debug_frame.o
+
+        .text
+        .file   "debug_frame_test.c"
+        .align  16, 0x90
+        .type   foo, at function
+foo:
+        .cfi_startproc
+        retq
+.Ltmp0:
+        .size   foo, .Ltmp0-foo
+        .cfi_endproc
+        .cfi_sections .debug_frame
+
+# Check that .debug_frame is mapped to 0.
+# rtdyld-check: section_addr(ELF_x86-64_debug_frame.o, .debug_frame) = 0
+
+# Check that The relocated FDE's CIE offset also points to zero.
+# rtdyld-check: *{4}(section_addr(ELF_x86-64_debug_frame.o, .debug_frame) + 0x1C) = 0
Index: lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
===================================================================
--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -705,7 +705,7 @@
   unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL;
   unsigned PaddingSize = 0;
   unsigned StubBufSize = 0;
-  bool IsRequired = isRequiredForExecution(Section) || ProcessAllSections;
+  bool IsRequired = isRequiredForExecution(Section);
   bool IsVirtual = Section.isVirtual();
   bool IsZeroInit = isZeroInit(Section);
   bool IsReadOnly = isReadOnlyData(Section);
@@ -745,8 +745,8 @@
     Alignment = std::max(Alignment, getStubAlignment());
 
   // Some sections, such as debug info, don't need to be loaded for execution.
-  // Leave those where they are.
-  if (IsRequired) {
+  // Process those only if explicitly requested.
+  if (IsRequired || ProcessAllSections) {
     Allocate = DataSize + PaddingSize + StubBufSize;
     if (!Allocate)
       Allocate = 1;
@@ -790,6 +790,10 @@
   Sections.push_back(
       SectionEntry(Name, Addr, DataSize, Allocate, (uintptr_t)pData));
 
+  // Debug info sections are linked as if their load address was zero
+  if (!IsRequired)
+    Sections.back().setLoadAddress(0);
+
   if (Checker)
     Checker->registerSection(Obj.getFileName(), SectionID);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D32899.98967.patch
Type: text/x-patch
Size: 2300 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170515/8a20bc5d/attachment.bin>


More information about the llvm-commits mailing list