Improved debug info emit

This commit is contained in:
nub31
2025-10-17 23:22:04 +02:00
parent dc78d1fc9a
commit 267da1941d
5 changed files with 20 additions and 27 deletions

View File

@@ -91,10 +91,10 @@ if (moduleRepository.Modules().TryGetValue("main", out var mainModule))
.text .text
.globl _start .globl _start
_start: _start:
mov rdi, rsp # Pass stack pointer to main (argv-like) mov rdi, [rsp + 8] # Pass stack pointer to main (argv-like)
call {mainFunction.ExternSymbol} call {mainFunction.ExternSymbol}
mov rdi, rax # Move return value into rdi mov rdi, rax # Move return value into rdi
mov rax, 60 # syscall: exit mov rax, 60 # syscall: exit
syscall syscall
"""; """;
@@ -102,8 +102,9 @@ if (moduleRepository.Modules().TryGetValue("main", out var mainModule))
var runtimePath = Path.Combine(".build", "runtime.s"); var runtimePath = Path.Combine(".build", "runtime.s");
File.WriteAllText(runtimePath, runtime); File.WriteAllText(runtimePath, runtime);
using var assembleProcess = Process.Start(new ProcessStartInfo("as", ["-c", runtimePath, "-o", Path.Combine(".build", "runtime.o")])); using var assembleProcess = Process.Start(new ProcessStartInfo("as", ["-g", "-c", runtimePath, "-o", Path.Combine(".build", "runtime.o")]));
if (assembleProcess == null) return 1; if (assembleProcess == null) return 1;
assembleProcess.WaitForExit();
if (assembleProcess.ExitCode != 0) if (assembleProcess.ExitCode != 0)
{ {

View File

@@ -166,7 +166,7 @@ public class Generator
foreach (var funcNode in _definitions.OfType<FuncNode>()) foreach (var funcNode in _definitions.OfType<FuncNode>())
{ {
EmitLine(funcNode.Tokens); EmitLine(funcNode.Tokens.FirstOrDefault());
appendNewLine = true; appendNewLine = true;
var parameters = funcNode.Signature.Parameters.Count != 0 var parameters = funcNode.Signature.Parameters.Count != 0
? string.Join(", ", funcNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name))) ? string.Join(", ", funcNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name)))
@@ -185,7 +185,7 @@ public class Generator
{ {
foreach (var structFuncNode in structNode.Functions) foreach (var structFuncNode in structNode.Functions)
{ {
EmitLine(structFuncNode.Tokens); EmitLine(structFuncNode.Tokens.FirstOrDefault());
var parameters = structFuncNode.Signature.Parameters.Count != 0 var parameters = structFuncNode.Signature.Parameters.Count != 0
? string.Join(", ", structFuncNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name))) ? string.Join(", ", structFuncNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name)))
: "void"; : "void";
@@ -201,7 +201,7 @@ public class Generator
{ {
if (funcNode.Body == null) continue; if (funcNode.Body == null) continue;
EmitLine(funcNode.Tokens); EmitLine(funcNode.Tokens.FirstOrDefault());
var parameters = funcNode.Signature.Parameters.Count != 0 var parameters = funcNode.Signature.Parameters.Count != 0
? string.Join(", ", funcNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name))) ? string.Join(", ", funcNode.Signature.Parameters.Select(x => MapNameWithType(x.Type, x.Name)))
: "void"; : "void";
@@ -236,7 +236,7 @@ public class Generator
private void EmitStatement(StatementNode statementNode) private void EmitStatement(StatementNode statementNode)
{ {
EmitLine(statementNode.Tokens); EmitLine(statementNode.Tokens.FirstOrDefault());
switch (statementNode) switch (statementNode)
{ {
case AssignmentNode assignmentNode: case AssignmentNode assignmentNode:
@@ -277,14 +277,12 @@ public class Generator
} }
} }
private void EmitLine(List<Token> tokens) private void EmitLine(Token? token)
{ {
if (tokens.Count >= 1) if (token == null) return;
{ var file = token.Span.FilePath;
var file = tokens[0].Span.FilePath; var line = token.Span.Start.Line;
var line = tokens[0].Span.Start.Line; _writer.WriteLine($"#line {line} \"{file}\"");
_writer.WriteLine($"#line {line} \"{file}\"");
}
} }
private void EmitAssignment(AssignmentNode assignmentNode) private void EmitAssignment(AssignmentNode assignmentNode)
@@ -352,10 +350,12 @@ public class Generator
EmitStatement(blockDefers[i].Statement); EmitStatement(blockDefers[i].Statement);
} }
EmitLine(returnNode.Tokens.FirstOrDefault());
_writer.WriteLine($"return {tmp};"); _writer.WriteLine($"return {tmp};");
} }
else else
{ {
EmitLine(returnNode.Tokens.FirstOrDefault());
_writer.WriteLine($"return {returnValue};"); _writer.WriteLine($"return {returnValue};");
} }
} }
@@ -670,6 +670,7 @@ public class Generator
private void EmitBlock(BlockNode blockNode) private void EmitBlock(BlockNode blockNode)
{ {
EmitLine(blockNode.Tokens.FirstOrDefault());
_writer.WriteLine("{"); _writer.WriteLine("{");
using (_writer.Indent()) using (_writer.Indent())
{ {
@@ -687,6 +688,7 @@ public class Generator
} }
} }
EmitLine(blockNode.Tokens.LastOrDefault());
_writer.WriteLine("}"); _writer.WriteLine("}");
} }
} }

View File

@@ -4,6 +4,7 @@ extern "puts" func puts(text: cstring)
extern "main" func main(args: []cstring): i64 extern "main" func main(args: []cstring): i64
{ {
defer puts("Goodybye World")
puts("Hello World") puts("Hello World")
return 0 return 0
} }

View File

@@ -1,6 +1,5 @@
out: main.nub generated/raylib.nub .build/out: main.nub generated/raylib.nub
nubc main.nub generated/raylib.nub raylib-5.5_linux_amd64/lib/libraylib.a nubc main.nub generated/raylib.nub raylib-5.5_linux_amd64/lib/libraylib.a
clean: clean:
@rm -r .build 2>/dev/null || true @rm -r .build 2>/dev/null || true
@rm out 2>/dev/null || true

View File

@@ -1,10 +0,0 @@
.intel_syntax noprefix
.text
.globl _start
_start:
mov rdi, rsp
call main
mov rdi, rax
mov rax, 60
syscall