diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index 9e5d1843d0..95c1124f9e 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -118,6 +118,7 @@ var pragcgobuf string var outfile string var linkobj string +var dolinkobj bool var bout *bio.Writer diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index d1dbe45c71..2b1ae860d6 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -181,6 +181,7 @@ func Main() { obj.Flagcount("live", "debug liveness analysis", &debuglive) obj.Flagcount("m", "print optimization decisions", &Debug['m']) flag.BoolVar(&flag_msan, "msan", false, "build code compatible with C/C++ memory sanitizer") + flag.BoolVar(&dolinkobj, "dolinkobj", true, "generate linker-specific objects; if false, some invalid code may compile") flag.BoolVar(&nolocalimports, "nolocalimports", false, "reject local (relative) imports") flag.StringVar(&outfile, "o", "", "write output to `file`") flag.StringVar(&myimportpath, "p", "", "set expected package import `path`") @@ -450,38 +451,40 @@ func Main() { timings.Start("fe", "escapes") escapes(xtop) - // Phase 7: Transform closure bodies to properly reference captured variables. - // This needs to happen before walk, because closures must be transformed - // before walk reaches a call of a closure. - timings.Start("fe", "xclosures") - for _, n := range xtop { - if n.Op == ODCLFUNC && n.Func.Closure != nil { - Curfn = n - transformclosure(n) + if dolinkobj { + // Phase 7: Transform closure bodies to properly reference captured variables. + // This needs to happen before walk, because closures must be transformed + // before walk reaches a call of a closure. + timings.Start("fe", "xclosures") + for _, n := range xtop { + if n.Op == ODCLFUNC && n.Func.Closure != nil { + Curfn = n + transformclosure(n) + } } - } - Curfn = nil + Curfn = nil - // Phase 8: Compile top level functions. - // Don't use range--walk can add functions to xtop. - timings.Start("be", "compilefuncs") - fcount = 0 - for i := 0; i < len(xtop); i++ { - n := xtop[i] - if n.Op == ODCLFUNC { - funccompile(n) - fcount++ + // Phase 8: Compile top level functions. + // Don't use range--walk can add functions to xtop. + timings.Start("be", "compilefuncs") + fcount = 0 + for i := 0; i < len(xtop); i++ { + n := xtop[i] + if n.Op == ODCLFUNC { + funccompile(n) + fcount++ + } } - } - timings.AddEvent(fcount, "funcs") + timings.AddEvent(fcount, "funcs") - if nsavederrors+nerrors == 0 { - fninit(xtop) - } + if nsavederrors+nerrors == 0 { + fninit(xtop) + } - if compiling_runtime { - checknowritebarrierrec() + if compiling_runtime { + checknowritebarrierrec() + } } // Phase 9: Check external declarations. diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 6d5f2aa208..bec5d89d75 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -41,12 +41,16 @@ const ( ) func dumpobj() { + if !dolinkobj { + dumpobj1(outfile, modeCompilerObj) + return + } if linkobj == "" { dumpobj1(outfile, modeCompilerObj|modeLinkerObj) - } else { - dumpobj1(outfile, modeCompilerObj) - dumpobj1(linkobj, modeLinkerObj) + return } + dumpobj1(outfile, modeCompilerObj) + dumpobj1(linkobj, modeLinkerObj) } func dumpobj1(outfile string, mode int) {