]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/compile: finish all data generation before writing object file
authorCherry Zhang <cherryyz@google.com>
Wed, 11 Sep 2019 20:03:59 +0000 (16:03 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 1 Oct 2019 20:28:28 +0000 (20:28 +0000)
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>

src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/obj.go

index f75e35c3bee2d79e4302e48254c48278fef387fd..eec5ece0dbaefddd4ee0061a549dec2d12c782e7 100644 (file)
@@ -723,6 +723,7 @@ func Main(archInit func(*Arch)) {
 
        // Write object data to disk.
        timings.Start("be", "dumpobj")
+       dumpdata()
        dumpobj()
        if asmhdr != "" {
                dumpasmhdr()
index be13b278921c6b920ae0b03b183dfdf8d84986a5..e703e8a3022e55832db838ba219b027bb3197551 100644 (file)
@@ -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)
 }