[llvm] r261503 - [Orc] Add stack-realignment code to the i386 resolver function.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 21 14:50:26 PST 2016
Author: lhames
Date: Sun Feb 21 16:50:26 2016
New Revision: 261503
URL: http://llvm.org/viewvc/llvm-project?rev=261503&view=rev
Log:
[Orc] Add stack-realignment code to the i386 resolver function.
The resolver uses the fxsave/fxrstor instructions, which require 16-byte
alignment, to save SSE state to the stack. Since 16-byte alignment can't be
assumed on all OSes (and all i386 OSes share this function) - add code to
automatically bump the alignment to 16-bytes on entry to the function.
Modified:
llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h
llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h?rev=261503&r1=261502&r2=261503&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h Sun Feb 21 16:50:26 2016
@@ -152,7 +152,7 @@ class OrcI386 {
public:
static const unsigned PointerSize = 4;
static const unsigned TrampolineSize = 8;
- static const unsigned ResolverCodeSize = 0x66;
+ static const unsigned ResolverCodeSize = 0x4a;
typedef GenericIndirectStubsInfo<8> IndirectStubsInfo;
Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp?rev=261503&r1=261502&r2=261503&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp Sun Feb 21 16:50:26 2016
@@ -172,35 +172,38 @@ void OrcI386::writeResolverCode(uint8_t
// resolver_entry:
0x55, // 0x00: pushl %ebp
0x89, 0xe5, // 0x01: movl %esp, %ebp
- 0x50, // 0x03: pushl %eax
- 0x53, // 0x04: pushl %ebx
- 0x51, // 0x05: pushl %ecx
- 0x52, // 0x06: pushl %edx
- 0x56, // 0x07: pushl %esi
- 0x57, // 0x08: pushl %edi
- 0x81, 0xec, 0x1C, 0x02, 0x00, 0x00, // 0x09: subl $0x21C, %esp
- 0x0f, 0xae, 0x44, 0x24, 0x10, // 0x0f: fxsave 0x10(%esp)
- 0x8b, 0x75, 0x04, // 0x14: movl 0x4(%ebp), %esi
- 0x83, 0xee, 0x05, // 0x17: subl $0x5, %esi
- 0x89, 0x74, 0x24, 0x04, // 0x1a: movl %esi, 0x4(%esp)
- 0xc7, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, // 0x1e: movl <cbmgr>, (%esp)
- 0xb8, 0x00, 0x00, 0x00, 0x00, // 0x25: movl <reentry>, %eax
- 0xff, 0xd0, // 0x2a: calll *%eax
- 0x89, 0x45, 0x04, // 0x2c: movl %eax, 0x4(%ebp)
- 0x0f, 0xae, 0x4c, 0x24, 0x10, // 0x2f: fxrstor 0x10(%esp)
- 0x81, 0xc4, 0x1c, 0x02, 0x00, 0x00, // 0x34: addl $0x21C, %esp
- 0x5f, // 0x3a: popl %edi
- 0x5e, // 0x3b: popl %esi
- 0x5a, // 0x3c: popl %edx
- 0x59, // 0x3d: popl %ecx
- 0x5b, // 0x3e: popl %ebx
- 0x58, // 0x3f: popl %eax
- 0x5d, // 0x40: popl %ebp
- 0xc3 // 0x41: retl
+ 0x54, // 0x03: pushl %esp
+ 0x83, 0xe4, 0xf0, // 0x04: andl $-0x10, %esp
+ 0x50, // 0x07: pushl %eax
+ 0x53, // 0x08: pushl %ebx
+ 0x51, // 0x09: pushl %ecx
+ 0x52, // 0x0a: pushl %edx
+ 0x56, // 0x0b: pushl %esi
+ 0x57, // 0x0c: pushl %edi
+ 0x81, 0xec, 0x18, 0x02, 0x00, 0x00, // 0x0d: subl $0x218, %esp
+ 0x0f, 0xae, 0x44, 0x24, 0x10, // 0x13: fxsave 0x10(%esp)
+ 0x8b, 0x75, 0x04, // 0x18: movl 0x4(%ebp), %esi
+ 0x83, 0xee, 0x05, // 0x1b: subl $0x5, %esi
+ 0x89, 0x74, 0x24, 0x04, // 0x1e: movl %esi, 0x4(%esp)
+ 0xc7, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, // 0x22: movl <cbmgr>, (%esp)
+ 0xb8, 0x00, 0x00, 0x00, 0x00, // 0x29: movl <reentry>, %eax
+ 0xff, 0xd0, // 0x2e: calll *%eax
+ 0x89, 0x45, 0x04, // 0x30: movl %eax, 0x4(%ebp)
+ 0x0f, 0xae, 0x4c, 0x24, 0x10, // 0x33: fxrstor 0x10(%esp)
+ 0x81, 0xc4, 0x18, 0x02, 0x00, 0x00, // 0x38: addl $0x218, %esp
+ 0x5f, // 0x3e: popl %edi
+ 0x5e, // 0x3f: popl %esi
+ 0x5a, // 0x40: popl %edx
+ 0x59, // 0x41: popl %ecx
+ 0x5b, // 0x42: popl %ebx
+ 0x58, // 0x43: popl %eax
+ 0x8b, 0x65, 0xfc, // 0x44: movl -0x4(%ebp), %esp
+ 0x5d, // 0x48: popl %ebp
+ 0xc3 // 0x49: retl
};
- const unsigned ReentryFnAddrOffset = 0x26;
- const unsigned CallbackMgrAddrOffset = 0x21;
+ const unsigned ReentryFnAddrOffset = 0x2a;
+ const unsigned CallbackMgrAddrOffset = 0x25;
memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
More information about the llvm-commits
mailing list