Generator returns an LLVM module

This commit is contained in:
Sasha Koshka 2023-11-23 01:26:14 -05:00
parent 15fece8154
commit 94bf21536d
2 changed files with 14 additions and 14 deletions

View File

@ -1,6 +1,5 @@
package generator package generator
import "io"
import "fmt" import "fmt"
import "sort" import "sort"
import "errors" import "errors"
@ -29,8 +28,7 @@ func NativeTarget () Target {
type generator struct { type generator struct {
target Target target Target
tree analyzer.Tree tree analyzer.Tree
output io.Writer module *llvm.Module
module llvm.Module
managerStack []*blockManager managerStack []*blockManager
blockManager *blockManager blockManager *blockManager
@ -39,32 +37,29 @@ type generator struct {
// Generate takes in a semantic tree and writes corresponding LLVM IR to the // Generate takes in a semantic tree and writes corresponding LLVM IR to the
// given io.Writer. It returns an error in case there is something wrong with // given io.Writer. It returns an error in case there is something wrong with
// the semantic tree that prevents the code generation process from occurring. // the semantic tree that prevents the code generation process from occurring.
func (this Target) Generate (tree analyzer.Tree, output io.Writer) error { func (this Target) Generate (tree analyzer.Tree) (*llvm.Module, error) {
return (&generator { return (&generator {
module: new(llvm.Module),
target: this, target: this,
tree: tree, tree: tree,
output: output,
}).generate() }).generate()
} }
func (this *generator) generate () error { func (this *generator) generate () (*llvm.Module, error) {
// generate typedefs // generate typedefs
typedefs := sortMapKeys(this.tree.Types) typedefs := sortMapKeys(this.tree.Types)
for _, typeName := range typedefs { for _, typeName := range typedefs {
_, err := this.typedef(typeName) _, err := this.typedef(typeName)
if err != nil { return err } if err != nil { return nil, err }
} }
// TODO hoist and lazily generate
// generate functions
functions := sortMapKeys(this.tree.Functions) functions := sortMapKeys(this.tree.Functions)
for _, functionName := range functions { for _, functionName := range functions {
_, err := this.function(functionName) _, err := this.function(functionName)
if err != nil { return err } if err != nil { return nil, err }
} }
_, err := this.module.WriteTo(this.output) return this.module, nil
return err
} }
func (this *generator) typedef (typeName string) (llvm.Type, error) { func (this *generator) typedef (typeName string) (llvm.Type, error) {

View File

@ -28,8 +28,13 @@ func testReader (test *testing.T, correct string, inputs ...io.Reader) {
return return
} }
module, err := NativeTarget().Generate(tree)
if err != nil {
test.Error("generator returned error: ", err)
return
}
output := new(strings.Builder) output := new(strings.Builder)
err = NativeTarget().Generate(tree, output) _, err = module.WriteTo(output)
if err != nil { if err != nil {
test.Error("generator returned error: ", err) test.Error("generator returned error: ", err)
return return