Updated LibCLCC.Net to newest version.

This commit is contained in:
2025-07-27 04:15:34 +10:00
parent 268c1f1ff1
commit 76f667204f
7 changed files with 104 additions and 20 deletions

View File

@@ -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);

View File

@@ -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;
} }
} }

View File

@@ -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;
} }
} }

View File

@@ -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>

View File

@@ -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);
}
} }
} }
} }

View File

@@ -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
{ {

View File

@@ -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);