mirror of
https://github.com/golang/go
synced 2024-11-07 14:46:14 -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.
|
||||
timings.Start("be", "dumpobj")
|
||||
dumpdata()
|
||||
dumpobj()
|
||||
if asmhdr != "" {
|
||||
dumpasmhdr()
|
||||
|
@ -111,21 +111,7 @@ func dumpCompilerObj(bout *bio.Writer) {
|
||||
dumpexport(bout)
|
||||
}
|
||||
|
||||
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")
|
||||
|
||||
func dumpdata() {
|
||||
externs := len(externdcl)
|
||||
|
||||
dumpglobls()
|
||||
@ -163,6 +149,22 @@ func dumpLinkerObj(bout *bio.Writer) {
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user