未验证 提交 7112a41c 编写于 作者: A Ankit Jain 提交者: GitHub

[wasm] Fix inclusion of `marshal-ilgen` component (#87629)

* [wasm] Fix inclusion of `marshal-ilgen`

Issue: `marshal-ilgen` component never included

Reason:
The item inclusion was being done *outside* any targets, which would get
evaluated *before* any targets are run.

But the item that it depends on to decide whether to include
`marshal-ilgen` is in target
`_ScanAssembliesDecideLightweightMarshaler`.

This broke microbenchmarks with:
```
Error: [MONO] * Assertion at /__w/1/s/src/mono/mono/component/marshal-ilgen-stub.c:28, condition `!m_type_is_byref(t)' not met

    at ft (/home/helixbot/work/96640802/w/B9C40A15/e/performance/artifacts/bin/for-running/MicroBenchmarks/fa21f9df-08d0-43a4-b28d-0078821ea492/bin/net8.0/browser-wasm/AppBundle/dotnet.runtime.js:3:12422)
    at mt (/home/helixbot/work/96640802/w/B9C40A15/e/performance/artifacts/bin/for-running/MicroBenchmarks/fa21f9df-08d0-43a4-b28d-0078821ea492/bin/net8.0/browser-wasm/AppBundle/dotnet.runtime.js:3:12676)
    at wasm_trace_logger (wasm://wasm/00a5f7d6:wasm-function[7879]:0x1e41d0)
    at eglib_log_adapter (wasm://wasm/00a5f7d6:wasm-function[581]:0x37fbb)
    at monoeg_g_logv_nofree (wasm://wasm/00a5f7d6:wasm-function[504]:0x35f57)
    at monoeg_assertion_message (wasm://wasm/00a5f7d6:wasm-function[508]:0x36078)
    at mono_assertion_message (wasm://wasm/00a5f7d6:wasm-function[510]:0x360bb)
    at stub_emit_marshal_ilgen (wasm://wasm/00a5f7d6:wasm-function[1300]:0x66db1)
    at mono_emit_marshal (wasm://wasm/00a5f7d6:wasm-function[1820]:0x8990b)
    at emit_native_wrapper_ilgen (wasm://wasm/00a5f7d6:wasm-function[2651]:0xb86de)
```

* [wasm] WBT: Use sdk 8.0.100-preview.6.23314.19

.. to workaround https://github.com/dotnet/runtime/issues/87647 .

* [wasm] Add test for marshal-ilgen - wbt

* add missing file
上级 35a5afb6
......@@ -204,7 +204,7 @@
<GrpcDotnetClientVersion>2.45.0</GrpcDotnetClientVersion>
<GrpcToolsVersion>2.45.0</GrpcToolsVersion>
<!-- Uncomment to set a fixed version, else the latest is used -->
<!-- <SdkVersionForWorkloadTesting>8.0.100-alpha.1.23077.3</SdkVersionForWorkloadTesting> -->
<SdkVersionForWorkloadTesting>8.0.100-preview.6.23314.19</SdkVersionForWorkloadTesting>
<CompilerPlatformTestingVersion>1.1.2-beta1.23205.1</CompilerPlatformTestingVersion>
<!-- Docs -->
<MicrosoftPrivateIntellisenseVersion>7.0.0-preview-20221010.1</MicrosoftPrivateIntellisenseVersion>
......
......@@ -180,5 +180,41 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined)
Assert.Contains("Use '-p:WasmAllowUndefinedSymbols=true' to allow undefined symbols", result.Output);
}
}
[Theory]
[InlineData("Debug")]
[InlineData("Release")]
public void ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config)
{
string id = $"dllimport_incompatible_{Path.GetRandomFileName()}";
string projectPath = CreateWasmTemplateProject(id, template: "wasmconsole");
string nativeSourceFilename = "incompatible_type.c";
string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}";
File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode);
AddItemsPropertiesToProject(
projectPath,
extraItems: "<NativeFileReference Include=\"" + nativeSourceFilename + "\" />"
);
File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs"),
Path.Combine(_projectDir!, "Program.cs"),
overwrite: true);
CommandResult result = new DotNetCommand(s_buildEnv, _testOutput)
.WithWorkingDirectory(_projectDir!)
.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir)
.ExecuteWithCapturedOutput("build", $"-c {config} -bl");
Assert.True(result.ExitCode == 0, "Expected build to succeed");
CommandResult res = new RunCommand(s_buildEnv, _testOutput)
.WithWorkingDirectory(_projectDir!)
.ExecuteWithCapturedOutput($"run --no-silent --no-build -c {config}")
.EnsureSuccessful();
Assert.Contains("Hello, Console!", res.Output);
Assert.Contains("Hello, World! Greetings from node version", res.Output);
}
}
}
......@@ -35,9 +35,6 @@
<ItemGroup Condition="'$(Configuration)' == 'Debug' and '@(_MonoComponent->Count())' == 0">
<_MonoComponent Include="hot_reload;debugger" />
</ItemGroup>
<ItemGroup Condition="'@(MonoLightweightMarshallerIncompatibleAssemblies->Count())' > 0">
<_MonoComponent Include="marshal-ilgen" />
</ItemGroup>
<Import Project="$(MSBuildThisFileDirectory)EmSdkRepo.Defaults.props" Condition="'$(WasmUseEMSDK_PATH)' == 'true'" />
......@@ -684,12 +681,16 @@
<Target Name="_ScanAssembliesDecideLightweightMarshaler">
<ItemGroup>
<AssembliesToScan Include="@(_WasmAssembliesInternal)" />
<_AssembliesToScan Include="@(_WasmAssembliesInternal)" />
</ItemGroup>
<MarshalingPInvokeScanner Assemblies ="@(AssembliesToScan)">
<MarshalingPInvokeScanner Assemblies ="@(_AssembliesToScan)">
<Output TaskParameter="IncompatibleAssemblies" ItemName="MonoLightweightMarshallerIncompatibleAssemblies" />
</MarshalingPInvokeScanner>
<ItemGroup Condition="@(MonoLightweightMarshallerIncompatibleAssemblies->Count()) > 0">
<_MonoComponent Include="marshal-ilgen" />
</ItemGroup>
</Target>
<!-- '$(ArchiveTests)' != 'true' is to skip on CI for now -->
......
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.JavaScript;
Console.WriteLine("Hello, Console!");
return 0;
public partial class MyClass
{
[JSExport]
internal static string Greeting()
{
int[] x = new int[0];
call_needing_marhsal_ilgen(x);
var text = $"Hello, World! Greetings from node version: {GetNodeVersion()}";
return text;
}
[JSImport("node.process.version", "main.mjs")]
internal static partial string GetNodeVersion();
[DllImport("incompatible_type")]
static extern void call_needing_marhsal_ilgen(int[] numbers);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册