mirror of https://github.com/golang/go.git
runtime, cmd/dist, misc/cgo: enable c-archive for aix/ppc64
Change-Id: Ib9a40d5596f5735a00483e2d2db965402f05671b Reviewed-on: https://go-review.googlesource.com/c/go/+/169120 Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
56517216c0
commit
3aacfce6cf
|
|
@ -110,6 +110,11 @@ func testMain(m *testing.M) int {
|
||||||
// TODO(crawshaw): can we do better?
|
// TODO(crawshaw): can we do better?
|
||||||
cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
|
cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
|
||||||
}
|
}
|
||||||
|
if GOOS == "aix" {
|
||||||
|
// -Wl,-bnoobjreorder is mandatory to keep the same layout
|
||||||
|
// in .text section.
|
||||||
|
cc = append(cc, "-Wl,-bnoobjreorder")
|
||||||
|
}
|
||||||
libbase := GOOS + "_" + GOARCH
|
libbase := GOOS + "_" + GOARCH
|
||||||
if runtime.Compiler == "gccgo" {
|
if runtime.Compiler == "gccgo" {
|
||||||
libbase = "gccgo_" + libgodir + "_fPIC"
|
libbase = "gccgo_" + libgodir + "_fPIC"
|
||||||
|
|
@ -318,7 +323,7 @@ func TestSignalForwarding(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSignalForwardingExternal(t *testing.T) {
|
func TestSignalForwardingExternal(t *testing.T) {
|
||||||
if GOOS == "freebsd" {
|
if GOOS == "freebsd" || GOOS == "aix" {
|
||||||
t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH)
|
t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH)
|
||||||
}
|
}
|
||||||
checkSignalForwardingTest(t)
|
checkSignalForwardingTest(t)
|
||||||
|
|
@ -594,13 +599,15 @@ func TestPIE(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := elf.Open("testp" + exeSuffix)
|
if GOOS != "aix" {
|
||||||
if err != nil {
|
f, err := elf.Open("testp" + exeSuffix)
|
||||||
t.Fatal("elf.Open failed: ", err)
|
if err != nil {
|
||||||
}
|
t.Fatal("elf.Open failed: ", err)
|
||||||
defer f.Close()
|
}
|
||||||
if hasDynTag(t, f, elf.DT_TEXTREL) {
|
defer f.Close()
|
||||||
t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
|
if hasDynTag(t, f, elf.DT_TEXTREL) {
|
||||||
|
t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
|
|
||||||
#include "libgo4.h"
|
#include "libgo4.h"
|
||||||
|
|
||||||
|
#ifdef _AIX
|
||||||
|
// On AIX, CSIGSTKSZ is too small to handle Go sighandler.
|
||||||
|
#define CSIGSTKSZ 0x4000
|
||||||
|
#else
|
||||||
|
#define CSIGSTKSZ SIGSTKSZ
|
||||||
|
#endif
|
||||||
|
|
||||||
static void die(const char* msg) {
|
static void die(const char* msg) {
|
||||||
perror(msg);
|
perror(msg);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
@ -53,12 +60,12 @@ static void* thread1(void* arg __attribute__ ((unused))) {
|
||||||
|
|
||||||
// Set up an alternate signal stack for this thread.
|
// Set up an alternate signal stack for this thread.
|
||||||
memset(&ss, 0, sizeof ss);
|
memset(&ss, 0, sizeof ss);
|
||||||
ss.ss_sp = malloc(SIGSTKSZ);
|
ss.ss_sp = malloc(CSIGSTKSZ);
|
||||||
if (ss.ss_sp == NULL) {
|
if (ss.ss_sp == NULL) {
|
||||||
die("malloc");
|
die("malloc");
|
||||||
}
|
}
|
||||||
ss.ss_flags = 0;
|
ss.ss_flags = 0;
|
||||||
ss.ss_size = SIGSTKSZ;
|
ss.ss_size = CSIGSTKSZ;
|
||||||
if (sigaltstack(&ss, NULL) < 0) {
|
if (sigaltstack(&ss, NULL) < 0) {
|
||||||
die("sigaltstack");
|
die("sigaltstack");
|
||||||
}
|
}
|
||||||
|
|
@ -112,12 +119,12 @@ static void* thread2(void* arg __attribute__ ((unused))) {
|
||||||
|
|
||||||
// Set up an alternate signal stack for this thread.
|
// Set up an alternate signal stack for this thread.
|
||||||
memset(&ss, 0, sizeof ss);
|
memset(&ss, 0, sizeof ss);
|
||||||
ss.ss_sp = malloc(SIGSTKSZ);
|
ss.ss_sp = malloc(CSIGSTKSZ);
|
||||||
if (ss.ss_sp == NULL) {
|
if (ss.ss_sp == NULL) {
|
||||||
die("malloc");
|
die("malloc");
|
||||||
}
|
}
|
||||||
ss.ss_flags = 0;
|
ss.ss_flags = 0;
|
||||||
ss.ss_size = SIGSTKSZ;
|
ss.ss_size = CSIGSTKSZ;
|
||||||
if (sigaltstack(&ss, NULL) < 0) {
|
if (sigaltstack(&ss, NULL) < 0) {
|
||||||
die("sigaltstack");
|
die("sigaltstack");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
#include "libgo2.h"
|
#include "libgo2.h"
|
||||||
|
|
||||||
|
int *nilp;
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
int verbose;
|
int verbose;
|
||||||
int test;
|
int test;
|
||||||
|
|
@ -39,7 +41,7 @@ int main(int argc, char** argv) {
|
||||||
printf("attempting segfault\n");
|
printf("attempting segfault\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
volatile int crash = *(int *) 0;
|
*nilp = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -928,7 +928,8 @@ func (t *tester) supportedBuildmode(mode string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
switch pair {
|
switch pair {
|
||||||
case "darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64",
|
case "aix-ppc64",
|
||||||
|
"darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64",
|
||||||
"linux-amd64", "linux-386", "linux-ppc64le", "linux-s390x",
|
"linux-amd64", "linux-386", "linux-ppc64le", "linux-s390x",
|
||||||
"freebsd-amd64",
|
"freebsd-amd64",
|
||||||
"windows-amd64", "windows-386":
|
"windows-amd64", "windows-386":
|
||||||
|
|
|
||||||
|
|
@ -273,6 +273,7 @@ func sigdelset(mask *sigset, i int) {
|
||||||
mask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
mask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,15 @@ func setSignalstackSP(s *stackt, sp uintptr) {
|
||||||
*(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp
|
*(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
|
switch sig {
|
||||||
|
case _SIGPIPE:
|
||||||
|
// For SIGPIPE, c.sigcode() isn't set to _SI_USER as on Linux.
|
||||||
|
// Therefore, raisebadsignal won't raise SIGPIPE again if
|
||||||
|
// it was deliver in a non-Go thread.
|
||||||
|
c.set_sigcode(_SI_USER)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
|
|
|
||||||
|
|
@ -252,6 +252,7 @@ func sigdelset(mask *sigset, i int) {
|
||||||
mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -365,6 +365,7 @@ func sigdelset(mask *sigset, i int) {
|
||||||
mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -395,6 +395,7 @@ func setSignalstackSP(s *stackt, sp uintptr) {
|
||||||
*(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp
|
*(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -328,6 +328,7 @@ func sigdelset(mask *sigset, i int) {
|
||||||
mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -302,6 +302,7 @@ func sigdelset(mask *sigset, i int) {
|
||||||
*mask &^= 1 << (uint32(i) - 1)
|
*mask &^= 1 << (uint32(i) - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x }
|
||||||
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x }
|
func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x }
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
switch sig {
|
switch sig {
|
||||||
case _SIGTRAP:
|
case _SIGTRAP:
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ func (c *sigctxt) set_rsp(x uint64) { c.regs().rsp = x }
|
||||||
func (c *sigctxt) set_sigcode(x uint64) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint64) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint64) { c.info.si_addr = x }
|
func (c *sigctxt) set_sigaddr(x uint64) { c.info.si_addr = x }
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
switch sig {
|
switch sig {
|
||||||
case _SIGTRAP:
|
case _SIGTRAP:
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ func (c *sigctxt) set_r10(x uint32) { c.regs().r[10] = x }
|
||||||
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x }
|
func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x }
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
switch sig {
|
switch sig {
|
||||||
case _SIGTRAP:
|
case _SIGTRAP:
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ func (c *sigctxt) set_sigaddr(x uint64) {
|
||||||
c.info.si_addr = (*byte)(unsafe.Pointer(uintptr(x)))
|
c.info.si_addr = (*byte)(unsafe.Pointer(uintptr(x)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
func (c *sigctxt) fixsigcode(sig uint32) {
|
func (c *sigctxt) fixsigcode(sig uint32) {
|
||||||
switch sig {
|
switch sig {
|
||||||
case _SIGTRAP:
|
case _SIGTRAP:
|
||||||
|
|
|
||||||
|
|
@ -296,6 +296,7 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
|
||||||
sigprofNonGoPC(c.sigpc())
|
sigprofNonGoPC(c.sigpc())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
c.fixsigcode(sig)
|
||||||
badsignal(uintptr(sig), c)
|
badsignal(uintptr(sig), c)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue