This commit is contained in:
nub31
2025-07-22 22:10:31 +02:00
parent 2d2d346da0
commit 4055002a8c
25 changed files with 413 additions and 972 deletions

View File

@@ -10,8 +10,6 @@ public partial class QBEGenerator
{
private Val EmitExpression(BoundExpression expression)
{
_writer.WriteDebugLocation(expression);
return expression switch
{
BoundArrayInitializer arrayInitializer => EmitArrayInitializer(arrayInitializer),
@@ -27,8 +25,7 @@ public partial class QBEGenerator
BoundLiteral literal => EmitLiteral(literal),
BoundUnaryExpression unaryExpression => EmitUnaryExpression(unaryExpression),
BoundStructFieldAccess structFieldAccess => EmitStructFieldAccess(structFieldAccess),
BoundTraitFuncAccess traitFuncAccess => EmitTraitFuncAccess(traitFuncAccess),
BoundTraitImplFuncAccess traitImplFuncAccess => EmitTraitImplFuncAccess(traitImplFuncAccess),
BoundInterfaceFuncAccess traitFuncAccess => EmitTraitFuncAccess(traitFuncAccess),
BoundArrayIndexAccess arrayIndex => EmitArrayIndexAccess(arrayIndex),
_ => throw new ArgumentOutOfRangeException(nameof(expression))
};
@@ -418,22 +415,11 @@ public partial class QBEGenerator
return new Val(output, structFieldAccess.Type, ValKind.Pointer);
}
private Val EmitTraitFuncAccess(BoundTraitFuncAccess traitFuncAccess)
private Val EmitTraitFuncAccess(BoundInterfaceFuncAccess interfaceFuncAccess)
{
throw new NotImplementedException();
}
private Val EmitTraitImplFuncAccess(BoundTraitImplFuncAccess traitImplFuncAccess)
{
var target = EmitExpression(traitImplFuncAccess.Target);
var funcImpl = _definitionTable.LookupTraitFuncImpl(traitImplFuncAccess.Target.Type, traitImplFuncAccess.FuncName);
var name = ImplFuncName();
_implFunctions.TryAdd(funcImpl, name);
return new Val(name, traitImplFuncAccess.Type, ValKind.Direct, new MethodCallContext(target));
}
private Val EmitFuncCall(BoundFuncCall funcCall)
{
var expression = EmitExpression(funcCall.Expression);
@@ -441,12 +427,6 @@ public partial class QBEGenerator
var parameterStrings = new List<string>();
if (expression.FuncCallContext != null)
{
var thisArg = EmitUnwrap(expression.FuncCallContext.ThisArg);
parameterStrings.Add($"{FuncQBETypeName(expression.FuncCallContext.ThisArg.Type)} {thisArg}");
}
foreach (var parameter in funcCall.Parameters)
{
var copy = EmitCreateCopyOrInitialize(parameter);

View File

@@ -7,8 +7,6 @@ public partial class QBEGenerator
{
private void EmitStatement(BoundStatement statement)
{
_writer.WriteDebugLocation(statement);
switch (statement)
{
case BoundAssignment assignment:

View File

@@ -18,23 +18,21 @@ public partial class QBEGenerator
private readonly Stack<string> _breakLabels = [];
private readonly Stack<string> _continueLabels = [];
private readonly Queue<(BoundArrowFunc Func, string Name)> _arrowFunctions = [];
private readonly Dictionary<BoundTraitFuncImpl, string> _implFunctions = [];
private readonly Stack<Scope> _scopes = [];
private int _tmpIndex;
private int _labelIndex;
private int _arrowFuncIndex;
private int _cStringLiteralIndex;
private int _stringLiteralIndex;
private int _implFuncNameIndex;
private bool _codeIsReachable = true;
private Scope Scope => _scopes.Peek();
public QBEGenerator(BoundSyntaxTree syntaxTree, BoundDefinitionTable definitionTable, string file)
public QBEGenerator(BoundSyntaxTree syntaxTree, BoundDefinitionTable definitionTable)
{
_syntaxTree = syntaxTree;
_definitionTable = definitionTable;
_writer = new QBEWriter(file);
_writer = new QBEWriter();
}
public string Emit()
@@ -44,14 +42,12 @@ public partial class QBEGenerator
_breakLabels.Clear();
_continueLabels.Clear();
_arrowFunctions.Clear();
_implFunctions.Clear();
_scopes.Clear();
_tmpIndex = 0;
_labelIndex = 0;
_arrowFuncIndex = 0;
_cStringLiteralIndex = 0;
_stringLiteralIndex = 0;
_implFuncNameIndex = 0;
_codeIsReachable = true;
foreach (var structDef in _definitionTable.GetStructs())
@@ -78,12 +74,6 @@ public partial class QBEGenerator
_writer.NewLine();
}
foreach (var (impl, name) in _implFunctions)
{
EmitFuncDefinition(name, impl.Signature.Parameters, impl.Signature.ReturnType, impl.Body);
_writer.NewLine();
}
foreach (var cStringLiteral in _cStringLiterals)
{
_writer.WriteLine($"data {cStringLiteral.Name} = {{ b \"{cStringLiteral.Value}\", b 0 }}");
@@ -207,19 +197,16 @@ public partial class QBEGenerator
{
case BoundArrayInitializer arrayInitializer:
{
_writer.WriteDebugLocation(arrayInitializer);
EmitStore(source.Type, EmitUnwrap(EmitArrayInitializer(arrayInitializer)), destinationPointer);
return true;
}
case BoundStructInitializer structInitializer:
{
_writer.WriteDebugLocation(structInitializer);
EmitStructInitializer(structInitializer, destinationPointer);
return true;
}
case BoundLiteral { Kind: LiteralKind.String } literal:
{
_writer.WriteDebugLocation(literal);
EmitStore(source.Type, EmitUnwrap(EmitLiteral(literal)), destinationPointer);
return true;
}
@@ -521,11 +508,6 @@ public partial class QBEGenerator
return $"${funcDef.CallName}";
}
private string ImplFuncName()
{
return $"$impl{++_implFuncNameIndex}";
}
private string CustomTypeName(NubCustomType customType)
{
return CustomTypeName(customType.Namespace, customType.Name);
@@ -551,7 +533,7 @@ public class CStringLiteral(string value, string name)
public string Name { get; } = name;
}
public record Val(string Name, NubType Type, ValKind Kind, MethodCallContext? FuncCallContext = null);
public record Val(string Name, NubType Type, ValKind Kind);
public class Scope(Scope? parent = null)
{
@@ -579,8 +561,6 @@ public class Scope(Scope? parent = null)
}
}
public record MethodCallContext(Val ThisArg);
public enum ValKind
{
Pointer,

View File

@@ -1,22 +1,13 @@
using System.Text;
using NubLang.Syntax.Binding.Node;
namespace NubLang.Generation.QBE;
internal class QBEWriter
{
private readonly StringBuilder _builder = new();
private int _currentLine = -1;
public QBEWriter(string debugFile)
{
_builder.AppendLine($"dbgfile \"{debugFile}\"");
_builder.AppendLine();
}
public void StartFunction(string signature)
{
_currentLine = -1;
_builder.Append(signature);
_builder.AppendLine(" {");
_builder.AppendLine("@start");
@@ -27,26 +18,6 @@ internal class QBEWriter
_builder.AppendLine("}");
}
private void WriteDebugLocation(SourceSpan span)
{
var line = span.Start.Line;
if (_currentLine != line)
{
_builder.AppendLine($" dbgloc {line}");
_currentLine = line;
}
}
public void WriteDebugLocation(BoundNode node)
{
var firstToken = node.Tokens.FirstOrDefault();
if (firstToken != null)
{
// WriteDebugLocation(firstToken.Span);
}
}
public void Indented(string value)
{
_builder.Append('\t');