]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: accept string debug flags
authorAustin Clements <austin@google.com>
Wed, 22 Feb 2017 21:13:06 +0000 (16:13 -0500)
committerAustin Clements <austin@google.com>
Fri, 3 Mar 2017 15:50:49 +0000 (15:50 +0000)
The compiler's -d flag accepts string-valued flags, but currently only
for SSA debug flags. Extend it to support string values for other
flags. This also makes the syntax somewhat more sane so flag=value and
flag:value now both accept integers and strings.

Change-Id: Idd144d8479a430970cc1688f824bffe0a56ed2df
Reviewed-on: https://go-review.googlesource.com/37345
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/ssa/compile.go

index b9350d33e0ad806f23cd1b264098a11b14dab31b..7eecde4c3785e32bd6dcd8d1355d786ae9fe501f 100644 (file)
@@ -41,11 +41,12 @@ var (
 
 // Debug arguments.
 // These can be specified with the -d flag, as in "-d nil"
-// to set the debug_checknil variable. In general the list passed
-// to -d can be comma-separated.
+// to set the debug_checknil variable.
+// Multiple options can be comma-separated.
+// Each option accepts an optional argument, as in "gcprog=2"
 var debugtab = []struct {
        name string
-       val  *int
+       val  interface{} // must be *int or *string
 }{
        {"append", &Debug_append},         // print information about append compilation
        {"closure", &Debug_closure},       // print information about closure compilation
@@ -269,26 +270,33 @@ func Main() {
                        if name == "" {
                                continue
                        }
-                       val := 1
-                       valstring := ""
-                       if i := strings.Index(name, "="); i >= 0 {
+                       val, valstring, haveInt := 1, "", true
+                       if i := strings.IndexAny(name, "=:"); i >= 0 {
                                var err error
-                               val, err = strconv.Atoi(name[i+1:])
+                               name, valstring = name[:i], name[i+1:]
+                               val, err = strconv.Atoi(valstring)
                                if err != nil {
-                                       log.Fatalf("invalid debug value %v", name)
+                                       val, haveInt = 1, false
                                }
-                               name = name[:i]
-                       } else if i := strings.Index(name, ":"); i >= 0 {
-                               valstring = name[i+1:]
-                               name = name[:i]
                        }
                        for _, t := range debugtab {
-                               if t.name == name {
-                                       if t.val != nil {
-                                               *t.val = val
-                                               continue Split
+                               if t.name != name {
+                                       continue
+                               }
+                               switch vp := t.val.(type) {
+                               case nil:
+                                       // Ignore
+                               case *string:
+                                       *vp = valstring
+                               case *int:
+                                       if !haveInt {
+                                               log.Fatalf("invalid debug value %v", name)
                                        }
+                                       *vp = val
+                               default:
+                                       panic("bad debugtab type")
                                }
+                               continue Split
                        }
                        // special case for ssa for now
                        if strings.HasPrefix(name, "ssa/") {
index 975845f258796c9f0c0f7d6f29832985ddcd032c..c03436cdf06c1b32c764da2b84992919c34f9809 100644 (file)
@@ -204,7 +204,7 @@ func PhaseOption(phase, flag string, val int, valString string) string {
                        }
                }
                return "" +
-                       `GcFlag -d=ssa/<phase>/<flag>[=<value>]|[:<function_name>]
+                       `GcFlag -d=ssa/<phase>/<flag>[=<value>|<function_name>]
 <phase> is one of:
 ` + phasenames + `
 <flag> is one of on, off, debug, mem, time, test, stats, dump