aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/asm.s8
-rw-r--r--src/runtime/funcdata.h2
-rw-r--r--src/runtime/preempt.go12
3 files changed, 4 insertions, 18 deletions
diff --git a/src/runtime/asm.s b/src/runtime/asm.s
index 0e14fcd3e6..84d56de7dd 100644
--- a/src/runtime/asm.s
+++ b/src/runtime/asm.s
@@ -4,14 +4,6 @@
#include "textflag.h"
-// funcdata for functions with no local variables in frame.
-// Define two zero-length bitmaps, because the same index is used
-// for the local variables as for the argument frame, and assembly
-// frames have two argument bitmaps, one without results and one with results.
-DATA runtime·no_pointers_stackmap+0x00(SB)/4, $2
-DATA runtime·no_pointers_stackmap+0x04(SB)/4, $0
-GLOBL runtime·no_pointers_stackmap(SB),RODATA, $8
-
#ifndef GOARCH_amd64
TEXT ·sigpanic0(SB),NOSPLIT,$0-0
JMP ·sigpanic<ABIInternal>(SB)
diff --git a/src/runtime/funcdata.h b/src/runtime/funcdata.h
index 1002b181e4..15f1b5c9a1 100644
--- a/src/runtime/funcdata.h
+++ b/src/runtime/funcdata.h
@@ -44,7 +44,7 @@
// NO_LOCAL_POINTERS indicates that the assembly function stores
// no pointers to heap objects in its local stack variables.
-#define NO_LOCAL_POINTERS FUNCDATA $FUNCDATA_LocalsPointerMaps, runtime·no_pointers_stackmap(SB)
+#define NO_LOCAL_POINTERS FUNCDATA $FUNCDATA_LocalsPointerMaps, no_pointers_stackmap(SB)
// ArgsSizeUnknown is set in Func.argsize to mark all functions
// whose argument size is unknown (C vararg functions, and
diff --git a/src/runtime/preempt.go b/src/runtime/preempt.go
index 18566a7459..da24f5042c 100644
--- a/src/runtime/preempt.go
+++ b/src/runtime/preempt.go
@@ -56,7 +56,6 @@ import (
"internal/abi"
"internal/goarch"
"runtime/internal/atomic"
- "unsafe"
)
type suspendGState struct {
@@ -405,12 +404,9 @@ func isAsyncSafePoint(gp *g, pc, sp, lr uintptr) (bool, uintptr) {
// functions (except at calls).
return false, 0
}
- if fd := funcdata(f, _FUNCDATA_LocalsPointerMaps); fd == nil || fd == unsafe.Pointer(&no_pointers_stackmap) {
- // This is assembly code. Don't assume it's
- // well-formed. We identify assembly code by
- // checking that it has either no stack map, or
- // no_pointers_stackmap, which is the stack map
- // for ones marked as NO_LOCAL_POINTERS.
+ if fd := funcdata(f, _FUNCDATA_LocalsPointerMaps); fd == nil || f.flag&funcFlag_ASM != 0 {
+ // This is assembly code. Don't assume it's well-formed.
+ // TODO: Empirically we still need the fd == nil check. Why?
//
// TODO: Are there cases that are safe but don't have a
// locals pointer map, like empty frame functions?
@@ -455,5 +451,3 @@ func isAsyncSafePoint(gp *g, pc, sp, lr uintptr) (bool, uintptr) {
}
return true, pc
}
-
-var no_pointers_stackmap uint64 // defined in assembly, for NO_LOCAL_POINTERS macro