|
|
// 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
// This file defines the BuilderMode type and its command-line flag.
import ( "bytes" "fmt" )
// BuilderMode is a bitmask of options for diagnostics and checking.
//
// *BuilderMode satisfies the flag.Value interface. Example:
//
// var mode = ssa.BuilderMode(0)
// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
//
type BuilderMode uint
const ( PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
PrintFunctions // Print function SSA code to stdout
LogSource // Log source locations as SSA builder progresses
SanityCheckFunctions // Perform sanity checking of function bodies
NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers
BuildSerially // Build packages serially, not in parallel.
GlobalDebug // Enable debug info for all packages
BareInits // Build init functions without guards or calls to dependent inits
)
const BuilderModeDoc = `Options controlling the SSA builder. The value is a sequence of zero or more of these letters: C perform sanity [C]hecking of the SSA form. D include [D]ebug info for every function. P print [P]ackage inventory. F print [F]unction SSA code. S log [S]ource locations as SSA builder progresses. L build distinct packages seria[L]ly instead of in parallel. N build [N]aive SSA form: don't replace local loads/stores with registers. I build bare [I]nit functions: no init guards or calls to dependent inits. `
func (m BuilderMode) String() string { var buf bytes.Buffer if m&GlobalDebug != 0 { buf.WriteByte('D') } if m&PrintPackages != 0 { buf.WriteByte('P') } if m&PrintFunctions != 0 { buf.WriteByte('F') } if m&LogSource != 0 { buf.WriteByte('S') } if m&SanityCheckFunctions != 0 { buf.WriteByte('C') } if m&NaiveForm != 0 { buf.WriteByte('N') } if m&BuildSerially != 0 { buf.WriteByte('L') } return buf.String() }
// Set parses the flag characters in s and updates *m.
func (m *BuilderMode) Set(s string) error { var mode BuilderMode for _, c := range s { switch c { case 'D': mode |= GlobalDebug case 'P': mode |= PrintPackages case 'F': mode |= PrintFunctions case 'S': mode |= LogSource | BuildSerially case 'C': mode |= SanityCheckFunctions case 'N': mode |= NaiveForm case 'L': mode |= BuildSerially default: return fmt.Errorf("unknown BuilderMode option: %q", c) } } *m = mode return nil }
// Get returns m.
func (m BuilderMode) Get() interface{} { return m }
|