/// <summary> /// Returns JIT helper entrypoint. JIT helpers can be either implemented by entrypoint with given mangled name or /// by a method in class library. /// </summary> static public void GetEntryPoint(TypeSystemContext context, JitHelperId id, out string mangledName, out MethodDesc methodDesc) { mangledName = null; methodDesc = null; switch (id) { case JitHelperId.Throw: mangledName = "RhpThrowEx"; break; case JitHelperId.Rethrow: mangledName = "RhpRethrow"; break; case JitHelperId.Overflow: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowOverflowException"); break; case JitHelperId.RngChkFail: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException"); break; case JitHelperId.FailFast: mangledName = "__fail_fast"; // TODO: Report stack buffer overrun break; case JitHelperId.ThrowNullRef: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNullReferenceException"); break; case JitHelperId.ThrowDivZero: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowDivideByZeroException"); break; case JitHelperId.WriteBarrier: mangledName = "RhpAssignRef"; break; case JitHelperId.CheckedWriteBarrier: mangledName = "RhpCheckedAssignRef"; break; case JitHelperId.ByRefWriteBarrier: mangledName = "RhpByRefAssignRef"; break; case JitHelperId.NewMultiDimArr: mangledName = "RhNewMDArray"; break; case JitHelperId.Stelem_Ref: mangledName = "RhpStelemRef"; break; case JitHelperId.Ldelema_Ref: mangledName = "RhpLdelemaRef"; break; case JitHelperId.MemCpy: mangledName = "memcpy"; // TODO: Null reference handling break; case JitHelperId.MemSet: mangledName = "memset"; // TODO: Null reference handling break; case JitHelperId.GetRuntimeTypeHandle: // TODO: Reflection case JitHelperId.GetRuntimeMethodHandle: case JitHelperId.GetRuntimeFieldHandle: mangledName = "__fail_fast"; break; default: throw new NotImplementedException(id.ToString()); } }
/// <summary> /// Returns JIT helper entrypoint. JIT helpers can be either implemented by entrypoint with given mangled name or /// by a method in class library. /// </summary> static public void GetEntryPoint(TypeSystemContext context, JitHelperId id, out string mangledName, out MethodDesc methodDesc) { mangledName = null; methodDesc = null; switch (id) { case JitHelperId.Throw: mangledName = "RhpThrowEx"; break; case JitHelperId.Rethrow: mangledName = "RhRethrow"; break; case JitHelperId.Overflow: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowOverflowException"); break; case JitHelperId.RngChkFail: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException"); break; case JitHelperId.FailFast: mangledName = "__fail_fast"; // TODO: Report stack buffer overrun break; case JitHelperId.ThrowNullRef: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNullReferenceException"); break; case JitHelperId.ThrowDivZero: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowDivideByZeroException"); break; case JitHelperId.WriteBarrier: mangledName = "RhpAssignRef"; break; case JitHelperId.CheckedWriteBarrier: mangledName = "RhpCheckedAssignRef"; break; case JitHelperId.ByRefWriteBarrier: mangledName = "RhpByRefAssignRef"; break; case JitHelperId.Box: case JitHelperId.Box_Nullable: mangledName = "RhBox"; break; case JitHelperId.Unbox: mangledName = "RhUnbox2"; break; case JitHelperId.Unbox_Nullable: mangledName = "RhUnboxNullable"; break; case JitHelperId.NewMultiDimArr: mangledName = "RhNewMDArray"; break; case JitHelperId.Stelem_Ref: mangledName = "RhpStelemRef"; break; case JitHelperId.Ldelema_Ref: mangledName = "RhpLdelemaRef"; break; case JitHelperId.MemCpy: mangledName = "memcpy"; // TODO: Null reference handling break; case JitHelperId.MemSet: mangledName = "memset"; // TODO: Null reference handling break; case JitHelperId.GetRuntimeTypeHandle: methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeTypeHandle"); break; case JitHelperId.GetRuntimeMethodHandle: // TODO: Reflection case JitHelperId.GetRuntimeFieldHandle: // TODO: Reflection mangledName = "__fail_fast"; break; case JitHelperId.Lng2Dbl: mangledName = "RhpLng2Dbl"; break; case JitHelperId.ULng2Dbl: mangledName = "RhpULng2Dbl"; break; case JitHelperId.Dbl2Lng: mangledName = "RhpDbl2Lng"; break; case JitHelperId.Dbl2ULng: mangledName = "RhpDbl2ULng"; break; case JitHelperId.Dbl2IntOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2IntOvf"); break; case JitHelperId.Dbl2LngOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2LngOvf"); break; case JitHelperId.Dbl2ULngOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2ULngOvf"); break; case JitHelperId.DblRem: mangledName = "RhpDblRem"; break; case JitHelperId.FltRem: mangledName = "RhpFltRem"; break; case JitHelperId.PInvokeBegin: mangledName = "RhpPInvoke"; break; case JitHelperId.PInvokeEnd: mangledName = "RhpPInvokeReturn"; break; case JitHelperId.ReversePInvokeEnter: mangledName = "RhpReversePInvoke2"; break; case JitHelperId.ReversePInvokeExit: mangledName = "RhpReversePInvokeReturn2"; break; default: throw new NotImplementedException(id.ToString()); } }
/// <summary> /// Returns JIT helper entrypoint. JIT helpers can be either implemented by entrypoint with given mangled name or /// by a method in class library. /// </summary> public static void GetEntryPoint(TypeSystemContext context, ReadyToRunHelper id, out string mangledName, out MethodDesc methodDesc) { mangledName = null; methodDesc = null; switch (id) { case ReadyToRunHelper.Throw: mangledName = "RhpThrowEx"; break; case ReadyToRunHelper.Rethrow: mangledName = "RhpRethrow"; break; case ReadyToRunHelper.Overflow: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowOverflowException"); break; case ReadyToRunHelper.RngChkFail: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException"); break; case ReadyToRunHelper.FailFast: mangledName = "__fail_fast"; // TODO: Report stack buffer overrun break; case ReadyToRunHelper.ThrowNullRef: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNullReferenceException"); break; case ReadyToRunHelper.ThrowDivZero: methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowDivideByZeroException"); break; case ReadyToRunHelper.DebugBreak: mangledName = "RhDebugBreak"; break; case ReadyToRunHelper.WriteBarrier: mangledName = "RhpAssignRef"; break; case ReadyToRunHelper.CheckedWriteBarrier: mangledName = "RhpCheckedAssignRef"; break; case ReadyToRunHelper.ByRefWriteBarrier: mangledName = "RhpByRefAssignRef"; break; case ReadyToRunHelper.Box: case ReadyToRunHelper.Box_Nullable: mangledName = "RhBox"; break; case ReadyToRunHelper.Unbox: mangledName = "RhUnbox2"; break; case ReadyToRunHelper.Unbox_Nullable: mangledName = "RhUnboxNullable"; break; case ReadyToRunHelper.NewMultiDimArr_NonVarArg: methodDesc = context.GetHelperEntryPoint("ArrayHelpers", "NewObjArray"); break; case ReadyToRunHelper.NewArray: mangledName = "RhNewArray"; break; case ReadyToRunHelper.NewObject: mangledName = "RhNewObject"; break; case ReadyToRunHelper.Stelem_Ref: mangledName = "RhpStelemRef"; break; case ReadyToRunHelper.Ldelema_Ref: mangledName = "RhpLdelemaRef"; break; case ReadyToRunHelper.MemCpy: mangledName = "memcpy"; // TODO: Null reference handling break; case ReadyToRunHelper.MemSet: mangledName = "memset"; // TODO: Null reference handling break; case ReadyToRunHelper.GetRuntimeTypeHandle: methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeTypeHandle"); break; case ReadyToRunHelper.GetRuntimeMethodHandle: // TODO: Reflection case ReadyToRunHelper.GetRuntimeFieldHandle: // TODO: Reflection mangledName = "__fail_fast"; break; case ReadyToRunHelper.Lng2Dbl: mangledName = "RhpLng2Dbl"; break; case ReadyToRunHelper.ULng2Dbl: mangledName = "RhpULng2Dbl"; break; case ReadyToRunHelper.Dbl2Lng: mangledName = "RhpDbl2Lng"; break; case ReadyToRunHelper.Dbl2ULng: mangledName = "RhpDbl2ULng"; break; case ReadyToRunHelper.Dbl2IntOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2IntOvf"); break; case ReadyToRunHelper.Dbl2UIntOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2UIntOvf"); break; case ReadyToRunHelper.Dbl2LngOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2LngOvf"); break; case ReadyToRunHelper.Dbl2ULngOvf: methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2ULngOvf"); break; case ReadyToRunHelper.DblRem: mangledName = "RhpDblRem"; break; case ReadyToRunHelper.FltRem: mangledName = "RhpFltRem"; break; case ReadyToRunHelper.PInvokeBegin: mangledName = "RhpPInvoke"; break; case ReadyToRunHelper.PInvokeEnd: mangledName = "RhpPInvokeReturn"; break; case ReadyToRunHelper.ReversePInvokeEnter: mangledName = "RhpReversePInvoke2"; break; case ReadyToRunHelper.ReversePInvokeExit: mangledName = "RhpReversePInvokeReturn2"; break; case ReadyToRunHelper.CheckCastAny: mangledName = "RhTypeCast_CheckCast2"; break; case ReadyToRunHelper.CheckInstanceAny: mangledName = "RhTypeCast_IsInstanceOf2"; break; case ReadyToRunHelper.MonitorEnter: methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorEnter"); break; case ReadyToRunHelper.MonitorExit: methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorExit"); break; case ReadyToRunHelper.MonitorEnterStatic: methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorEnterStatic"); break; case ReadyToRunHelper.MonitorExitStatic: methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorExitStatic"); break; default: throw new NotImplementedException(id.ToString()); } }