[RuntimeDyld] Don't try to get the contents of sections that don't have any
authorLang Hames <lhames@gmail.com>
Thu, 15 Oct 2015 06:41:45 +0000 (06:41 +0000)
committerLang Hames <lhames@gmail.com>
Thu, 15 Oct 2015 06:41:45 +0000 (06:41 +0000)
(e.g. bss sections).

MachO and ELF have been silently letting this pass, but COFFObjectFile contains
an assertion to catch this kind of (ab)use of the getSectionContents, and this
was causing the JIT to crash on COFF objects with BSS sections. This patch
should fix that.

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

lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
test/ExecutionEngine/RuntimeDyld/X86/COFF_x86_64 [deleted file]
test/ExecutionEngine/RuntimeDyld/X86/COFF_x86_64.s [new file with mode: 0644]

index b2f017c..27cd098 100644 (file)
@@ -182,8 +182,6 @@ RuntimeDyldImpl::loadObjectImpl(const object::ObjectFile &Obj) {
           continue;
         uint64_t SectOffset;
         Check(getOffset(*I, *SI, SectOffset));
-        StringRef SectionData;
-        Check(SI->getContents(SectionData));
         bool IsCode = SI->isText();
         unsigned SectionID =
             findOrEmitSection(Obj, *SI, IsCode, LocalSections);
@@ -568,12 +566,14 @@ unsigned RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
   uint8_t *Addr;
   const char *pData = nullptr;
 
-  // In either case, set the location of the unrelocated section in memory,
-  // since we still process relocations for it even if we're not applying them.
-  Check(Section.getContents(data));
-  // Virtual sections have no data in the object image, so leave pData = 0
-  if (!IsVirtual)
+  // If this section contains any bits (i.e. isn't a virtual or bss section),
+  // grab a reference to them.
+  if (!IsVirtual && !IsZeroInit) {
+    // In either case, set the location of the unrelocated section in memory,
+    // since we still process relocations for it even if we're not applying them.
+    Check(Section.getContents(data));
     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
diff --git a/test/ExecutionEngine/RuntimeDyld/X86/COFF_x86_64 b/test/ExecutionEngine/RuntimeDyld/X86/COFF_x86_64
deleted file mode 100644 (file)
index 7029cf4..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# RUN: llvm-mc -triple=x86_64-pc-win32 -filetype=obj -o %T/COFF_x86_64.o %s
-# RUN: llvm-rtdyld -triple=x86_64-pc-win32 -verify -check=%s %/T/COFF_x86_64.o
-               .text
-       .def     F;
-       .scl    2;
-       .type   32;
-       .endef
-       .globl  __real400921f9f01b866e
-       .section        .rdata,"dr",discard,__real400921f9f01b866e
-       .align  8
-__real400921f9f01b866e:
-       .quad   4614256650576692846     # double 3.1415899999999999
-       .text
-       .globl  F
-        .global inst1
-       .align  16, 0x90
-F:                                      # @F
-.Ltmp0:
-.seh_proc F
-# BB#0:                                 # %entry
-.Ltmp1:
-       .seh_endprologue
-# rtdyld-check: decode_operand(inst1, 4) = __real400921f9f01b866e - next_pc(inst1)
-inst1:
-       movsd   __real400921f9f01b866e(%rip), %xmm0 # xmm0 = mem[0],zero
-       retq
-.Leh_func_end0:
-.Ltmp2:
-       .seh_endproc
-
-
diff --git a/test/ExecutionEngine/RuntimeDyld/X86/COFF_x86_64.s b/test/ExecutionEngine/RuntimeDyld/X86/COFF_x86_64.s
new file mode 100644 (file)
index 0000000..fc0f3e8
--- /dev/null
@@ -0,0 +1,34 @@
+# RUN: llvm-mc -triple=x86_64-pc-win32 -filetype=obj -o %T/COFF_x86_64.o %s
+# RUN: llvm-rtdyld -triple=x86_64-pc-win32 -verify -check=%s %/T/COFF_x86_64.o
+               .text
+       .def     F;
+       .scl    2;
+       .type   32;
+       .endef
+       .globl  __real400921f9f01b866e
+       .section        .rdata,"dr",discard,__real400921f9f01b866e
+       .align  8
+__real400921f9f01b866e:
+       .quad   4614256650576692846     # double 3.1415899999999999
+       .text
+       .globl  F
+        .global inst1
+       .align  16, 0x90
+F:                                      # @F
+.Ltmp0:
+.seh_proc F
+# BB#0:                                 # %entry
+.Ltmp1:
+       .seh_endprologue
+# rtdyld-check: decode_operand(inst1, 4) = __real400921f9f01b866e - next_pc(inst1)
+inst1:
+       movsd   __real400921f9f01b866e(%rip), %xmm0 # xmm0 = mem[0],zero
+       retq
+.Leh_func_end0:
+.Ltmp2:
+       .seh_endproc
+
+# Make sure the JIT doesn't bail out on BSS sections.
+        .bss
+bss_check:
+        .fill 8, 1, 0