mirror of
https://github.com/creeperlv/SVM.git
synced 2026-01-11 04:49:53 +00:00
Updated LibCLCC.Net to newest version.
This commit is contained in:
@@ -65,7 +65,7 @@ LabelConstant InternalLbl
|
|||||||
|
|
||||||
ISA = isaDefinition;
|
ISA = isaDefinition;
|
||||||
}
|
}
|
||||||
public OperationResult<LexSegment?> Lex(ILexer lexer)
|
private OperationResult<LexSegment?> Lex(ILexer lexer)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@@ -78,7 +78,7 @@ LabelConstant InternalLbl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public OperationResult<(string, string)?> ParseKVPair(ILexer lexer, LexSegment currentSeg)
|
private OperationResult<(string, string)?> ParseKVPair(ILexer lexer, LexSegment currentSeg)
|
||||||
{
|
{
|
||||||
OperationResult<(string, string)?> operationResult = new OperationResult<(string, string)?>(null);
|
OperationResult<(string, string)?> operationResult = new OperationResult<(string, string)?>(null);
|
||||||
var r = Lex(lexer);
|
var r = Lex(lexer);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using SVM.Core;
|
using SVM.Core;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
@@ -34,17 +35,17 @@ namespace SVM.Assembler.Core
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < depth; i++)
|
for (int i = 0; i < depth; i++)
|
||||||
{
|
{
|
||||||
Console.Write("\t");
|
Trace.Write("\t");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void ShowNode(XmlNode node, int depth = 0)
|
static void ShowNode(XmlNode node, int depth = 0)
|
||||||
{
|
{
|
||||||
PrintDepth(depth);
|
PrintDepth(depth);
|
||||||
Console.WriteLine($"[+]{node.NodeType}:{node.Name}");
|
Trace.WriteLine($"[+]{node.NodeType}:{node.Name}");
|
||||||
foreach (XmlAttribute item in node.Attributes)
|
foreach (XmlAttribute item in node.Attributes)
|
||||||
{
|
{
|
||||||
PrintDepth(depth + 1);
|
PrintDepth(depth + 1);
|
||||||
Console.WriteLine($"[i]{item.NodeType}:{item.Name}={item.InnerText}");
|
Trace.WriteLine($"[i]{item.NodeType}:{item.Name}={item.InnerText}");
|
||||||
|
|
||||||
}
|
}
|
||||||
foreach (XmlElement item in node.ChildNodes)
|
foreach (XmlElement item in node.ChildNodes)
|
||||||
@@ -56,13 +57,13 @@ namespace SVM.Assembler.Core
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
PrintDepth(depth + 1);
|
PrintDepth(depth + 1);
|
||||||
Console.Write($"[?]{item.NodeType}:{item.Name}");
|
Trace.Write($"[?]{item.NodeType}:{item.Name}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static bool ParseParameter(XmlNode node, ref InstructionDefinition instruction)
|
static bool ParseParameter(XmlNode node, ref InstructionDefinition instruction)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Parse:Parameter");
|
Trace.WriteLine("Parse:Parameter");
|
||||||
InstructionParameter parameter = new InstructionParameter();
|
InstructionParameter parameter = new InstructionParameter();
|
||||||
foreach (XmlNode subNode in node)
|
foreach (XmlNode subNode in node)
|
||||||
{
|
{
|
||||||
@@ -75,7 +76,7 @@ namespace SVM.Assembler.Core
|
|||||||
{
|
{
|
||||||
var result = item.Attributes.GetNamedItem("Id");
|
var result = item.Attributes.GetNamedItem("Id");
|
||||||
if (result == null) return false;
|
if (result == null) return false;
|
||||||
Console.WriteLine($"Item:{result.InnerText}");
|
Trace.WriteLine($"Item:{result.InnerText}");
|
||||||
parameter.AllowedTokenIds.Add(result.InnerText);
|
parameter.AllowedTokenIds.Add(result.InnerText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,12 +91,12 @@ namespace SVM.Assembler.Core
|
|||||||
if (ConverterAttr == null) return false;
|
if (ConverterAttr == null) return false;
|
||||||
if (!Enum.TryParse<SVMNativeTypes>(TypeAttr.InnerText, out var nType))
|
if (!Enum.TryParse<SVMNativeTypes>(TypeAttr.InnerText, out var nType))
|
||||||
{
|
{
|
||||||
Console.WriteLine($"ParseSVMNativeTypes:{TypeAttr.InnerText}");
|
Trace.WriteLine($"ParseSVMNativeTypes:{TypeAttr.InnerText}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!int.TryParse(PosAttr.InnerText, out var pos))
|
if (!int.TryParse(PosAttr.InnerText, out var pos))
|
||||||
{
|
{
|
||||||
Console.WriteLine($"ParseInt:{PosAttr.InnerText}");
|
Trace.WriteLine($"ParseInt:{PosAttr.InnerText}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
parameter.ExpectdValue.Type = nType;
|
parameter.ExpectdValue.Type = nType;
|
||||||
@@ -111,7 +112,7 @@ namespace SVM.Assembler.Core
|
|||||||
}
|
}
|
||||||
static bool ParseDefinition(XmlNode node, ref ISADefinition definition)
|
static bool ParseDefinition(XmlNode node, ref ISADefinition definition)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"ParseDefinition:{node.Name}");
|
Trace.WriteLine($"ParseDefinition:{node.Name}");
|
||||||
InstructionDefinition instDefinition = new InstructionDefinition();
|
InstructionDefinition instDefinition = new InstructionDefinition();
|
||||||
var PIAttr = node.Attributes.GetNamedItem("PrimaryInstruction");
|
var PIAttr = node.Attributes.GetNamedItem("PrimaryInstruction");
|
||||||
if (PIAttr == null) return false;
|
if (PIAttr == null) return false;
|
||||||
@@ -122,13 +123,13 @@ namespace SVM.Assembler.Core
|
|||||||
instDefinition.PrimaryInstruction = pi;
|
instDefinition.PrimaryInstruction = pi;
|
||||||
foreach (XmlNode item in node.ChildNodes)
|
foreach (XmlNode item in node.ChildNodes)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{item.Name}");
|
Trace.WriteLine($"{item.Name}");
|
||||||
switch (item.Name)
|
switch (item.Name)
|
||||||
{
|
{
|
||||||
case "Aliases":
|
case "Aliases":
|
||||||
foreach (XmlNode aliasNode in item.ChildNodes)
|
foreach (XmlNode aliasNode in item.ChildNodes)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Aliases->{aliasNode.Name}");
|
Trace.WriteLine($"Aliases->{aliasNode.Name}");
|
||||||
if (aliasNode.Name == "Alias")
|
if (aliasNode.Name == "Alias")
|
||||||
{
|
{
|
||||||
instDefinition.Aliases.Add(aliasNode.Attributes["Name"].Value);
|
instDefinition.Aliases.Add(aliasNode.Attributes["Name"].Value);
|
||||||
@@ -142,7 +143,7 @@ namespace SVM.Assembler.Core
|
|||||||
case "Parameters":
|
case "Parameters":
|
||||||
foreach (XmlNode parameterNode in item.ChildNodes)
|
foreach (XmlNode parameterNode in item.ChildNodes)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Parameters->{parameterNode.Name}");
|
Trace.WriteLine($"Parameters->{parameterNode.Name}");
|
||||||
if (parameterNode.Name == "InstructionParameter")
|
if (parameterNode.Name == "InstructionParameter")
|
||||||
{
|
{
|
||||||
if (!ParseParameter(parameterNode, ref instDefinition))
|
if (!ParseParameter(parameterNode, ref instDefinition))
|
||||||
@@ -157,7 +158,7 @@ namespace SVM.Assembler.Core
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Console.WriteLine($"???{item.Name}");
|
Trace.WriteLine($"???{item.Name}");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,12 +167,12 @@ namespace SVM.Assembler.Core
|
|||||||
}
|
}
|
||||||
static bool ParseDefinitions(XmlNode node, ref ISADefinition definition)
|
static bool ParseDefinitions(XmlNode node, ref ISADefinition definition)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Parse:Definitions");
|
Trace.WriteLine("Parse:Definitions");
|
||||||
foreach (XmlNode item in node.ChildNodes)
|
foreach (XmlNode item in node.ChildNodes)
|
||||||
{
|
{
|
||||||
if (item.Name != "InstructionDefinition")
|
if (item.Name != "InstructionDefinition")
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Not Matching:{item.Name}");
|
Trace.WriteLine($"Not Matching:{item.Name}");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -279,7 +280,7 @@ namespace SVM.Assembler.Core
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Console.WriteLine("Unknown Node!");
|
Trace.WriteLine("Unknown Node!");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ namespace SVM.Assembler.Core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
operationResult.Result = intermediateObject;
|
||||||
return operationResult;
|
return operationResult;
|
||||||
}
|
}
|
||||||
public static bool TryParseRegister(string input, LinkingContext context, out byte registerID)
|
public static bool TryParseRegister(string input, LinkingContext context, out byte registerID)
|
||||||
@@ -290,6 +291,7 @@ namespace SVM.Assembler.Core
|
|||||||
offset += (uint)data2.Length;
|
offset += (uint)data2.Length;
|
||||||
Data.Add(data);
|
Data.Add(data);
|
||||||
}
|
}
|
||||||
|
Console.WriteLine($"Instruction Count:{Obj.instructions.Count}");
|
||||||
foreach (var item in Obj.instructions)
|
foreach (var item in Obj.instructions)
|
||||||
{
|
{
|
||||||
if (definition.InstructionDefinitions.TryGetValue(item.inst, out var def))
|
if (definition.InstructionDefinitions.TryGetValue(item.inst, out var def))
|
||||||
@@ -310,6 +312,7 @@ namespace SVM.Assembler.Core
|
|||||||
Buffer.BlockCopy(item, 0, program.Datas, offset2, item.Length);
|
Buffer.BlockCopy(item, 0, program.Datas, offset2, item.Length);
|
||||||
offset2 += item.Length;
|
offset2 += item.Length;
|
||||||
}
|
}
|
||||||
|
operationResult.Result = program;
|
||||||
return operationResult;
|
return operationResult;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="LibCLCC.NET" Version="1.33.34" />
|
<PackageReference Include="LibCLCC.NET" Version="1.34.35" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -19,7 +19,70 @@ namespace SVM.Assembler
|
|||||||
Console.WriteLine("Cannot load ISA definition!");
|
Console.WriteLine("Cannot load ISA definition!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Console.WriteLine(JsonConvert.SerializeObject(def, Formatting.Indented));
|
List<string> files = new List<string>();
|
||||||
|
List<IntermediateObject> objs = new();
|
||||||
|
string outputfile = "a.out";
|
||||||
|
for (int i = 0; i < args.Length; i++)
|
||||||
|
{
|
||||||
|
string? item = args[i];
|
||||||
|
switch (item)
|
||||||
|
{
|
||||||
|
case "-o":
|
||||||
|
outputfile = args[i + 1];
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (File.Exists(item))
|
||||||
|
{
|
||||||
|
files.Add(item);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in files)
|
||||||
|
{
|
||||||
|
Console.WriteLine(item);
|
||||||
|
}
|
||||||
|
Assembler.Core.Assembler assembler = new Core.Assembler(def);
|
||||||
|
foreach (var item in files)
|
||||||
|
{
|
||||||
|
var result = assembler.AssembleIntermediateObject(File.ReadAllText(item), item);
|
||||||
|
if (result.HasError())
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine($"Error at assembling {item}. Abort.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
objs.Add(result.Result);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var lResult = Linker.Link(objs);
|
||||||
|
if (lResult.HasError())
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("Linking error!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (lResult.Result == null)
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("Linker return no data!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var fResult = Linker.Finialize(def, lResult.Result);
|
||||||
|
if (fResult.HasError())
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("Finalizer error!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (fResult.Result == null)
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("Linker Finalizer return no data!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (File.Exists(outputfile)) File.Delete(outputfile);
|
||||||
|
using var stream = File.OpenWrite(outputfile);
|
||||||
|
fResult.Result.WriteToStream(stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,17 @@ namespace SVM.Core
|
|||||||
{
|
{
|
||||||
public List<SVMInstruction> instructions = new List<SVMInstruction>();
|
public List<SVMInstruction> instructions = new List<SVMInstruction>();
|
||||||
public byte[]? Datas;
|
public byte[]? Datas;
|
||||||
|
public void WriteToStream(Stream stream)
|
||||||
|
{
|
||||||
|
stream.WriteData(Datas?.Length ?? 0);
|
||||||
|
stream.WriteData(instructions.Count);
|
||||||
|
if (Datas != null)
|
||||||
|
stream.Write(Datas);
|
||||||
|
foreach (SVMInstruction instruction in instructions)
|
||||||
|
{
|
||||||
|
stream.WriteData(instruction);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public unsafe struct SVMProgram : IDisposable
|
public unsafe struct SVMProgram : IDisposable
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,12 @@ namespace SVM.Core.Utils
|
|||||||
{
|
{
|
||||||
public static class StreamUtils
|
public static class StreamUtils
|
||||||
{
|
{
|
||||||
|
public unsafe static void WriteData<T>(this Stream s, T data) where T : unmanaged
|
||||||
|
{
|
||||||
|
var ptr=&data;
|
||||||
|
Span<byte> buffer = new(ptr, sizeof(T));
|
||||||
|
s.Write(buffer);
|
||||||
|
}
|
||||||
public unsafe static bool TryReadData<T>(this Stream stream, out T data) where T : unmanaged
|
public unsafe static bool TryReadData<T>(this Stream stream, out T data) where T : unmanaged
|
||||||
{
|
{
|
||||||
int len = sizeof(T);
|
int len = sizeof(T);
|
||||||
|
|||||||
Reference in New Issue
Block a user