github.com/jd-ly/tools@v0.5.7/go/ssa/mode.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ssa 6 7 // This file defines the BuilderMode type and its command-line flag. 8 9 import ( 10 "bytes" 11 "fmt" 12 ) 13 14 // BuilderMode is a bitmask of options for diagnostics and checking. 15 // 16 // *BuilderMode satisfies the flag.Value interface. Example: 17 // 18 // var mode = ssa.BuilderMode(0) 19 // func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) } 20 // 21 type BuilderMode uint 22 23 const ( 24 PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout 25 PrintFunctions // Print function SSA code to stdout 26 LogSource // Log source locations as SSA builder progresses 27 SanityCheckFunctions // Perform sanity checking of function bodies 28 NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers 29 BuildSerially // Build packages serially, not in parallel. 30 GlobalDebug // Enable debug info for all packages 31 BareInits // Build init functions without guards or calls to dependent inits 32 ) 33 34 const BuilderModeDoc = `Options controlling the SSA builder. 35 The value is a sequence of zero or more of these letters: 36 C perform sanity [C]hecking of the SSA form. 37 D include [D]ebug info for every function. 38 P print [P]ackage inventory. 39 F print [F]unction SSA code. 40 S log [S]ource locations as SSA builder progresses. 41 L build distinct packages seria[L]ly instead of in parallel. 42 N build [N]aive SSA form: don't replace local loads/stores with registers. 43 I build bare [I]nit functions: no init guards or calls to dependent inits. 44 ` 45 46 func (m BuilderMode) String() string { 47 var buf bytes.Buffer 48 if m&GlobalDebug != 0 { 49 buf.WriteByte('D') 50 } 51 if m&PrintPackages != 0 { 52 buf.WriteByte('P') 53 } 54 if m&PrintFunctions != 0 { 55 buf.WriteByte('F') 56 } 57 if m&LogSource != 0 { 58 buf.WriteByte('S') 59 } 60 if m&SanityCheckFunctions != 0 { 61 buf.WriteByte('C') 62 } 63 if m&NaiveForm != 0 { 64 buf.WriteByte('N') 65 } 66 if m&BuildSerially != 0 { 67 buf.WriteByte('L') 68 } 69 if m&BareInits != 0 { 70 buf.WriteByte('I') 71 } 72 return buf.String() 73 } 74 75 // Set parses the flag characters in s and updates *m. 76 func (m *BuilderMode) Set(s string) error { 77 var mode BuilderMode 78 for _, c := range s { 79 switch c { 80 case 'D': 81 mode |= GlobalDebug 82 case 'P': 83 mode |= PrintPackages 84 case 'F': 85 mode |= PrintFunctions 86 case 'S': 87 mode |= LogSource | BuildSerially 88 case 'C': 89 mode |= SanityCheckFunctions 90 case 'N': 91 mode |= NaiveForm 92 case 'L': 93 mode |= BuildSerially 94 case 'I': 95 mode |= BareInits 96 default: 97 return fmt.Errorf("unknown BuilderMode option: %q", c) 98 } 99 } 100 *m = mode 101 return nil 102 } 103 104 // Get returns m. 105 func (m BuilderMode) Get() interface{} { return m }