diff --git a/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs b/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs index 4789649..99f2ec9 100644 --- a/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs +++ b/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs @@ -10,56 +10,33 @@ public class Generator private readonly List _definitions; private readonly SymbolTable _symbolTable; private readonly StringBuilder _builder; - private readonly HashSet _externFuncDefinitions; private readonly ExpressionGenerator _expressionGenerator; private readonly FuncGenerator _funcGenerator; - public Generator(FileNode file, Dictionary deps) + public Generator(IReadOnlyCollection definitions) { _definitions = []; _builder = new StringBuilder(); - _externFuncDefinitions = ["strcmp"]; _symbolTable = new SymbolTable(); _expressionGenerator = new ExpressionGenerator(_symbolTable, _builder); _funcGenerator = new FuncGenerator(_symbolTable, _builder, _expressionGenerator); - - ResolveGlobalVariables(file, deps); - ResolveDefinitions(file, deps); - } - private void ResolveGlobalVariables(FileNode file, Dictionary deps) - { - - foreach (var globalVariableDefinition in file.Definitions.OfType()) + foreach (var globalVariableDefinition in definitions.OfType()) { _symbolTable.DefineGlobalVariable(globalVariableDefinition); _definitions.Add(globalVariableDefinition); } - foreach (var include in file.Includes) + foreach (var funcDefinitionNode in definitions.OfType()) { - ResolveGlobalVariables(deps[include], deps); + _symbolTable.DefineFunc(funcDefinitionNode); + _definitions.Add(funcDefinitionNode); } - } - private void ResolveDefinitions(FileNode file, Dictionary deps) - { - foreach (var funcDefinitionNode in file.Definitions.OfType()) + foreach (var funcDefinitionNode in definitions.OfType()) { _symbolTable.DefineFunc(funcDefinitionNode); _definitions.Add(funcDefinitionNode); - _externFuncDefinitions.Add(_symbolTable.ResolveExternFunc(funcDefinitionNode.Name, funcDefinitionNode.Parameters.Select(p => p.Type).ToList()).StartLabel); - } - - foreach (var funcDefinitionNode in file.Definitions.OfType()) - { - _symbolTable.DefineFunc(funcDefinitionNode); - _definitions.Add(funcDefinitionNode); - } - - foreach (var include in file.Includes) - { - ResolveDefinitions(deps[include], deps); } } @@ -67,7 +44,7 @@ public class Generator { _builder.AppendLine("global _start"); - foreach (var externFuncDefinition in _externFuncDefinitions) + foreach (var externFuncDefinition in _definitions.OfType().Select(e => e.Name)) { _builder.AppendLine($"extern {externFuncDefinition}"); } @@ -110,6 +87,27 @@ public class Generator _builder.AppendLine(); _builder.AppendLine(_funcGenerator.GenerateFuncDefinition(funcDefinition)); } + + _builder.AppendLine(""" + + strcmp: + xor rdx, rdx + .loop: + mov al, [rsi + rdx] + mov bl, [rdi + rdx] + inc rdx + cmp al, bl + jne .not_equal + cmp al, 0 + je .equal + jmp .loop + .not_equal: + mov rax, 0 + ret + .equal: + mov rax, 1 + ret + """); _builder.AppendLine(); _builder.AppendLine("section .data"); diff --git a/Nub.Lang/Nub.Lang/Program.cs b/Nub.Lang/Nub.Lang/Program.cs index 9517963..5d74ba4 100644 --- a/Nub.Lang/Nub.Lang/Program.cs +++ b/Nub.Lang/Nub.Lang/Program.cs @@ -39,8 +39,7 @@ foreach (var file in files) typer.Populate(); } - -var generator = new Generator(files[rootFileName], files); +var generator = new Generator(files.Values.SelectMany(f => f.Definitions).ToList()); var asm = generator.Generate(); Console.WriteLine(asm); diff --git a/Nub.Lang/Nub.Lang/input/core/string.asm b/Nub.Lang/Nub.Lang/input/core/string.asm index 5b815d4..dcd0a3c 100644 --- a/Nub.Lang/Nub.Lang/input/core/string.asm +++ b/Nub.Lang/Nub.Lang/input/core/string.asm @@ -1,25 +1,6 @@ global strlen -global strcmp section .text -strcmp: - xor rdx, rdx -.loop: - mov al, [rsi + rdx] - mov bl, [rdi + rdx] - inc rdx - cmp al, bl - jne .not_equal - cmp al, 0 - je .equal - jmp .loop -.not_equal: - mov rax, 0 - ret -.equal: - mov rax, 1 - ret - strlen: xor rax, rax .loop: diff --git a/Nub.Lang/Nub.Lang/input/core/string.nub b/Nub.Lang/Nub.Lang/input/core/string.nub index 32f47ea..ff54a7e 100644 --- a/Nub.Lang/Nub.Lang/input/core/string.nub +++ b/Nub.Lang/Nub.Lang/input/core/string.nub @@ -1,2 +1 @@ extern func strlen(msg: String): int64; -extern func strcmp(a: String, b: String): bool;