[llvm] r268845 - [Orc] Rename OrcArchitectureSupport to OrcABISupport and add Win32 ABI support.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Fri May 6 20:36:38 PDT 2016


Author: lhames
Date: Fri May  6 22:36:38 2016
New Revision: 268845

URL: http://llvm.org/viewvc/llvm-project?rev=268845&view=rev
Log:
[Orc] Rename OrcArchitectureSupport to OrcABISupport and add Win32 ABI support.

This enables lazy JITing on Windows x86-64.

Patch by David. Thanks David!


Added:
    llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcABISupport.h
      - copied, changed from r268796, llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h
    llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp
      - copied, changed from r268796, llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
Removed:
    llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h
    llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
Modified:
    llvm/trunk/examples/Kaleidoscope/Orc/fully_lazy/toy.cpp
    llvm/trunk/lib/ExecutionEngine/Orc/CMakeLists.txt
    llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp
    llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp
    llvm/trunk/tools/lli/OrcLazyJIT.cpp

Modified: llvm/trunk/examples/Kaleidoscope/Orc/fully_lazy/toy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/examples/Kaleidoscope/Orc/fully_lazy/toy.cpp?rev=268845&r1=268844&r2=268845&view=diff
==============================================================================
--- llvm/trunk/examples/Kaleidoscope/Orc/fully_lazy/toy.cpp (original)
+++ llvm/trunk/examples/Kaleidoscope/Orc/fully_lazy/toy.cpp Fri May  6 22:36:38 2016
@@ -4,7 +4,7 @@
 #include "llvm/ExecutionEngine/Orc/LambdaResolver.h"
 #include "llvm/ExecutionEngine/Orc/LazyEmittingLayer.h"
 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
-#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
+#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
 #include "llvm/IR/DataLayout.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/IRBuilder.h"
@@ -1309,7 +1309,7 @@ private:
 
   std::map<std::string, std::unique_ptr<FunctionAST>> FunctionDefs;
 
-  LocalJITCompileCallbackManager<OrcX86_64> CompileCallbacks;
+  LocalJITCompileCallbackManager<OrcX86_64_SysV> CompileCallbacks;
 };
 
 static void HandleDefinition(SessionContext &S, KaleidoscopeJIT &J) {

Copied: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcABISupport.h (from r268796, llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcABISupport.h?p2=llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcABISupport.h&p1=llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h&r1=268796&r2=268845&rev=268845&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcABISupport.h Fri May  6 22:36:38 2016
@@ -1,4 +1,4 @@
-//===-- OrcArchitectureSupport.h - Architecture support code  ---*- C++ -*-===//
+//===-------------- OrcABISupport.h - ABI support code  ---------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,16 +7,16 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// Architecture specific code for Orc, e.g. callback assembly.
+// ABI specific code for Orc, e.g. callback assembly.
 //
-// Architecture classes should be part of the JIT *target* process, not the host
+// ABI classes should be part of the JIT *target* process, not the host
 // process (except where you're doing hosted JITing and the two are one and the
 // same).
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_EXECUTIONENGINE_ORC_ORCARCHITECTURESUPPORT_H
-#define LLVM_EXECUTIONENGINE_ORC_ORCARCHITECTURESUPPORT_H
+#ifndef LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H
+#define LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H
 
 #include "IndirectionUtils.h"
 #include "llvm/Support/Memory.h"
@@ -25,13 +25,13 @@
 namespace llvm {
 namespace orc {
 
-/// Generic ORC Architecture support.
+/// Generic ORC ABI support.
 ///
 /// This class can be substituted as the target architecure support class for
 /// ORC templates that require one (e.g. IndirectStubsManagers). It does not
 /// support lazy JITing however, and any attempt to use that functionality
 /// will result in execution of an llvm_unreachable.
-class OrcGenericArchitecture {
+class OrcGenericABI {
 public:
   static const unsigned PointerSize = sizeof(uintptr_t);
   static const unsigned TrampolineSize = 1;
@@ -138,24 +138,16 @@ public:
                                       unsigned MinStubs, void *InitialPtrVal);
 };
 
-/// @brief X86_64 support.
+/// @brief X86_64 code that's common to all ABIs.
 ///
 /// X86_64 supports lazy JITing.
-class OrcX86_64 {
+class OrcX86_64_Base {
 public:
   static const unsigned PointerSize = 8;
   static const unsigned TrampolineSize = 8;
-  static const unsigned ResolverCodeSize = 0x6C;
 
   typedef GenericIndirectStubsInfo<8> IndirectStubsInfo;
 
-  typedef TargetAddress (*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
-
-  /// @brief Write the resolver code into the given memory. The user is be
-  ///        responsible for allocating the memory and setting permissions.
-  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
-                                void *CallbackMgr);
-
   /// @brief Write the requsted number of trampolines into the given memory,
   ///        which must be big enough to hold 1 pointer, plus NumTrampolines
   ///        trampolines.
@@ -172,6 +164,34 @@ public:
                                       unsigned MinStubs, void *InitialPtrVal);
 };
 
+/// @brief X86_64 support for SysV ABI (Linux, MacOSX).
+///
+/// X86_64_SysV supports lazy JITing.
+class OrcX86_64_SysV : public OrcX86_64_Base {
+public:
+  static const unsigned ResolverCodeSize = 0x6C;
+  typedef TargetAddress(*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
+
+  /// @brief Write the resolver code into the given memory. The user is be
+  ///        responsible for allocating the memory and setting permissions.
+  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
+                                void *CallbackMgr);
+};
+
+/// @brief X86_64 support for Win32.
+///
+/// X86_64_Win32 supports lazy JITing.
+class OrcX86_64_Win32 : public OrcX86_64_Base {
+public:
+  static const unsigned ResolverCodeSize = 0x74;
+  typedef TargetAddress(*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
+
+  /// @brief Write the resolver code into the given memory. The user is be
+  ///        responsible for allocating the memory and setting permissions.
+  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
+                                void *CallbackMgr);
+};
+
 /// @brief I386 support.
 ///
 /// I386 supports lazy JITing.
@@ -209,4 +229,4 @@ public:
 } // End namespace orc.
 } // End namespace llvm.
 
-#endif // LLVM_EXECUTIONENGINE_ORC_ORCARCHITECTURESUPPORT_H
+#endif // LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H

Removed: llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h?rev=268844&view=auto
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h (removed)
@@ -1,212 +0,0 @@
-//===-- OrcArchitectureSupport.h - Architecture support code  ---*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Architecture specific code for Orc, e.g. callback assembly.
-//
-// Architecture classes should be part of the JIT *target* process, not the host
-// process (except where you're doing hosted JITing and the two are one and the
-// same).
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_EXECUTIONENGINE_ORC_ORCARCHITECTURESUPPORT_H
-#define LLVM_EXECUTIONENGINE_ORC_ORCARCHITECTURESUPPORT_H
-
-#include "IndirectionUtils.h"
-#include "llvm/Support/Memory.h"
-#include "llvm/Support/Process.h"
-
-namespace llvm {
-namespace orc {
-
-/// Generic ORC Architecture support.
-///
-/// This class can be substituted as the target architecure support class for
-/// ORC templates that require one (e.g. IndirectStubsManagers). It does not
-/// support lazy JITing however, and any attempt to use that functionality
-/// will result in execution of an llvm_unreachable.
-class OrcGenericArchitecture {
-public:
-  static const unsigned PointerSize = sizeof(uintptr_t);
-  static const unsigned TrampolineSize = 1;
-  static const unsigned ResolverCodeSize = 1;
-
-  typedef TargetAddress (*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
-
-  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
-                                void *CallbackMgr) {
-    llvm_unreachable("writeResolverCode is not supported by the generic host "
-                     "support class");
-  }
-
-  static void writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                               unsigned NumTrampolines) {
-    llvm_unreachable("writeTrampolines is not supported by the generic host "
-                     "support class");
-  }
-
-  class IndirectStubsInfo {
-  public:
-    const static unsigned StubSize = 1;
-    unsigned getNumStubs() const { llvm_unreachable("Not supported"); }
-    void *getStub(unsigned Idx) const { llvm_unreachable("Not supported"); }
-    void **getPtr(unsigned Idx) const { llvm_unreachable("Not supported"); }
-  };
-
-  static Error emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                      unsigned MinStubs, void *InitialPtrVal) {
-    llvm_unreachable("emitIndirectStubsBlock is not supported by the generic "
-                     "host support class");
-  }
-};
-
-/// @brief Provide information about stub blocks generated by the
-///        makeIndirectStubsBlock function.
-template <unsigned StubSizeVal> class GenericIndirectStubsInfo {
-public:
-  const static unsigned StubSize = StubSizeVal;
-
-  GenericIndirectStubsInfo() : NumStubs(0) {}
-  GenericIndirectStubsInfo(unsigned NumStubs, sys::OwningMemoryBlock StubsMem)
-      : NumStubs(NumStubs), StubsMem(std::move(StubsMem)) {}
-  GenericIndirectStubsInfo(GenericIndirectStubsInfo &&Other)
-      : NumStubs(Other.NumStubs), StubsMem(std::move(Other.StubsMem)) {
-    Other.NumStubs = 0;
-  }
-  GenericIndirectStubsInfo &operator=(GenericIndirectStubsInfo &&Other) {
-    NumStubs = Other.NumStubs;
-    Other.NumStubs = 0;
-    StubsMem = std::move(Other.StubsMem);
-    return *this;
-  }
-
-  /// @brief Number of stubs in this block.
-  unsigned getNumStubs() const { return NumStubs; }
-
-  /// @brief Get a pointer to the stub at the given index, which must be in
-  ///        the range 0 .. getNumStubs() - 1.
-  void *getStub(unsigned Idx) const {
-    return static_cast<char *>(StubsMem.base()) + Idx * StubSize;
-  }
-
-  /// @brief Get a pointer to the implementation-pointer at the given index,
-  ///        which must be in the range 0 .. getNumStubs() - 1.
-  void **getPtr(unsigned Idx) const {
-    char *PtrsBase = static_cast<char *>(StubsMem.base()) + NumStubs * StubSize;
-    return reinterpret_cast<void **>(PtrsBase) + Idx;
-  }
-
-private:
-  unsigned NumStubs;
-  sys::OwningMemoryBlock StubsMem;
-};
-
-class OrcAArch64 {
-public:
-  static const unsigned PointerSize = 8;
-  static const unsigned TrampolineSize = 12;
-  static const unsigned ResolverCodeSize = 0x120;
-
-  typedef GenericIndirectStubsInfo<8> IndirectStubsInfo;
-
-  typedef TargetAddress (*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
-
-  /// @brief Write the resolver code into the given memory. The user is be
-  ///        responsible for allocating the memory and setting permissions.
-  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
-                                void *CallbackMgr);
-
-  /// @brief Write the requsted number of trampolines into the given memory,
-  ///        which must be big enough to hold 1 pointer, plus NumTrampolines
-  ///        trampolines.
-  static void writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                               unsigned NumTrampolines);
-
-  /// @brief Emit at least MinStubs worth of indirect call stubs, rounded out to
-  ///        the nearest page size.
-  ///
-  ///   E.g. Asking for 4 stubs on x86-64, where stubs are 8-bytes, with 4k
-  /// pages will return a block of 512 stubs (4096 / 8 = 512). Asking for 513
-  /// will return a block of 1024 (2-pages worth).
-  static Error emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                      unsigned MinStubs, void *InitialPtrVal);
-};
-
-/// @brief X86_64 support.
-///
-/// X86_64 supports lazy JITing.
-class OrcX86_64 {
-public:
-  static const unsigned PointerSize = 8;
-  static const unsigned TrampolineSize = 8;
-  static const unsigned ResolverCodeSize = 0x6C;
-
-  typedef GenericIndirectStubsInfo<8> IndirectStubsInfo;
-
-  typedef TargetAddress (*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
-
-  /// @brief Write the resolver code into the given memory. The user is be
-  ///        responsible for allocating the memory and setting permissions.
-  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
-                                void *CallbackMgr);
-
-  /// @brief Write the requsted number of trampolines into the given memory,
-  ///        which must be big enough to hold 1 pointer, plus NumTrampolines
-  ///        trampolines.
-  static void writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                               unsigned NumTrampolines);
-
-  /// @brief Emit at least MinStubs worth of indirect call stubs, rounded out to
-  ///        the nearest page size.
-  ///
-  ///   E.g. Asking for 4 stubs on x86-64, where stubs are 8-bytes, with 4k
-  /// pages will return a block of 512 stubs (4096 / 8 = 512). Asking for 513
-  /// will return a block of 1024 (2-pages worth).
-  static Error emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                      unsigned MinStubs, void *InitialPtrVal);
-};
-
-/// @brief I386 support.
-///
-/// I386 supports lazy JITing.
-class OrcI386 {
-public:
-  static const unsigned PointerSize = 4;
-  static const unsigned TrampolineSize = 8;
-  static const unsigned ResolverCodeSize = 0x4a;
-
-  typedef GenericIndirectStubsInfo<8> IndirectStubsInfo;
-
-  typedef TargetAddress (*JITReentryFn)(void *CallbackMgr, void *TrampolineId);
-
-  /// @brief Write the resolver code into the given memory. The user is be
-  ///        responsible for allocating the memory and setting permissions.
-  static void writeResolverCode(uint8_t *ResolveMem, JITReentryFn Reentry,
-                                void *CallbackMgr);
-
-  /// @brief Write the requsted number of trampolines into the given memory,
-  ///        which must be big enough to hold 1 pointer, plus NumTrampolines
-  ///        trampolines.
-  static void writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                               unsigned NumTrampolines);
-
-  /// @brief Emit at least MinStubs worth of indirect call stubs, rounded out to
-  ///        the nearest page size.
-  ///
-  ///   E.g. Asking for 4 stubs on i386, where stubs are 8-bytes, with 4k
-  /// pages will return a block of 512 stubs (4096 / 8 = 512). Asking for 513
-  /// will return a block of 1024 (2-pages worth).
-  static Error emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                      unsigned MinStubs, void *InitialPtrVal);
-};
-
-} // End namespace orc.
-} // End namespace llvm.
-
-#endif // LLVM_EXECUTIONENGINE_ORC_ORCARCHITECTURESUPPORT_H

Modified: llvm/trunk/lib/ExecutionEngine/Orc/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/CMakeLists.txt?rev=268845&r1=268844&r2=268845&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/CMakeLists.txt (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/CMakeLists.txt Fri May  6 22:36:38 2016
@@ -2,7 +2,7 @@ add_llvm_library(LLVMOrcJIT
   ExecutionUtils.cpp
   IndirectionUtils.cpp
   NullResolver.cpp
-  OrcArchitectureSupport.cpp
+  OrcABISupport.cpp
   OrcCBindings.cpp
   OrcCBindingsStack.cpp
   OrcError.cpp

Copied: llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp (from r268796, llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp?p2=llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp&p1=llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp&r1=268796&r2=268845&rev=268845&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcABISupport.cpp Fri May  6 22:36:38 2016
@@ -1,4 +1,4 @@
-//===------ OrcArchSupport.cpp - Architecture specific support code -------===//
+//===------------- OrcABISupport.cpp - ABI specific support code ----------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
+#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
 #include "llvm/ADT/Triple.h"
 #include "llvm/Support/Process.h"
 
@@ -190,74 +190,9 @@ Error OrcAArch64::emitIndirectStubsBlock
   return Error::success();
 }
 
-void OrcX86_64::writeResolverCode(uint8_t *ResolverMem, JITReentryFn ReentryFn,
-                                  void *CallbackMgr) {
-
-  const uint8_t ResolverCode[] = {
-      // resolver_entry:
-      0x55,                                     // 0x00: pushq     %rbp
-      0x48, 0x89, 0xe5,                         // 0x01: movq      %rsp, %rbp
-      0x50,                                     // 0x04: pushq     %rax
-      0x53,                                     // 0x05: pushq     %rbx
-      0x51,                                     // 0x06: pushq     %rcx
-      0x52,                                     // 0x07: pushq     %rdx
-      0x56,                                     // 0x08: pushq     %rsi
-      0x57,                                     // 0x09: pushq     %rdi
-      0x41, 0x50,                               // 0x0a: pushq     %r8
-      0x41, 0x51,                               // 0x0c: pushq     %r9
-      0x41, 0x52,                               // 0x0e: pushq     %r10
-      0x41, 0x53,                               // 0x10: pushq     %r11
-      0x41, 0x54,                               // 0x12: pushq     %r12
-      0x41, 0x55,                               // 0x14: pushq     %r13
-      0x41, 0x56,                               // 0x16: pushq     %r14
-      0x41, 0x57,                               // 0x18: pushq     %r15
-      0x48, 0x81, 0xec, 0x08, 0x02, 0x00, 0x00, // 0x1a: subq      0x208, %rsp
-      0x48, 0x0f, 0xae, 0x04, 0x24,             // 0x21: fxsave64  (%rsp)
-      0x48, 0xbf,                               // 0x26: movabsq   <CBMgr>, %rdi
-
-      // 0x28: Callback manager addr.
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-      0x48, 0x8b, 0x75, 0x08, // 0x30: movq      8(%rbp), %rsi
-      0x48, 0x83, 0xee, 0x06, // 0x34: subq      $6, %rsi
-      0x48, 0xb8,             // 0x38: movabsq   <REntry>, %rax
-
-      // 0x3a: JIT re-entry fn addr:
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-      0xff, 0xd0,                               // 0x42: callq     *%rax
-      0x48, 0x89, 0x45, 0x08,                   // 0x44: movq      %rax, 8(%rbp)
-      0x48, 0x0f, 0xae, 0x0c, 0x24,             // 0x48: fxrstor64 (%rsp)
-      0x48, 0x81, 0xc4, 0x08, 0x02, 0x00, 0x00, // 0x4d: addq      0x208, %rsp
-      0x41, 0x5f,                               // 0x54: popq      %r15
-      0x41, 0x5e,                               // 0x56: popq      %r14
-      0x41, 0x5d,                               // 0x58: popq      %r13
-      0x41, 0x5c,                               // 0x5a: popq      %r12
-      0x41, 0x5b,                               // 0x5c: popq      %r11
-      0x41, 0x5a,                               // 0x5e: popq      %r10
-      0x41, 0x59,                               // 0x60: popq      %r9
-      0x41, 0x58,                               // 0x62: popq      %r8
-      0x5f,                                     // 0x64: popq      %rdi
-      0x5e,                                     // 0x65: popq      %rsi
-      0x5a,                                     // 0x66: popq      %rdx
-      0x59,                                     // 0x67: popq      %rcx
-      0x5b,                                     // 0x68: popq      %rbx
-      0x58,                                     // 0x69: popq      %rax
-      0x5d,                                     // 0x6a: popq      %rbp
-      0xc3,                                     // 0x6b: retq
-  };
-
-  const unsigned ReentryFnAddrOffset = 0x3a;
-  const unsigned CallbackMgrAddrOffset = 0x28;
-
-  memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
-  memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
-  memcpy(ResolverMem + CallbackMgrAddrOffset, &CallbackMgr,
-         sizeof(CallbackMgr));
-}
-
-void OrcX86_64::writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                                 unsigned NumTrampolines) {
+void OrcX86_64_Base::writeTrampolines(uint8_t *TrampolineMem,
+                                      void *ResolverAddr,
+                                      unsigned NumTrampolines) {
 
   unsigned OffsetToPtr = NumTrampolines * TrampolineSize;
 
@@ -270,9 +205,9 @@ void OrcX86_64::writeTrampolines(uint8_t
     Trampolines[I] = CallIndirPCRel | ((OffsetToPtr - 6) << 16);
 }
 
-Error OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                        unsigned MinStubs,
-                                        void *InitialPtrVal) {
+Error OrcX86_64_Base::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
+                                             unsigned MinStubs,
+                                             void *InitialPtrVal) {
   // Stub format is:
   //
   // .section __orc_stubs
@@ -336,6 +271,149 @@ Error OrcX86_64::emitIndirectStubsBlock(
   return Error::success();
 }
 
+void OrcX86_64_SysV::writeResolverCode(uint8_t *ResolverMem,
+                                       JITReentryFn ReentryFn,
+                                       void *CallbackMgr) {
+
+  const uint8_t ResolverCode[] = {
+      // resolver_entry:
+      0x55,                                     // 0x00: pushq     %rbp
+      0x48, 0x89, 0xe5,                         // 0x01: movq      %rsp, %rbp
+      0x50,                                     // 0x04: pushq     %rax
+      0x53,                                     // 0x05: pushq     %rbx
+      0x51,                                     // 0x06: pushq     %rcx
+      0x52,                                     // 0x07: pushq     %rdx
+      0x56,                                     // 0x08: pushq     %rsi
+      0x57,                                     // 0x09: pushq     %rdi
+      0x41, 0x50,                               // 0x0a: pushq     %r8
+      0x41, 0x51,                               // 0x0c: pushq     %r9
+      0x41, 0x52,                               // 0x0e: pushq     %r10
+      0x41, 0x53,                               // 0x10: pushq     %r11
+      0x41, 0x54,                               // 0x12: pushq     %r12
+      0x41, 0x55,                               // 0x14: pushq     %r13
+      0x41, 0x56,                               // 0x16: pushq     %r14
+      0x41, 0x57,                               // 0x18: pushq     %r15
+      0x48, 0x81, 0xec, 0x08, 0x02, 0x00, 0x00, // 0x1a: subq      0x208, %rsp
+      0x48, 0x0f, 0xae, 0x04, 0x24,             // 0x21: fxsave64  (%rsp)
+      0x48, 0xbf,                               // 0x26: movabsq   <CBMgr>, %rdi
+
+      // 0x28: Callback manager addr.
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+      0x48, 0x8b, 0x75, 0x08,                   // 0x30: movq      8(%rbp), %rsi
+      0x48, 0x83, 0xee, 0x06,                   // 0x34: subq      $6, %rsi
+      0x48, 0xb8,                               // 0x38: movabsq   <REntry>, %rax
+
+      // 0x3a: JIT re-entry fn addr:
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+      0xff, 0xd0,                               // 0x42: callq     *%rax
+      0x48, 0x89, 0x45, 0x08,                   // 0x44: movq      %rax, 8(%rbp)
+      0x48, 0x0f, 0xae, 0x0c, 0x24,             // 0x48: fxrstor64 (%rsp)
+      0x48, 0x81, 0xc4, 0x08, 0x02, 0x00, 0x00, // 0x4d: addq      0x208, %rsp
+      0x41, 0x5f,                               // 0x54: popq      %r15
+      0x41, 0x5e,                               // 0x56: popq      %r14
+      0x41, 0x5d,                               // 0x58: popq      %r13
+      0x41, 0x5c,                               // 0x5a: popq      %r12
+      0x41, 0x5b,                               // 0x5c: popq      %r11
+      0x41, 0x5a,                               // 0x5e: popq      %r10
+      0x41, 0x59,                               // 0x60: popq      %r9
+      0x41, 0x58,                               // 0x62: popq      %r8
+      0x5f,                                     // 0x64: popq      %rdi
+      0x5e,                                     // 0x65: popq      %rsi
+      0x5a,                                     // 0x66: popq      %rdx
+      0x59,                                     // 0x67: popq      %rcx
+      0x5b,                                     // 0x68: popq      %rbx
+      0x58,                                     // 0x69: popq      %rax
+      0x5d,                                     // 0x6a: popq      %rbp
+      0xc3,                                     // 0x6b: retq
+  };
+
+  const unsigned ReentryFnAddrOffset = 0x3a;
+  const unsigned CallbackMgrAddrOffset = 0x28;
+
+  memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
+  memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
+  memcpy(ResolverMem + CallbackMgrAddrOffset, &CallbackMgr,
+         sizeof(CallbackMgr));
+}
+
+void OrcX86_64_Win32::writeResolverCode(uint8_t *ResolverMem,
+                                        JITReentryFn ReentryFn,
+                                        void *CallbackMgr) {
+
+  // resolverCode is similar to OrcX86_64 with differences specific to windows x64 calling convention:
+  // arguments go into rcx, rdx and come in reverse order, shadow space allocation on stack
+  const uint8_t ResolverCode[] = {
+      // resolver_entry:
+      0x55,                                      // 0x00: pushq     %rbp
+      0x48, 0x89, 0xe5,                          // 0x01: movq      %rsp, %rbp
+      0x50,                                      // 0x04: pushq     %rax
+      0x53,                                      // 0x05: pushq     %rbx
+      0x51,                                      // 0x06: pushq     %rcx
+      0x52,                                      // 0x07: pushq     %rdx
+      0x56,                                      // 0x08: pushq     %rsi
+      0x57,                                      // 0x09: pushq     %rdi
+      0x41, 0x50,                                // 0x0a: pushq     %r8
+      0x41, 0x51,                                // 0x0c: pushq     %r9
+      0x41, 0x52,                                // 0x0e: pushq     %r10
+      0x41, 0x53,                                // 0x10: pushq     %r11
+      0x41, 0x54,                                // 0x12: pushq     %r12
+      0x41, 0x55,                                // 0x14: pushq     %r13
+      0x41, 0x56,                                // 0x16: pushq     %r14
+      0x41, 0x57,                                // 0x18: pushq     %r15
+      0x48, 0x81, 0xec, 0x08, 0x02, 0x00, 0x00,  // 0x1a: subq      0x208, %rsp
+      0x48, 0x0f, 0xae, 0x04, 0x24,              // 0x21: fxsave64  (%rsp)
+
+      0x48, 0xb9,                                // 0x26: movabsq   <CBMgr>, %rcx
+      // 0x28: Callback manager addr.
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+      0x48, 0x8B, 0x55, 0x08,                    // 0x30: mov       rdx, [rbp+0x8]
+      0x48, 0x83, 0xea, 0x06,                    // 0x34: sub       rdx, 0x6
+
+      0x48, 0xb8,                                // 0x38: movabsq   <REntry>, %rax
+      // 0x3a: JIT re-entry fn addr:
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+      // 0x42: sub       rsp, 0x20 (Allocate shadow space)
+      0x48, 0x83, 0xEC, 0x20,
+      0xff, 0xd0,                                // 0x46: callq     *%rax
+
+      // 0x48: add       rsp, 0x20 (Free shadow space)
+      0x48, 0x83, 0xC4, 0x20,
+
+      0x48, 0x89, 0x45, 0x08,                    // 0x4C: movq      %rax, 8(%rbp)
+      0x48, 0x0f, 0xae, 0x0c, 0x24,              // 0x50: fxrstor64 (%rsp)
+      0x48, 0x81, 0xc4, 0x08, 0x02, 0x00, 0x00,  // 0x55: addq      0x208, %rsp
+      0x41, 0x5f,                                // 0x5C: popq      %r15
+      0x41, 0x5e,                                // 0x5E: popq      %r14
+      0x41, 0x5d,                                // 0x60: popq      %r13
+      0x41, 0x5c,                                // 0x62: popq      %r12
+      0x41, 0x5b,                                // 0x64: popq      %r11
+      0x41, 0x5a,                                // 0x66: popq      %r10
+      0x41, 0x59,                                // 0x68: popq      %r9
+      0x41, 0x58,                                // 0x6a: popq      %r8
+      0x5f,                                      // 0x6c: popq      %rdi
+      0x5e,                                      // 0x6d: popq      %rsi
+      0x5a,                                      // 0x6e: popq      %rdx
+      0x59,                                      // 0x6f: popq      %rcx
+      0x5b,                                      // 0x70: popq      %rbx
+      0x58,                                      // 0x71: popq      %rax
+      0x5d,                                      // 0x72: popq      %rbp
+      0xc3,                                      // 0x73: retq
+  };
+
+
+  const unsigned ReentryFnAddrOffset = 0x3a;
+  const unsigned CallbackMgrAddrOffset = 0x28;
+
+  memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
+  memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
+  memcpy(ResolverMem + CallbackMgrAddrOffset, &CallbackMgr,
+         sizeof(CallbackMgr));
+}
+
 void OrcI386::writeResolverCode(uint8_t *ResolverMem, JITReentryFn ReentryFn,
                                 void *CallbackMgr) {
 

Removed: llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp?rev=268844&view=auto
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcArchitectureSupport.cpp (removed)
@@ -1,464 +0,0 @@
-//===------ OrcArchSupport.cpp - Architecture specific support code -------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
-#include "llvm/ADT/Triple.h"
-#include "llvm/Support/Process.h"
-
-namespace llvm {
-namespace orc {
-
-void OrcAArch64::writeResolverCode(uint8_t *ResolverMem, JITReentryFn ReentryFn,
-                                   void *CallbackMgr) {
-
-  const uint32_t ResolverCode[] = {
-    // resolver_entry:
-    0xa9bf47fd,        // 0x000:  stp  x29, x17, [sp, #-16]!
-    0x910003fd,        // 0x004:  mov  x29, sp
-    0xa9bf73fb,        // 0x008:  stp  x27, x28, [sp, #-16]!
-    0xa9bf6bf9,        // 0x00c:  stp  x25, x26, [sp, #-16]!
-    0xa9bf63f7,        // 0x010:  stp  x23, x24, [sp, #-16]!
-    0xa9bf5bf5,        // 0x014:  stp  x21, x22, [sp, #-16]!
-    0xa9bf53f3,        // 0x018:  stp  x19, x20, [sp, #-16]!
-    0xa9bf3fee,        // 0x01c:  stp  x14, x15, [sp, #-16]!
-    0xa9bf37ec,        // 0x020:  stp  x12, x13, [sp, #-16]!
-    0xa9bf2fea,        // 0x024:  stp  x10, x11, [sp, #-16]!
-    0xa9bf27e8,        // 0x028:  stp   x8,  x9, [sp, #-16]!
-    0xa9bf1fe6,        // 0x02c:  stp   x6,  x7, [sp, #-16]!
-    0xa9bf17e4,        // 0x030:  stp   x4,  x5, [sp, #-16]!
-    0xa9bf0fe2,        // 0x034:  stp   x2,  x3, [sp, #-16]!
-    0xa9bf07e0,        // 0x038:  stp   x0,  x1, [sp, #-16]!
-    0xadbf7ffe,        // 0x03c:  stp  q30, q31, [sp, #-32]!
-    0xadbf77fc,        // 0x040:  stp  q28, q29, [sp, #-32]!
-    0xadbf6ffa,        // 0x044:  stp  q26, q27, [sp, #-32]!
-    0xadbf67f8,        // 0x048:  stp  q24, q25, [sp, #-32]!
-    0xadbf5ff6,        // 0x04c:  stp  q22, q23, [sp, #-32]!
-    0xadbf57f4,        // 0x050:  stp  q20, q21, [sp, #-32]!
-    0xadbf4ff2,        // 0x054:  stp  q18, q19, [sp, #-32]!
-    0xadbf47f0,        // 0x058:  stp  q16, q17, [sp, #-32]!
-    0xadbf3fee,        // 0x05c:  stp  q14, q15, [sp, #-32]!
-    0xadbf37ec,        // 0x060:  stp  q12, q13, [sp, #-32]!
-    0xadbf2fea,        // 0x064:  stp  q10, q11, [sp, #-32]!
-    0xadbf27e8,        // 0x068:  stp   q8,  q9, [sp, #-32]!
-    0xadbf1fe6,        // 0x06c:  stp   q6,  q7, [sp, #-32]!
-    0xadbf17e4,        // 0x070:  stp   q4,  q5, [sp, #-32]!
-    0xadbf0fe2,        // 0x074:  stp   q2,  q3, [sp, #-32]!
-    0xadbf07e0,        // 0x078:  stp   q0,  q1, [sp, #-32]!
-    0x580004e0,        // 0x07c:  ldr   x0, Lcallbackmgr
-    0xaa1e03e1,        // 0x080:  mov   x1, x30
-    0xd1003021,        // 0x084:  sub   x1,  x1, #12
-    0x58000442,        // 0x088:  ldr   x2, Lreentry_fn_ptr
-    0xd63f0040,        // 0x08c:  blr   x2
-    0xaa0003f1,        // 0x090:  mov   x17, x0
-    0xacc107e0,        // 0x094:  ldp   q0,  q1, [sp], #32
-    0xacc10fe2,        // 0x098:  ldp   q2,  q3, [sp], #32
-    0xacc117e4,        // 0x09c:  ldp   q4,  q5, [sp], #32
-    0xacc11fe6,        // 0x0a0:  ldp   q6,  q7, [sp], #32
-    0xacc127e8,        // 0x0a4:  ldp   q8,  q9, [sp], #32
-    0xacc12fea,        // 0x0a8:  ldp  q10, q11, [sp], #32
-    0xacc137ec,        // 0x0ac:  ldp  q12, q13, [sp], #32
-    0xacc13fee,        // 0x0b0:  ldp  q14, q15, [sp], #32
-    0xacc147f0,        // 0x0b4:  ldp  q16, q17, [sp], #32
-    0xacc14ff2,        // 0x0b8:  ldp  q18, q19, [sp], #32
-    0xacc157f4,        // 0x0bc:  ldp  q20, q21, [sp], #32
-    0xacc15ff6,        // 0x0c0:  ldp  q22, q23, [sp], #32
-    0xacc167f8,        // 0x0c4:  ldp  q24, q25, [sp], #32
-    0xacc16ffa,        // 0x0c8:  ldp  q26, q27, [sp], #32
-    0xacc177fc,        // 0x0cc:  ldp  q28, q29, [sp], #32
-    0xacc17ffe,        // 0x0d0:  ldp  q30, q31, [sp], #32
-    0xa8c107e0,        // 0x0d4:  ldp   x0,  x1, [sp], #16
-    0xa8c10fe2,        // 0x0d8:  ldp   x2,  x3, [sp], #16
-    0xa8c117e4,        // 0x0dc:  ldp   x4,  x5, [sp], #16
-    0xa8c11fe6,        // 0x0e0:  ldp   x6,  x7, [sp], #16
-    0xa8c127e8,        // 0x0e4:  ldp   x8,  x9, [sp], #16
-    0xa8c12fea,        // 0x0e8:  ldp  x10, x11, [sp], #16
-    0xa8c137ec,        // 0x0ec:  ldp  x12, x13, [sp], #16
-    0xa8c13fee,        // 0x0f0:  ldp  x14, x15, [sp], #16
-    0xa8c153f3,        // 0x0f4:  ldp  x19, x20, [sp], #16
-    0xa8c15bf5,        // 0x0f8:  ldp  x21, x22, [sp], #16
-    0xa8c163f7,        // 0x0fc:  ldp  x23, x24, [sp], #16
-    0xa8c16bf9,        // 0x100:  ldp  x25, x26, [sp], #16
-    0xa8c173fb,        // 0x104:  ldp  x27, x28, [sp], #16
-    0xa8c17bfd,        // 0x108:  ldp  x29, x30, [sp], #16
-    0xd65f0220,        // 0x10c:  ret  x17
-    0x01234567,        // 0x110:  Lreentry_fn_ptr:
-    0xdeadbeef,        // 0x114:      .quad 0
-    0x98765432,        // 0x118:  Lcallbackmgr:
-    0xcafef00d         // 0x11c:      .quad 0
-  };
-
-  const unsigned ReentryFnAddrOffset = 0x110;
-  const unsigned CallbackMgrAddrOffset = 0x118;
-
-  memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
-  memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
-  memcpy(ResolverMem + CallbackMgrAddrOffset, &CallbackMgr,
-         sizeof(CallbackMgr));
-}
-
-void OrcAArch64::writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                                  unsigned NumTrampolines) {
-
-  unsigned OffsetToPtr = alignTo(NumTrampolines * TrampolineSize, 8);
-
-  memcpy(TrampolineMem + OffsetToPtr, &ResolverAddr, sizeof(void *));
-
-  // OffsetToPtr is actually the offset from the PC for the 2nd instruction, so
-  // subtract 32-bits.
-  OffsetToPtr -= 4;
-
-  uint32_t *Trampolines = reinterpret_cast<uint32_t *>(TrampolineMem);
-
-  for (unsigned I = 0; I < NumTrampolines; ++I, OffsetToPtr -= TrampolineSize) {
-    Trampolines[3 * I + 0] = 0xaa1e03f1;                      // mov x17, x30
-    Trampolines[3 * I + 1] = 0x58000010 | (OffsetToPtr << 3); // mov x16, Lptr
-    Trampolines[3 * I + 2] = 0xd63f0200;                      // blr x16
-  }
-
-}
-
-Error OrcAArch64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                         unsigned MinStubs,
-                                         void *InitialPtrVal) {
-  // Stub format is:
-  //
-  // .section __orc_stubs
-  // stub1:
-  //                 ldr     x0, ptr1       ; PC-rel load of ptr1
-  //                 br      x0             ; Jump to resolver
-  // stub2:
-  //                 ldr     x0, ptr2       ; PC-rel load of ptr2
-  //                 br      x0             ; Jump to resolver
-  //
-  // ...
-  //
-  // .section __orc_ptrs
-  // ptr1:
-  //                 .quad 0x0
-  // ptr2:
-  //                 .quad 0x0
-  //
-  // ...
-
-  const unsigned StubSize = IndirectStubsInfo::StubSize;
-
-  // Emit at least MinStubs, rounded up to fill the pages allocated.
-  unsigned PageSize = sys::Process::getPageSize();
-  unsigned NumPages = ((MinStubs * StubSize) + (PageSize - 1)) / PageSize;
-  unsigned NumStubs = (NumPages * PageSize) / StubSize;
-
-  // Allocate memory for stubs and pointers in one call.
-  std::error_code EC;
-  auto StubsMem = sys::OwningMemoryBlock(sys::Memory::allocateMappedMemory(
-      2 * NumPages * PageSize, nullptr,
-      sys::Memory::MF_READ | sys::Memory::MF_WRITE, EC));
-
-  if (EC)
-    return errorCodeToError(EC);
-
-  // Create separate MemoryBlocks representing the stubs and pointers.
-  sys::MemoryBlock StubsBlock(StubsMem.base(), NumPages * PageSize);
-  sys::MemoryBlock PtrsBlock(static_cast<char *>(StubsMem.base()) +
-                                 NumPages * PageSize,
-                             NumPages * PageSize);
-
-  // Populate the stubs page stubs and mark it executable.
-  uint64_t *Stub = reinterpret_cast<uint64_t *>(StubsBlock.base());
-  uint64_t PtrOffsetField = static_cast<uint64_t>(NumPages * PageSize)
-                            << 3;
-
-  for (unsigned I = 0; I < NumStubs; ++I)
-    Stub[I] = 0xd61f020058000010 | PtrOffsetField;
-
-  if (auto EC = sys::Memory::protectMappedMemory(
-          StubsBlock, sys::Memory::MF_READ | sys::Memory::MF_EXEC))
-    return errorCodeToError(EC);
-
-  // Initialize all pointers to point at FailureAddress.
-  void **Ptr = reinterpret_cast<void **>(PtrsBlock.base());
-  for (unsigned I = 0; I < NumStubs; ++I)
-    Ptr[I] = InitialPtrVal;
-
-  StubsInfo = IndirectStubsInfo(NumStubs, std::move(StubsMem));
-
-  return Error::success();
-}
-
-void OrcX86_64::writeResolverCode(uint8_t *ResolverMem, JITReentryFn ReentryFn,
-                                  void *CallbackMgr) {
-
-  const uint8_t ResolverCode[] = {
-      // resolver_entry:
-      0x55,                                     // 0x00: pushq     %rbp
-      0x48, 0x89, 0xe5,                         // 0x01: movq      %rsp, %rbp
-      0x50,                                     // 0x04: pushq     %rax
-      0x53,                                     // 0x05: pushq     %rbx
-      0x51,                                     // 0x06: pushq     %rcx
-      0x52,                                     // 0x07: pushq     %rdx
-      0x56,                                     // 0x08: pushq     %rsi
-      0x57,                                     // 0x09: pushq     %rdi
-      0x41, 0x50,                               // 0x0a: pushq     %r8
-      0x41, 0x51,                               // 0x0c: pushq     %r9
-      0x41, 0x52,                               // 0x0e: pushq     %r10
-      0x41, 0x53,                               // 0x10: pushq     %r11
-      0x41, 0x54,                               // 0x12: pushq     %r12
-      0x41, 0x55,                               // 0x14: pushq     %r13
-      0x41, 0x56,                               // 0x16: pushq     %r14
-      0x41, 0x57,                               // 0x18: pushq     %r15
-      0x48, 0x81, 0xec, 0x08, 0x02, 0x00, 0x00, // 0x1a: subq      0x208, %rsp
-      0x48, 0x0f, 0xae, 0x04, 0x24,             // 0x21: fxsave64  (%rsp)
-      0x48, 0xbf,                               // 0x26: movabsq   <CBMgr>, %rdi
-
-      // 0x28: Callback manager addr.
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-      0x48, 0x8b, 0x75, 0x08, // 0x30: movq      8(%rbp), %rsi
-      0x48, 0x83, 0xee, 0x06, // 0x34: subq      $6, %rsi
-      0x48, 0xb8,             // 0x38: movabsq   <REntry>, %rax
-
-      // 0x3a: JIT re-entry fn addr:
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-      0xff, 0xd0,                               // 0x42: callq     *%rax
-      0x48, 0x89, 0x45, 0x08,                   // 0x44: movq      %rax, 8(%rbp)
-      0x48, 0x0f, 0xae, 0x0c, 0x24,             // 0x48: fxrstor64 (%rsp)
-      0x48, 0x81, 0xc4, 0x08, 0x02, 0x00, 0x00, // 0x4d: addq      0x208, %rsp
-      0x41, 0x5f,                               // 0x54: popq      %r15
-      0x41, 0x5e,                               // 0x56: popq      %r14
-      0x41, 0x5d,                               // 0x58: popq      %r13
-      0x41, 0x5c,                               // 0x5a: popq      %r12
-      0x41, 0x5b,                               // 0x5c: popq      %r11
-      0x41, 0x5a,                               // 0x5e: popq      %r10
-      0x41, 0x59,                               // 0x60: popq      %r9
-      0x41, 0x58,                               // 0x62: popq      %r8
-      0x5f,                                     // 0x64: popq      %rdi
-      0x5e,                                     // 0x65: popq      %rsi
-      0x5a,                                     // 0x66: popq      %rdx
-      0x59,                                     // 0x67: popq      %rcx
-      0x5b,                                     // 0x68: popq      %rbx
-      0x58,                                     // 0x69: popq      %rax
-      0x5d,                                     // 0x6a: popq      %rbp
-      0xc3,                                     // 0x6b: retq
-  };
-
-  const unsigned ReentryFnAddrOffset = 0x3a;
-  const unsigned CallbackMgrAddrOffset = 0x28;
-
-  memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
-  memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
-  memcpy(ResolverMem + CallbackMgrAddrOffset, &CallbackMgr,
-         sizeof(CallbackMgr));
-}
-
-void OrcX86_64::writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                                 unsigned NumTrampolines) {
-
-  unsigned OffsetToPtr = NumTrampolines * TrampolineSize;
-
-  memcpy(TrampolineMem + OffsetToPtr, &ResolverAddr, sizeof(void *));
-
-  uint64_t *Trampolines = reinterpret_cast<uint64_t *>(TrampolineMem);
-  uint64_t CallIndirPCRel = 0xf1c40000000015ff;
-
-  for (unsigned I = 0; I < NumTrampolines; ++I, OffsetToPtr -= TrampolineSize)
-    Trampolines[I] = CallIndirPCRel | ((OffsetToPtr - 6) << 16);
-}
-
-Error OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                        unsigned MinStubs,
-                                        void *InitialPtrVal) {
-  // Stub format is:
-  //
-  // .section __orc_stubs
-  // stub1:
-  //                 jmpq    *ptr1(%rip)
-  //                 .byte   0xC4         ; <- Invalid opcode padding.
-  //                 .byte   0xF1
-  // stub2:
-  //                 jmpq    *ptr2(%rip)
-  //
-  // ...
-  //
-  // .section __orc_ptrs
-  // ptr1:
-  //                 .quad 0x0
-  // ptr2:
-  //                 .quad 0x0
-  //
-  // ...
-
-  const unsigned StubSize = IndirectStubsInfo::StubSize;
-
-  // Emit at least MinStubs, rounded up to fill the pages allocated.
-  unsigned PageSize = sys::Process::getPageSize();
-  unsigned NumPages = ((MinStubs * StubSize) + (PageSize - 1)) / PageSize;
-  unsigned NumStubs = (NumPages * PageSize) / StubSize;
-
-  // Allocate memory for stubs and pointers in one call.
-  std::error_code EC;
-  auto StubsMem = sys::OwningMemoryBlock(sys::Memory::allocateMappedMemory(
-      2 * NumPages * PageSize, nullptr,
-      sys::Memory::MF_READ | sys::Memory::MF_WRITE, EC));
-
-  if (EC)
-    return errorCodeToError(EC);
-
-  // Create separate MemoryBlocks representing the stubs and pointers.
-  sys::MemoryBlock StubsBlock(StubsMem.base(), NumPages * PageSize);
-  sys::MemoryBlock PtrsBlock(static_cast<char *>(StubsMem.base()) +
-                                 NumPages * PageSize,
-                             NumPages * PageSize);
-
-  // Populate the stubs page stubs and mark it executable.
-  uint64_t *Stub = reinterpret_cast<uint64_t *>(StubsBlock.base());
-  uint64_t PtrOffsetField = static_cast<uint64_t>(NumPages * PageSize - 6)
-                            << 16;
-  for (unsigned I = 0; I < NumStubs; ++I)
-    Stub[I] = 0xF1C40000000025ff | PtrOffsetField;
-
-  if (auto EC = sys::Memory::protectMappedMemory(
-          StubsBlock, sys::Memory::MF_READ | sys::Memory::MF_EXEC))
-    return errorCodeToError(EC);
-
-  // Initialize all pointers to point at FailureAddress.
-  void **Ptr = reinterpret_cast<void **>(PtrsBlock.base());
-  for (unsigned I = 0; I < NumStubs; ++I)
-    Ptr[I] = InitialPtrVal;
-
-  StubsInfo = IndirectStubsInfo(NumStubs, std::move(StubsMem));
-
-  return Error::success();
-}
-
-void OrcI386::writeResolverCode(uint8_t *ResolverMem, JITReentryFn ReentryFn,
-                                void *CallbackMgr) {
-
-  const uint8_t ResolverCode[] = {
-      // resolver_entry:
-      0x55,                               // 0x00: pushl    %ebp
-      0x89, 0xe5,                         // 0x01: movl     %esp, %ebp
-      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 = 0x2a;
-  const unsigned CallbackMgrAddrOffset = 0x25;
-
-  memcpy(ResolverMem, ResolverCode, sizeof(ResolverCode));
-  memcpy(ResolverMem + ReentryFnAddrOffset, &ReentryFn, sizeof(ReentryFn));
-  memcpy(ResolverMem + CallbackMgrAddrOffset, &CallbackMgr,
-         sizeof(CallbackMgr));
-}
-
-void OrcI386::writeTrampolines(uint8_t *TrampolineMem, void *ResolverAddr,
-                               unsigned NumTrampolines) {
-
-  uint64_t CallRelImm = 0xF1C4C400000000e8;
-  uint64_t Resolver = reinterpret_cast<uint64_t>(ResolverAddr);
-  uint64_t ResolverRel =
-      Resolver - reinterpret_cast<uint64_t>(TrampolineMem) - 5;
-
-  uint64_t *Trampolines = reinterpret_cast<uint64_t *>(TrampolineMem);
-  for (unsigned I = 0; I < NumTrampolines; ++I, ResolverRel -= TrampolineSize)
-    Trampolines[I] = CallRelImm | (ResolverRel << 8);
-}
-
-Error OrcI386::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
-                                      unsigned MinStubs, void *InitialPtrVal) {
-  // Stub format is:
-  //
-  // .section __orc_stubs
-  // stub1:
-  //                 jmpq    *ptr1
-  //                 .byte   0xC4         ; <- Invalid opcode padding.
-  //                 .byte   0xF1
-  // stub2:
-  //                 jmpq    *ptr2
-  //
-  // ...
-  //
-  // .section __orc_ptrs
-  // ptr1:
-  //                 .quad 0x0
-  // ptr2:
-  //                 .quad 0x0
-  //
-  // ...
-
-  const unsigned StubSize = IndirectStubsInfo::StubSize;
-
-  // Emit at least MinStubs, rounded up to fill the pages allocated.
-  unsigned PageSize = sys::Process::getPageSize();
-  unsigned NumPages = ((MinStubs * StubSize) + (PageSize - 1)) / PageSize;
-  unsigned NumStubs = (NumPages * PageSize) / StubSize;
-
-  // Allocate memory for stubs and pointers in one call.
-  std::error_code EC;
-  auto StubsMem = sys::OwningMemoryBlock(sys::Memory::allocateMappedMemory(
-      2 * NumPages * PageSize, nullptr,
-      sys::Memory::MF_READ | sys::Memory::MF_WRITE, EC));
-
-  if (EC)
-    return errorCodeToError(EC);
-
-  // Create separate MemoryBlocks representing the stubs and pointers.
-  sys::MemoryBlock StubsBlock(StubsMem.base(), NumPages * PageSize);
-  sys::MemoryBlock PtrsBlock(static_cast<char *>(StubsMem.base()) +
-                                 NumPages * PageSize,
-                             NumPages * PageSize);
-
-  // Populate the stubs page stubs and mark it executable.
-  uint64_t *Stub = reinterpret_cast<uint64_t *>(StubsBlock.base());
-  uint64_t PtrAddr = reinterpret_cast<uint64_t>(PtrsBlock.base());
-  for (unsigned I = 0; I < NumStubs; ++I, PtrAddr += 4)
-    Stub[I] = 0xF1C40000000025ff | (PtrAddr << 16);
-
-  if (auto EC = sys::Memory::protectMappedMemory(
-          StubsBlock, sys::Memory::MF_READ | sys::Memory::MF_EXEC))
-    return errorCodeToError(EC);
-
-  // Initialize all pointers to point at FailureAddress.
-  void **Ptr = reinterpret_cast<void **>(PtrsBlock.base());
-  for (unsigned I = 0; I < NumStubs; ++I)
-    Ptr[I] = InitialPtrVal;
-
-  StubsInfo = IndirectStubsInfo(NumStubs, std::move(StubsMem));
-
-  return Error::success();
-}
-
-} // End namespace orc.
-} // End namespace llvm.

Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp?rev=268845&r1=268844&r2=268845&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcCBindingsStack.cpp Fri May  6 22:36:38 2016
@@ -9,7 +9,7 @@
 
 #include "OrcCBindingsStack.h"
 
-#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
+#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/DynamicLibrary.h"
 #include <cstdio>
@@ -29,8 +29,13 @@ OrcCBindingsStack::createCompileCallback
   };
 
   case Triple::x86_64: {
-    typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64> CCMgrT;
-    return llvm::make_unique<CCMgrT>(0);
+    if ( T.getOS() == Triple::OSType::Win32 ) {
+      typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_Win32> CCMgrT;
+      return llvm::make_unique<CCMgrT>(0);
+    } else {
+      typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_SysV> CCMgrT;
+      return llvm::make_unique<CCMgrT>(0);
+    }
   }
   }
 }
@@ -47,9 +52,16 @@ OrcCBindingsStack::createIndirectStubsMg
     };
 
   case Triple::x86_64:
-    return []() {
-      return llvm::make_unique<
-          orc::LocalIndirectStubsManager<orc::OrcX86_64>>();
-    };
+    if (T.getOS() == Triple::OSType::Win32) {
+      return [](){
+        return llvm::make_unique<
+          orc::LocalIndirectStubsManager<orc::OrcX86_64_Win32>>();
+      };
+    } else {
+      return [](){
+        return llvm::make_unique<
+          orc::LocalIndirectStubsManager<orc::OrcX86_64_SysV>>();
+      };
+    }
   }
 }

Modified: llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp?rev=268845&r1=268844&r2=268845&view=diff
==============================================================================
--- llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp (original)
+++ llvm/trunk/tools/lli/ChildTarget/ChildTarget.cpp Fri May  6 22:36:38 2016
@@ -1,4 +1,4 @@
-#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
+#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
 #include "llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/DynamicLibrary.h"
@@ -12,7 +12,7 @@ using namespace llvm::orc;
 using namespace llvm::sys;
 
 #ifdef __x86_64__
-typedef OrcX86_64 HostOrcArch;
+typedef OrcX86_64_SysV HostOrcArch;
 #else
 typedef OrcGenericArchitecture HostOrcArch;
 #endif

Modified: llvm/trunk/tools/lli/OrcLazyJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/OrcLazyJIT.cpp?rev=268845&r1=268844&r2=268845&view=diff
==============================================================================
--- llvm/trunk/tools/lli/OrcLazyJIT.cpp (original)
+++ llvm/trunk/tools/lli/OrcLazyJIT.cpp Fri May  6 22:36:38 2016
@@ -8,7 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "OrcLazyJIT.h"
-#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h"
+#include "llvm/ExecutionEngine/Orc/OrcABISupport.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/DynamicLibrary.h"
 #include <cstdio>
@@ -57,8 +57,13 @@ OrcLazyJIT::createCompileCallbackMgr(Tri
     }
 
     case Triple::x86_64: {
-      typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64> CCMgrT;
-      return llvm::make_unique<CCMgrT>(0);
+      if ( T.getOS() == Triple::OSType::Win32 ) {
+        typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_Win32> CCMgrT;
+        return llvm::make_unique<CCMgrT>(0);
+      } else {
+        typedef orc::LocalJITCompileCallbackManager<orc::OrcX86_64_SysV> CCMgrT;
+        return llvm::make_unique<CCMgrT>(0);
+      }
     }
   }
 }
@@ -75,10 +80,17 @@ OrcLazyJIT::createIndirectStubsMgrBuilde
       };
 
     case Triple::x86_64:
-      return [](){
-        return llvm::make_unique<
-                       orc::LocalIndirectStubsManager<orc::OrcX86_64>>();
-      };
+      if (T.getOS() == Triple::OSType::Win32) {
+        return [](){
+          return llvm::make_unique<
+                     orc::LocalIndirectStubsManager<orc::OrcX86_64_Win32>>();
+        };
+      } else {
+        return [](){
+          return llvm::make_unique<
+                     orc::LocalIndirectStubsManager<orc::OrcX86_64_SysV>>();
+        };
+      }
   }
 }
 
@@ -192,3 +204,4 @@ int llvm::runOrcLazyJIT(std::unique_ptr<
   auto Main = fromTargetAddress<MainFnPtr>(MainSym.getAddress());
   return Main(ArgC, ArgV);
 }
+




More information about the llvm-commits mailing list