diff options
| author | Josh Bleecher Snyder <josharian@gmail.com> | 2018-04-08 09:37:44 -0700 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2018-04-11 23:46:30 +0000 |
| commit | 2dfb423e6e84b64acb0dc741cba5b1fa5fe03c64 (patch) | |
| tree | c599ca91123abc7c240833a15f3ca02327f70bd3 /src | |
| parent | 8f6ae3379615c6e9dcf47bafc74710a1346a932e (diff) | |
| download | go-2dfb423e6e84b64acb0dc741cba5b1fa5fe03c64.tar.xz | |
cmd/compile: loop to ensure all autogenerated functions are compiled
I was wrong. There was a need to loop here.
Fixes #24761
Change-Id: If13b3ab72febde930bdaebdddd1c05e0d0446020
Reviewed-on: https://go-review.googlesource.com/105615
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/gc/obj.go | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index bf2a621ebe..aec6fe5397 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -144,16 +144,17 @@ func dumpLinkerObj(bout *bio.Writer) { dumpimportstrings() dumpbasictypes() - // The first call to dumpsignats can generate functions, + // Calls to dumpsignats can generate functions, // like method wrappers and hash and equality routines. - compileFunctions() - - // Process any new signats added during compilation. - // No need to loop here; signats from compiling the generated - // functions should not themselves generate new functions. - // If they do, we'll know about it; the sanity check of - // len(compilequeue) in gc.Main will fail. - dumpsignats() + // Compile any generated functions, process any new resulting types, repeat. + // This can't loop forever, because there is no way to generate an infinite + // number of types in a finite amount of code. + // In the typical case, we loop 0 or 1 times. + // It was not until issue 24761 that we found any code that required a loop at all. + for len(compilequeue) > 0 { + compileFunctions() + dumpsignats() + } // Dump extra globals. tmp := externdcl |
