Skip to content
This repository has been archived by the owner on Nov 1, 2020. It is now read-only.

Commit

Permalink
Progress towards x86 Windows support (#7944)
Browse files Browse the repository at this point in the history
* Fix x86 Windows build

* Fix calling convention mismatch in JitHost

* Fix ObjWriter build

* Fix ObjWriter calling convention mismatch

* Use the correct target triple for x86

* Implement helper to get the non-GC static base

* Implement helpers necessary to get a build out
  • Loading branch information
MichalStrehovsky authored and jkotas committed Jan 9, 2020
1 parent 3584c6c commit 9ef8d4d
Show file tree
Hide file tree
Showing 11 changed files with 239 additions and 114 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1226,7 +1226,7 @@ private static string GetLLVMTripleFromTarget(TargetDetails target)
arch = "x86_64";
break;
case TargetArchitecture.X86:
arch = "x86";
arch = "i686";
break;
case TargetArchitecture.Wasm32:
arch = "wasm32";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ public X86Emitter(NodeFactory factory, bool relocsOnly)
public ObjectDataBuilder Builder;
public TargetRegisterMap TargetRegister;

public void EmitCMP(ref AddrMode addrMode, sbyte immediate)
{
if (addrMode.Size == AddrModeSize.Int16)
Builder.EmitByte(0x66);
EmitIndirInstruction((byte)((addrMode.Size != AddrModeSize.Int8) ? 0x83 : 0x80), 0x7, ref addrMode);
Builder.EmitByte((byte)immediate);
}

public void EmitADD(ref AddrMode addrMode, sbyte immediate)
{
if (addrMode.Size == AddrModeSize.Int16)
Expand Down Expand Up @@ -76,7 +84,13 @@ public void EmitPUSH(ISymbolNode node)
}
}

public void EmitMOV(Register register, ISymbolNode node)
public void EmitMOV(Register regDst, Register regSrc)
{
Builder.EmitByte(0x8B);
Builder.EmitByte((byte)(0xC0 | (((int)regDst & 0x07) << 3) | (((int)regSrc & 0x07))));
}

public void EmitMOV(Register register, ISymbolNode node, int delta = 0)
{
if (node.RepresentsIndirectionCell)
{
Expand All @@ -89,14 +103,29 @@ public void EmitMOV(Register register, ISymbolNode node)
// mov register, immediate
Builder.EmitByte((byte)(0xB8 + (byte)register));
}
Builder.EmitReloc(node, RelocType.IMAGE_REL_BASED_HIGHLOW);
Builder.EmitReloc(node, RelocType.IMAGE_REL_BASED_HIGHLOW, delta);
}

public void EmitINT3()
{
Builder.EmitByte(0xCC);
}

public void EmitRET()
{
Builder.EmitByte(0xC3);
}

public void EmitRETIfEqual()
{
// jne @+1
Builder.EmitByte(0x75);
Builder.EmitByte(0x01);

// ret
Builder.EmitByte(0xC3);
}

private bool InSignedByteRange(int i)
{
return i == (int)(sbyte)i;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ partial class ReadyToRunGenericHelperNode
{
protected sealed override void EmitCode(NodeFactory factory, ref X86Emitter encoder, bool relocsOnly)
{
throw new NotImplementedException();
encoder.EmitINT3();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,80 @@
// See the LICENSE file in the project root for more information.

using System;
using System.Collections.Generic;
using System.Diagnostics;

using ILCompiler.DependencyAnalysis.X86;

using Internal.TypeSystem;
using ILCompiler;

namespace ILCompiler.DependencyAnalysis
{
/// <summary>
/// X64 specific portions of ReadyToRunHelperNode
/// X86 specific portions of ReadyToRunHelperNode
/// </summary>
public partial class ReadyToRunHelperNode
{
protected override void EmitCode(NodeFactory factory, ref X86Emitter encoder, bool relocsOnly)
{
throw new NotImplementedException();
switch (Id)
{
case ReadyToRunHelperId.VirtualCall:
{
encoder.EmitINT3();
}
break;

case ReadyToRunHelperId.GetNonGCStaticBase:
{
MetadataType target = (MetadataType)Target;
bool hasLazyStaticConstructor = factory.TypeSystemContext.HasLazyStaticConstructor(target);
encoder.EmitMOV(encoder.TargetRegister.Result, factory.TypeNonGCStaticsSymbol(target));

if (!hasLazyStaticConstructor)
{
encoder.EmitRET();
}
else
{
// We need to trigger the cctor before returning the base. It is stored at the beginning of the non-GC statics region.
encoder.EmitMOV(encoder.TargetRegister.Arg0, factory.TypeNonGCStaticsSymbol(target), -NonGCStaticsNode.GetClassConstructorContextStorageSize(factory.Target, target));

AddrMode initialized = new AddrMode(encoder.TargetRegister.Arg0, null, factory.Target.PointerSize, 0, AddrModeSize.Int32);
encoder.EmitCMP(ref initialized, 1);
encoder.EmitRETIfEqual();

encoder.EmitMOV(encoder.TargetRegister.Arg1, encoder.TargetRegister.Result);
encoder.EmitJMP(factory.HelperEntrypoint(HelperEntrypoint.EnsureClassConstructorRunAndReturnNonGCStaticBase));
}
}
break;

case ReadyToRunHelperId.GetThreadStaticBase:
{
encoder.EmitINT3();
}
break;

case ReadyToRunHelperId.GetGCStaticBase:
{
encoder.EmitINT3();
}
break;

case ReadyToRunHelperId.DelegateCtor:
{
encoder.EmitINT3();
}
break;

case ReadyToRunHelperId.ResolveVirtualFunction:
{
encoder.EmitINT3();
}
break;

default:
throw new NotImplementedException();
}
}
}
}
12 changes: 12 additions & 0 deletions src/ILCompiler.Compiler/src/Compiler/JitHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,18 @@ public static void GetEntryPoint(TypeSystemContext context, ReadyToRunHelper id,
case ReadyToRunHelper.ByRefWriteBarrier:
mangledName = "RhpByRefAssignRef";
break;
case ReadyToRunHelper.WriteBarrier_EAX:
mangledName = "RhpAssignRefEAX";
break;
case ReadyToRunHelper.WriteBarrier_ECX:
mangledName = "RhpAssignRefECX";
break;
case ReadyToRunHelper.CheckedWriteBarrier_EAX:
mangledName = "RhpCheckedAssignRefEAX";
break;
case ReadyToRunHelper.CheckedWriteBarrier_ECX:
mangledName = "RhpCheckedAssignRefECX";
break;

case ReadyToRunHelper.Box:
case ReadyToRunHelper.Box_Nullable:
Expand Down
12 changes: 12 additions & 0 deletions src/ILCompiler.RyuJit/src/JitInterface/CorInfoImpl.RyuJit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,18 @@ private ISymbolNode GetHelperFtnUncached(CorInfoHelpFunc ftnNum)
case CorInfoHelpFunc.CORINFO_HELP_ASSIGN_BYREF:
id = ReadyToRunHelper.ByRefWriteBarrier;
break;
case CorInfoHelpFunc.CORINFO_HELP_ASSIGN_REF_EAX:
id = ReadyToRunHelper.WriteBarrier_EAX;
break;
case CorInfoHelpFunc.CORINFO_HELP_ASSIGN_REF_ECX:
id = ReadyToRunHelper.WriteBarrier_ECX;
break;
case CorInfoHelpFunc.CORINFO_HELP_CHECKED_ASSIGN_REF_EAX:
id = ReadyToRunHelper.CheckedWriteBarrier_EAX;
break;
case CorInfoHelpFunc.CORINFO_HELP_CHECKED_ASSIGN_REF_ECX:
id = ReadyToRunHelper.CheckedWriteBarrier_ECX;
break;

case CorInfoHelpFunc.CORINFO_HELP_ARRADDR_ST:
id = ReadyToRunHelper.Stelem_Ref;
Expand Down
2 changes: 2 additions & 0 deletions src/Native/ObjWriter/llvmCap/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ endif()
get_target_property(CORERT_NATIVE_COMPILE_OPTIONS Runtime COMPILE_OPTIONS)
get_target_property(CORERT_NATIVE_INCLUDE_DIRECTORIES Runtime INCLUDE_DIRECTORIES)

list(REMOVE_ITEM CORERT_NATIVE_COMPILE_OPTIONS "/Gz")

foreach(dir ${CORERT_NATIVE_INCLUDE_DIRECTORIES})
set(CORERT_NATIVE_COMPILE_OPTIONS "${CORERT_NATIVE_COMPILE_OPTIONS} -I${dir}")
endforeach()
Expand Down
Loading

0 comments on commit 9ef8d4d

Please sign in to comment.