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