[llvm] r351001 - [ORC][MIPS] Fill delay-slot after `jr` instruction

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 12 03:12:08 PST 2019


Author: atanasyan
Date: Sat Jan 12 03:12:08 2019
New Revision: 351001

URL: http://llvm.org/viewvc/llvm-project?rev=351001&view=rev
Log:
[ORC][MIPS] Fill delay-slot after `jr` instruction

MIPS `jr` instruction uses a delay-slot. To escape execution of
arbitrary instruction we should either fill the delay-slot by `nop`
instruction or swap `jr` instruction and logically preceding
instruction. This fix implements the second method to generate a bit
more effective code.

Modified:
    llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp

Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp?rev=351001&r1=351000&r2=351001&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp Sat Jan 12 03:12:08 2019
@@ -610,13 +610,13 @@ void OrcMips32_Base::writeResolverCode(u
       0x8fa40008,                    // 0xe8: lw $a0,8($sp)
       0x27bd0068,                    // 0xec: addiu $sp,$sp,104
       0x0300f825,                    // 0xf0: move $ra, $t8
-      0x00000000,                    // 0xf4: move $t9, $v0/v1
-      0x03200008                     // 0xf8: jr $t9
+      0x03200008,                    // 0xf4: jr $t9
+      0x00000000,                    // 0xf8: move $t9, $v0/v1
   };
 
   const unsigned ReentryFnAddrOffset = 0x7c;   // JIT re-entry fn addr lui
   const unsigned CallbackMgrAddrOffset = 0x6c; // Callback manager addr lui
-  const unsigned Offsett = 0xf4;
+  const unsigned Offsett = 0xf8;
 
   memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
 
@@ -810,8 +810,8 @@ void OrcMips64::writeResolverCode(uint8_
       0xdfa30008,                     // 0x10c: ld v1, 8(sp)
       0x67bd00d0,                     // 0x110: daddiu $sp,$sp,208
       0x0300f825,                     // 0x114: move $ra, $t8
-      0x0040c825,                     // 0x118: move $t9, $v0
-      0x03200008                      // 0x11c: jr $t9
+      0x03200008,                     // 0x118: jr $t9
+      0x0040c825,                     // 0x11c: move $t9, $v0
   };
 
   const unsigned ReentryFnAddrOffset = 0x8c;   // JIT re-entry fn addr lui




More information about the llvm-commits mailing list