mirror of
https://github.com/golang/go
synced 2024-11-07 16:36:24 -07:00
[dev.link] cmd/compile: finish all data generation before writing object file
Currently, at the end of compilation, the compiler writes out the export data, the linker object file header, then does more code/data generation, then writes the main content of the linker object file. This CL refactors it to finish all the code/data generation before writing any output file. A later CL will inject some code that operates on all defined symbols before writing the output. This ensures all the symbols are available at that point. Change-Id: I97d946553fd0ffd298234c520219540d29783576 Reviewed-on: https://go-review.googlesource.com/c/go/+/196027 Reviewed-by: Than McIntosh <thanm@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
55738850c4
commit
dc8453964a
@ -723,6 +723,7 @@ func Main(archInit func(*Arch)) {
|
|||||||
|
|
||||||
// Write object data to disk.
|
// Write object data to disk.
|
||||||
timings.Start("be", "dumpobj")
|
timings.Start("be", "dumpobj")
|
||||||
|
dumpdata()
|
||||||
dumpobj()
|
dumpobj()
|
||||||
if asmhdr != "" {
|
if asmhdr != "" {
|
||||||
dumpasmhdr()
|
dumpasmhdr()
|
||||||
|
@ -111,21 +111,7 @@ func dumpCompilerObj(bout *bio.Writer) {
|
|||||||
dumpexport(bout)
|
dumpexport(bout)
|
||||||
}
|
}
|
||||||
|
|
||||||
func dumpLinkerObj(bout *bio.Writer) {
|
func dumpdata() {
|
||||||
printObjHeader(bout)
|
|
||||||
|
|
||||||
if len(pragcgobuf) != 0 {
|
|
||||||
// write empty export section; must be before cgo section
|
|
||||||
fmt.Fprintf(bout, "\n$$\n\n$$\n\n")
|
|
||||||
fmt.Fprintf(bout, "\n$$ // cgo\n")
|
|
||||||
if err := json.NewEncoder(bout).Encode(pragcgobuf); err != nil {
|
|
||||||
Fatalf("serializing pragcgobuf: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Fprintf(bout, "\n$$\n\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(bout, "\n!\n")
|
|
||||||
|
|
||||||
externs := len(externdcl)
|
externs := len(externdcl)
|
||||||
|
|
||||||
dumpglobls()
|
dumpglobls()
|
||||||
@ -163,6 +149,22 @@ func dumpLinkerObj(bout *bio.Writer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addGCLocals()
|
addGCLocals()
|
||||||
|
}
|
||||||
|
|
||||||
|
func dumpLinkerObj(bout *bio.Writer) {
|
||||||
|
printObjHeader(bout)
|
||||||
|
|
||||||
|
if len(pragcgobuf) != 0 {
|
||||||
|
// write empty export section; must be before cgo section
|
||||||
|
fmt.Fprintf(bout, "\n$$\n\n$$\n\n")
|
||||||
|
fmt.Fprintf(bout, "\n$$ // cgo\n")
|
||||||
|
if err := json.NewEncoder(bout).Encode(pragcgobuf); err != nil {
|
||||||
|
Fatalf("serializing pragcgobuf: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Fprintf(bout, "\n$$\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(bout, "\n!\n")
|
||||||
|
|
||||||
obj.WriteObjFile(Ctxt, bout.Writer, myimportpath)
|
obj.WriteObjFile(Ctxt, bout.Writer, myimportpath)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user