Enable ReadyToRun feature on Unix
authorJan Vorlicek <janvorli@microsoft.com>
Thu, 30 Apr 2015 20:32:25 +0000 (13:32 -0700)
committerJan Vorlicek <janvorli@microsoft.com>
Wed, 20 May 2015 09:51:49 +0000 (11:51 +0200)
This change enables building the ReadyToRun feature on Unix systems.

CMakeLists.txt
src/pal/inc/unixasmmacros.inc
src/vm/CMakeLists.txt
src/vm/amd64/asmconstants.h
src/vm/amd64/externalmethodfixupthunk.S
src/vm/crossgen/CMakeLists.txt

index 70c5f82..4c0ca81 100644 (file)
@@ -457,8 +457,8 @@ add_definitions(-DFEATURE_NORM_IDNA_ONLY)
 add_definitions(-DFEATURE_PREJIT)
 if(WIN32)
     add_definitions(-DFEATURE_RANDOMIZED_STRING_HASHING)
-    add_definitions(-DFEATURE_READYTORUN)
 endif(WIN32)
+add_definitions(-DFEATURE_READYTORUN)
 add_definitions(-DFEATURE_STANDALONE_SN)
 add_definitions(-DFEATURE_STRONGNAME_DELAY_SIGNING_ALLOWED)
 add_definitions(-DFEATURE_STRONGNAME_MIGRATION)
index de79ba3..ee139c4 100644 (file)
@@ -336,6 +336,14 @@ C_FUNC(\Name\()_End):
 
 .endm
 
+.macro EPILOG_WITH_TRANSITION_BLOCK_RETURN
+
+        add rsp, __PWTB_StackAlloc
+        POP_CALLEE_SAVED_REGISTERS
+        ret
+
+.endm
+
 .macro EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
 
         RESTORE_FLOAT_ARGUMENT_REGISTERS __PWTB_FloatArgumentRegisters
index cad60fd..788c6ae 100644 (file)
@@ -97,6 +97,7 @@ set(VM_SOURCES_DAC_AND_WKS_COMMON
     perfmap.cpp
     precode.cpp
     prestub.cpp
+    readytoruninfo.cpp
     rejit.cpp
     securitydescriptor.cpp
     securitydescriptorassembly.cpp
@@ -253,7 +254,6 @@ set(VM_SOURCES_DAC_AND_WKS_WIN32
     clrtocomcall.cpp
     comtoclrcall.cpp
     rcwwalker.cpp
-    readytoruninfo.cpp
     umthunkhash.cpp #" Condition="'$(FeatureMixedMode)' == 'true'
     winrttypenameconverter.cpp
 )
index 3630391..dac7def 100644 (file)
@@ -657,6 +657,11 @@ ASMCONSTANTS_C_ASSERT(CallDescrData__fpReturnSize         == offsetof(CallDescrD
 ASMCONSTANTS_C_ASSERT(CallDescrData__pTarget              == offsetof(CallDescrData, pTarget))
 ASMCONSTANTS_C_ASSERT(CallDescrData__returnValue          == offsetof(CallDescrData, returnValue))
 
+#ifdef UNIX_AMD64_ABI
+#define OFFSETOF__TransitionBlock__m_argumentRegisters    0x00
+ASMCONSTANTS_C_ASSERT(OFFSETOF__TransitionBlock__m_argumentRegisters == offsetof(TransitionBlock, m_argumentRegisters))
+#endif // UNIX_AMD64_ABI
+
 #undef ASMCONSTANTS_RUNTIME_ASSERT
 #undef ASMCONSTANTS_C_ASSERT
 #undef DBG_FRE
index 6db5d8d..d002d8b 100644 (file)
@@ -28,6 +28,59 @@ PATCH_LABEL ExternalMethodFixupPatchLabel
 
 NESTED_END ExternalMethodFixupStub, _TEXT
 
+#ifdef FEATURE_READYTORUN
+
+NESTED_ENTRY DelayLoad_MethodCall, _TEXT, NoHandler
+
+        PROLOG_WITH_TRANSITION_BLOCK 0, 10h, rdx, rcx, 0
+
+        lea     rdi, [rsp + __PWTB_TransitionBlock] // pTransitionBlock
+        mov     rsi, rax                            // pIndirection
+
+        call            C_FUNC(ExternalMethodFixupWorker)
+
+        EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
+
+        // Share the patch label
+        jmp C_FUNC(ExternalMethodFixupPatchLabel)
+
+NESTED_END DelayLoad_MethodCall, _TEXT
+
+//============================================================================================
+
+.macro DYNAMICHELPER frameFlags, suffix
+
+NESTED_ENTRY DelayLoad_Helper\suffix, _TEXT, NoHandler
+
+        PROLOG_WITH_TRANSITION_BLOCK 0, 10h, rdx, rcx, 0
+
+        mov     r8, \frameFlags
+        lea     rdi, [rsp + __PWTB_TransitionBlock] // pTransitionBlock
+        mov     rsi, rax                            // pIndirection
+
+        call    C_FUNC(DynamicHelperWorker)
+
+        test    rax,rax
+        jnz     LOCAL_LABEL(TailCallDelayLoad_Helper\suffix)
+
+        // The result is stored in the argument area of the transition block
+        mov     rax, [rsp + __PWTB_TransitionBlock + OFFSETOF__TransitionBlock__m_argumentRegisters] 
+
+        EPILOG_WITH_TRANSITION_BLOCK_RETURN
+
+LOCAL_LABEL(TailCallDelayLoad_Helper\suffix):
+        EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
+        TAILJMP_RAX
+
+NESTED_END DelayLoad_Helper\suffix, _TEXT
+
+    .endm
+
+DYNAMICHELPER DynamicHelperFrameFlags_Default
+DYNAMICHELPER DynamicHelperFrameFlags_ObjectArg, _Obj
+DYNAMICHELPER (DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_ObjectArg2), _ObjObj
+
+#endif // FEATURE_READYTORUN
 
 //============================================================================================
 // EXTERN_C VOID __stdcall VirtualMethodFixupStub()
index afb7f74..f21f149 100644 (file)
@@ -68,6 +68,7 @@ set(VM_CROSSGEN_SOURCES
     ../pendingload.cpp
     ../precode.cpp
     ../olevariant.cpp
+    ../readytoruninfo.cpp
     ../security.cpp
     ../securitypolicy.cpp
     ../securityattributes.cpp
@@ -101,12 +102,6 @@ set(VM_CROSSGEN_SOURCES
     ../crossgencompile.cpp
 )
 
-if (WIN32)
-  list(APPEND VM_CROSSGEN_SOURCES
-      ../readytoruninfo.cpp
-  )
-endif (WIN32)
-
 include_directories(BEFORE ..)
 include_directories(${CLR_DIR}/src/gc)
 include_directories(../amd64)