runtime: don't allocate a new string in printf

LGTM=dave
R=rsc, dave
CC=golang-codereviews
https://golang.org/cl/139890043
diff --git a/src/pkg/runtime/print1.go b/src/pkg/runtime/print1.go
index 94ba9e4..9df6a62 100644
--- a/src/pkg/runtime/print1.go
+++ b/src/pkg/runtime/print1.go
@@ -39,7 +39,7 @@
 // and type tables.
 //go:nosplit
 func printf(s *byte) {
-	vprintf(gostring(s), add(unsafe.Pointer(&s), unsafe.Sizeof(s)))
+	vprintf(gostringnocopy(s), add(unsafe.Pointer(&s), unsafe.Sizeof(s)))
 }
 
 // sprintf is only called from C code.
diff --git a/src/pkg/runtime/string.c b/src/pkg/runtime/string.c
index 60a0545..5421b53 100644
--- a/src/pkg/runtime/string.c
+++ b/src/pkg/runtime/string.c
@@ -90,6 +90,7 @@
 	return sl;
 }
 
+#pragma textflag NOSPLIT
 String
 runtime·gostringnocopy(byte *str)
 {
diff --git a/src/pkg/runtime/stubs.go b/src/pkg/runtime/stubs.go
index 26126fc..2014dfb 100644
--- a/src/pkg/runtime/stubs.go
+++ b/src/pkg/runtime/stubs.go
@@ -203,6 +203,7 @@
 func lock(lk *mutex)
 func unlock(lk *mutex)
 func purgecachedstats(c *mcache)
+func gostringnocopy(b *byte) string
 
 //go:noescape
 func write(fd uintptr, p unsafe.Pointer, n int32) int32