Generator returns an LLVM module
This commit is contained in:
parent
15fece8154
commit
94bf21536d
@ -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) {
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user