diff options
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/asm.s | 8 | ||||
| -rw-r--r-- | src/runtime/funcdata.h | 2 | ||||
| -rw-r--r-- | src/runtime/preempt.go | 12 |
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 |
