/// <summary> /// Provides method bodies for intrinsics recognized by the compiler. /// It can return null if it's not an intrinsic recognized by the compiler, /// but an intrinsic e.g. recognized by codegen. /// </summary> private MethodIL TryGetIntrinsicMethodIL(MethodDesc method) { var mdType = method.OwningType as MetadataType; if (mdType == null) { return(null); } if (mdType.Name == "RuntimeHelpers" && mdType.Namespace == "System.Runtime.CompilerServices") { return(RuntimeHelpersIntrinsics.EmitIL(method)); } if (mdType.Name == "Unsafe" && mdType.Namespace == "Internal.Runtime.CompilerServices") { return(UnsafeIntrinsics.EmitIL(method)); } if (mdType.Name == "Volatile" && mdType.Namespace == "System.Threading") { return(VolatileIntrinsics.EmitIL(method)); } if (mdType.Name == "Interlocked" && mdType.Namespace == "System.Threading") { return(InterlockedIntrinsics.EmitIL(method)); } return(null); }
/// <summary> /// Provides method bodies for intrinsics recognized by the compiler. /// It can return null if it's not an intrinsic recognized by the compiler, /// but an intrinsic e.g. recognized by codegen. /// </summary> private MethodIL TryGetIntrinsicMethodIL(MethodDesc method) { Debug.Assert(method.IsIntrinsic); MetadataType owningType = method.OwningType as MetadataType; if (owningType == null) { return(null); } switch (owningType.Name) { case "Interlocked": { if (owningType.Namespace == "System.Threading") { return(InterlockedIntrinsics.EmitIL(method)); } } break; case "Unsafe": { if (owningType.Namespace == "Internal.Runtime.CompilerServices") { return(UnsafeIntrinsics.EmitIL(method)); } } break; case "MemoryMarshal": { if (owningType.Namespace == "System.Runtime.InteropServices") { return(MemoryMarshalIntrinsics.EmitIL(method)); } } break; case "Volatile": { if (owningType.Namespace == "System.Threading") { return(VolatileIntrinsics.EmitIL(method)); } } break; case "Debug": { if (owningType.Namespace == "System.Diagnostics" && method.Name == "DebugBreak") { return(new ILStubMethodIL(method, new byte[] { (byte)ILOpcode.break_, (byte)ILOpcode.ret }, Array.Empty <LocalVariableDefinition>(), null)); } } break; case "EETypePtr": { if (owningType.Namespace == "System" && method.Name == "EETypePtrOf") { return(EETypePtrOfIntrinsic.EmitIL(method)); } } break; case "RuntimeAugments": { if (owningType.Namespace == "Internal.Runtime.Augments" && method.Name == "GetCanonType") { return(GetCanonTypeIntrinsic.EmitIL(method)); } } break; case "EEType": { if (owningType.Namespace == "Internal.Runtime" && method.Name == "get_SupportsRelativePointers") { ILOpcode value = method.Context.Target.SupportsRelativePointers ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0; return(new ILStubMethodIL(method, new byte[] { (byte)value, (byte)ILOpcode.ret }, Array.Empty <LocalVariableDefinition>(), null)); } } break; } return(null); }