Commit f9be63b9 authored by Damien Lespiau's avatar Damien Lespiau Committed by David Chase

cmd/compile: provide a way to auto-discover -d debug keys

Currently one needs to refer to the sources to have a list of accepted
debug keys. We can copy what 'ssa/help' does and introspect the list of
debug keys to print a more detailed help:

    $ go tool compile -d help
    usage: -d arg[,arg]* and arg is <key>[=<value>]

    <key> is one of:

    	append    	print information about append compilation
    	closure   	print information about closure compilation
    	disablenil	disable nil checks
    	dclstack  	run internal dclstack check
    	gcprog    	print dump of GC programs
    	nil       	print information about nil checks
    	panic     	do not hide any compiler panic
    	slice     	print information about slice compilation
    	typeassert	print information about type assertion inlining
    	wb        	print information about write barriers
    	export    	print export data
    	pctab     	print named pc-value table
    	ssa/help  	print help about SSA debugging

    <value> is key-specific.

    Key "pctab" supports values:
    	"pctospadj", "pctofile", "pctoline", "pctoinline", "pctopcdata"

For '-d help' to be discoverable, a hint is given in the -d flag
description.

A last thing, today at least one go file needs to be provided to get to
the code printing ssa/help.

  $ go tool compile -d ssa/help foo.go

Add a check so one can just do '-d help' or '-d ssa/help'

Caught by trybot: I needed to update fmt_test.go as I'm introducing the
usage of %-*s in a format string.

Fixes #20041

Change-Id: Ib2858b038c1bcbe644aa3b1a371009710c6d957d
Reviewed-on: https://go-review.googlesource.com/41091
Run-TryBot: Alberto Donizetti <alb.donizetti@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarDavid Chase <drchase@google.com>
parent 1e72bf62
...@@ -687,6 +687,7 @@ var knownFormats = map[string]string{ ...@@ -687,6 +687,7 @@ var knownFormats = map[string]string{
"reflect.Type %s": "", "reflect.Type %s": "",
"rune %#U": "", "rune %#U": "",
"rune %c": "", "rune %c": "",
"string %-*s": "",
"string %-16s": "", "string %-16s": "",
"string %.*s": "", "string %.*s": "",
"string %q": "", "string %q": "",
......
...@@ -51,22 +51,36 @@ var ( ...@@ -51,22 +51,36 @@ var (
// Each option accepts an optional argument, as in "gcprog=2" // Each option accepts an optional argument, as in "gcprog=2"
var debugtab = []struct { var debugtab = []struct {
name string name string
help string
val interface{} // must be *int or *string val interface{} // must be *int or *string
}{ }{
{"append", &Debug_append}, // print information about append compilation {"append", "print information about append compilation", &Debug_append},
{"closure", &Debug_closure}, // print information about closure compilation {"closure", "print information about closure compilation", &Debug_closure},
{"disablenil", &disable_checknil}, // disable nil checks {"disablenil", "disable nil checks", &disable_checknil},
{"dclstack", &debug_dclstack}, // run internal dclstack checks {"dclstack", "run internal dclstack check", &debug_dclstack},
{"gcprog", &Debug_gcprog}, // print dump of GC programs {"gcprog", "print dump of GC programs", &Debug_gcprog},
{"nil", &Debug_checknil}, // print information about nil checks {"nil", "print information about nil checks", &Debug_checknil},
{"panic", &Debug_panic}, // do not hide any compiler panic {"panic", "do not hide any compiler panic", &Debug_panic},
{"slice", &Debug_slice}, // print information about slice compilation {"slice", "print information about slice compilation", &Debug_slice},
{"typeassert", &Debug_typeassert}, // print information about type assertion inlining {"typeassert", "print information about type assertion inlining", &Debug_typeassert},
{"wb", &Debug_wb}, // print information about write barriers {"wb", "print information about write barriers", &Debug_wb},
{"export", &Debug_export}, // print export data {"export", "print export data", &Debug_export},
{"pctab", &Debug_pctab}, // print named pc-value table {"pctab", "print named pc-value table", &Debug_pctab},
} }
const debugHelpHeader = `usage: -d arg[,arg]* and arg is <key>[=<value>]
<key> is one of:
`
const debugHelpFooter = `
<value> is key-specific.
Key "pctab" supports values:
"pctospadj", "pctofile", "pctoline", "pctoinline", "pctopcdata"
`
func usage() { func usage() {
fmt.Printf("usage: compile [options] file.go...\n") fmt.Printf("usage: compile [options] file.go...\n")
objabi.Flagprint(1) objabi.Flagprint(1)
...@@ -171,7 +185,7 @@ func Main(archInit func(*Arch)) { ...@@ -171,7 +185,7 @@ func Main(archInit func(*Arch)) {
flag.StringVar(&asmhdr, "asmhdr", "", "write assembly header to `file`") flag.StringVar(&asmhdr, "asmhdr", "", "write assembly header to `file`")
flag.StringVar(&buildid, "buildid", "", "record `id` as the build id in the export metadata") flag.StringVar(&buildid, "buildid", "", "record `id` as the build id in the export metadata")
flag.BoolVar(&pure_go, "complete", false, "compiling complete package (no C or assembly)") flag.BoolVar(&pure_go, "complete", false, "compiling complete package (no C or assembly)")
flag.StringVar(&debugstr, "d", "", "print debug information about items in `list`") flag.StringVar(&debugstr, "d", "", "print debug information about items in `list`; try -d help")
flag.BoolVar(&flagDWARF, "dwarf", true, "generate DWARF symbols") flag.BoolVar(&flagDWARF, "dwarf", true, "generate DWARF symbols")
objabi.Flagcount("e", "no limit on number of errors reported", &Debug['e']) objabi.Flagcount("e", "no limit on number of errors reported", &Debug['e'])
objabi.Flagcount("f", "debug stack frames", &Debug['f']) objabi.Flagcount("f", "debug stack frames", &Debug['f'])
...@@ -223,7 +237,7 @@ func Main(archInit func(*Arch)) { ...@@ -223,7 +237,7 @@ func Main(archInit func(*Arch)) {
Ctxt.DebugInfo = debuginfo Ctxt.DebugInfo = debuginfo
} }
if flag.NArg() < 1 { if flag.NArg() < 1 && debugstr != "help" && debugstr != "ssa/help" {
usage() usage()
} }
...@@ -273,6 +287,23 @@ func Main(archInit func(*Arch)) { ...@@ -273,6 +287,23 @@ func Main(archInit func(*Arch)) {
if name == "" { if name == "" {
continue continue
} }
// display help about the -d option itself and quit
if name == "help" {
fmt.Printf(debugHelpHeader)
maxLen := len("ssa/help")
for _, t := range debugtab {
if len(t.name) > maxLen {
maxLen = len(t.name)
}
}
for _, t := range debugtab {
fmt.Printf("\t%-*s\t%s\n", maxLen, t.name, t.help)
}
// ssa options have their own help
fmt.Printf("\t%-*s\t%s\n", maxLen, "ssa/help", "print help about SSA debugging")
fmt.Printf(debugHelpFooter)
os.Exit(0)
}
val, valstring, haveInt := 1, "", true val, valstring, haveInt := 1, "", true
if i := strings.IndexAny(name, "=:"); i >= 0 { if i := strings.IndexAny(name, "=:"); i >= 0 {
var err error var err error
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment