// 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 incannedimport = 1 importpkg = Runtimepkg parse_import(obj.Binitr(strings.NewReader(runtimeimport)), nil) importpkg = unsafepkg parse_import(obj.Binitr(strings.NewReader(unsafeimport)), nil) importpkg = nil incannedimport = 0 }
func dumpexport() { if buildid != "" { exportf("build id %q\n", buildid) } size := 0 // size of export section without enclosing markers if forceNewExport || newexport != 0 { // binary export // The linker also looks for the $$ marker - use char after $$ to distinguish format. exportf("\n$$B\n") // indicate binary format const verifyExport = true // enable to check format changes if verifyExport { // save a copy of the export data var copy bytes.Buffer bcopy := obj.Binitw(©) size = Export(bcopy, Debug_export != 0) bcopy.Flush() // flushing to bytes.Buffer cannot fail if n, err := bout.Write(copy.Bytes()); n != size || err != nil { Fatalf("error writing export data: got %d bytes, want %d bytes, err = %v", n, size, err) } // export data must contain no '$' so that we can find the end by searching for "$$" if bytes.IndexByte(copy.Bytes(), '$') >= 0 { Fatalf("export data contains $") } // verify that we can read the copied export data back in // (use empty package map to avoid collisions) savedPkgMap := pkgMap savedPkgs := pkgs pkgMap = make(map[string]*Pkg) pkgs = nil importpkg = mkpkg("") Import(obj.Binitr(©)) // must not die importpkg = nil pkgs = savedPkgs pkgMap = savedPkgMap } else { size = Export(bout, Debug_export != 0) } exportf("\n$$\n") } else { // textual export lno := lineno exportf("\n$$\n") // indicate textual format exportsize = 0 exportf("package %s", localpkg.Name) if safemode != 0 { exportf(" safe") } exportf("\n") for _, p := range pkgs { if p.Direct { dumppkg(p) } } // exportlist grows during iteration - cannot use range for len(exportlist) > 0 { n := exportlist[0] exportlist = exportlist[1:] lineno = n.Lineno dumpsym(n.Sym) } size = exportsize exportf("\n$$\n") lineno = lno } if Debug_export != 0 { fmt.Printf("export data size = %d bytes\n", size) } }