OSDN Git Service

[RuntimeDyld] Apply padding and alignment bumps to all sections with stubs, and
authorLang Hames <lhames@gmail.com>
Thu, 30 May 2019 19:59:20 +0000 (19:59 +0000)
committerLang Hames <lhames@gmail.com>
Thu, 30 May 2019 19:59:20 +0000 (19:59 +0000)
increase the MachO/x86-64 stub alignment to 8.

Stub alignment should be guaranteed for any section containing RuntimeDyld
stubs/GOT-entries. To do this we should pad and align all sections containing
stubs, not just code sections.

This commit also bumps the MachO/x86-64 stub alignment to 8, so that GOT entries
will be aligned.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362139 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOX86_64.h
test/ExecutionEngine/RuntimeDyld/X86/MachO_x86-64_PIC_relocations.s

index f99868d..b1d22b8 100644 (file)
@@ -799,13 +799,12 @@ RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
     pData = data.data();
   }
 
-  // Code section alignment needs to be at least as high as stub alignment or
-  // padding calculations may by incorrect when the section is remapped to a
-  // higher alignment.
-  if (IsCode) {
+  // If there are any stubs then the section alignment needs to be at least as
+  // high as stub alignment or padding calculations may by incorrect when the
+  // section is remapped.
+  if (StubBufSize != 0) {
     Alignment = std::max(Alignment, getStubAlignment());
-    if (StubBufSize > 0)
-      PaddingSize += getStubAlignment() - 1;
+    PaddingSize += getStubAlignment() - 1;
   }
 
   // Some sections, such as debug info, don't need to be loaded for execution.
index 249f8dc..28febbd 100644 (file)
@@ -28,7 +28,7 @@ public:
 
   unsigned getMaxStubSize() const override { return 8; }
 
-  unsigned getStubAlignment() override { return 1; }
+  unsigned getStubAlignment() override { return 8; }
 
   Expected<relocation_iterator>
   processRelocationRef(unsigned SectionID, relocation_iterator RelI,
index dc69a15..9205295 100644 (file)
@@ -22,8 +22,9 @@ insn2:
        movl    x(%rip), %eax
 
 # Test PC-rel GOT relocation.
-# Verify both the contents of the GOT entry for y, and that the movq instruction
-# references the correct GOT entry address:
+# Verify the alignment of the GOT entry, the contents of the GOT entry for y,
+# and that the movq instruction references the correct GOT entry address:
+# rtdyld-check: stub_addr(test_x86-64.o/__text, y)[2:0] = 0
 # rtdyld-check: *{8}(stub_addr(test_x86-64.o/__text, y)) = y
 # rtdyld-check: decode_operand(insn3, 4) = stub_addr(test_x86-64.o/__text, y) - next_pc(insn3)
 insn3: