Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New object format and object hashes #875

Merged
merged 1 commit into from
Sep 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions Source/Mosa.Compiler.Framework/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ namespace Mosa.Compiler.Framework
/// </summary>
public sealed class Compiler
{
public const uint ObjectHeaderSizeInNativeIntegers = 2;

private const uint MaxThreads = 1024;

#region Data Members
Expand Down Expand Up @@ -256,7 +254,7 @@ public Compiler(MosaCompiler mosaCompiler)

Linker = new MosaLinker(this);

ObjectHeaderSize = (uint)Architecture.NativePointerSize * ObjectHeaderSizeInNativeIntegers;
ObjectHeaderSize = Architecture.NativePointerSize * 4 + 4; // Hash Value (32-bit) + Lock & Status (32-bit) + Method Table

StackFrame = Operand.CreateCPURegister(TypeSystem.BuiltIn.Pointer, Architecture.StackFrameRegister);
StackPointer = Operand.CreateCPURegister(TypeSystem.BuiltIn.Pointer, Architecture.StackPointerRegister);
Expand Down
14 changes: 6 additions & 8 deletions Source/Mosa.Compiler.Framework/CompilerStages/MetadataStage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,20 +44,18 @@ protected override void Finalization()
private LinkerSymbol EmitStringWithLength(string name, string data)
{
// Strings are now going to be embedded objects since they are immutable
var symbol = Linker.DefineSymbol(name, SectionKind.ROData, TypeLayout.NativePointerAlignment, Compiler.ObjectHeaderSize + NativePointerSize + ((uint)data.Length * 2));
var symbol = Linker.DefineSymbol(name, SectionKind.ROData, TypeLayout.NativePointerAlignment, (uint)(Compiler.ObjectHeaderSize + NativePointerSize + (data.Length * 2)));
var writer = new BinaryWriter(symbol.Stream);

// 1. Object Header
writer.WriteZeroBytes(NativePointerSize);
Linker.Link(LinkType.AbsoluteAddress, NativePatchType, symbol, Compiler.ObjectHeaderSize - NativePointerSize, Metadata.TypeDefinition + "System.String", 0);

// 2. Method Table Pointers
Linker.Link(LinkType.AbsoluteAddress, NativePatchType, symbol, writer.GetPosition(), Metadata.TypeDefinition + "System.String", 0);
writer.WriteZeroBytes(NativePointerSize);
// 1. Object Header
writer.WriteZeroBytes(Compiler.ObjectHeaderSize);

// 3. Length
// 2. Length
writer.Write(data.Length, NativePointerSize);

// 4. Unicode
// 3. Unicode
writer.Write(Encoding.Unicode.GetBytes(data));

return symbol;
Expand Down
2 changes: 1 addition & 1 deletion Source/Mosa.Compiler.Framework/CompilerVersion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static Version GetVersion()
if (version.Build == 0)
{
// Revision and build number are reversed by design
version = new Version(2, 0, 1, 3);
version = new Version(2, 0, 2, 0);
}

return version;
Expand Down
99 changes: 50 additions & 49 deletions Source/Mosa.Compiler.Framework/Stages/CILDecodingStageV2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Mosa.Compiler.MosaTypeSystem;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Mosa.Compiler.Framework.Stages
Expand Down Expand Up @@ -377,10 +378,10 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
switch (opcode)
{
case OpCode.Add: return Add(context, stack);
case OpCode.Add_ovf: return Add(context, stack); // TODO: implement overflow check
case OpCode.Add_ovf_un: return Add(context, stack); // TODO: implement overflow check
case OpCode.Add_ovf: return Add(context, stack); // TODO: implement overflow check
case OpCode.Add_ovf_un: return Add(context, stack); // TODO: implement overflow check
case OpCode.And: return And(context, stack);
case OpCode.Arglist: return false;
case OpCode.Arglist: return false; // TODO
case OpCode.Beq: return Branch(context, stack, ConditionCode.Equal, instruction);
case OpCode.Beq_s: return Branch(context, stack, ConditionCode.Equal, instruction);
case OpCode.Bge: return Branch(context, stack, ConditionCode.GreaterOrEqual, instruction);
Expand All @@ -404,19 +405,19 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Box: return Box(context, stack, instruction);
case OpCode.Br: return Branch(context, stack, instruction);
case OpCode.Br_s: return Branch(context, stack, instruction);
case OpCode.Break: return true;
case OpCode.Break: return true; // TODO
case OpCode.Brfalse: return Branch1(context, stack, ConditionCode.Equal, instruction);
case OpCode.Brfalse_s: return Branch1(context, stack, ConditionCode.Equal, instruction);
case OpCode.Brtrue: return Branch1(context, stack, ConditionCode.NotEqual, instruction);
case OpCode.Brtrue_s: return Branch1(context, stack, ConditionCode.NotEqual, instruction);
case OpCode.Call: return Call(context, stack, instruction);
case OpCode.Calli: return false;
case OpCode.Calli: return false; // TODO
case OpCode.Callvirt: return Callvirt(context, stack, instruction);
case OpCode.Castclass: return Castclass(context, stack);
case OpCode.Ceq: return Compare(context, stack, ConditionCode.Equal);
case OpCode.Cgt: return Compare(context, stack, ConditionCode.Greater);
case OpCode.Cgt_un: return Compare(context, stack, ConditionCode.UnsignedGreater);
case OpCode.Ckfinite: return false;
case OpCode.Ckfinite: return false; // TODO
case OpCode.Clt: return Compare(context, stack, ConditionCode.Less);
case OpCode.Clt_un: return Compare(context, stack, ConditionCode.UnsignedLess);
case OpCode.Conv_i: return ConvertI(context, stack);
Expand All @@ -425,7 +426,7 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Conv_i4: return ConvertI4(context, stack);
case OpCode.Conv_i8: return ConvertI8(context, stack);
case OpCode.Conv_ovf_i: return ConvertI(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_i_un: return false;
case OpCode.Conv_ovf_i_un: return false; // TODO
case OpCode.Conv_ovf_i1: return ConvertI1(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_i1_un: return ConvertUToI1(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_i2: return ConvertI2(context, stack); // TODO: implement overflow check
Expand All @@ -435,7 +436,7 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Conv_ovf_i8: return ConvertI8(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_i8_un: return ConvertUToI8(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_u: return ConvertU(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_u_un: return false;
case OpCode.Conv_ovf_u_un: return false; // TODO
case OpCode.Conv_ovf_u1: return ConvertU1(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_u1_un: return ConvertUToU1(context, stack); // TODO: implement overflow check
case OpCode.Conv_ovf_u2: return ConvertU2(context, stack); // TODO: implement overflow check
Expand All @@ -457,13 +458,13 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Div: return Div(context, stack);
case OpCode.Div_un: return DivUnsigned(context, stack);
case OpCode.Dup: return Dup(context, stack);
case OpCode.Endfilter: return false;
case OpCode.Endfinally: return false;
case OpCode.Extop: return false;
case OpCode.Initblk: return false;
case OpCode.InitObj: return false;
case OpCode.Endfilter: return false; // TODO
case OpCode.Endfinally: return false; // TODO
case OpCode.Extop: return false; // TODO
case OpCode.Initblk: return false; // TODO
case OpCode.InitObj: return false; // TODO
case OpCode.Isinst: return Isinst(context, stack, instruction);
case OpCode.Jmp: return false;
case OpCode.Jmp: return false; // TODO
case OpCode.Ldarg: return Ldarg(context, stack, (int)instruction.Operand);
case OpCode.Ldarg_0: return Ldarg(context, stack, 0);
case OpCode.Ldarg_1: return Ldarg(context, stack, 1);
Expand Down Expand Up @@ -499,10 +500,10 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Ldelem_u1: return Ldelem(context, stack, ElementType.U1);
case OpCode.Ldelem_u2: return Ldelem(context, stack, ElementType.U2);
case OpCode.Ldelem_u4: return Ldelem(context, stack, ElementType.U4);
case OpCode.Ldelema: return false;
case OpCode.Ldelema: return false; // TODO
case OpCode.Ldfld: return Ldfld(context, stack, instruction);
case OpCode.Ldflda: return false;
case OpCode.Ldftn: return false;
case OpCode.Ldflda: return false; // TODO
case OpCode.Ldftn: return false; // TODO
case OpCode.Ldind_i: return Ldind(context, stack, ElementType.I);
case OpCode.Ldind_i1: return Ldind(context, stack, ElementType.I1);
case OpCode.Ldind_i2: return Ldind(context, stack, ElementType.I2);
Expand All @@ -521,19 +522,19 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Ldloc_2: return Ldloc(context, stack, 2);
case OpCode.Ldloc_3: return Ldloc(context, stack, 3);
case OpCode.Ldloc_s: return Ldloc(context, stack, (int)instruction.Operand);
case OpCode.Ldloca: return false;
case OpCode.Ldloca_s: return false;
case OpCode.Ldloca: return false; // TODO
case OpCode.Ldloca_s: return false; // TODO
case OpCode.Ldnull: return Ldnull(context, stack);
case OpCode.Ldobj: return Ldobj(context, stack, instruction);
case OpCode.Ldsfld: return false;
case OpCode.Ldsflda: return false;
case OpCode.Ldsfld: return false; // TODO
case OpCode.Ldsflda: return false; // TODO
case OpCode.Ldstr: return Ldstr(context, stack, instruction);
case OpCode.Ldtoken: return false;
case OpCode.Ldvirtftn: return false;
case OpCode.Leave: return false;
case OpCode.Leave_s: return false;
case OpCode.Localalloc: return false;
case OpCode.Mkrefany: return false;
case OpCode.Ldtoken: return false; // TODO
case OpCode.Ldvirtftn: return false; // TODO
case OpCode.Leave: return false; // TODO
case OpCode.Leave_s: return false; // TODO
case OpCode.Localalloc: return false; // TODO
case OpCode.Mkrefany: return false; // TODO
case OpCode.Mul: return Mul(context, stack);
case OpCode.Mul_ovf: return Mul(context, stack); // TODO: implement overflow check
case OpCode.Mul_ovf_un: return Mul(context, stack); // TODO: implement overflow check
Expand All @@ -544,18 +545,18 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Not: return Not(context, stack);
case OpCode.Or: return Or(context, stack);
case OpCode.Pop: return Pop(context, stack);
case OpCode.PreConstrained: return false;
case OpCode.PreNo: return false;
case OpCode.PreReadOnly: return false;
case OpCode.PreTail: return false;
case OpCode.PreUnaligned: return false;
case OpCode.PreVolatile: return false;
case OpCode.Refanytype: return false;
case OpCode.Refanyval: return false;
case OpCode.PreConstrained: return false; // TODO
case OpCode.PreNo: return false; // TODO
case OpCode.PreReadOnly: return false; // TODO
case OpCode.PreTail: return false; // TODO
case OpCode.PreUnaligned: return false; // TODO
case OpCode.PreVolatile: return false; // TODO
case OpCode.Refanytype: return false; // TODO
case OpCode.Refanyval: return false; // TODO
case OpCode.Rem: return RemOperand(context, stack);
case OpCode.Rem_un: return RemUnsigned(context, stack);
case OpCode.Ret: return Ret(context, stack);
case OpCode.Rethrow: return false;
case OpCode.Rethrow: return false; // TODO
case OpCode.Shl: return Shl(context, stack, instruction);
case OpCode.Shr: return Shr(context, stack, instruction);
case OpCode.Shr_un: return ShrU(context, stack, instruction);
Expand All @@ -571,7 +572,7 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Stelem_r4: return Stelem(context, stack, ElementType.R4);
case OpCode.Stelem_r8: return Stelem(context, stack, ElementType.R8);
case OpCode.Stelem_ref: return Stelem(context, stack, ElementType.Ref);
case OpCode.Stfld: return false;
case OpCode.Stfld: return false; // TODO
case OpCode.Stind_i: return Stind(context, stack, ElementType.I);
case OpCode.Stind_i1: return Stind(context, stack, ElementType.I1);
case OpCode.Stind_i2: return Stind(context, stack, ElementType.I2);
Expand All @@ -587,11 +588,11 @@ private bool Translate(Stack<StackEntry> stack, Context context, MosaInstruction
case OpCode.Stloc_3: return Stloc(context, stack, 3);
case OpCode.Stloc_s: return Stloc(context, stack, (int)instruction.Operand);
case OpCode.Stobj: return Stobj(context, stack, instruction);
case OpCode.Stsfld: return false;
case OpCode.Stsfld: return false; // TODO
case OpCode.Sub: return Sub(context, stack);
case OpCode.Sub_ovf: return Sub(context, stack); // TODO: implement overflow check
case OpCode.Sub_ovf_un: return Sub(context, stack); // TODO: implement overflow check
case OpCode.Switch: return false;
case OpCode.Sub_ovf: return Sub(context, stack); // TODO: implement overflow check
case OpCode.Sub_ovf_un: return Sub(context, stack); // TODO: implement overflow check
case OpCode.Switch: return false; // TODO
case OpCode.Throw: return Throw(context, stack);
case OpCode.Unbox: return Unbox(context, stack, instruction);
case OpCode.Unbox_any: return UnboxAny(context, stack, instruction);
Expand Down Expand Up @@ -710,14 +711,14 @@ private StackEntry CreateStateEntry(MosaType type)
private string EmitString(string data, uint token)
{
string symbolName = $"$ldstr${Method.Module.Name}${token}";
var linkerSymbol = Linker.DefineSymbol(symbolName, SectionKind.ROData, NativeAlignment, ObjectHeaderSize + NativePointerSize + ((uint)data.Length * 2));
var stream = linkerSymbol.Stream;

stream.WriteZeroBytes(NativePointerSize);
Linker.Link(LinkType.AbsoluteAddress, PatchType.I32, linkerSymbol, stream.Position, Metadata.TypeDefinition + "System.String", 0);
stream.WriteZeroBytes(NativePointerSize);
stream.Write(BitConverter.GetBytes(data.Length), 0, 4);
stream.Write(Encoding.Unicode.GetBytes(data));
var linkerSymbol = Linker.DefineSymbol(symbolName, SectionKind.ROData, NativeAlignment, (uint)(ObjectHeaderSize + NativePointerSize + (data.Length * 2)));
var writer = new BinaryWriter(linkerSymbol.Stream);

Linker.Link(LinkType.AbsoluteAddress, PatchType.I32, linkerSymbol, ObjectHeaderSize - NativePointerSize, Metadata.TypeDefinition + "System.String", 0);

writer.WriteZeroBytes(ObjectHeaderSize);
writer.Write(data.Length, NativePointerSize);
writer.Write(Encoding.Unicode.GetBytes(data));
return symbolName;
}

Expand Down
22 changes: 10 additions & 12 deletions Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace Mosa.Compiler.Framework.Stages
Expand Down Expand Up @@ -1057,22 +1058,19 @@ private void Ldstr(InstructionNode node)
var symbolName = node.Operand1.Name;
var data = node.Operand1.StringData;

// FUTURE: Add to linkers to allow for deduplicate of internal strings
var symbol = Linker.DefineSymbol(symbolName, SectionKind.ROData, NativeAlignment, ObjectHeaderSize + NativePointerSize + ((uint)data.Length * 2));
var stream = symbol.Stream;
var symbol = Linker.DefineSymbol(symbolName, SectionKind.ROData, NativeAlignment, (uint)(ObjectHeaderSize + NativePointerSize + (data.Length * 2)));
var writer = new BinaryWriter(symbol.Stream);

// Header Block
stream.WriteZeroBytes(NativePointerSize);
Linker.Link(LinkType.AbsoluteAddress, PatchType.I32, symbol, ObjectHeaderSize - NativePointerSize, Metadata.TypeDefinition + "System.String", 0);

// Type Definition
Linker.Link(LinkType.AbsoluteAddress, PatchType.I32, symbol, stream.Position, Metadata.TypeDefinition + "System.String", 0);
stream.WriteZeroBytes(NativePointerSize);
// 1. Object Header
writer.WriteZeroBytes(ObjectHeaderSize);

// String length field
stream.Write(BitConverter.GetBytes(data.Length), 0, 4);
// 2. Length
writer.Write(data.Length, NativePointerSize);

// String data
stream.Write(Encoding.Unicode.GetBytes(data));
// 3. Unicode
writer.Write(Encoding.Unicode.GetBytes(data));

node.SetInstruction(IRInstruction.MoveObject, node.Result, node.Operand1);
}
Expand Down
3 changes: 3 additions & 0 deletions Source/Mosa.Korlib/Mosa.Korlib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,7 @@
<RuntimeMetadataVersion>v4.0.30319</RuntimeMetadataVersion>
<AssemblyVersion>5.0.0.0</AssemblyVersion>
</PropertyGroup>
<ItemGroup>
<Compile Remove="System\Marvin.cs" />
</ItemGroup>
</Project>
Loading