mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: always write pack files
By always writing out pack files, the object file format can be simplified somewhat. In particular, the export data format will no longer require escaping, because the pack file provides appropriate framing. This CL does not affect build systems that use -pack, which includes all major Go build systems (cmd/go, gb, bazel). Also, existing package import logic already distinguishes pack/object files based on file contents rather than file extension. The only exception is cmd/pack, which specially handled object files created by cmd/compile when used with the 'c' mode. This mode is extended to now recognize the pack files produced by cmd/compile and handle them as before. Passes toolstash-check. Updates #21705. Updates #24512. Change-Id: Idf131013bfebd73a5cde7e087eb19964503a9422 Reviewed-on: https://go-review.googlesource.com/102236 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
699b0d4e52
commit
ea668e18a6
3 changed files with 154 additions and 121 deletions
|
|
@ -62,69 +62,68 @@ func dumpobj1(outfile string, mode int) {
|
|||
errorexit()
|
||||
}
|
||||
defer bout.Close()
|
||||
|
||||
startobj := int64(0)
|
||||
var arhdr [ArhdrSize]byte
|
||||
if writearchive {
|
||||
bout.WriteString("!<arch>\n")
|
||||
arhdr = [ArhdrSize]byte{}
|
||||
bout.Write(arhdr[:])
|
||||
startobj = bout.Offset()
|
||||
}
|
||||
|
||||
printheader := func() {
|
||||
fmt.Fprintf(bout, "go object %s %s %s %s\n", objabi.GOOS, objabi.GOARCH, objabi.Version, objabi.Expstring())
|
||||
if buildid != "" {
|
||||
fmt.Fprintf(bout, "build id %q\n", buildid)
|
||||
}
|
||||
if localpkg.Name == "main" {
|
||||
fmt.Fprintf(bout, "main\n")
|
||||
}
|
||||
if safemode {
|
||||
fmt.Fprintf(bout, "safe\n")
|
||||
} else {
|
||||
fmt.Fprintf(bout, "----\n") // room for some other tool to write "safe"
|
||||
}
|
||||
fmt.Fprintf(bout, "\n") // header ends with blank line
|
||||
}
|
||||
|
||||
printheader()
|
||||
bout.WriteString("!<arch>\n")
|
||||
|
||||
if mode&modeCompilerObj != 0 {
|
||||
dumpexport(bout)
|
||||
start := startArchiveEntry(bout)
|
||||
dumpCompilerObj(bout)
|
||||
finishArchiveEntry(bout, start, "__.PKGDEF")
|
||||
}
|
||||
if mode&modeLinkerObj != 0 {
|
||||
start := startArchiveEntry(bout)
|
||||
dumpLinkerObj(bout)
|
||||
finishArchiveEntry(bout, start, "_go_.o")
|
||||
}
|
||||
}
|
||||
|
||||
if writearchive {
|
||||
bout.Flush()
|
||||
size := bout.Offset() - startobj
|
||||
if size&1 != 0 {
|
||||
bout.WriteByte(0)
|
||||
}
|
||||
bout.Seek(startobj-ArhdrSize, 0)
|
||||
formathdr(arhdr[:], "__.PKGDEF", size)
|
||||
bout.Write(arhdr[:])
|
||||
bout.Flush()
|
||||
bout.Seek(startobj+size+(size&1), 0)
|
||||
func printObjHeader(bout *bio.Writer) {
|
||||
fmt.Fprintf(bout, "go object %s %s %s %s\n", objabi.GOOS, objabi.GOARCH, objabi.Version, objabi.Expstring())
|
||||
if buildid != "" {
|
||||
fmt.Fprintf(bout, "build id %q\n", buildid)
|
||||
}
|
||||
if localpkg.Name == "main" {
|
||||
fmt.Fprintf(bout, "main\n")
|
||||
}
|
||||
if safemode {
|
||||
fmt.Fprintf(bout, "safe\n")
|
||||
} else {
|
||||
fmt.Fprintf(bout, "----\n") // room for some other tool to write "safe"
|
||||
}
|
||||
fmt.Fprintf(bout, "\n") // header ends with blank line
|
||||
}
|
||||
|
||||
if mode&modeLinkerObj == 0 {
|
||||
return
|
||||
}
|
||||
func startArchiveEntry(bout *bio.Writer) int64 {
|
||||
var arhdr [ArhdrSize]byte
|
||||
bout.Write(arhdr[:])
|
||||
return bout.Offset()
|
||||
}
|
||||
|
||||
if writearchive {
|
||||
// start object file
|
||||
arhdr = [ArhdrSize]byte{}
|
||||
bout.Write(arhdr[:])
|
||||
startobj = bout.Offset()
|
||||
printheader()
|
||||
func finishArchiveEntry(bout *bio.Writer, start int64, name string) {
|
||||
bout.Flush()
|
||||
size := bout.Offset() - start
|
||||
if size&1 != 0 {
|
||||
bout.WriteByte(0)
|
||||
}
|
||||
bout.Seek(start-ArhdrSize, 0)
|
||||
|
||||
var arhdr [ArhdrSize]byte
|
||||
formathdr(arhdr[:], name, size)
|
||||
bout.Write(arhdr[:])
|
||||
bout.Flush()
|
||||
bout.Seek(start+size+(size&1), 0)
|
||||
}
|
||||
|
||||
func dumpCompilerObj(bout *bio.Writer) {
|
||||
printObjHeader(bout)
|
||||
dumpexport(bout)
|
||||
}
|
||||
|
||||
func dumpLinkerObj(bout *bio.Writer) {
|
||||
printObjHeader(bout)
|
||||
|
||||
if pragcgobuf != "" {
|
||||
if writearchive {
|
||||
// write empty export section; must be before cgo section
|
||||
fmt.Fprintf(bout, "\n$$\n\n$$\n\n")
|
||||
}
|
||||
|
||||
// write empty export section; must be before cgo section
|
||||
fmt.Fprintf(bout, "\n$$\n\n$$\n\n")
|
||||
fmt.Fprintf(bout, "\n$$ // cgo\n")
|
||||
fmt.Fprintf(bout, "%s\n$$\n\n", pragcgobuf)
|
||||
}
|
||||
|
|
@ -158,17 +157,6 @@ func dumpobj1(outfile string, mode int) {
|
|||
addGCLocals()
|
||||
|
||||
obj.WriteObjFile(Ctxt, bout.Writer)
|
||||
|
||||
if writearchive {
|
||||
bout.Flush()
|
||||
size := bout.Offset() - startobj
|
||||
if size&1 != 0 {
|
||||
bout.WriteByte(0)
|
||||
}
|
||||
bout.Seek(startobj-ArhdrSize, 0)
|
||||
formathdr(arhdr[:], "_go_.o", size)
|
||||
bout.Write(arhdr[:])
|
||||
}
|
||||
}
|
||||
|
||||
func addptabs() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue