| // Copyright 2022 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 p |
| |
| import ( |
| "fmt" |
| "runtime" |
| ) |
| |
| var y int |
| |
| //go:noinline |
| func Square(x int) { |
| var pc0, pc1 [1]uintptr |
| runtime.Callers(1, pc0[:]) // get PC at entry |
| |
| // a switch using jump table |
| switch x { |
| case 1: |
| y = 1 |
| case 2: |
| y = 4 |
| case 3: |
| y = 9 |
| case 4: |
| y = 16 |
| case 5: |
| y = 25 |
| case 6: |
| y = 36 |
| case 7: |
| y = 49 |
| case 8: |
| y = 64 |
| default: |
| panic("too large") |
| } |
| |
| // check PC is in the same function |
| runtime.Callers(1, pc1[:]) |
| if pc1[0] < pc0[0] || pc1[0] > pc0[0]+1000000 { |
| fmt.Printf("jump across DSO boundary. pc0=%x, pc1=%x\n", pc0[0], pc1[0]) |
| panic("FAIL") |
| } |
| |
| if y != x*x { |
| fmt.Printf("x=%d y=%d!=%d\n", x, y, x*x) |
| panic("FAIL") |
| } |
| } |