From 8eb14e9de5018afbcf7eefd7b4bce7a200d0ce3f Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 22 Feb 2017 16:13:06 -0500 Subject: [PATCH] cmd/compile: accept string debug flags 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 TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/main.go | 40 +++++++++++++++---------- src/cmd/compile/internal/ssa/compile.go | 2 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index b9350d33e0..7eecde4c37 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -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/") { diff --git a/src/cmd/compile/internal/ssa/compile.go b/src/cmd/compile/internal/ssa/compile.go index 975845f258..c03436cdf0 100644 --- a/src/cmd/compile/internal/ssa/compile.go +++ b/src/cmd/compile/internal/ssa/compile.go @@ -204,7 +204,7 @@ func PhaseOption(phase, flag string, val int, valString string) string { } } return "" + - `GcFlag -d=ssa//[=]|[:] + `GcFlag -d=ssa//[=|] is one of: ` + phasenames + ` is one of on, off, debug, mem, time, test, stats, dump -- 2.48.1