From e518b9c8e2a4f9403bf925a8dee1a41fc2248fbf Mon Sep 17 00:00:00 2001 From: Matthijs ter Woord Date: Tue, 28 Jul 2015 09:57:30 -0400 Subject: [PATCH] Add possibility for using the referenced debug stub version in the kernel tester. Fixes #169 --- .../Cosmos.TestRunner.Core.csproj | 4 ++ .../DefaultEngineConfiguration.cs | 8 +-- .../Cosmos.TestRunner.Core/Engine.Helpers.cs | 2 + source/Cosmos.Assembler/.editorconfig | 2 + source/Cosmos.Assembler/Assembler.cs | 60 +++++++++++++++++-- .../Cosmos.Assembler/Cosmos.Assembler.csproj | 5 ++ .../Cosmos.Build.MSBuild.csproj | 5 ++ .../Cosmos.Debug.DebugStub.csproj | 49 +++++++-------- .../Cosmos.Debug.DebugStub/ReferenceHelper.cs | 7 +++ source/XSharp.Compiler/.editorconfig | 2 + source/XSharp.Compiler/AsmGenerator.cs | 55 ++++++++++------- source/XSharp.Compiler/XSharp.Compiler.csproj | 1 + 12 files changed, 146 insertions(+), 54 deletions(-) create mode 100644 source/Cosmos.Assembler/.editorconfig create mode 100644 source/Cosmos.Debug.DebugStub/ReferenceHelper.cs create mode 100644 source/XSharp.Compiler/.editorconfig diff --git a/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj b/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj index 3d8b091db..de49b7c53 100644 --- a/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj +++ b/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj @@ -73,6 +73,10 @@ + + {1116130E-28E0-428A-A597-F4B3B676C0CA} + Cosmos.Assembler + {0462E82B-8C29-41A9-8265-9C89038ADB29} Cosmos.Build.Common diff --git a/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs b/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs index 967b30d3e..65d82b0f0 100644 --- a/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs +++ b/Tests/Cosmos.TestRunner.Core/DefaultEngineConfiguration.cs @@ -15,16 +15,16 @@ namespace Cosmos.TestRunner.Core engine.AllowedSecondsInKernel = 120; // If you want to test only specific platforms, add them to the list, like next line. By default, all platforms are ran. - // engine.RunTargets.Add(RunTargetEnum.Bochs); + engine.RunTargets.Add(RunTargetEnum.Bochs); // if you're working on the compiler (or other lower parts), you can choose to run the compiler in process // 1 thing to keep in mind though, is that this only works with 1 kernel at a time! engine.RunIL2CPUInProcess = false; engine.AddKernel(typeof(Cosmos.Compiler.Tests.SimpleWriteLine.Kernel.Kernel).Assembly.Location); - engine.AddKernel(typeof(SimpleStructsAndArraysTest.Kernel).Assembly.Location); - engine.AddKernel(typeof(VGACompilerCrash.Kernel).Assembly.Location); - engine.AddKernel(typeof(BoxingTests.Kernel).Assembly.Location); + //engine.AddKernel(typeof(SimpleStructsAndArraysTest.Kernel).Assembly.Location); + //engine.AddKernel(typeof(VGACompilerCrash.Kernel).Assembly.Location); + //engine.AddKernel(typeof(BoxingTests.Kernel).Assembly.Location); // known bugs, therefor disabled for now: // end of known bugs diff --git a/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs b/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs index 608ca627c..1e8e75c71 100644 --- a/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs +++ b/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs @@ -62,6 +62,8 @@ namespace Cosmos.TestRunner.Core { throw new Exception("Cannot run multiple kernels with in-process compilation!"); } + // ensure we're using the referenced (= solution) version + Assembler.Assembler.ReadDebugStubFromDisk = false; var xResult = Program.Run(xArguments, OutputHandler.LogMessage, OutputHandler.LogError); if (xResult != 0) { diff --git a/source/Cosmos.Assembler/.editorconfig b/source/Cosmos.Assembler/.editorconfig new file mode 100644 index 000000000..7324c3aae --- /dev/null +++ b/source/Cosmos.Assembler/.editorconfig @@ -0,0 +1,2 @@ +[Assembler.cs] +indent_size=2 diff --git a/source/Cosmos.Assembler/Assembler.cs b/source/Cosmos.Assembler/Assembler.cs index a0c69392e..e29f11f56 100644 --- a/source/Cosmos.Assembler/Assembler.cs +++ b/source/Cosmos.Assembler/Assembler.cs @@ -11,6 +11,7 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Xml; using Cosmos.Assembler.x86; +using Cosmos.Debug.DebugStub; namespace Cosmos.Assembler { public class Assembler { @@ -511,13 +512,54 @@ namespace Cosmos.Assembler { if (mComPort > 0) { var xGen = new XSharp.Compiler.AsmGenerator(); - foreach (var xFile in Directory.GetFiles(Cosmos.Build.Common.CosmosPaths.DebugStubSrc, "*.xs")) { - var xAsm = xGen.Generate(xFile); - foreach (var xData in xAsm.Data) { - Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember() { RawAsm = xData }); + + var xGenerateAssembler = + new Action(i => + { + XSharp.Nasm.Assembler xAsm; + if (i is StreamReader) + { + xAsm = xGen.Generate((StreamReader)i); + } + else if (i is string) + { + xAsm = xGen.Generate((string)i); + } + else + { + throw new Exception("Object type '" + i.ToString() + "' not supported!"); + } + foreach (var xData in xAsm.Data) + { + Cosmos.Assembler.Assembler.CurrentInstance.DataMembers.Add(new DataMember() {RawAsm = xData}); + } + foreach (var xCode in xAsm.Code) + { + new LiteralAssemblerCode(xCode); + } + }); + if (ReadDebugStubFromDisk) + { + foreach (var xFile in Directory.GetFiles(Cosmos.Build.Common.CosmosPaths.DebugStubSrc, "*.xs")) + { + xGenerateAssembler(xFile); } - foreach (var xCode in xAsm.Code) { - new LiteralAssemblerCode(xCode); + } + else + { + foreach (var xManifestName in typeof(ReferenceHelper).Assembly.GetManifestResourceNames()) + { + if (!xManifestName.EndsWith(".xs", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + using (var xStream = typeof(ReferenceHelper).Assembly.GetManifestResourceStream(xManifestName)) + { + using (var xReader = new StreamReader(xStream)) + { + xGenerateAssembler(xReader); + } + } } } OnAfterEmitDebugStub(); @@ -529,6 +571,12 @@ namespace Cosmos.Assembler { Cosmos.Assembler.Assembler.CurrentInstance.EmitAsmLabels = true; } + /// + /// Setting this field to false means the .xs files for the debug stub are read from the DebugStub assembly. + /// This allows the automated kernel tester to use the live ones, instead of the installed ones. + /// + public static bool ReadDebugStubFromDisk = true; + protected virtual void OnAfterEmitDebugStub() { // diff --git a/source/Cosmos.Assembler/Cosmos.Assembler.csproj b/source/Cosmos.Assembler/Cosmos.Assembler.csproj index fe791cb4f..8877021a5 100644 --- a/source/Cosmos.Assembler/Cosmos.Assembler.csproj +++ b/source/Cosmos.Assembler/Cosmos.Assembler.csproj @@ -310,6 +310,7 @@ + @@ -324,6 +325,10 @@ {A281A1B1-C718-4BCB-A7BE-ED840A70449A} XSharp.Compiler + + {A7F3F078-CF99-4018-9A35-2D6DC9517ADB} + Cosmos.Debug.DebugStub +