aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2019-09-11 16:03:59 -0400
committerCherry Zhang <cherryyz@google.com>2019-10-01 20:28:28 +0000
commitdc8453964a519032bfd338a2cc027d038c9b2e79 (patch)
treeac2eb0cf19a45be7b10b7678ec6a8857f0abd807 /src/cmd
parent55738850c43bd1ae46326f7419dbd8f49808c776 (diff)
downloadgo-dc8453964a519032bfd338a2cc027d038c9b2e79.tar.xz
[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>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/compile/internal/gc/main.go1
-rw-r--r--src/cmd/compile/internal/gc/obj.go32
2 files changed, 18 insertions, 15 deletions
diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go
index f75e35c3be..eec5ece0db 100644
--- a/src/cmd/compile/internal/gc/main.go
+++ b/src/cmd/compile/internal/gc/main.go
@@ -723,6 +723,7 @@ func Main(archInit func(*Arch)) {
// Write object data to disk.
timings.Start("be", "dumpobj")
+ dumpdata()
dumpobj()
if asmhdr != "" {
dumpasmhdr()
diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go
index be13b27892..e703e8a302 100644
--- a/src/cmd/compile/internal/gc/obj.go
+++ b/src/cmd/compile/internal/gc/obj.go
@@ -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)
}