mirror of
https://github.com/golang/go
synced 2024-11-18 03:24:42 -07:00
ee97216a17
The `skip` argument passed to runtime.Caller and runtime.Callers should be interpreted as the number of logical calls to skip (rather than the number of physical stack frames to skip). This changes runtime.Callers to skip inlined calls in addition to physical stack frames. The result value of runtime.Callers is a slice of program counters ([]uintptr) representing physical stack frames. If the `skip` parameter to runtime.Callers skips part-way into a physical frame, there is no convenient way to encode that in the resulting slice. To avoid changing the API in an incompatible way, our solution is to store the number of skipped logical calls of the first frame in the _second_ uintptr returned by runtime.Callers. Since this number is a small integer, we encode it as a valid PC value into a small symbol called: runtime.skipPleaseUseCallersFrames For example, if f() calls g(), g() calls `runtime.Callers(2, pcs)`, and g() is inlined into f, then the frame for f will be partially skipped, resulting in the following slice: pcs = []uintptr{pc_in_f, runtime.skipPleaseUseCallersFrames+1, ...} We store the skip PC in pcs[1] instead of pcs[0] so that `pcs[i:]` will truncate the captured stack trace rather than grow it for all i. Updates #19348. Change-Id: I1c56f89ac48c29e6f52a5d085567c6d77d499cf1 Reviewed-on: https://go-review.googlesource.com/37854 Run-TryBot: David Lazar <lazard@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
38 lines
1.3 KiB
ArmAsm
38 lines
1.3 KiB
ArmAsm
// Copyright 2014 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
#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
|
|
|
|
GLOBL runtime·mheap_(SB), NOPTR, $0
|
|
GLOBL runtime·memstats(SB), NOPTR, $0
|
|
|
|
// NaCl requires that these skips be verifiable machine code.
|
|
#ifdef GOARCH_amd64
|
|
#define SKIP4 BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90
|
|
#endif
|
|
#ifdef GOARCH_386
|
|
#define SKIP4 BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90
|
|
#endif
|
|
#ifdef GOARCH_amd64p32
|
|
#define SKIP4 BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90
|
|
#endif
|
|
#ifndef SKIP4
|
|
#define SKIP4 WORD $0
|
|
#endif
|
|
|
|
#define SKIP16 SKIP4; SKIP4; SKIP4; SKIP4
|
|
#define SKIP64 SKIP16; SKIP16; SKIP16; SKIP16
|
|
|
|
// This function must be sizeofSkipFunction bytes.
|
|
TEXT runtime·skipPleaseUseCallersFrames(SB),NOSPLIT,$0-0
|
|
SKIP64; SKIP64; SKIP64; SKIP64
|