1
0
mirror of https://github.com/golang/go synced 2024-11-24 22:10:02 -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:
Matthew Dempsky 2015-12-01 12:02:42 -08:00
parent fb2af2b35b
commit 1402e522c6
2 changed files with 28 additions and 25 deletions

View File

@ -311,6 +311,8 @@ func Main() {
lexlineno = 1 lexlineno = 1
const BOM = 0xFEFF const BOM = 0xFEFF
loadsys()
for _, infile = range flag.Args() { for _, infile = range flag.Args() {
if trace && Debug['x'] != 0 { if trace && Debug['x'] != 0 {
fmt.Printf("--- %s ---\n", infile) fmt.Printf("--- %s ---\n", infile)
@ -656,6 +658,30 @@ func findpkg(name string) (file string, ok bool) {
return "", false 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() { func fakeimport() {
importpkg = mkpkg("fake") importpkg = mkpkg("fake")
cannedimports("fake.o", "$$\n") cannedimports("fake.o", "$$\n")
@ -706,8 +732,8 @@ func importfile(f *Val, line int) {
errorexit() errorexit()
} }
importpkg = mkpkg(f.U.(string)) importpkg = unsafepkg
cannedimports("unsafe.o", unsafeimport) cannedimports("unsafe.o", "package unsafe\n\n$$\n\n")
imported_unsafe = true imported_unsafe = true
return return
} }

View File

@ -51,33 +51,10 @@ func pop_parser() {
// parse_file sets up a new parser and parses a single Go source file. // parse_file sets up a new parser and parses a single Go source file.
func parse_file() { func parse_file() {
thenewparser = parser{} thenewparser = parser{}
thenewparser.loadsys()
thenewparser.next() thenewparser.next()
thenewparser.file() 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 { type parser struct {
tok int32 // next token (one-token look-ahead) tok int32 // next token (one-token look-ahead)
op Op // valid if tok == LASOP op Op // valid if tok == LASOP