Ejemplo n.º 1
0
        /// <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());
            }
        }
Ejemplo n.º 2
0
        /// <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());
            }
        }
Ejemplo n.º 3
0
        /// <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());
            }
        }