Module system

This commit is contained in:
nub31
2025-09-11 23:03:44 +02:00
parent 9c2975d45f
commit 0e442a8c4a
15 changed files with 265 additions and 167 deletions

View File

@@ -11,7 +11,7 @@ public class QBEGenerator
{
private readonly QBEWriter _writer;
private readonly IReadOnlyList<DefinitionNode> _definitions;
private readonly IReadOnlyDictionary<string, ModuleSignature> _moduleSignatures;
private readonly IReadOnlyDictionary<string, Module> _moduleSignatures;
private readonly List<CStringLiteral> _cStringLiterals = [];
private readonly List<StringLiteral> _stringLiterals = [];
@@ -23,7 +23,7 @@ public class QBEGenerator
private int _stringLiteralIndex;
private bool _codeIsReachable = true;
public QBEGenerator(IReadOnlyList<DefinitionNode> definitions, IReadOnlyDictionary<string, ModuleSignature> moduleSignatures)
public QBEGenerator(IReadOnlyList<DefinitionNode> definitions, IReadOnlyDictionary<string, Module> moduleSignatures)
{
_definitions = definitions;
_moduleSignatures = moduleSignatures;
@@ -46,7 +46,7 @@ public class QBEGenerator
{
foreach (var structType in signature.ExportedStructTypes)
{
EmitStructType(module, structType);
EmitStructType(module, structType.StructType);
_writer.NewLine();
}
}
@@ -410,8 +410,6 @@ public class QBEGenerator
private void EmitStructDefinition(StructNode structDef)
{
var type = TypeResolver.ResolveStructType(structDef.Module, structDef.Name, _moduleSignatures);
// _writer.WriteLine($"export function {StructCtorName(_module.Name, structDef.Name)}() {{");
// _writer.WriteLine("@start");
// _writer.Indented($"%struct =l alloc8 {SizeOf(type)}");
@@ -660,7 +658,6 @@ public class QBEGenerator
private string EmitFuncIdentifier(FuncIdentifierNode funcIdent)
{
// todo(nub31): Support for extern funcs
return FuncName(funcIdent.Module, funcIdent.Name);
}
@@ -755,9 +752,7 @@ public class QBEGenerator
private string EmitAddressOfStructFieldAccess(StructFieldAccessNode structFieldAccess)
{
var target = EmitExpression(structFieldAccess.Target);
var structType = TypeResolver.ResolveStructType(structFieldAccess.StructType.Module, structFieldAccess.StructType.Name, _moduleSignatures);
var offset = OffsetOf(structType, structFieldAccess.Field);
var offset = OffsetOf(structFieldAccess.StructType, structFieldAccess.Field);
var address = TmpName();
_writer.Indented($"{address} =l add {target}, {offset}");
@@ -1398,8 +1393,8 @@ public class QBEGenerator
private string FuncName(string module, string name)
{
var type = TypeResolver.ResolveFunctionType(module, name, _moduleSignatures);
var symbol = type.ExternSymbol ?? $"{module}.{name}";
var function = _moduleSignatures[module].AllFunctions.First(x => x.Name == name);
var symbol = function.ExternSymbol ?? $"{module}.{name}";
return "$" + symbol;
}