From be1b737ce925d2f851ef2171f7d0142f8c8d2f24 Mon Sep 17 00:00:00 2001 From: Scott Waye Date: Sat, 25 Jul 2020 19:21:42 -0500 Subject: [PATCH 1/2] Add handling for TypeFlags.FunctionPointer Add a call to RhpReversePInvokeReturn2 when Main returns --- .../src/CodeGen/ILToWebAssemblyImporter.cs | 3 +++ .../src/CodeGen/WebAssemblyObjectWriter.cs | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/ILCompiler.WebAssembly/src/CodeGen/ILToWebAssemblyImporter.cs b/src/ILCompiler.WebAssembly/src/CodeGen/ILToWebAssemblyImporter.cs index 3a8b45dae16..809ba28e426 100644 --- a/src/ILCompiler.WebAssembly/src/CodeGen/ILToWebAssemblyImporter.cs +++ b/src/ILCompiler.WebAssembly/src/CodeGen/ILToWebAssemblyImporter.cs @@ -1061,6 +1061,7 @@ private StackValueKind GetStackValueKind(TypeDesc type) case TypeFlags.ByRef: return StackValueKind.ByRef; case TypeFlags.Pointer: + case TypeFlags.FunctionPointer: return StackValueKind.NativeInt; default: return StackValueKind.Unknown; @@ -1285,6 +1286,8 @@ internal static LLVMTypeRef GetLLVMTypeForTypeDesc(TypeDesc type) case TypeFlags.Pointer: return LLVMTypeRef.CreatePointer(type.GetParameterType().IsVoid ? LLVMTypeRef.Int8 : GetLLVMTypeForTypeDesc(type.GetParameterType()), 0); + case TypeFlags.FunctionPointer: + return LLVMTypeRef.CreatePointer(LLVMTypeRef.Int8, 0); case TypeFlags.Int64: case TypeFlags.UInt64: diff --git a/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs b/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs index 113229192a9..430e703db43 100644 --- a/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs +++ b/src/ILCompiler.WebAssembly/src/CodeGen/WebAssemblyObjectWriter.cs @@ -272,6 +272,14 @@ private void EmitNativeMain(LLVMContextRef context) }, "returnValue"); + LLVMValueRef RhpReversePInvokeReturn2 = Module.GetNamedFunction("RhpReversePInvokeReturn2"); + LLVMTypeRef reversePInvokeFunctionType = LLVMTypeRef.CreateFunction(LLVMTypeRef.Void, new LLVMTypeRef[] { LLVMTypeRef.CreatePointer(reversePInvokeFrameType, 0) }, false); + if (RhpReversePInvoke2.Handle == IntPtr.Zero) + { + RhpReversePInvokeReturn2 = Module.AddFunction("RhpReversePInvokeReturn2", reversePInvokeFunctionType); + } + builder.BuildCall(RhpReversePInvokeReturn2, new LLVMValueRef[] { reversePinvokeFrame }, ""); + builder.BuildRet(mainReturn); mainFunc.Linkage = LLVMLinkage.LLVMExternalLinkage; } From 33b163be28d0f8f7a4bca95cfea598ec3515cd02 Mon Sep 17 00:00:00 2001 From: Scott Waye Date: Sat, 25 Jul 2020 19:36:29 -0500 Subject: [PATCH 2/2] add warning --- src/System.Private.CoreLib/src/System/Environment.CoreRT.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Private.CoreLib/src/System/Environment.CoreRT.cs b/src/System.Private.CoreLib/src/System/Environment.CoreRT.cs index 42b326a5365..52ae5d3ca84 100644 --- a/src/System.Private.CoreLib/src/System/Environment.CoreRT.cs +++ b/src/System.Private.CoreLib/src/System/Environment.CoreRT.cs @@ -55,7 +55,7 @@ internal static void ShutdownCore() { // TODO: shut down threading etc. -#if !TARGET_WASM // WASMTODO +#if !TARGET_WASM // WASMTODO Be careful what happens here as if the code has called emscripten_set_main_loop then the main loop method will normally be called repeatedly after this method AppContext.OnProcessExit(); #endif }