Skip to content

Commit 186c994

Browse files
authored
NativeAOT/x86: Implement ResolveVirtualFunction R2R helper (#99913)
1 parent 46cdeca commit 186c994

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.cs

+22-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,28 @@ protected override void EmitCode(NodeFactory factory, ref X86Emitter encoder, bo
188188

189189
case ReadyToRunHelperId.ResolveVirtualFunction:
190190
{
191-
encoder.EmitINT3();
191+
MethodDesc targetMethod = (MethodDesc)Target;
192+
if (targetMethod.OwningType.IsInterface)
193+
{
194+
encoder.EmitMOV(encoder.TargetRegister.Arg1, factory.InterfaceDispatchCell(targetMethod));
195+
encoder.EmitJMP(factory.ExternSymbol("RhpResolveInterfaceMethod"));
196+
}
197+
else
198+
{
199+
if (relocsOnly)
200+
break;
201+
202+
AddrMode loadFromThisPtr = new AddrMode(encoder.TargetRegister.Arg0, null, 0, 0, AddrModeSize.Int32);
203+
encoder.EmitMOV(encoder.TargetRegister.Result, ref loadFromThisPtr);
204+
205+
Debug.Assert(!targetMethod.CanMethodBeInSealedVTable(factory));
206+
207+
int slot = VirtualMethodSlotHelper.GetVirtualMethodSlot(factory, targetMethod, targetMethod.OwningType);
208+
Debug.Assert(slot != -1);
209+
AddrMode loadFromSlot = new AddrMode(encoder.TargetRegister.Result, null, EETypeNode.GetVTableOffset(factory.Target.PointerSize) + (slot * factory.Target.PointerSize), 0, AddrModeSize.Int32);
210+
encoder.EmitMOV(encoder.TargetRegister.Result, ref loadFromSlot);
211+
encoder.EmitRET();
212+
}
192213
}
193214
break;
194215

0 commit comments

Comments
 (0)