blob: 27f6017e2fa6df84b530ba8f813cb8d6a71be0bc [file] [log] [blame]
package ssa_test
import (
"code.google.com/p/go.exp/ssa"
"fmt"
"go/ast"
"go/parser"
"os"
)
// This example demonstrates the SSA builder.
func Example() {
const hello = `
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
`
// Construct a builder. Imports will be loaded as if by 'go build'.
builder := ssa.NewBuilder(&ssa.Context{Loader: ssa.MakeGoBuildLoader(nil)})
// Parse the input file.
file, err := parser.ParseFile(builder.Prog.Files, "hello.go", hello, parser.DeclarationErrors)
if err != nil {
fmt.Printf("Parsing failed: %s\n", err.Error())
return
}
// Create a "main" package containing one file.
mainPkg, err := builder.CreatePackage("main", []*ast.File{file})
if err != nil {
fmt.Printf("Type-checking failed: %s\n", err.Error())
return
}
// Build SSA code for bodies of functions in mainPkg.
builder.BuildPackage(mainPkg)
// Print out the package-level functions.
for _, mem := range mainPkg.Members {
if fn, ok := mem.(*ssa.Function); ok {
fn.DumpTo(os.Stdout)
}
}
// Output:
// # Name: main.main
// # Declared at hello.go:6:6
// func main():
// .0.entry: P:0 S:0
// a0 = new [1]interface{} *[1]interface{}
// t0 = &a0[0:untyped integer] *interface{}
// t1 = make interface interface{} <- string ("Hello, World!":string) interface{}
// *t0 = t1
// t2 = slice a0[:] []interface{}
// t3 = fmt.Println(t2) (n int, err error)
// ret
}