mirror of
https://github.com/golang/go
synced 2024-11-24 20:30:14 -07:00
cmd/compile: load builtin export data only once
Previously, the builtin runtime export data was reparsed before every Go source file, and the unsafe export data was reparsed for every import of package unsafe. Now, we parse both of them just once ahead of time. This does mean package unsafe's export data will be loaded even when compiling packages that don't import it, but it's tiny anyway. Change-Id: Ic6931bc58f6d62f664348bfa932f92d4ccacc3ef Reviewed-on: https://go-review.googlesource.com/19626 TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
fb2af2b35b
commit
1402e522c6
@ -311,6 +311,8 @@ func Main() {
|
||||
lexlineno = 1
|
||||
const BOM = 0xFEFF
|
||||
|
||||
loadsys()
|
||||
|
||||
for _, infile = range flag.Args() {
|
||||
if trace && Debug['x'] != 0 {
|
||||
fmt.Printf("--- %s ---\n", infile)
|
||||
@ -656,6 +658,30 @@ func findpkg(name string) (file string, ok bool) {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// loadsys loads the definitions for the low-level runtime and unsafe functions,
|
||||
// so that the compiler can generate calls to them,
|
||||
// but does not make the names "runtime" or "unsafe" visible as packages.
|
||||
func loadsys() {
|
||||
if Debug['A'] != 0 {
|
||||
return
|
||||
}
|
||||
|
||||
block = 1
|
||||
iota_ = -1000000
|
||||
|
||||
importpkg = Runtimepkg
|
||||
cannedimports("runtime.Builtin", runtimeimport)
|
||||
thenewparser.import_package()
|
||||
thenewparser.import_there()
|
||||
|
||||
importpkg = unsafepkg
|
||||
cannedimports("unsafe.o", unsafeimport)
|
||||
thenewparser.import_package()
|
||||
thenewparser.import_there()
|
||||
|
||||
importpkg = nil
|
||||
}
|
||||
|
||||
func fakeimport() {
|
||||
importpkg = mkpkg("fake")
|
||||
cannedimports("fake.o", "$$\n")
|
||||
@ -706,8 +732,8 @@ func importfile(f *Val, line int) {
|
||||
errorexit()
|
||||
}
|
||||
|
||||
importpkg = mkpkg(f.U.(string))
|
||||
cannedimports("unsafe.o", unsafeimport)
|
||||
importpkg = unsafepkg
|
||||
cannedimports("unsafe.o", "package unsafe\n\n$$\n\n")
|
||||
imported_unsafe = true
|
||||
return
|
||||
}
|
||||
|
@ -51,33 +51,10 @@ func pop_parser() {
|
||||
// parse_file sets up a new parser and parses a single Go source file.
|
||||
func parse_file() {
|
||||
thenewparser = parser{}
|
||||
thenewparser.loadsys()
|
||||
thenewparser.next()
|
||||
thenewparser.file()
|
||||
}
|
||||
|
||||
// loadsys loads the definitions for the low-level runtime functions,
|
||||
// so that the compiler can generate calls to them,
|
||||
// but does not make the name "runtime" visible as a package.
|
||||
func (p *parser) loadsys() {
|
||||
if trace && Debug['x'] != 0 {
|
||||
defer p.trace("loadsys")()
|
||||
}
|
||||
|
||||
importpkg = Runtimepkg
|
||||
|
||||
if Debug['A'] != 0 {
|
||||
cannedimports("runtime.Builtin", "package runtime safe\n\n$$\n\n")
|
||||
} else {
|
||||
cannedimports("runtime.Builtin", runtimeimport)
|
||||
}
|
||||
|
||||
p.import_package()
|
||||
p.import_there()
|
||||
|
||||
importpkg = nil
|
||||
}
|
||||
|
||||
type parser struct {
|
||||
tok int32 // next token (one-token look-ahead)
|
||||
op Op // valid if tok == LASOP
|
||||
|
Loading…
Reference in New Issue
Block a user