From 7e9f5d500f8f7213241123cf6af479031489fc84 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Wed, 9 Jul 2025 21:13:50 +0200 Subject: [PATCH] Simplified linker interface --- src/cli/build.go | 4 ++-- src/cli/run.go | 2 +- src/core/Environment.go | 2 ++ src/core/Function.go | 5 ++--- src/linker/Write.go | 12 ++++++------ src/linker/WriteFile.go | 5 ++--- src/linker/Write_test.go | 2 +- src/memfile/memfile_test.go | 2 +- src/scanner/Scan.go | 1 + tests/testRun_test.go | 2 +- 10 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/cli/build.go b/src/cli/build.go index 6d1ed80..fb371ee 100644 --- a/src/cli/build.go +++ b/src/cli/build.go @@ -17,7 +17,7 @@ func _build(args []string) int { return exit(err) } - result, err := compiler.Compile(b) + env, err := compiler.Compile(b) if err != nil { return exit(err) @@ -27,7 +27,7 @@ func _build(args []string) int { return 0 } - err = linker.WriteFile(b.Executable(), b, result) + err = linker.WriteFile(b.Executable(), env) return exit(err) } diff --git a/src/cli/run.go b/src/cli/run.go index 0ca58b2..75586f7 100644 --- a/src/cli/run.go +++ b/src/cli/run.go @@ -29,7 +29,7 @@ func run(args []string) int { return exit(err) } - linker.Write(file, b, env) + linker.Write(file, env) err = memfile.Exec(file) if err != nil { diff --git a/src/core/Environment.go b/src/core/Environment.go index 7b31c17..ca240c5 100644 --- a/src/core/Environment.go +++ b/src/core/Environment.go @@ -1,11 +1,13 @@ package core import ( + "git.urbach.dev/cli/q/src/build" "git.urbach.dev/cli/q/src/fs" ) // Environment holds information about the entire build. type Environment struct { + Build *build.Build Functions map[string]*Function Files []*fs.File } \ No newline at end of file diff --git a/src/core/Function.go b/src/core/Function.go index 71e14f7..64aa796 100644 --- a/src/core/Function.go +++ b/src/core/Function.go @@ -32,9 +32,8 @@ type Function struct { // NewFunction creates a new function. func NewFunction(name string, pkg string, file *fs.File) *Function { return &Function{ - Name: name, - Package: pkg, - + Name: name, + Package: pkg, File: file, Identifiers: make(map[string]ssa.Value, 8), IR: ssa.IR{ diff --git a/src/linker/Write.go b/src/linker/Write.go index af55f8f..97492bc 100644 --- a/src/linker/Write.go +++ b/src/linker/Write.go @@ -13,7 +13,7 @@ import ( ) // Write writes an executable to the given writer. -func Write(writer io.WriteSeeker, b *build.Build, env *core.Environment) { +func Write(writer io.WriteSeeker, env *core.Environment) { program := asm.Assembler{ Instructions: make([]asm.Instruction, 0, 32), Data: make(data.Data, 32), @@ -28,14 +28,14 @@ func Write(writer io.WriteSeeker, b *build.Build, env *core.Environment) { program.Merge(&f.Assembler) }) - code, data, libs := program.Compile(b) + code, data, libs := program.Compile(env.Build) - switch b.OS { + switch env.Build.OS { case build.Linux: - elf.Write(writer, b, code, data) + elf.Write(writer, env.Build, code, data) case build.Mac: - macho.Write(writer, b, code, data) + macho.Write(writer, env.Build, code, data) case build.Windows: - pe.Write(writer, b, code, data, libs) + pe.Write(writer, env.Build, code, data, libs) } } \ No newline at end of file diff --git a/src/linker/WriteFile.go b/src/linker/WriteFile.go index 93bc8ee..f268c9d 100644 --- a/src/linker/WriteFile.go +++ b/src/linker/WriteFile.go @@ -3,19 +3,18 @@ package linker import ( "os" - "git.urbach.dev/cli/q/src/build" "git.urbach.dev/cli/q/src/core" ) // WriteFile writes an executable file to disk. -func WriteFile(executable string, b *build.Build, env *core.Environment) error { +func WriteFile(executable string, env *core.Environment) error { file, err := os.Create(executable) if err != nil { return err } - Write(file, b, env) + Write(file, env) err = file.Chmod(0o755) if err != nil { diff --git a/src/linker/Write_test.go b/src/linker/Write_test.go index bbde817..70f8cfe 100644 --- a/src/linker/Write_test.go +++ b/src/linker/Write_test.go @@ -18,6 +18,6 @@ func TestWrite(t *testing.T) { assert.Nil(t, err) writer := &exe.Discard{} - linker.Write(writer, b, env) + linker.Write(writer, env) }) } \ No newline at end of file diff --git a/src/memfile/memfile_test.go b/src/memfile/memfile_test.go index 3546861..457394f 100644 --- a/src/memfile/memfile_test.go +++ b/src/memfile/memfile_test.go @@ -33,7 +33,7 @@ func TestHelloExample(t *testing.T) { env, err := compiler.Compile(b) assert.Nil(t, err) - linker.Write(file, b, env) + linker.Write(file, env) err = memfile.Exec(file) assert.Nil(t, err) diff --git a/src/scanner/Scan.go b/src/scanner/Scan.go index 4da223e..f3073e5 100644 --- a/src/scanner/Scan.go +++ b/src/scanner/Scan.go @@ -28,6 +28,7 @@ func Scan(b *build.Build) (*core.Environment, error) { }() all := &core.Environment{ + Build: b, Files: make([]*fs.File, 0, 8), Functions: make(map[string]*core.Function, 32), } diff --git a/tests/testRun_test.go b/tests/testRun_test.go index 8faded9..2847630 100644 --- a/tests/testRun_test.go +++ b/tests/testRun_test.go @@ -33,7 +33,7 @@ func (test *testRun) Run(t *testing.T, path string) { executable := b.Executable() executable = filepath.Join(tmpDir, filepath.Base(executable)) - err = linker.WriteFile(executable, b, env) + err = linker.WriteFile(executable, env) assert.Nil(t, err) stat, err := os.Stat(executable)