| # Tests that the linker implements the PPC64 ELFv2 ABI |
| # register save and restore functions as defined in |
| # section 2.3.3.1 of the PPC64 ELFv2 ABI when linking |
| # external objects most likely compiled with gcc's |
| # -Os option. |
| # |
| # Verifies golang.org/issue/52366 for linux/ppc64le |
| [!GOOS:linux] skip |
| [!compiler:gc] skip |
| [!cgo] skip |
| [!GOARCH:ppc64le] skip |
| |
| go build -ldflags='-linkmode=internal' |
| exec ./abitest |
| stdout success |
| |
| go build -buildmode=pie -o abitest.pie -ldflags='-linkmode=internal' |
| exec ./abitest.pie |
| stdout success |
| |
| -- go.mod -- |
| module abitest |
| |
| -- abitest.go -- |
| package main |
| |
| /* |
| #cgo CFLAGS: -Os |
| |
| int foo_fpr() { |
| asm volatile("":::"fr31","fr30","fr29","fr28"); |
| } |
| int foo_gpr0() { |
| asm volatile("":::"r30","r29","r28"); |
| } |
| int foo_gpr1() { |
| asm volatile("":::"fr31", "fr30","fr29","fr28","r30","r29","r28"); |
| } |
| int foo_vr() { |
| asm volatile("":::"v31","v30","v29","v28"); |
| } |
| */ |
| import "C" |
| |
| import "fmt" |
| |
| func main() { |
| C.foo_fpr() |
| C.foo_gpr0() |
| C.foo_gpr1() |
| C.foo_vr() |
| fmt.Println("success") |
| } |