Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
kekyo committed May 13, 2024
1 parent 3b108f1 commit 42ed064
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 202 deletions.
55 changes: 12 additions & 43 deletions chibild/chibild.core/Generating/CodeGenerator_Emit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -704,28 +704,6 @@ private bool TryLoadAndConsumeCAbiStartUpObjectIfRequired(
return false;
}

private bool TryLoadAndConsumeBasePathObject(
InputFragment[] inputFragments,
out ObjectFileInputFragment fragment)
{



using var fs = ObjectStreamUtilities.OpenEmbeddedObjectStream(
"chibild.Generating.basepath.o");

var basePathBody = new StreamReader(fs).ReadToEnd();

string.Format(basePathBody, scope, "bopt__");

return this.TryLoadAndConsumeAdhocObject(
inputFragments,
"",
"basepath.o",
fs,
out fragment);
}

private void AssignEntryPoint(
string entryPointSymbol)
{
Expand All @@ -743,6 +721,8 @@ private void AssignEntryPoint(
// Assign startup method when declared.
this.targetModule.EntryPoint = startup;
this.logger.Trace($"Found entry point: {startup.FullName}");


}
else
{
Expand Down Expand Up @@ -826,35 +806,16 @@ public bool Emit(
if (this.TryLoadAndConsumeCAbiStartUpObjectIfRequired(
inputFragments,
cabiStartUpObjectDirectoryPath,
out var fragment))
out var fragment1))
{
// Emit this object.
this.EmitMembers(fragment);
this.EmitMembers(fragment1);

// Invoke delayed looking ups.
this.InvokeDelayedLookingUps();
}
}

// Assign entry point.
if (creationOptions is { } co2 &&
co2.AssemblyType != AssemblyTypes.Dll)
{
this.AssignEntryPoint(
co2.EntryPointSymbol);
}

if (this.TryLoadAndConsumeBasePathObject(
inputFragments,
out var fragments))
{
// Emit this object.
this.EmitMembers(fragment);

// Invoke delayed looking ups.
this.InvokeDelayedLookingUps();
}

// Apply method optimization for all object fragments.
if (applyOptimization)
{
Expand All @@ -876,6 +837,14 @@ public bool Emit(
}
}

// Assign entry point.
if (creationOptions is { } co2 &&
co2.AssemblyType != AssemblyTypes.Dll)
{
this.AssignEntryPoint(
co2.EntryPointSymbol);
}

Debug.Assert(this.delayDebuggingInsertionEntries.Count == 0);

// (Completed all CIL implementations in this place.)
Expand Down
Binary file removed chibild/chibild.core/Generating/basepath.o
Binary file not shown.
70 changes: 0 additions & 70 deletions chibild/chibild.core/Generating/basepath.s

This file was deleted.

2 changes: 2 additions & 0 deletions chibild/chibild.core/LinkerOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ public sealed class LinkerCreationOptions
default;
public string EntryPointSymbol =
"_start";
public string[] PrependExecutionSearchPaths =
CommonUtilities.Empty<string>();

public AssemblyOptions AssemblyOptions =
AssemblyOptions.DisableJITOptimization;
Expand Down
5 changes: 0 additions & 5 deletions chibild/chibild.core/chibild.core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,4 @@
<EmbeddedResource Include="Internal\runtimeconfig.json" />
</ItemGroup>

<ItemGroup>
<None Remove="Generating\*.o" />
<EmbeddedResource Include="Generating\*.o" />
</ItemGroup>

</Project>
129 changes: 45 additions & 84 deletions chibild/chibild.core/cli/CliOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,29 @@ public static CliOptions Parse(
var options = new CliOptions();
var libraryBasePaths = new List<string>();
var inputReferences = new List<InputReference>();
var prependExecutionSearchPaths = new List<string>();

options.LinkerOptions.CreationOptions!.TargetFramework =
TargetFramework.TryParse(defaultTargetFrameworkMoniker, out var tf) ?
tf : TargetFramework.Default;

static bool TryGetOptionArgument(
string[] args, ref int index, out string result)
{
if (args[index].Length >= 3)
{
result = args[index].Substring(2);
return true;
}
else if (args.Length >= index)
{
result = args[++index];
return true;
}
result = null!;
return false;
}

for (var index = 0; index < args.Length; index++)
{
var arg = args[index];
Expand All @@ -68,124 +86,63 @@ public static CliOptions Parse(
switch (arg[1])
{
case 'o':
if (arg.Length >= 3)
if (TryGetOptionArgument(args, ref index, out var path1))
{
var outputAssemblyPath =
Path.GetFullPath(arg.Substring(2));
options.OutputAssemblyPath = outputAssemblyPath;
continue;
}
else if (args.Length >= index)
{
var outputAssemblyPath =
Path.GetFullPath(args[++index]);
options.OutputAssemblyPath = outputAssemblyPath;
options.OutputAssemblyPath = Path.GetFullPath(path1);
continue;
}
break;
case 'L':
if (arg.Length >= 3)
{
var referenceAssemblyBasePath =
Path.GetFullPath(arg.Substring(2));
libraryBasePaths.Add(referenceAssemblyBasePath);
continue;
}
else if (args.Length >= index)
if (TryGetOptionArgument(args, ref index, out var path2))
{
var referenceAssemblyBasePath =
Path.GetFullPath(args[++index]);
libraryBasePaths.Add(referenceAssemblyBasePath);
libraryBasePaths.Add(Path.GetFullPath(path2));
continue;
}
break;
case 'l':
if (arg.Length >= 3)
{
var referenceAssemblyName = arg.Substring(2);
inputReferences.Add(new LibraryNameReference(referenceAssemblyName));
continue;
}
else if (args.Length >= index)
if (TryGetOptionArgument(args, ref index, out var path3))
{
var referenceAssemblyName = args[index + 1];
inputReferences.Add(new LibraryNameReference(referenceAssemblyName));
index++;
continue;
inputReferences.Add(new LibraryNameReference(path3));
}
break;
case 'i':
if (arg.Length >= 3)
if (TryGetOptionArgument(args, ref index, out var path4))
{
options.InjectToAssemblyPath = arg.Substring(2);
options.InjectToAssemblyPath = path4;
options.LinkerOptions.CreationOptions = null;
continue;
}
else if (args.Length >= index)
{
options.InjectToAssemblyPath = args[index + 1];
options.LinkerOptions.CreationOptions = null;
index++;
continue;
}
options.LinkerOptions.CreationOptions = null;
continue;
case 'a':
if (arg.Length >= 3)
{
if (options.LinkerOptions.CreationOptions is { } co2)
{
co2.AppHostTemplatePath = arg.Substring(2);
}
continue;
}
else if (args.Length >= index)
if (TryGetOptionArgument(args, ref index, out var path5))
{
if (options.LinkerOptions.CreationOptions is { } co2)
{
co2.AppHostTemplatePath = args[index + 1];
co2.AppHostTemplatePath = path5;
}
index++;
continue;
}
break;
case 'd':
if (arg.Length >= 3)
{
if (options.LinkerOptions.CreationOptions is { } co2)
{
co2.CAbiStartUpObjectDirectoryPath = arg.Substring(2);
}
continue;
}
else if (args.Length >= index)
if (TryGetOptionArgument(args, ref index, out var path6))
{
if (options.LinkerOptions.CreationOptions is { } co2)
{
co2.CAbiStartUpObjectDirectoryPath = args[index + 1];
co2.CAbiStartUpObjectDirectoryPath = path6;
}
index++;
continue;
}
break;
case 'e':
if (arg.Length >= 3)
if (TryGetOptionArgument(args, ref index, out var path7))
{
if (options.LinkerOptions.CreationOptions is { } co2)
{
co2.EntryPointSymbol = arg.Substring(2);
co2.EntryPointSymbol = path7;
}
continue;
}
else if (args.Length >= index)
{
if (options.LinkerOptions.CreationOptions is { } co2)
{
co2.EntryPointSymbol = args[index + 1];
}
index++;
continue;
}
break;
case 'g':
if (arg.Length == 3)
Expand Down Expand Up @@ -270,22 +227,20 @@ public static CliOptions Parse(
}
break;
case 'v':
if (arg.Length == 2 &&
Version.TryParse(args[index + 1], out var version))
if (TryGetOptionArgument(args, ref index, out var vs))
{
index++;
if (options.LinkerOptions.CreationOptions is { } co6)
if (Version.TryParse(vs, out var version))
{
co6.Version = version;
if (options.LinkerOptions.CreationOptions is { } co6)
{
co6.Version = version;
}
}
continue;
}
break;
case 'm':
var mopt = (arg.Length >= 3) ? arg.Substring(2) :
args.Length >= index ? args[++index] :
null;
if (mopt != null)
if (TryGetOptionArgument(args, ref index, out var mopt))
{
if (TargetFramework.TryParse(mopt, out var tf2))
{
Expand Down Expand Up @@ -469,6 +424,11 @@ public void WriteOptions(ILogger logger)
logger.Information($"Version={co.Version}");
logger.Information($"TargetFramework={co.TargetFramework}");
logger.Information($"AppHostTemplatePath={(co.AppHostTemplatePath ?? "(null)")}");

foreach (var sp in co.PrependExecutionSearchPaths)
{
logger.Information($"PrependExecutionSearchPath={sp}");
}
}
else
{
Expand Down Expand Up @@ -497,6 +457,7 @@ public static void WriteUsage(TextWriter tw)
tw.WriteLine(" -x Will not copy required assemblies");
tw.WriteLine(" -d <path> CABI startup object directory path");
tw.WriteLine(" -e <symbol> Entry point symbol (defaulted: _start)");
tw.WriteLine(" -B <path> Prepend execution search path");
tw.WriteLine(" -v <version> Apply assembly version (defaulted: 1.0.0.0)");
tw.WriteLine($" -m <tfm> Target framework moniker (defaulted: {ThisAssembly.AssemblyMetadata.TargetFrameworkMoniker})");
tw.WriteLine(" -m <arch> Target Windows architecture [AnyCPU|Preferred32Bit|X86|X64|IA64|ARM|ARMv7|ARM64] (defaulted: AnyCPU)");
Expand Down

0 comments on commit 42ed064

Please sign in to comment.