diff --git a/src/SVM.Assembler.Core/Linker.cs b/src/SVM.Assembler.Core/Linker.cs index 7ededac..6ba92fb 100644 --- a/src/SVM.Assembler.Core/Linker.cs +++ b/src/SVM.Assembler.Core/Linker.cs @@ -420,11 +420,12 @@ namespace SVM.Assembler.Core result.Result = true; return result; } - public unsafe static OperationResult Finialize(ISADefinition definition, IntermediateObject Obj) + public unsafe static OperationResult<(ManagedSVMProgram program, LinkingContext context)?> Finialize(ISADefinition definition, IntermediateObject Obj,bool PreFinalizeLabels) { - OperationResult operationResult = new OperationResult(null); + OperationResult<(ManagedSVMProgram program, LinkingContext context)?> operationResult = new OperationResult<(ManagedSVMProgram program, LinkingContext context)?>(null); ManagedSVMProgram program = new ManagedSVMProgram(); LinkingContext context = new LinkingContext(program, Obj, definition); + List Data = new List(); uint offset = 0; foreach (var item in Obj.data) @@ -481,6 +482,10 @@ namespace SVM.Assembler.Core Data.Add(data2); } } + if (PreFinalizeLabels) + { + context.FinalizeLabels(); + } foreach (var item in Obj.instructions) { if (definition.InstructionDefinitions.TryGetValue(item.InstDefID, out var def)) @@ -513,7 +518,7 @@ namespace SVM.Assembler.Core Buffer.BlockCopy(item, 0, program.Datas, offset2, item.Length); offset2 += item.Length; } - operationResult.Result = program; + operationResult.Result = (program, context); return operationResult; } } diff --git a/src/SVM.Assembler.Core/LinkingContext.cs b/src/SVM.Assembler.Core/LinkingContext.cs index f261692..925d294 100644 --- a/src/SVM.Assembler.Core/LinkingContext.cs +++ b/src/SVM.Assembler.Core/LinkingContext.cs @@ -1,4 +1,5 @@ using SVM.Core; +using System; using System.Collections.Generic; namespace SVM.Assembler.Core @@ -26,6 +27,21 @@ namespace SVM.Assembler.Core } return false; } + public void FinalizeLabels() + { + + int acc = 0; + for (int i = 0; i < IntermediateObject.instructions.Count; i++) + { + IntermediateInstruction? item = IntermediateObject.instructions[i]; + if (item.Label != null) + if (item.Label.Content != null) + { + this.label.Add(item.Label.Content, acc); + } + acc += Definition.InstructionDefinitions[item.InstDefID].InstructionCount; + } + } public bool TryFindLabel(string label, out int offset) { label = label + ":"; @@ -33,7 +49,7 @@ namespace SVM.Assembler.Core { return true; } - int acc=0; + int acc = 0; for (int i = 0; i < IntermediateObject.instructions.Count; i++) { IntermediateInstruction? item = IntermediateObject.instructions[i]; diff --git a/src/SVM.Assembler/Program.cs b/src/SVM.Assembler/Program.cs index a03d6c9..c24a7c9 100644 --- a/src/SVM.Assembler/Program.cs +++ b/src/SVM.Assembler/Program.cs @@ -22,6 +22,7 @@ namespace SVM.Assembler List files = new List(); List objs = new(); string outputfile = "a.out"; + bool outputDebugSymbol = false; for (int i = 0; i < args.Length; i++) { string? item = args[i]; @@ -31,6 +32,9 @@ namespace SVM.Assembler outputfile = args[i + 1]; i++; break; + case "-d": + outputDebugSymbol = true; + break; default: if (File.Exists(item)) { @@ -71,7 +75,7 @@ namespace SVM.Assembler Console.Error.WriteLine("Linker return no data!"); return; } - var fResult = Linker.Finialize(def, lResult.Result); + var fResult = Linker.Finialize(def, lResult.Result, outputDebugSymbol); if (fResult.HasError()) { Console.Error.WriteLine("Finalizer error!"); @@ -88,7 +92,21 @@ namespace SVM.Assembler } if (File.Exists(outputfile)) File.Delete(outputfile); using var stream = File.OpenWrite(outputfile); - fResult.Result.WriteToStream(stream); + if (!fResult.Result.HasValue) + { + return; + } + fResult.Result.Value.program.WriteToStream(stream); + if (outputDebugSymbol) + { + FileInfo fi = new FileInfo(outputfile); + + var dbgFile = Path.Combine(fi.DirectoryName ?? ".", Path.GetFileNameWithoutExtension(outputfile) + ".dbg"); + File.WriteAllText(dbgFile, JsonConvert.SerializeObject(fResult.Result.Value.context.label, Formatting.Indented, new JsonSerializerSettings() + { + + })); + } } } }