//go:noescape
func lsanregisterrootregion(addr unsafe.Pointer, n uintptr)
+//go:noescape
+func lsanunregisterrootregion(addr unsafe.Pointer, n uintptr)
+
func lsandoleakcheck()
// These are called from asan_GOARCH.s
//go:cgo_import_static __asan_poison_go
//go:cgo_import_static __asan_register_globals_go
//go:cgo_import_static __lsan_register_root_region_go
+//go:cgo_import_static __lsan_unregister_root_region_go
//go:cgo_import_static __lsan_do_leak_check_go
__lsan_register_root_region(addr, sz);
}
+void __lsan_unregister_root_region_go(void *addr, uintptr_t sz) {
+ __lsan_unregister_root_region(addr, sz);
+}
+
void __lsan_do_leak_check_go(void) {
__lsan_do_leak_check();
}
func asanpoison(addr unsafe.Pointer, sz uintptr) { throw("asan") }
func asanregisterglobals(addr unsafe.Pointer, sz uintptr) { throw("asan") }
func lsanregisterrootregion(unsafe.Pointer, uintptr) { throw("asan") }
+func lsanunregisterrootregion(unsafe.Pointer, uintptr) { throw("asan") }
func lsandoleakcheck() { throw("asan") }
MOVQ $__lsan_register_root_region_go(SB), AX
JMP asancall<>(SB)
+// func runtime·lsanunregisterrootregion(addr unsafe.Pointer, n uintptr)
+TEXT runtime·lsanunregisterrootregion(SB), NOSPLIT, $0-16
+ MOVQ addr+0(FP), RARG0
+ MOVQ n+8(FP), RARG1
+ // void __lsan_unregister_root_region_go(void *addr, uintptr_t sz)
+ MOVQ $__lsan_unregister_root_region_go(SB), AX
+ JMP asancall<>(SB)
+
// func runtime·lsandoleakcheck()
TEXT runtime·lsandoleakcheck(SB), NOSPLIT, $0-0
// void __lsan_do_leak_check_go(void);
MOVD $__lsan_register_root_region_go(SB), FARG
JMP asancall<>(SB)
+// func runtime·lsanunregisterrootregion(addr unsafe.Pointer, n uintptr)
+TEXT runtime·lsanunregisterrootregion(SB), NOSPLIT, $0-16
+ MOVD addr+0(FP), RARG0
+ MOVD n+8(FP), RARG1
+ // void __lsan_unregister_root_region_go(void *addr, uintptr_t n);
+ MOVD $__lsan_unregister_root_region_go(SB), FARG
+ JMP asancall<>(SB)
+
// func runtime·lsandoleakcheck()
TEXT runtime·lsandoleakcheck(SB), NOSPLIT, $0-0
// void __lsan_do_leak_check_go(void);
MOVV $__lsan_register_root_region_go(SB), FARG
JMP asancall<>(SB)
+// func runtime·lsanunregisterrootregion(addr unsafe.Pointer, n uintptr)
+TEXT runtime·lsanunregisterrootregion(SB), NOSPLIT, $0-16
+ MOVV addr+0(FP), RARG0
+ MOVV n+8(FP), RARG1
+ // void __lsan_unregister_root_region_go(void *addr, uintptr_t n);
+ MOVV $__lsan_unregister_root_region_go(SB), FARG
+ JMP asancall<>(SB)
+
// func runtime·lsandoleakcheck()
TEXT runtime·lsandoleakcheck(SB), NOSPLIT, $0-0
// void __lsan_do_leak_check_go(void);
MOVD $__lsan_register_root_region_go(SB), FARG
BR asancall<>(SB)
+// func runtime·lsanunregisterrootregion(addr unsafe.Pointer, n uintptr)
+TEXT runtime·lsanunregisterrootregion(SB),NOSPLIT|NOFRAME,$0-16
+ MOVD addr+0(FP), RARG0
+ MOVD n+8(FP), RARG1
+ // void __lsan_unregister_root_region_go(void *addr, uintptr_t n);
+ MOVD $__lsan_unregister_root_region_go(SB), FARG
+ BR asancall<>(SB)
+
// func runtime·lsandoleakcheck()
TEXT runtime·lsandoleakcheck(SB), NOSPLIT|NOFRAME, $0-0
// void __lsan_do_leak_check_go(void);
MOV $__lsan_register_root_region_go(SB), X14
JMP asancall<>(SB)
+// func runtime·lsanunregisterrootregion(addr unsafe.Pointer, n uintptr)
+TEXT runtime·lsanunregisterrootregion(SB), NOSPLIT, $0-16
+ MOV addr+0(FP), X10
+ MOV n+8(FP), X11
+ // void __lsan_unregister_root_region_go(void *addr, uintptr_t n);
+ MOV $__lsan_unregister_root_region_go(SB), X14
+ JMP asancall<>(SB)
+
// func runtime·lsandoleakcheck()
TEXT runtime·lsandoleakcheck(SB), NOSPLIT, $0-0
// void __lsan_do_leak_check_go(void);
//
//go:nosplit
func sysFree(v unsafe.Pointer, n uintptr, sysStat *sysMemStat) {
+ // When using ASAN leak detection, the memory being freed is
+ // known by the sanitizer. We need to unregister it so it's
+ // not accessed by it.
+ if asanenabled {
+ lsanunregisterrootregion(v, n)
+ }
+
sysStat.add(-int64(n))
gcController.mappedReady.Add(-int64(n))
sysFreeOS(v, n)