Cosmos/source2/Build/Cosmos.Build.MSBuild/IL2CPU.cs

165 lines
No EOL
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
using System.Reflection;
using Cosmos.IL2CPU;
using Cosmos.IL2CPU.X86;
using System.IO;
using Cosmos.Build.Common;
namespace Cosmos.Build.MSBuild
{
public class IL2CPU : AppDomainIsolatedTask
{
public IL2CPU()
{
AppDomain.CurrentDomain.AppendPrivatePath(Path.GetDirectoryName(typeof(IL2CPU).Assembly.Location));
DoInitTypes();
}
private void DoInitTypes()
{
var xType = typeof(Cosmos.Hardware.Plugs.FCL.System.Console);
xType = typeof(Cosmos.Sys.Plugs.Deboot);
xType = typeof(Cosmos.Kernel.Plugs.ArrayListImpl);
}
#region properties
[Required]
public string InputAssembly
{
get;
set;
}
[Required]
public string DebugMode{
get;
set;
}
public string TraceAssemblies
{
get;
set;
}
public byte DebugCom
{
get;
set;
}
[Required]
public bool UseNAsm
{
get;
set;
}
public string DebugSymbolsFile
{
get;
set;
}
public string LogFile
{
get;
set;
}
[Required]
public string OutputFile
{
get;
set;
}
#endregion
private bool Initialize()
{
if (String.IsNullOrEmpty(DebugMode))
{
mDebugMode = Cosmos.Build.Common.DebugMode.None;
}
else
{
if (!Enum.GetNames(typeof(DebugMode)).Contains(DebugMode, StringComparer.InvariantCultureIgnoreCase))
{
Log.LogError("Invalid DebugMode specified");
return false;
}
mDebugMode = (DebugMode)Enum.Parse(typeof(DebugMode), DebugMode);
}
if (String.IsNullOrEmpty(TraceAssemblies))
{
mTraceAssemblies = Cosmos.Build.Common.TraceAssemblies.User;
}
else
{
if (!Enum.GetNames(typeof(TraceAssemblies)).Contains(TraceAssemblies, StringComparer.InvariantCultureIgnoreCase))
{
Log.LogError("Invalid TraceAssemblies specified");
return false;
}
mTraceAssemblies = (TraceAssemblies)Enum.Parse(typeof(TraceAssemblies), TraceAssemblies);
}
return true;
}
private DebugMode mDebugMode = Cosmos.Build.Common.DebugMode.None;
private TraceAssemblies mTraceAssemblies = Cosmos.Build.Common.TraceAssemblies.All;
private void LogTime(string message)
{
//
}
public override bool Execute()
{
Log.LogMessage("Executing IL2CPU on assembly");
if (!Initialize())
{
return false;
}
LogTime("Engine execute started");
var xEntryAsm = Assembly.LoadFrom(InputAssembly);
var xInitMethod = xEntryAsm.EntryPoint.DeclaringType.GetMethod("Init", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
var xAsm = new AssemblerNasm(DebugCom);
xAsm.DebugMode = mDebugMode;
xAsm.TraceAssemblies = mTraceAssemblies;
#if OUTPUT_ELF
xAsm.EmitELF = true;
#endif
xAsm.Initialize();
using (var xScanner = new ILScanner(xAsm))
{
if (!String.IsNullOrEmpty(LogFile))
{
xScanner.EnableLogging(LogFile);
}
xScanner.Execute(xInitMethod);
using (var xOut = new StreamWriter(OutputFile, false))
{
if (!String.IsNullOrEmpty(DebugSymbolsFile))
{
xAsm.FlushText(xOut, DebugSymbolsFile);
}
else
{
xAsm.FlushText(xOut);
}
}
}
LogTime("Engine execute finished");
return true;
}
}
}