b.AddEdgeTo(lab.target)
case OAS, OASWB:
- // Check whether we can generate static data rather than code.
- // If so, ignore n and defer data generation until codegen.
- // Failure to do this causes writes to readonly symbols.
+ // Generate static data rather than code, if possible.
if gen_as_init(n, true) {
- var data []*Node
- if s.f.StaticData != nil {
- data = s.f.StaticData.([]*Node)
+ if !gen_as_init(n, false) {
+ Fatalf("non-static data marked as static: %v\n\n", n)
}
- s.f.StaticData = append(data, n)
return
}
}
}
- // Emit static data
- if f.StaticData != nil {
- for _, n := range f.StaticData.([]*Node) {
- if !gen_as_init(n, false) {
- Fatalf("non-static data marked as static: %v\n\n", n)
- }
- }
- }
-
// Generate gc bitmaps.
liveness(Curfn, ptxt, gcargs, gclocals)
// A Func represents a Go func declaration (or function literal) and
// its body. This package compiles each Func independently.
type Func struct {
- Config *Config // architecture information
- pass *pass // current pass information (name, options, etc.)
- Name string // e.g. bytes·Compare
- Type Type // type signature of the function.
- StaticData interface{} // associated static data, untouched by the ssa package
- Blocks []*Block // unordered set of all basic blocks (note: not indexable by ID)
- Entry *Block // the entry basic block
- bid idAlloc // block ID allocator
- vid idAlloc // value ID allocator
+ Config *Config // architecture information
+ pass *pass // current pass information (name, options, etc.)
+ Name string // e.g. bytes·Compare
+ Type Type // type signature of the function.
+ Blocks []*Block // unordered set of all basic blocks (note: not indexable by ID)
+ Entry *Block // the entry basic block
+ bid idAlloc // block ID allocator
+ vid idAlloc // value ID allocator
scheduled bool // Values in Blocks are in final order
NoSplit bool // true if function is marked as nosplit. Used by schedule check pass.