]> Cypherpunks repositories - gostls13.git/commitdiff
runtime, cmd/dist, misc/cgo: enable c-archive for aix/ppc64
authorClément Chigot <clement.chigot@atos.net>
Mon, 25 Mar 2019 09:34:57 +0000 (10:34 +0100)
committerIan Lance Taylor <iant@golang.org>
Tue, 2 Apr 2019 16:03:24 +0000 (16:03 +0000)
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>
16 files changed:
misc/cgo/testcarchive/carchive_test.go
misc/cgo/testcarchive/testdata/main4.c
misc/cgo/testcarchive/testdata/main5.c
src/cmd/dist/test.go
src/runtime/os3_solaris.go
src/runtime/os_aix.go
src/runtime/os_dragonfly.go
src/runtime/os_freebsd.go
src/runtime/os_linux.go
src/runtime/os_netbsd.go
src/runtime/os_openbsd.go
src/runtime/signal_darwin_386.go
src/runtime/signal_darwin_amd64.go
src/runtime/signal_darwin_arm.go
src/runtime/signal_darwin_arm64.go
src/runtime/signal_unix.go

index 611a770245c5fb79c0bbaf6277b964b37c958553..b7f04356a9088da0a6bfd7f772abf94308e986a3 100644 (file)
@@ -110,6 +110,11 @@ func testMain(m *testing.M) int {
                // TODO(crawshaw): can we do better?
                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
        if runtime.Compiler == "gccgo" {
                libbase = "gccgo_" + libgodir + "_fPIC"
@@ -318,7 +323,7 @@ func TestSignalForwarding(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)
        }
        checkSignalForwardingTest(t)
@@ -594,13 +599,15 @@ func TestPIE(t *testing.T) {
                t.Fatal(err)
        }
 
-       f, err := elf.Open("testp" + exeSuffix)
-       if err != nil {
-               t.Fatal("elf.Open failed: ", err)
-       }
-       defer f.Close()
-       if hasDynTag(t, f, elf.DT_TEXTREL) {
-               t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+       if GOOS != "aix" {
+               f, err := elf.Open("testp" + exeSuffix)
+               if err != nil {
+                       t.Fatal("elf.Open failed: ", err)
+               }
+               defer f.Close()
+               if hasDynTag(t, f, elf.DT_TEXTREL) {
+                       t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+               }
        }
 }
 
index a74763dd70efc1743f7a91b9e5137adc16ffd2a4..04f774008f1101d003eb5ae489ea5a791f4639f2 100644 (file)
 
 #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) {
        perror(msg);
        exit(EXIT_FAILURE);
@@ -53,12 +60,12 @@ static void* thread1(void* arg __attribute__ ((unused))) {
 
        // Set up an alternate signal stack for this thread.
        memset(&ss, 0, sizeof ss);
-       ss.ss_sp = malloc(SIGSTKSZ);
+       ss.ss_sp = malloc(CSIGSTKSZ);
        if (ss.ss_sp == NULL) {
                die("malloc");
        }
        ss.ss_flags = 0;
-       ss.ss_size = SIGSTKSZ;
+       ss.ss_size = CSIGSTKSZ;
        if (sigaltstack(&ss, NULL) < 0) {
                die("sigaltstack");
        }
@@ -112,12 +119,12 @@ static void* thread2(void* arg __attribute__ ((unused))) {
 
        // Set up an alternate signal stack for this thread.
        memset(&ss, 0, sizeof ss);
-       ss.ss_sp = malloc(SIGSTKSZ);
+       ss.ss_sp = malloc(CSIGSTKSZ);
        if (ss.ss_sp == NULL) {
                die("malloc");
        }
        ss.ss_flags = 0;
-       ss.ss_size = SIGSTKSZ;
+       ss.ss_size = CSIGSTKSZ;
        if (sigaltstack(&ss, NULL) < 0) {
                die("sigaltstack");
        }
index 9d0da336521b99d3a5d730b6b28d07ceea43e98c..d431ce01ce52513822c5e85bed7227eab474fb37 100644 (file)
@@ -14,6 +14,8 @@
 
 #include "libgo2.h"
 
+int *nilp;
+
 int main(int argc, char** argv) {
        int verbose;
        int test;
@@ -39,7 +41,7 @@ int main(int argc, char** argv) {
                                printf("attempting segfault\n");
                        }
 
-                       volatile int crash = *(int *) 0;
+                       *nilp = 0;
                        break;
                }
 
index 3f8f12c9e9f4a8811c0081be14285ee0929a16c1..df86ae72237bbab95d8099b3d0a25d4eee0baffc 100644 (file)
@@ -928,7 +928,8 @@ func (t *tester) supportedBuildmode(mode string) bool {
                        return false
                }
                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",
                        "freebsd-amd64",
                        "windows-amd64", "windows-386":
index 11d2c9b098c6aa9e2398f6a1fb60467bbab3dbf5..b5f8a7c042c1931d50bb5e79a9c239bfb6875094 100644 (file)
@@ -273,6 +273,7 @@ func sigdelset(mask *sigset, i int) {
        mask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
 }
 
index faec9ac113f72f51f444d6e98c371ce3e909da55..197869f9897b51ab013b89f35d4bf2107bf3771e 100644 (file)
@@ -296,7 +296,15 @@ func setSignalstackSP(s *stackt, sp uintptr) {
        *(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp
 }
 
+//go:nosplit
 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
index eb7e159d35c60d75a9dd4b1453d58887b1e1e55a..4fda7ea8060a467e1355384d99454f50c052307a 100644 (file)
@@ -252,6 +252,7 @@ func sigdelset(mask *sigset, i int) {
        mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
 }
 
index ba0afa23bfe6c459af47198a2de12ba173a303e3..cbb72cf55e66472833c03f1f0e6c2c267d532351 100644 (file)
@@ -365,6 +365,7 @@ func sigdelset(mask *sigset, i int) {
        mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
 }
 
index 8f3afe05777e472da6a1aa7ec94cf2b989c8630a..a817020c9026296353ab426a34ad6532c7c91110 100644 (file)
@@ -395,6 +395,7 @@ func setSignalstackSP(s *stackt, sp uintptr) {
        *(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
 }
 
index fa3c9fa6493df35d39a3c0b5229b830fc527eb95..da024cd309b302904ef7f1ad9a819117e1294657 100644 (file)
@@ -328,6 +328,7 @@ func sigdelset(mask *sigset, i int) {
        mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31)
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
 }
 
index 42fe315bcd795b998e7d823603f69ea41d9fa803..2d6334ec8631e69b5266d87955c72d909d693bb6 100644 (file)
@@ -302,6 +302,7 @@ func sigdelset(mask *sigset, i int) {
        *mask &^= 1 << (uint32(i) - 1)
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
 }
 
index c162959c12d06d64041c3e64ddb3875196cb1440..3dc533499760cdc7ad03170795d755a9ee3f76be 100644 (file)
@@ -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_sigaddr(x uint32) { c.info.si_addr = x }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
        switch sig {
        case _SIGTRAP:
index 40de4812b88927bee168f0662f5733548c533a8e..abc212ad5151e267efc6a17808898fec6dde1e38 100644 (file)
@@ -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_sigaddr(x uint64) { c.info.si_addr = x }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
        switch sig {
        case _SIGTRAP:
index 9a5d3ac5bb813a385a2f9d4c64c4317004f1b54f..9098b1053d207dac446b5c162ea32e4ccac4f857 100644 (file)
@@ -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_sigaddr(x uint32) { c.info.si_addr = x }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
        switch sig {
        case _SIGTRAP:
index 41b8fcaab91ea32fb0e9322c23607672bcdbcece..690ffe4ae20fc14a022f6ad717ab1bb5b3d9464a 100644 (file)
@@ -67,6 +67,7 @@ func (c *sigctxt) set_sigaddr(x uint64) {
        c.info.si_addr = (*byte)(unsafe.Pointer(uintptr(x)))
 }
 
+//go:nosplit
 func (c *sigctxt) fixsigcode(sig uint32) {
        switch sig {
        case _SIGTRAP:
index 8814f7836dc1aef0fd78c19e751a97d1a752ce88..1dd56989b48fd5dc74e100202d90e3fe03d4a3ad 100644 (file)
@@ -296,6 +296,7 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
                        sigprofNonGoPC(c.sigpc())
                        return
                }
+               c.fixsigcode(sig)
                badsignal(uintptr(sig), c)
                return
        }