aboutsummaryrefslogtreecommitdiff
path: root/test/retjmp.dir
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2018-02-14 19:35:03 -0500
committerCherry Zhang <cherryyz@google.com>2018-03-01 21:11:16 +0000
commit2baed3856deb9b077cc9b604c8247865bd3adec0 (patch)
tree3f1781307a691d729d568d5aec218ba2ea96021d /test/retjmp.dir
parent213a75171df1c1fb0ae76fe7c8ff877b1fa9c0b9 (diff)
downloadgo-2baed3856deb9b077cc9b604c8247865bd3adec0.tar.gz
go-2baed3856deb9b077cc9b604c8247865bd3adec0.zip
cmd/asm: fix assembling return jump
In RET instruction, the operand is the return jump's target, which should be put in Prog.To. Add an action "buildrundir" to the test driver, which builds (compile+assemble+link) the code in a directory and runs the resulting binary. Fixes #23838. Change-Id: I7ebe7eda49024b40a69a24857322c5ca9c67babb Reviewed-on: https://go-review.googlesource.com/94175 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'test/retjmp.dir')
-rw-r--r--test/retjmp.dir/a.s12
-rw-r--r--test/retjmp.dir/main.go32
2 files changed, 44 insertions, 0 deletions
diff --git a/test/retjmp.dir/a.s b/test/retjmp.dir/a.s
new file mode 100644
index 0000000000..c67a06638f
--- /dev/null
+++ b/test/retjmp.dir/a.s
@@ -0,0 +1,12 @@
+// Copyright 2018 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.
+
+TEXT ·f(SB), 4, $8-0
+ CALL ·f1(SB)
+ RET ·f2(SB)
+ CALL ·unreachable(SB)
+
+TEXT ·leaf(SB), 4, $0-0
+ RET ·f3(SB)
+ JMP ·unreachable(SB)
diff --git a/test/retjmp.dir/main.go b/test/retjmp.dir/main.go
new file mode 100644
index 0000000000..cb4bd018bf
--- /dev/null
+++ b/test/retjmp.dir/main.go
@@ -0,0 +1,32 @@
+// Copyright 2018 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.
+
+package main
+
+func f()
+func leaf()
+
+var f1called, f2called, f3called bool
+
+func main() {
+ f()
+ if !f1called {
+ panic("f1 not called")
+ }
+ if !f2called {
+ panic("f2 not called")
+ }
+ leaf()
+ if !f3called {
+ panic("f3 not called")
+ }
+}
+
+func f1() { f1called = true }
+func f2() { f2called = true }
+func f3() { f3called = true }
+
+func unreachable() {
+ panic("unreachable function called")
+}