2018-12-02 12:28:33 -08:00
|
|
|
package pass
|
|
|
|
|
|
|
|
|
|
import "github.com/mmcloughlin/avo"
|
|
|
|
|
|
2018-12-08 22:02:02 -08:00
|
|
|
var Compile = Concat(
|
|
|
|
|
FunctionPass(LabelTarget),
|
|
|
|
|
FunctionPass(CFG),
|
|
|
|
|
FunctionPass(Liveness),
|
|
|
|
|
FunctionPass(AllocateRegisters),
|
|
|
|
|
FunctionPass(BindRegisters),
|
|
|
|
|
FunctionPass(VerifyAllocation),
|
|
|
|
|
)
|
2018-12-02 12:28:33 -08:00
|
|
|
|
2018-12-08 22:02:02 -08:00
|
|
|
type Interface interface {
|
|
|
|
|
Execute(*avo.File) error
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Func func(*avo.File) error
|
|
|
|
|
|
|
|
|
|
func (p Func) Execute(f *avo.File) error {
|
|
|
|
|
return p(f)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type FunctionPass func(*avo.Function) error
|
|
|
|
|
|
|
|
|
|
func (p FunctionPass) Execute(f *avo.File) error {
|
|
|
|
|
for _, fn := range f.Functions {
|
|
|
|
|
if err := p(fn); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Concat(passes ...Interface) Interface {
|
|
|
|
|
return Func(func(f *avo.File) error {
|
|
|
|
|
for _, p := range passes {
|
|
|
|
|
if err := p.Execute(f); err != nil {
|
2018-12-02 12:28:33 -08:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
2018-12-08 22:02:02 -08:00
|
|
|
})
|
2018-12-02 12:28:33 -08:00
|
|
|
}
|