[PATCH] D21172: [LLVM][MIPS] Fix createStubFunction to emit JR encoding based on Arch.

Nitesh Jain via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 9 00:03:02 PDT 2016


nitesh.jain created this revision.
nitesh.jain added reviewers: dsanders, vkalintiris.
nitesh.jain added subscribers: jaydeep, bhushan, slthakur, mohit.bhakkad, llvm-commits.
nitesh.jain set the repository for this revision to rL LLVM.

The RuntimeDyldImpl::createStubFunction() contains hard coded JR encoding. The encoding given in this function is incorrect in case of R6 so it results in illegal instruction at runtime while evaluating  expression in LLDB for MIPS32r6. This patch emit JR encoding based on Arch.

Repository:
  rL LLVM

http://reviews.llvm.org/D21172

Files:
  lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
  lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp

Index: lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
===================================================================
--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
+++ lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
@@ -1402,8 +1402,12 @@
         // Create a new stub function.
         DEBUG(dbgs() << " Create a new stub function\n");
         Stubs[Value] = Section.getStubOffset();
+
+        unsigned AbiVariant;
+        O.getPlatformFlags(AbiVariant);
+
         uint8_t *StubTargetAddr = createStubFunction(
-            Section.getAddressWithOffset(Section.getStubOffset()));
+            Section.getAddressWithOffset(Section.getStubOffset()), AbiVariant);
 
         // Creating Hi and Lo relocations for the filled stub instructions.
         RelocationEntry REHi(SectionID, StubTargetAddr - Section.getAddress(),
Index: lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
===================================================================
--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -816,7 +816,10 @@
     // 8:   03200008        jr      t9.
     // c:   00000000        nop.
     const unsigned LuiT9Instr = 0x3c190000, AdduiT9Instr = 0x27390000;
-    const unsigned JrT9Instr = 0x03200008, NopInstr = 0x0;
+    const unsigned NopInstr = 0x0;
+    unsigned JrT9Instr = 0x03200008;
+    if ((AbiVariant & ELF::EF_MIPS_ARCH) == ELF::EF_MIPS_ARCH_32R6)
+        JrT9Instr = 0x03200009;
 
     writeBytesUnaligned(LuiT9Instr, Addr, 4);
     writeBytesUnaligned(AdduiT9Instr, Addr+4, 4);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21172.60141.patch
Type: text/x-patch
Size: 1577 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160609/9699397b/attachment.bin>


More information about the llvm-commits mailing list