Commit b6c600fc authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile/internal/gc: separate builtin and real runtime packages

The builtin runtime package definitions intentionally diverge from the
actual runtime package's, but this only works as long as they never
overlap.

To make it easier to expand the builtin runtime package, this CL now
loads their definitions into a logically separate "go.runtime"
package.  By resetting the package's Prefix field to "runtime", any
references to builtin definitions will still resolve against the real
package runtime.

Fixes #14482.

Passes toolstash -cmp.

Change-Id: I539c0994deaed4506a331f38c5b4d6bc8c95433f
Reviewed-on: https://go-review.googlesource.com/37538
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
parent 12b6c181
...@@ -27,6 +27,14 @@ type Pkg struct { ...@@ -27,6 +27,14 @@ type Pkg struct {
Syms map[string]*Sym Syms map[string]*Sym
} }
// isRuntime reports whether p is package runtime.
func (p *Pkg) isRuntime() bool {
if compiling_runtime && p == localpkg {
return true
}
return p.Path == "runtime"
}
// Sym represents an object name. Most commonly, this is a Go identifier naming // Sym represents an object name. Most commonly, this is a Go identifier naming
// an object declared within a package, but Syms are also used to name internal // an object declared within a package, but Syms are also used to name internal
// synthesized objects. // synthesized objects.
...@@ -153,7 +161,7 @@ var itabpkg *Pkg // fake pkg for itab entries ...@@ -153,7 +161,7 @@ var itabpkg *Pkg // fake pkg for itab entries
var itablinkpkg *Pkg // fake package for runtime itab entries var itablinkpkg *Pkg // fake package for runtime itab entries
var Runtimepkg *Pkg // package runtime var Runtimepkg *Pkg // fake package runtime
var racepkg *Pkg // package runtime/race var racepkg *Pkg // package runtime/race
......
...@@ -124,9 +124,14 @@ func Main() { ...@@ -124,9 +124,14 @@ func Main() {
unsafepkg = mkpkg("unsafe") unsafepkg = mkpkg("unsafe")
unsafepkg.Name = "unsafe" unsafepkg.Name = "unsafe"
// real package, referred to by generated runtime calls // Pseudo-package that contains the compiler's builtin
Runtimepkg = mkpkg("runtime") // declarations for package runtime. These are declared in a
// separate package to avoid conflicts with package runtime's
// actual declarations, which may differ intentionally but
// insignificantly.
Runtimepkg = mkpkg("go.runtime")
Runtimepkg.Name = "runtime" Runtimepkg.Name = "runtime"
Runtimepkg.Prefix = "runtime"
// pseudo-packages used in symbol tables // pseudo-packages used in symbol tables
itabpkg = mkpkg("go.itab") itabpkg = mkpkg("go.itab")
......
...@@ -1289,7 +1289,7 @@ OpSwitch: ...@@ -1289,7 +1289,7 @@ OpSwitch:
if t.Results().NumFields() == 1 { if t.Results().NumFields() == 1 {
n.Type = l.Type.Results().Field(0).Type n.Type = l.Type.Results().Field(0).Type
if n.Op == OCALLFUNC && n.Left.Op == ONAME && (compiling_runtime || n.Left.Sym.Pkg == Runtimepkg) && n.Left.Sym.Name == "getg" { if n.Op == OCALLFUNC && n.Left.Op == ONAME && n.Left.Sym.Pkg.isRuntime() && n.Left.Sym.Name == "getg" {
// Emit code for runtime.getg() directly instead of calling function. // Emit code for runtime.getg() directly instead of calling function.
// Most such rewrites (for example the similar one for math.Sqrt) should be done in walk, // Most such rewrites (for example the similar one for math.Sqrt) should be done in walk,
// so that the ordering pass can make sure to preserve the semantics of the original code // so that the ordering pass can make sure to preserve the semantics of the original code
......
...@@ -1914,7 +1914,7 @@ func walkprint(nn *Node, init *Nodes) *Node { ...@@ -1914,7 +1914,7 @@ func walkprint(nn *Node, init *Nodes) *Node {
on = substArgTypes(on, n.Type) // any-1 on = substArgTypes(on, n.Type) // any-1
} else if isInt[et] { } else if isInt[et] {
if et == TUINT64 { if et == TUINT64 {
if (t.Sym.Pkg == Runtimepkg || compiling_runtime) && t.Sym.Name == "hex" { if t.Sym.Pkg.isRuntime() && t.Sym.Name == "hex" {
on = syslook("printhex") on = syslook("printhex")
} else { } else {
on = syslook("printuint") on = syslook("printuint")
......
...@@ -17,5 +17,5 @@ package main ...@@ -17,5 +17,5 @@ package main
import "runtime" import "runtime"
func main() { func main() {
runtime.printbool(true) // ERROR "unexported" runtime.printbool(true) // ERROR "unexported" "undefined"
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment