diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-03-23 14:44:32 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-03-23 14:44:32 +0000 |
commit | 5f287b943f833d3bd88af077d06292e8990ad62a (patch) | |
tree | a02b87fb43994863c3549bb0875e7ff3fc9cc814 /lib | |
parent | 112a17aacbe157b4401bb5454356209ca84c9508 (diff) | |
download | external_llvm-5f287b943f833d3bd88af077d06292e8990ad62a.zip external_llvm-5f287b943f833d3bd88af077d06292e8990ad62a.tar.gz external_llvm-5f287b943f833d3bd88af077d06292e8990ad62a.tar.bz2 |
Add Win64 compilation callback. This allows easy examples to be JITed on Win64!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48706 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86CompilationCallback_Win64.asm | 54 | ||||
-rw-r--r-- | lib/Target/X86/X86JITInfo.cpp | 9 |
2 files changed, 58 insertions, 5 deletions
diff --git a/lib/Target/X86/X86CompilationCallback_Win64.asm b/lib/Target/X86/X86CompilationCallback_Win64.asm new file mode 100644 index 0000000..f9b5481 --- /dev/null +++ b/lib/Target/X86/X86CompilationCallback_Win64.asm @@ -0,0 +1,54 @@ +extrn X86CompilationCallback2: PROC + +.code +X86CompilationCallback proc + push rbp + + ; Save RSP + mov rbp, rsp + + ; Save all int arg registers + push rcx + push rdx + push r8 + push r9 + + ; Align stack on 16-byte boundary. + and rsp, -16 + + ; Save all XMM arg registers + sub rsp, 64 + movaps [rsp], xmm0 + movaps [rsp+16], xmm1 + movaps [rsp+32], xmm2 + movaps [rsp+48], xmm3 + + ; JIT callee + + ; Pass prev frame and return address + mov rcx, rbp + mov rdx, qword ptr [rbp+8] + call X86CompilationCallback2 + + ; Restore all XMM arg registers + movaps xmm3, [rsp+48] + movaps xmm2, [rsp+32] + movaps xmm1, [rsp+16] + movaps xmm0, [rsp] + + ; Restore RSP + mov rsp, rbp + + ; Restore all int arg registers + sub rsp, 32 + pop r9 + pop r8 + pop rdx + pop rcx + + ; Restore RBP + pop rbp + ret +X86CompilationCallback endp + +End diff --git a/lib/Target/X86/X86JITInfo.cpp b/lib/Target/X86/X86JITInfo.cpp index a98d66d..5d942a1 100644 --- a/lib/Target/X86/X86JITInfo.cpp +++ b/lib/Target/X86/X86JITInfo.cpp @@ -153,11 +153,10 @@ extern "C" { CFI(".cfi_endproc\n") ); # else - // No inline assembler support on this platform - void X86CompilationCallback() { - assert(0 && "Cannot call X86CompilationCallback() on a non-x86 arch!\n"); - abort(); - } + // No inline assembler support on this platform. The routine is in external + // file. + void X86CompilationCallback(); + # endif #elif defined (X86_32_JIT) # ifndef _MSC_VER |