| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ssa |
| |
| import "fmt" |
| |
| // Compile is the main entry point for this package. |
| // Compile modifies f so that on return: |
| // · all Values in f map to 0 or 1 assembly instructions of the target architecture |
| // · the order of f.Blocks is the order to emit the Blocks |
| // · the order of b.Values is the order to emit the Values in each Block |
| // · f has a non-nil regAlloc field |
| func Compile(f *Func) { |
| // TODO: debugging - set flags to control verbosity of compiler, |
| // which phases to dump IR before/after, etc. |
| fmt.Printf("compiling %s\n", f.Name) |
| |
| // hook to print function & phase if panic happens |
| phaseName := "init" |
| defer func() { |
| if phaseName != "" { |
| fmt.Printf("panic during %s while compiling %s\n", phaseName, f.Name) |
| } |
| }() |
| |
| // Run all the passes |
| printFunc(f) |
| checkFunc(f) |
| for _, p := range passes { |
| phaseName = p.name |
| fmt.Printf(" pass %s begin\n", p.name) |
| p.fn(f) |
| fmt.Printf(" pass %s end\n", p.name) |
| printFunc(f) |
| checkFunc(f) |
| } |
| |
| // Squash error printing defer |
| phaseName = "" |
| } |
| |
| type pass struct { |
| name string |
| fn func(*Func) |
| } |
| |
| // list of passes for the compiler |
| var passes = [...]pass{ |
| {"phielim", phielim}, |
| {"copyelim", copyelim}, |
| //{"opt", opt}, |
| // cse |
| {"deadcode", deadcode}, |
| //{"fuse", fuse}, |
| //{"lower", lower}, |
| // cse |
| //{"critical", critical}, // remove critical edges |
| //{"layout", layout}, // schedule blocks |
| //{"schedule", schedule}, // schedule values |
| // regalloc |
| // stack slot alloc (+size stack frame) |
| //{"cgen", cgen}, |
| } |