GoPLS Viewer

Home|gopls/go/ssa/mode.go
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
5package ssa
6
7// This file defines the BuilderMode type and its command-line flag.
8
9import (
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) }
20type BuilderMode uint
21
22const (
23    PrintPackages        BuilderMode = 1 << iota // Print package inventory to stdout
24    PrintFunctions                               // Print function SSA code to stdout
25    LogSource                                    // Log source locations as SSA builder progresses
26    SanityCheckFunctions                         // Perform sanity checking of function bodies
27    NaiveForm                                    // Build naïve SSA form: don't replace local loads/stores with registers
28    BuildSerially                                // Build packages serially, not in parallel.
29    GlobalDebug                                  // Enable debug info for all packages
30    BareInits                                    // Build init functions without guards or calls to dependent inits
31    InstantiateGenerics                          // Instantiate generics functions (monomorphize) while building
32)
33
34const BuilderModeDoc = `Options controlling the SSA builder.
35The value is a sequence of zero or more of these letters:
36C    perform sanity [C]hecking of the SSA form.
37D    include [D]ebug info for every function.
38P    print [P]ackage inventory.
39F    print [F]unction SSA code.
40S    log [S]ource locations as SSA builder progresses.
41L    build distinct packages seria[L]ly instead of in parallel.
42N    build [N]aive SSA form: don't replace local loads/stores with registers.
43I    build bare [I]nit functions: no init guards or calls to dependent inits.
44G   instantiate [G]eneric function bodies via monomorphization
45`
46
47func (m BuilderModeString() string {
48    var buf bytes.Buffer
49    if m&GlobalDebug != 0 {
50        buf.WriteByte('D')
51    }
52    if m&PrintPackages != 0 {
53        buf.WriteByte('P')
54    }
55    if m&PrintFunctions != 0 {
56        buf.WriteByte('F')
57    }
58    if m&LogSource != 0 {
59        buf.WriteByte('S')
60    }
61    if m&SanityCheckFunctions != 0 {
62        buf.WriteByte('C')
63    }
64    if m&NaiveForm != 0 {
65        buf.WriteByte('N')
66    }
67    if m&BuildSerially != 0 {
68        buf.WriteByte('L')
69    }
70    if m&BareInits != 0 {
71        buf.WriteByte('I')
72    }
73    if m&InstantiateGenerics != 0 {
74        buf.WriteByte('G')
75    }
76    return buf.String()
77}
78
79// Set parses the flag characters in s and updates *m.
80func (m *BuilderModeSet(s stringerror {
81    var mode BuilderMode
82    for _c := range s {
83        switch c {
84        case 'D':
85            mode |= GlobalDebug
86        case 'P':
87            mode |= PrintPackages
88        case 'F':
89            mode |= PrintFunctions
90        case 'S':
91            mode |= LogSource | BuildSerially
92        case 'C':
93            mode |= SanityCheckFunctions
94        case 'N':
95            mode |= NaiveForm
96        case 'L':
97            mode |= BuildSerially
98        case 'I':
99            mode |= BareInits
100        case 'G':
101            mode |= InstantiateGenerics
102        default:
103            return fmt.Errorf("unknown BuilderMode option: %q"c)
104        }
105    }
106    *m = mode
107    return nil
108}
109
110// Get returns m.
111func (m BuilderModeGet() interface{} { return m }
112
MembersX
BuilderMode.Set.mode
BuilderMode
PrintPackages
BuilderModeDoc
BuilderMode.String.m
BuilderMode.String
BuilderMode.String.buf
BuilderMode.Set.s
BuilderMode.Get.m
BuilderMode.Get
BuilderMode.Set.m
BuilderMode.Set
BuilderMode.Set.RangeStmt_2672.c
Members
X