1
0
mirror of https://github.com/golang/go synced 2024-11-18 11:04:42 -07:00
The Go programming language
Go to file
Russ Cox 7e97d39879 cmd/5g, cmd/6g, cmd/8g: fix line number of caller of deferred func
Deferred functions are not run by a call instruction. They are run by
the runtime editing registers to make the call start with a caller PC
returning to a
        CALL deferreturn
instruction.

That instruction has always had the line number of the function's
closing brace, but that instruction's line number is irrelevant.
Stack traces show the line number of the instruction before the
return PC, because normally that's what started the call. Not so here.
The instruction before the CALL deferreturn could be almost anywhere
in the function; it's unrelated and its line number is incorrect to show.

Fix the line number by inserting a true hardware no-op with the right
line number before the returned-to CALL instruction. That is, the deferred
calls now appear to start with a caller PC returning to the second instruction
in this sequence:
        NOP
        CALL deferreturn

The traceback will show the line number of the NOP, which we've set
to be the line number of the function's closing brace.

The NOP here is not the usual pseudo-instruction, which would be
elided by the linker. Instead it is the real hardware instruction:
XCHG AX, AX on 386 and amd64, and AND.EQ R0, R0, R0 on ARM.

Fixes #5856.

R=ken2, ken
CC=golang-dev
https://golang.org/cl/11223043
2013-07-12 13:47:55 -04:00
api api: update next.txt 2013-06-14 10:00:07 -07:00
doc spec: move decl in example closer to use 2013-07-11 14:41:46 -07:00
include include/plan9: define size_t to fix build breakage 2013-06-28 12:16:33 -07:00
lib cmd/godoc: set up playground for examples that are already visible 2013-07-02 08:44:25 +10:00
misc misc/cgo/test: relax the threshold in test3250. 2013-07-12 14:13:59 +08:00
src cmd/5g, cmd/6g, cmd/8g: fix line number of caller of deferred func 2013-07-12 13:47:55 -04:00
test cmd/5g, cmd/6g, cmd/8g: fix line number of caller of deferred func 2013-07-12 13:47:55 -04:00
.hgignore hgignore: cleanup obsolete entries. 2013-06-02 11:36:09 +02:00
.hgtags tag go1.1.1 2013-06-13 12:52:02 +10:00
AUTHORS A+C: Oliver Hookins (individual CLA) 2013-07-05 12:53:01 +10:00
CONTRIBUTORS A+C: Oliver Hookins (individual CLA) 2013-07-05 12:53:01 +10:00
favicon.ico godoc: update favicon 2012-10-11 17:02:36 +11:00
LICENSE doc: update licensing text one more time 2012-03-27 15:09:13 +11:00
PATENTS LICENSE: separate, change PATENTS text 2010-12-06 16:31:59 -05:00
README build: update, streamline documentation for new $GOBIN 2010-08-24 20:00:50 -04:00
robots.txt godoc: serve robots.txt raw 2011-02-19 05:46:20 +11:00

This is the source code repository for the Go programming language.  

For documentation about how to install and use Go,
visit http://golang.org/ or load doc/install.html in your web browser.

After installing Go, you can view a nicely formatted
doc/install.html by running godoc --http=:6060
and then visiting http://localhost:6060/doc/install.html.

Unless otherwise noted, the Go source files are distributed
under the BSD-style license found in the LICENSE file.

--

Binary Distribution Notes

If you have just untarred a binary Go distribution, you need to set
the environment variable $GOROOT to the full path of the go
directory (the one containing this README).  You can omit the
variable if you unpack it into /usr/local/go, or if you rebuild
from sources by running all.bash (see doc/install.html).
You should also add the Go binary directory $GOROOT/bin
to your shell's path.

For example, if you extracted the tar file into $HOME/go, you might
put the following in your .profile:

    export GOROOT=$HOME/go
    export PATH=$PATH:$GOROOT/bin

See doc/install.html for more details.