From 79df80a148c441e3268b2fb5226c9bf5c9a634bf Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Tue, 2 Sep 2014 18:40:16 -0400 Subject: [PATCH] go/ssa/interp: add no-op intrinsic for runtime.init(). Recent changes in the runtime caused the interpreter to call 'getg', and it should never have gotten that far. Also, delete bodies of "runtime" functions, since they're too magical. This makes missing intrinsics cause very obvious failures. LGTM=gri R=gri CC=golang-codereviews https://golang.org/cl/135330043 --- go/ssa/interp/external.go | 5 +++++ go/ssa/interp/interp.go | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/go/ssa/interp/external.go b/go/ssa/interp/external.go index f96c89b4..3aa7a5f3 100644 --- a/go/ssa/interp/external.go +++ b/go/ssa/interp/external.go @@ -91,6 +91,7 @@ func init() { "runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS, "runtime.Goexit": ext۰runtime۰Goexit, "runtime.Gosched": ext۰runtime۰Gosched, + "runtime.init": ext۰runtime۰init, "runtime.NumCPU": ext۰runtime۰NumCPU, "runtime.ReadMemStats": ext۰runtime۰ReadMemStats, "runtime.SetFinalizer": ext۰runtime۰SetFinalizer, @@ -344,6 +345,10 @@ func ext۰runtime۰Gosched(fr *frame, args []value) value { return nil } +func ext۰runtime۰init(fr *frame, args []value) value { + return nil +} + func ext۰runtime۰NumCPU(fr *frame, args []value) value { return runtime.NumCPU() } diff --git a/go/ssa/interp/interp.go b/go/ssa/interp/interp.go index 78866178..77f11f62 100644 --- a/go/ssa/interp/interp.go +++ b/go/ssa/interp/interp.go @@ -670,6 +670,19 @@ func Interpret(mainpkg *ssa.Package, mode Mode, sizes types.Sizes, filename stri sz := sizes.Sizeof(pkg.Object.Scope().Lookup("MemStats").Type()) setGlobal(i, pkg, "sizeof_C_MStats", uintptr(sz)) + // Delete the bodies of almost all "runtime" functions since they're magic. + // A missing intrinsic leads to a very clear error. + for _, mem := range pkg.Members { + if fn, ok := mem.(*ssa.Function); ok { + switch fn.Name() { + case "GOROOT", "gogetenv": + // keep + default: + fn.Blocks = nil + } + } + } + case "os": Args := []value{filename} for _, s := range args {