Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/design/coreclr/botr/guide-for-porting.md
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ Here is an annotated list of the stubs implemented for Unix on Arm64.
calls. Necessary for all applications as this is how the main method is
called.

2. `NDirectImportThunk` – Needed to support saving off a set of arguments to
2. `PInvokeImportThunk` – Needed to support saving off a set of arguments to
a p/invoke so that the runtime can find the actual target. Also uses one
of the secret arguments (Used by all p/invoke methods)

Expand Down
12 changes: 6 additions & 6 deletions docs/design/coreclr/botr/method-descriptor.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Used for less common IL methods that have generic instantiation or that do not h

Internal methods implemented in unmanaged code. These are [methods marked with MethodImplAttribute(MethodImplOptions.InternalCall) attribute](corelib.md), delegate constructors and tlbimp constructors.

**NDirect**
**PInvoke**

P/Invoke methods. These are methods marked with DllImport attribute.

Expand Down Expand Up @@ -270,14 +270,14 @@ ThisPtrRetBufPrecode looks like this:
jmp entrypoint
dw pMethodDesc

**NDirectImportPrecode**
**PInvokeImportPrecode**

NDirectImportPrecode is used for lazy binding of unmanaged P/Invoke targets. This precode is for convenience and to reduce amount of platform specific plumbing.
PInvokeImportPrecode is used for lazy binding of unmanaged P/Invoke targets. This precode is for convenience and to reduce amount of platform specific plumbing.

Each NDirectMethodDesc has NDirectImportPrecode in addition to the regular precode.
Each PInvokeMethodDesc has PInvokeImportPrecode in addition to the regular precode.

NDirectImportPrecode looks like this on x86:
PInvokeImportPrecode looks like this on x86:

mov eax,pMethodDesc
mov eax,eax // dummy instruction that marks the type of the precode
jmp NDirectImportThunk // loads P/Invoke target for pMethodDesc lazily
jmp PInvokeImportThunk // loads P/Invoke target for pMethodDesc lazily
2 changes: 1 addition & 1 deletion docs/design/coreclr/botr/profiling.md
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ A profiler DLL is an unmanaged DLL that is effectively running as part of the CL
Combining Managed and Unmanaged Code in a Code Profiler
=======================================================

A close review of the CLR Profiling API creates the impression that you could write a profiler that has managed and unmanaged components that call to each other through COM Interop or ndirect calls.
A close review of the CLR Profiling API creates the impression that you could write a profiler that has managed and unmanaged components that call to each other through COM Interop or PInvoke calls.

Although this is possible from a design perspective, the CLR Profiling API does not support it. A CLR profiler is supposed to be purely unmanaged. Attempts to combine managed and unmanaged code from a CLR profiler can cause crashes, hangs and deadlocks. The danger is clear since the managed parts of the profiler will "fire" events back to its unmanaged component, which subsequently would call into the managed part of the profiler etc. The danger at this point is clear.

Expand Down
2 changes: 1 addition & 1 deletion docs/design/datacontracts/PrecodeStubs.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ After the initial precode type is determined, for stub precodes a refined precod
internal enum KnownPrecodeType
{
Stub = 1,
PInvokeImport, // also known as NDirectImport in the runtime
PInvokeImport,
Fixup,
ThisPtrRetBuf,
UMEntry,
Expand Down
2 changes: 1 addition & 1 deletion docs/design/datacontracts/RuntimeTypeSystem.md
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,7 @@ Checking if a method has a native code slot and getting its address
{
MethodClassification.IL => /*size of MethodDesc*/,
MethodClassification.FCall => /* size of FCallMethodDesc */
MethodClassification.PInvoke => /* size of NDirectMethodDesc */
MethodClassification.PInvoke => /* size of PInvokeMethodDesc */
MethodClassification.EEImpl => /* size of EEImplMethodDesc */
MethodClassification.Array => /* size of ArrayMethodDesc */
MethodClassification.Instantiated => /* size of InstantiatedMethodDesc */
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -944,7 +944,7 @@ private unsafe IntPtr ConvertArrayToNative(object pManagedHome, int dwFlags)
}

default:
throw new ArgumentException(SR.Arg_NDirectBadObject);
throw new ArgumentException(SR.Arg_PInvokeBadObject);
}

// marshal the object as C-style array (UnmanagedType.LPArray)
Expand Down Expand Up @@ -1151,7 +1151,7 @@ internal IntPtr ConvertToNative(object pManagedHome, int dwFlags)
else
{
// this type is not supported for AsAny marshaling
throw new ArgumentException(SR.Arg_NDirectBadObject);
throw new ArgumentException(SR.Arg_PInvokeBadObject);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ ULONG32 DacDbiInterfaceImpl::GetCountOfInternalFrames(VMPTR_Thread vmThread)
{
// Skip new exception handling helpers
InlinedCallFrame *pInlinedCallFrame = dac_cast<PTR_InlinedCallFrame>(pFrame);
PTR_NDirectMethodDesc pMD = pInlinedCallFrame->m_Datum;
PTR_PInvokeMethodDesc pMD = pInlinedCallFrame->m_Datum;
TADDR datum = dac_cast<TADDR>(pMD);
if ((datum & (TADDR)InlinedCallFrameMarker::Mask) == (TADDR)InlinedCallFrameMarker::ExceptionHandlingHelper)
{
Expand Down Expand Up @@ -527,7 +527,7 @@ void DacDbiInterfaceImpl::EnumerateInternalFrames(VMPTR_Thread
{
// Skip new exception handling helpers
InlinedCallFrame *pInlinedCallFrame = dac_cast<PTR_InlinedCallFrame>(pFrame);
PTR_NDirectMethodDesc pMD = pInlinedCallFrame->m_Datum;
PTR_PInvokeMethodDesc pMD = pInlinedCallFrame->m_Datum;
TADDR datum = dac_cast<TADDR>(pMD);
if ((datum & (TADDR)InlinedCallFrameMarker::Mask) == (TADDR)InlinedCallFrameMarker::ExceptionHandlingHelper)
{
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/debug/di/shimstackwalk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1202,7 +1202,7 @@ BOOL ShimStackWalk::CheckInternalFrame(ICorDebugFrame * pNextStackFrame,
// Special handling for the case where a managed method contains a M2U internal frame.
// Normally only IL stubs contain M2U internal frames, but we may have inlined pinvoke calls in
// optimized code. In that case, we would have an InlinedCallFrame in a normal managed method on x86.
// On WIN64, we would have a normal NDirectMethodFrame* in a normal managed method.
// On WIN64, we would have a normal PInvokeMethodFrame* in a normal managed method.
if (pStackWalkInfo->m_internalFrameType == STUBFRAME_M2U)
{
// create a temporary ICDStackWalk
Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/debug/ee/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5921,7 +5921,7 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
#endif

// Note: we used to pass in the IP from the active frame to GetJitInfo, but there seems to be no value in that, and
// it was causing problems creating a stepper while sitting in ndirect stubs after we'd returned from the unmanaged
// it was causing problems creating a stepper while sitting in PInvoke stubs after we'd returned from the unmanaged
// function that had been called.
DebuggerJitInfo *ji = info->m_activeFrame.GetJitInfoFromFrame();
if( ji != NULL )
Expand Down Expand Up @@ -6537,7 +6537,7 @@ void DebuggerStepper::TrapStepOut(ControllerStackInfo *info, bool fForceTraditio
_ASSERTE(dji != NULL);

// Note: we used to pass in the IP from the active frame to GetJitInfo, but there seems to be no value
// in that, and it was causing problems creating a stepper while sitting in ndirect stubs after we'd
// in that, and it was causing problems creating a stepper while sitting in PInvoke stubs after we'd
// returned from the unmanaged function that had been called.
ULONG reloffset = info->m_activeFrame.relOffset;

Expand Down Expand Up @@ -6816,7 +6816,7 @@ bool DebuggerStepper::SetRangesFromIL(DebuggerJitInfo *dji, COR_DEBUG_STEP_RANGE
CONTRACTL_END;

// Note: we used to pass in the IP from the active frame to GetJitInfo, but there seems to be no value in that, and
// it was causing problems creating a stepper while sitting in ndirect stubs after we'd returned from the unmanaged
// it was causing problems creating a stepper while sitting in PInvoke stubs after we'd returned from the unmanaged
// function that had been called.
MethodDesc *fd = dji->m_nativeCodeVersion.GetMethodDesc();

Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/debug/ee/frameinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1503,7 +1503,7 @@ StackWalkAction DebuggerWalkStackProc(CrawlFrame *pCF, void *data)
(pPrevFrame->GetFrameType() == Frame::TYPE_EXIT) &&
!HasExitRuntime(pPrevFrame, d, NULL) )
{
// This is for the inlined NDirectMethodFrameGeneric case. We have not exit the runtime yet, so the current
// This is for the inlined PInvokeMethodFrameGeneric case. We have not exit the runtime yet, so the current
// frame should still be regarded as the leaf frame.
d->info.fIsLeaf = true;
}
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/debug/runtimeinfo/datadescriptor.inc
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ CDAC_TYPE_SIZE(sizeof(FCallMethodDesc))
CDAC_TYPE_END(FCallMethodDesc)

CDAC_TYPE_BEGIN(PInvokeMethodDesc)
CDAC_TYPE_SIZE(sizeof(NDirectMethodDesc))
CDAC_TYPE_SIZE(sizeof(PInvokeMethodDesc))
CDAC_TYPE_END(PInvokeMethodDesc)

CDAC_TYPE_BEGIN(EEImplMethodDesc)
Expand Down Expand Up @@ -543,7 +543,7 @@ CDAC_TYPE_END(MethodDescVersioningState)
CDAC_TYPE_BEGIN(PrecodeMachineDescriptor)
CDAC_TYPE_INDETERMINATE(PrecodeMachineDescriptor)
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, InvalidPrecodeType, offsetof(PrecodeMachineDescriptor, InvalidPrecodeType))
#ifdef HAS_NDIRECT_IMPORT_PRECODE
#ifdef HAS_PINVOKE_IMPORT_PRECODE
CDAC_TYPE_FIELD(PrecodeMachineDescriptor, /*uint8*/, PInvokeImportPrecodeType, offsetof(PrecodeMachineDescriptor, PInvokeImportPrecodeType))
#endif

Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/importercalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,7 @@ var_types Compiler::impImportCall(OPCODE opcode,
* to the arg list next after we pop them */
}

//--------------------------- Inline NDirect ------------------------------
//--------------------------- Inline PInvoke ------------------------------
// If this is a call to a PInvoke method, we may be able to inline the invocation frame.
//
impCheckForPInvokeCall(call->AsCall(), methHnd, sig, mflags, compCurBB);
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/liveness.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -823,7 +823,7 @@ GenTreeLclVarCommon* Compiler::fgComputeLifeCall(VARSET_TP& life, VARSET_VALARG_
}

// TODO: we should generate the code for saving to/restoring
// from the inlined N/Direct frame instead.
// from the inlined PInvoke frame instead.

/* Is this call to unmanaged code? */
if (call->IsUnmanaged() && compMethodRequiresPInvokeFrame())
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/tools/metainfo/mdinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2912,7 +2912,7 @@ HRESULT MDInfo::GetOneElementType(PCCOR_SIGNATURE pbSigBlob, ULONG ulSigBlob, UL
return hr;
} // HRESULT MDInfo::GetOneElementType()

// Display the fields of the N/Direct custom value structure.
// Display the fields of the PInvoke custom value structure.

void MDInfo::DisplayCorNativeLink(COR_NATIVE_LINK *pCorNLnk, const char *preFix)
{
Expand Down
19 changes: 8 additions & 11 deletions src/coreclr/vm/amd64/AsmHelpers.asm
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ include asmconstants.inc

Thread_GetInterpThreadContext TEXTEQU <?GetInterpThreadContext@Thread@@QEAAPEAUInterpThreadContext@@XZ>

extern NDirectImportWorker:proc
extern PInvokeImportWorker:proc
extern ThePreStub:proc
extern ProfileEnter:proc
extern ProfileLeave:proc
Expand All @@ -23,15 +23,12 @@ extern g_TrapReturningThreads:DWORD

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; NDirectImportThunk
;; PInvokeImportThunk
;;
;; In addition to being called by the EE, this function can be called
;; directly from code generated by JIT64 for CRT optimized direct
;; P/Invoke calls. If it is modified, the JIT64 compiler's code
;; generation will need to altered accordingly.
;; The call in PInvokeImportPrecode points to this function.
;;
; EXTERN_C VOID __stdcall NDirectImportThunk();
NESTED_ENTRY NDirectImportThunk, _TEXT
; EXTERN_C VOID __stdcall PInvokeImportThunk();
NESTED_ENTRY PInvokeImportThunk, _TEXT

;
; Allocate space for XMM parameter registers and callee scratch area.
Expand All @@ -55,10 +52,10 @@ NESTED_ENTRY NDirectImportThunk, _TEXT
END_PROLOGUE

;
; Call NDirectImportWorker w/ the NDirectMethodDesc*
; Call PInvokeImportWorker w/ the PInvokeMethodDesc*
;
mov rcx, METHODDESC_REGISTER
call NDirectImportWorker
call PInvokeImportWorker

;
; Restore parameter registers
Expand All @@ -79,7 +76,7 @@ NESTED_ENTRY NDirectImportThunk, _TEXT
add rsp, 68h

TAILJMP_RAX
NESTED_END NDirectImportThunk, _TEXT
NESTED_END PInvokeImportThunk, _TEXT


;------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/vm/amd64/PInvokeStubs.asm
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ LEAF_ENTRY GenericPInvokeCalliHelper, _TEXT
;
; check for existing IL stub
;
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pNDirectILStub]
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pPInvokeILStub]
test rax, rax
jz GenericPInvokeCalliGenILStub

Expand Down Expand Up @@ -85,7 +85,7 @@ LEAF_ENTRY VarargPInvokeStubHelper, _TEXT
;
; check for existing IL stub
;
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pNDirectILStub]
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pPInvokeILStub]
test rax, rax
jz VarargPInvokeGenILStub

Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/vm/amd64/asmconstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,9 +248,9 @@ ASMCONSTANTS_C_ASSERT(OFFSETOF__DynamicStaticsInfo__m_pNonGCStatics
ASMCONSTANTS_C_ASSERT(OFFSETOF__DynamicStaticsInfo__m_pGCStatics
== offsetof(DynamicStaticsInfo, m_pGCStatics));

#define OFFSETOF__VASigCookie__pNDirectILStub 0x8
ASMCONSTANTS_C_ASSERT(OFFSETOF__VASigCookie__pNDirectILStub
== offsetof(VASigCookie, pNDirectILStub));
#define OFFSETOF__VASigCookie__pPInvokeILStub 0x8
ASMCONSTANTS_C_ASSERT(OFFSETOF__VASigCookie__pPInvokeILStub
== offsetof(VASigCookie, pPInvokeILStub));

#if defined(UNIX_AMD64_ABI) && !defined(HOST_WINDOWS)
// Expression is too complicated, is currently:
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/vm/amd64/cgencpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class ComCallMethodDesc;
#define SIZEOF_LOAD_AND_JUMP_THUNK 22 // # bytes to mov r10, X; jmp Z
#define SIZEOF_LOAD2_AND_JUMP_THUNK 32 // # bytes to mov r10, X; mov r11, Y; jmp Z

#define HAS_NDIRECT_IMPORT_PRECODE 1
#define HAS_PINVOKE_IMPORT_PRECODE 1
#define HAS_FIXUP_PRECODE 1

// ThisPtrRetBufPrecode one is necessary for closed delegates over static methods with return buffer
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/vm/amd64/pinvokestubs.S
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ LEAF_ENTRY GenericPInvokeCalliHelper, _TEXT
//
// check for existing IL stub
//
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pNDirectILStub]
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pPInvokeILStub]
test rax, rax
jz C_FUNC(GenericPInvokeCalliGenILStub)

Expand Down Expand Up @@ -81,7 +81,7 @@ LEAF_ENTRY VarargPInvokeStubHelper, _TEXT
//
// check for existing IL stub
//
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pNDirectILStub]
mov rax, [PINVOKE_CALLI_SIGTOKEN_REGISTER + OFFSETOF__VASigCookie__pPInvokeILStub]
test rax, rax
jz C_FUNC(VarargPInvokeGenILStub)

Expand Down
17 changes: 7 additions & 10 deletions src/coreclr/vm/amd64/unixasmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,12 @@

//////////////////////////////////////////////////////////////////////////
//
// NDirectImportThunk
// PInvokeImportThunk
//
// In addition to being called by the EE, this function can be called
// directly from code generated by JIT64 for CRT optimized direct
// P/Invoke calls. If it is modified, the JIT64 compiler's code
// generation will need to altered accordingly.
// The call in PInvokeImportPrecode points to this function
//
// EXTERN_C VOID __stdcall NDirectImportThunk()//
NESTED_ENTRY NDirectImportThunk, _TEXT, NoHandler
// EXTERN_C VOID __stdcall PInvokeImportThunk()//
NESTED_ENTRY PInvokeImportThunk, _TEXT, NoHandler

//
// Save integer parameter registers.
Expand All @@ -36,10 +33,10 @@ NESTED_ENTRY NDirectImportThunk, _TEXT, NoHandler
END_PROLOGUE

//
// Call NDirectImportWorker w/ the NDirectMethodDesc*
// Call PInvokeImportWorker w/ the PInvokeMethodDesc*
//
mov rdi, METHODDESC_REGISTER
call C_FUNC(NDirectImportWorker)
call C_FUNC(PInvokeImportWorker)
mov r10, rax

RESTORE_FLOAT_ARGUMENT_REGISTERS 0
Expand All @@ -58,7 +55,7 @@ NESTED_ENTRY NDirectImportThunk, _TEXT, NoHandler

jmp r10

NESTED_END NDirectImportThunk, _TEXT
NESTED_END PInvokeImportThunk, _TEXT

//------------------------------------------------
// JIT_RareDisableHelper
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/vm/appdomain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -889,7 +889,7 @@ void SystemDomain::Init()
{
// We are about to start allocating objects, so we must be in cooperative mode.
// However, many of the entrypoints to the system (DllGetClassObject and all
// N/Direct exports) get called multiple times. Sometimes they initialize the EE,
// PInvoke exports) get called multiple times. Sometimes they initialize the EE,
// but generally they remain in preemptive mode. So we really want to push/pop
// the state here:
GCX_COOP();
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/vm/arm/asmconstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ ASMCONSTANTS_C_ASSERT(ASM__VTABLE_SLOTS_PER_CHUNK == VTABLE_SLOTS_PER_CHUNK)
#define ASM__VTABLE_SLOTS_PER_CHUNK_LOG2 3
ASMCONSTANTS_C_ASSERT(ASM__VTABLE_SLOTS_PER_CHUNK_LOG2 == VTABLE_SLOTS_PER_CHUNK_LOG2)

#define VASigCookie__pNDirectILStub 0x4
ASMCONSTANTS_C_ASSERT(VASigCookie__pNDirectILStub == offsetof(VASigCookie, pNDirectILStub))
#define VASigCookie__pPInvokeILStub 0x4
ASMCONSTANTS_C_ASSERT(VASigCookie__pPInvokeILStub == offsetof(VASigCookie, pPInvokeILStub))

#define CONTEXT_Pc 0x040
ASMCONSTANTS_C_ASSERT(CONTEXT_Pc == offsetof(T_CONTEXT,Pc))
Expand Down
10 changes: 5 additions & 5 deletions src/coreclr/vm/arm/asmhelpers.S
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ ThePreStubPatchLabel:
LEAF_END ThePreStubPatch, _TEXT

// ------------------------------------------------------------------
// The call in ndirect import precode points to this function.
NESTED_ENTRY NDirectImportThunk, _TEXT, NoHandler
// The call in PInvokeImportPrecode points to this function.
NESTED_ENTRY PInvokeImportThunk, _TEXT, NoHandler

PROLOG_PUSH "{r0-r4,r7,r8,lr}" // Spill general argument registers, return address and
PROLOG_STACK_SAVE_OFFSET r7, #20
Expand All @@ -198,17 +198,17 @@ ThePreStubPatchLabel:
CHECK_STACK_ALIGNMENT

mov r0, r12
bl C_FUNC(NDirectImportWorker)
bl C_FUNC(PInvokeImportWorker)
mov r12, r0

EPILOG_VPOP {d0-d7}
EPILOG_POP "{r0-r4,r7,r8,lr}"

// If we got back from NDirectImportWorker, the MD has been successfully
// If we got back from PInvokeImportWorker, the MD has been successfully
// linked. Proceed to execute the original DLL call.
bx r12

NESTED_END NDirectImportThunk, _TEXT
NESTED_END PInvokeImportThunk, _TEXT

// ------------------------------------------------------------------
// void ResolveWorkerAsmStub(r0, r1, r2, r3, r4:IndirectionCellAndFlags, r12:DispatchToken)
Expand Down
Loading
Loading