Improved debug info emit
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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("}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -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
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
.intel_syntax noprefix
|
|
||||||
|
|
||||||
.text
|
|
||||||
.globl _start
|
|
||||||
_start:
|
|
||||||
mov rdi, rsp
|
|
||||||
call main
|
|
||||||
mov rdi, rax
|
|
||||||
mov rax, 60
|
|
||||||
syscall
|
|
||||||
Reference in New Issue
Block a user