From 28d464f318115d325eee248698390127b10281cd Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 21 Jan 2025 20:57:51 +0100 Subject: [PATCH] continue cmd --- asm/amd64/codegen.go | 2 +- cmd/cmd.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/asm/amd64/codegen.go b/asm/amd64/codegen.go index e70ffa1..d7c8054 100644 --- a/asm/amd64/codegen.go +++ b/asm/amd64/codegen.go @@ -15,7 +15,7 @@ func toAsmOperand(op ttir.Operand) Operand { } } -func CgProgram(prog ttir.Program) Program { +func CgProgram(prog *ttir.Program) Program { funcs := make([]Function, 0) for _, f := range prog.Functions { diff --git a/cmd/cmd.go b/cmd/cmd.go index 7030a8a..55e79c9 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -8,9 +8,11 @@ import ( "path/filepath" "strings" + "robaertschi.xyz/robaertschi/tt/asm/amd64" "robaertschi.xyz/robaertschi/tt/lexer" "robaertschi.xyz/robaertschi/tt/parser" "robaertschi.xyz/robaertschi/tt/token" + "robaertschi.xyz/robaertschi/tt/ttir" "robaertschi.xyz/robaertschi/tt/typechecker" ) @@ -34,6 +36,7 @@ func main() { if output == "" { output = strings.TrimRight(input, filepath.Ext(input)) } + asmOutputName := strings.TrimRight(input, filepath.Ext(input)) + ".asm" file, err := os.Open(input) if err != nil { @@ -76,4 +79,22 @@ func main() { fmt.Printf("Typechecker failed with %e\n", err) os.Exit(1) } + + ir := ttir.EmitProgram(tprogram) + asm := amd64.CgProgram(ir) + + asmOutput := asm.Emit() + + asmOutputFile, err := os.Open(asmOutputName) + if err != nil { + fmt.Printf("Failed to open asm file %q because: %e", asmOutputName, err) + os.Exit(1) + } + defer asmOutputFile.Close() + + _, err = asmOutputFile.WriteString(asmOutput) + if err != nil { + fmt.Printf("Failed to write to file %q because: %e", asmOutputName, err) + os.Exit(1) + } }