435c0d9fc8
This PR switches the Nomad repository from using govendor to Go modules for managing dependencies. Aspects of the Nomad workflow remain pretty much the same. The usual Makefile targets should continue to work as they always did. The API submodule simply defers to the parent Nomad version on the repository, keeping the semantics of API versioning that currently exists.
99 lines
2.6 KiB
Go
99 lines
2.6 KiB
Go
// 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 ir
|
|
|
|
// 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 = ir.BuilderMode(0)
|
|
// func init() { flag.Var(&mode, "build", ir.BuilderModeDoc) }
|
|
//
|
|
type BuilderMode uint
|
|
|
|
const (
|
|
PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
|
|
PrintFunctions // Print function IR code to stdout
|
|
PrintSource // Print source code when printing function IR
|
|
LogSource // Log source locations as IR builder progresses
|
|
SanityCheckFunctions // Perform sanity checking of function bodies
|
|
NaiveForm // Build naïve IR form: don't replace local loads/stores with registers
|
|
GlobalDebug // Enable debug info for all packages
|
|
)
|
|
|
|
const BuilderModeDoc = `Options controlling the IR builder.
|
|
The value is a sequence of zero or more of these letters:
|
|
C perform sanity [C]hecking of the IR form.
|
|
D include [D]ebug info for every function.
|
|
P print [P]ackage inventory.
|
|
F print [F]unction IR code.
|
|
A print [A]ST nodes responsible for IR instructions
|
|
S log [S]ource locations as IR builder progresses.
|
|
N build [N]aive IR form: don't replace local loads/stores with registers.
|
|
`
|
|
|
|
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&PrintSource != 0 {
|
|
buf.WriteByte('A')
|
|
}
|
|
if m&LogSource != 0 {
|
|
buf.WriteByte('S')
|
|
}
|
|
if m&SanityCheckFunctions != 0 {
|
|
buf.WriteByte('C')
|
|
}
|
|
if m&NaiveForm != 0 {
|
|
buf.WriteByte('N')
|
|
}
|
|
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 'A':
|
|
mode |= PrintSource
|
|
case 'S':
|
|
mode |= LogSource
|
|
case 'C':
|
|
mode |= SanityCheckFunctions
|
|
case 'N':
|
|
mode |= NaiveForm
|
|
default:
|
|
return fmt.Errorf("unknown BuilderMode option: %q", c)
|
|
}
|
|
}
|
|
*m = mode
|
|
return nil
|
|
}
|
|
|
|
// Get returns m.
|
|
func (m BuilderMode) Get() interface{} { return m }
|