Skip to content

Commit 5e949e1

Browse files
authored
[mono] Add SwiftError support for Swift reverse pinvokes (#101122)
* initialized swift reverse pinvokes for mini jit arm64 * added comments * fixed reverse pinvokes error passing on arm64 * implemented swift reverse pinvoke error passing on amd64 * disable SwiftErrorHandling tests on mono interpreter for now * add comments
1 parent 71abc26 commit 5e949e1

File tree

4 files changed

+53
-20
lines changed

4 files changed

+53
-20
lines changed

src/mono/mono/mini/mini-amd64.c

+26-10
Original file line numberDiff line numberDiff line change
@@ -1990,13 +1990,18 @@ mono_arch_allocate_vars (MonoCompile *cfg)
19901990
}
19911991
case ArgSwiftError: {
19921992
ins->opcode = OP_REGOFFSET;
1993-
ins->inst_basereg = cfg->frame_reg;
1994-
ins->inst_offset = ainfo->offset + ARGS_OFFSET;
19951993
offset = ALIGN_TO (offset, sizeof (target_mgreg_t));
1994+
ins->inst_basereg = cfg->frame_reg;
1995+
ins->inst_offset = offset;
19961996
offset += sizeof (target_mgreg_t);
19971997

19981998
cfg->arch.swift_error_var = ins;
1999-
cfg->used_int_regs |= (size_t)(1 << AMD64_R12);
1999+
2000+
/* In the n2m case, the error register functions as an extra return register
2001+
* and is thus is not treated as callee-saved.
2002+
*/
2003+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)
2004+
cfg->used_int_regs |= (size_t)(1 << AMD64_R12);
20002005
}
20012006
break;
20022007
default:
@@ -4280,8 +4285,13 @@ emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code)
42804285
guint32 quad;
42814286

42824287
if (cfg->arch.swift_error_var) {
4283-
amd64_mov_reg_membase (code, AMD64_R11, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, sizeof (target_mgreg_t));
4284-
amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_R12, sizeof (target_mgreg_t));
4288+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
4289+
amd64_mov_reg_membase (code, AMD64_R11, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, sizeof (target_mgreg_t));
4290+
amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_R12, sizeof (target_mgreg_t));
4291+
}
4292+
else if (cfg->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {
4293+
amd64_mov_reg_membase (code, AMD64_R12, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, sizeof (target_mgreg_t));
4294+
}
42854295
}
42864296

42874297
/* Move return value to the target register */
@@ -8248,11 +8258,17 @@ MONO_RESTORE_WARNING
82488258
amd64_mov_membase_reg (code, ins->inst_basereg, ins->inst_offset, ainfo->reg, 8);
82498259
break;
82508260
case ArgSwiftError:
8251-
if (ainfo->offset) {
8252-
amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, ARGS_OFFSET + ainfo->offset, 8);
8253-
amd64_mov_membase_reg (code, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, AMD64_R11, sizeof (target_mgreg_t));
8254-
} else {
8255-
amd64_mov_membase_reg (code, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, ainfo->reg, sizeof (target_mgreg_t));
8261+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
8262+
if (ainfo->offset) {
8263+
amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, ARGS_OFFSET + ainfo->offset, 8);
8264+
amd64_mov_membase_reg (code, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, AMD64_R11, sizeof (target_mgreg_t));
8265+
} else {
8266+
amd64_mov_membase_reg (code, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset, ainfo->reg, sizeof (target_mgreg_t));
8267+
}
8268+
} else if (cfg->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {
8269+
/* Relies on arguments being passed on the stack */
8270+
amd64_lea_membase (code, AMD64_R11, cfg->arch.swift_error_var->inst_basereg, cfg->arch.swift_error_var->inst_offset);
8271+
amd64_mov_membase_reg (code, ins->inst_basereg, ins->inst_offset, AMD64_R11, 8);
82568272
}
82578273
break;
82588274
default:

src/mono/mono/mini/mini-arm64.c

+24-8
Original file line numberDiff line numberDiff line change
@@ -2887,7 +2887,12 @@ mono_arch_allocate_vars (MonoCompile *cfg)
28872887
offset += size;
28882888

28892889
cfg->arch.swift_error_var = ins;
2890-
cfg->used_int_regs |= 1 << ARMREG_R21;
2890+
2891+
/* In the n2m case, the error register functions as an extra return register
2892+
* and is thus is not treated as callee-saved.
2893+
*/
2894+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)
2895+
cfg->used_int_regs |= 1 << ARMREG_R21;
28912896
break;
28922897
}
28932898
default:
@@ -3731,8 +3736,13 @@ emit_move_return_value (MonoCompile *cfg, guint8 * code, MonoInst *ins)
37313736
MonoCallInst *call;
37323737

37333738
if (cfg->arch.swift_error_var) {
3734-
code = emit_ldrx (code, ARMREG_IP0, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
3735-
code = emit_strx (code, ARMREG_R21, ARMREG_IP0, 0);
3739+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
3740+
code = emit_ldrx (code, ARMREG_IP0, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
3741+
code = emit_strx (code, ARMREG_R21, ARMREG_IP0, 0);
3742+
} else if (cfg->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {
3743+
/* Load the value of SwiftError into R21 */
3744+
code = emit_ldrx (code, ARMREG_R21, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
3745+
}
37363746
}
37373747

37383748
call = (MonoCallInst*)ins;
@@ -5937,11 +5947,17 @@ emit_move_args (MonoCompile *cfg, guint8 *code)
59375947
code = emit_strfpq (code, ainfo->reg, ins->inst_basereg, GTMREG_TO_INT (ins->inst_offset));
59385948
break;
59395949
case ArgSwiftError:
5940-
if (ainfo->offset) {
5941-
code = emit_ldrx (code, ARMREG_IP0, cfg->arch.args_reg, ainfo->offset);
5942-
code = emit_strx (code, ARMREG_IP0, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
5943-
} else {
5944-
code = emit_strx (code, ainfo->reg, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
5950+
if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
5951+
if (ainfo->offset) {
5952+
code = emit_ldrx (code, ARMREG_IP0, cfg->arch.args_reg, ainfo->offset);
5953+
code = emit_strx (code, ARMREG_IP0, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
5954+
} else {
5955+
code = emit_strx (code, ainfo->reg, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
5956+
}
5957+
} else if (cfg->method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) {
5958+
arm_addx_imm (code, ARMREG_IP0, cfg->arch.swift_error_var->inst_basereg, GTMREG_TO_INT (cfg->arch.swift_error_var->inst_offset));
5959+
/* Relies on arguments being passed on the stack */
5960+
code = emit_strx (code, ARMREG_IP0, ins->inst_basereg, GTMREG_TO_INT (ins->inst_offset));
59455961
}
59465962
break;
59475963
default:

src/tests/Interop/Swift/SwiftErrorHandling/SwiftErrorHandling.cs

-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ public unsafe static void TestSwiftErrorOnStackNotThrown()
128128
}
129129

130130
[Fact]
131-
[SkipOnMono("needs reverse P/Invoke support")]
132131
public static unsafe void TestUnmanagedCallersOnly()
133132
{
134133
SwiftError error;
@@ -144,7 +143,6 @@ public static unsafe void TestUnmanagedCallersOnly()
144143
}
145144

146145
[Fact]
147-
[SkipOnMono("needs reverse P/Invoke support")]
148146
public static unsafe void TestUnmanagedCallersOnlyWithReturn()
149147
{
150148
SwiftError error;

src/tests/issues.targets

+3
Original file line numberDiff line numberDiff line change
@@ -2191,6 +2191,9 @@
21912191
<ExcludeList Include = "$(XUnitTestBinBase)/JIT/Directed/Arrays/nintindexoutofrange/**">
21922192
<Issue>https://github.com/dotnet/runtime/issues/71656</Issue>
21932193
</ExcludeList>
2194+
<ExcludeList Include="$(XunitTestBinBase)/Interop/Swift/SwiftErrorHandling/**">
2195+
<Issue>Reverse P/Invokes not supported yet</Issue>
2196+
</ExcludeList>
21942197
<!-- End interpreter issues -->
21952198
</ItemGroup>
21962199

0 commit comments

Comments
 (0)