[Arm64/Linux] Fix GenericPInvokeCalliHelper (#17659)
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>
Thu, 19 Apr 2018 16:22:10 +0000 (12:22 -0400)
committerJan Kotas <jkotas@microsoft.com>
Thu, 19 Apr 2018 16:22:10 +0000 (09:22 -0700)
src/jit/target.h
src/vm/amd64/PInvokeStubs.asm
src/vm/amd64/pinvokestubs.S
src/vm/arm64/PInvokeStubs.asm
src/vm/arm64/pinvokestubs.S
src/vm/dllimport.cpp
tests/arm64/corefx_test_exclusions.txt

index 15f4693..9c64045 100644 (file)
@@ -1746,8 +1746,8 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
   #define RBM_PINVOKE_COOKIE_PARAM          RBM_R15
 
   // GenericPInvokeCalliHelper unmanaged target Parameter 
-  #define REG_PINVOKE_TARGET_PARAM          REG_R14
-  #define RBM_PINVOKE_TARGET_PARAM          RBM_R14
+  #define REG_PINVOKE_TARGET_PARAM          REG_R12
+  #define RBM_PINVOKE_TARGET_PARAM          RBM_R12
 
   // IL stub's secret MethodDesc parameter (JitFlags::JIT_FLAG_PUBLISH_SECRET_PARAM)
   #define REG_SECRET_STUB_PARAM     REG_R12
index 4801697..7255fa2 100644 (file)
@@ -32,14 +32,6 @@ LEAF_ENTRY GenericPInvokeCalliHelper, _TEXT
         jz              GenericPInvokeCalliGenILStub
 
         ;
-        ; We need to distinguish between a MethodDesc* and an unmanaged target in PInvokeStubForHost().  
-        ; The way we do this is to shift the managed target to the left by one bit and then set the 
-        ; least significant bit to 1.  This works because MethodDesc* are always 8-byte aligned.
-        ;
-        shl             PINVOKE_CALLI_TARGET_REGISTER, 1
-        or              PINVOKE_CALLI_TARGET_REGISTER, 1
-
-        ;
         ; jump to existing IL stub
         ;
         jmp             rax
index 49697e1..dad668a 100644 (file)
@@ -25,14 +25,6 @@ LEAF_ENTRY GenericPInvokeCalliHelper, _TEXT
         jz              C_FUNC(GenericPInvokeCalliGenILStub)
 
         //
-        // We need to distinguish between a MethodDesc* and an unmanaged target in PInvokeStubForHost().
-        // The way we do this is to shift the managed target to the left by one bit and then set the
-        // least significant bit to 1.  This works because MethodDesc* are always 8-byte aligned.
-        //
-        shl             PINVOKE_CALLI_TARGET_REGISTER, 1
-        or              PINVOKE_CALLI_TARGET_REGISTER, 1
-
-        //
         // jump to existing IL stub
         //
         jmp             rax
index afe2fb4..e21151e 100644 (file)
@@ -124,9 +124,9 @@ __PInvokeGenStubFuncName SETS "$__PInvokeGenStubFuncName":CC:"_RetBuffArg"
 ;
 ; in:
 ; x15 = VASigCookie*
-; x14 = Unmanaged target
+; x12 = Unmanaged target
 ;
-        PINVOKE_STUB GenericPInvokeCalli, x15, x14, {true}
+        PINVOKE_STUB GenericPInvokeCalli, x15, x12, {true}
 
 ; ------------------------------------------------------------------
 ; VarargPInvokeStub_RetBuffArg & VarargPInvokeGenILStub_RetBuffArg
index 00d64b4..f13d2da 100644 (file)
@@ -32,7 +32,6 @@
         // if null goto stub generation
         cbz                 x9, LOCAL_LABEL(\__PInvokeStubFuncName\()_0)
 
-
         EPILOG_BRANCH_REG   x9 
 
 LOCAL_LABEL(\__PInvokeStubFuncName\()_0):
@@ -96,9 +95,9 @@ PINVOKE_STUB VarargPInvokeStub, VarargPInvokeGenILStub, VarargPInvokeStubWorker,
 //
 // in:
 // x15 = VASigCookie*
-// x14 = Unmanaged target
+// x12 = Unmanaged target
 //
-PINVOKE_STUB GenericPInvokeCalliHelper, GenericPInvokeCalliGenILStub, GenericPInvokeCalliStubWorker, x15, x14, 1
+PINVOKE_STUB GenericPInvokeCalliHelper, GenericPInvokeCalliGenILStub, GenericPInvokeCalliStubWorker, x15, x12, 1
 
 // ------------------------------------------------------------------
 // VarargPInvokeStub_RetBuffArg & VarargPInvokeGenILStub_RetBuffArg
index 5b51ee3..c0f7d1f 100644 (file)
@@ -2253,31 +2253,9 @@ void NDirectStubLinker::DoNDirect(ILCodeStream *pcsEmit, DWORD dwStubFlags, Meth
                 // if we ever NGEN CALLI stubs, this would have to be done differently
                 _ASSERTE(!SF_IsNGENedStub(dwStubFlags));
 
-#ifndef CROSSGEN_COMPILE
-
-#ifdef _TARGET_X86_
-
-                {
-                    // for managed-to-unmanaged CALLI that requires marshaling, the target is passed
-                    // as the secret argument to the stub by GenericPInvokeCalliHelper (asmhelpers.asm)
-                    EmitLoadStubContext(pcsEmit, dwStubFlags);
-                }
-
-
-#else // _TARGET_X86_
-
-                {
-                    // the secret arg has been shifted to left and ORed with 1 (see code:GenericPInvokeCalliHelper)
-                    EmitLoadStubContext(pcsEmit, dwStubFlags);
-#ifndef _TARGET_ARM_
-                    pcsEmit->EmitLDC(1);
-                    pcsEmit->EmitSHR_UN();
-#endif
-                }
-
-#endif // _TARGET_X86_
-
-#endif // CROSSGEN_COMPILE
+                // for managed-to-unmanaged CALLI that requires marshaling, the target is passed
+                // as the secret argument to the stub by GenericPInvokeCalliHelper (asmhelpers.asm)
+                EmitLoadStubContext(pcsEmit, dwStubFlags);
             }
             else
 #ifdef FEATURE_COMINTEROP
index 1d5f55f..6b00a58 100644 (file)
@@ -1,4 +1,3 @@
 Invariant.Tests
 System.Diagnostics.Process.Tests
-System.Reflection.Emit.ILGeneration.Tests
 System.ValueTuple.Tests