1 // Copyright 2023 The gVisor Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 15 package gohacks
16 17 import (
18 "unsafe"
19 )
20 21 // Noescape hides a pointer from escape analysis. Noescape is the identity
22 // function but escape analysis doesn't think the output depends on the input.
23 // Noescape is inlined and currently compiles down to zero instructions.
24 // USE CAREFULLY!
25 //
26 // Noescape is copy/pasted from Go's runtime/stubs.go:noescape(), and is valid
27 // as of Go 1.20. It is possible that this approach stops working in future
28 // versions of the toolchain, at which point `p` may still escape.
29 //
30 //go:nosplit
31 func Noescape(p unsafe.Pointer) unsafe.Pointer {
32 x := uintptr(p)
33 return unsafe.Pointer(x ^ 0)
34 }
35