This patch changes the Go compiler and libgo runtime package to remove
the dummy argument of runtime.getcallersp.  This is a port of
https://golang.org/cl/109596 to the gofrontend, in preparation for
updating libgo to 1.11.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Committed to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 263749)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-274c88df4d6f9360dcd657b6e069a3b5a1d37a90
+8deaafd14414bb5cbbdf3e2673f61b6d836d7d2a
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc    (revision 263749)
+++ gcc/go/gofrontend/expressions.cc    (working copy)
@@ -9635,13 +9635,9 @@ Call_expression::do_lower(Gogo* gogo, Na
                                            "__builtin_return_address",
                                            0);
            }
-         else if (this->args_ != NULL
-                  && this->args_->size() == 1
+         else if ((this->args_ == NULL || this->args_->size() == 0)
                   && n == "getcallersp")
            {
-             // The actual argument to getcallersp is always the
-             // address of a parameter; we don't need that for the
-             // GCC builtin function, so we just ignore it.
              static Named_object* builtin_frame_address;
              return this->lower_to_builtin(&builtin_frame_address,
                                            "__builtin_frame_address",
Index: libgo/go/runtime/cgo_gccgo.go
===================================================================
--- libgo/go/runtime/cgo_gccgo.go       (revision 263749)
+++ libgo/go/runtime/cgo_gccgo.go       (working copy)
@@ -47,7 +47,7 @@ func Cgocall() {
        mp := getg().m
        mp.ncgocall++
        mp.ncgo++
-       entersyscall(0)
+       entersyscall()
        mp.incgo = true
 }
 
@@ -63,7 +63,7 @@ func CgocallDone() {
        // If we are invoked because the C function called _cgo_panic,
        // then _cgo_panic will already have exited syscall mode.
        if readgstatus(gp)&^_Gscan == _Gsyscall {
-               exitsyscall(0)
+               exitsyscall()
        }
 }
 
@@ -84,7 +84,7 @@ func CgocallBack() {
 
        lockOSThread()
 
-       exitsyscall(0)
+       exitsyscall()
        gp.m.incgo = false
 
        if gp.m.ncgo == 0 {
@@ -134,7 +134,7 @@ func CgocallBackDone() {
        }
 
        gp.m.incgo = true
-       entersyscall(0)
+       entersyscall()
 
        if drop {
                mp.dropextram = false
@@ -144,7 +144,7 @@ func CgocallBackDone() {
 
 // _cgo_panic may be called by SWIG code to panic.
 func _cgo_panic(p *byte) {
-       exitsyscall(0)
+       exitsyscall()
        panic(gostringnocopy(p))
 }
 
Index: libgo/go/runtime/lock_futex.go
===================================================================
--- libgo/go/runtime/lock_futex.go      (revision 263749)
+++ libgo/go/runtime/lock_futex.go      (working copy)
@@ -236,8 +236,8 @@ func notetsleepg(n *note, ns int64) bool
                throw("notetsleepg on g0")
        }
 
-       entersyscallblock(0)
+       entersyscallblock()
        ok := notetsleep_internal(n, ns)
-       exitsyscall(0)
+       exitsyscall()
        return ok
 }
Index: libgo/go/runtime/lock_sema.go
===================================================================
--- libgo/go/runtime/lock_sema.go       (revision 263749)
+++ libgo/go/runtime/lock_sema.go       (working copy)
@@ -289,8 +289,8 @@ func notetsleepg(n *note, ns int64) bool
                throw("notetsleepg on g0")
        }
        semacreate(gp.m)
-       entersyscallblock(0)
+       entersyscallblock()
        ok := notetsleep_internal(n, ns, nil, 0)
-       exitsyscall(0)
+       exitsyscall()
        return ok
 }
Index: libgo/go/runtime/malloc.go
===================================================================
--- libgo/go/runtime/malloc.go  (revision 263749)
+++ libgo/go/runtime/malloc.go  (working copy)
@@ -621,7 +621,7 @@ func mallocgc(size uintptr, typ *_type,
        // callback.
        incallback := false
        if gomcache() == nil && getg().m.ncgo > 0 {
-               exitsyscall(0)
+               exitsyscall()
                incallback = true
        }
 
@@ -709,7 +709,7 @@ func mallocgc(size uintptr, typ *_type,
                                mp.mallocing = 0
                                releasem(mp)
                                if incallback {
-                                       entersyscall(0)
+                                       entersyscall()
                                }
                                return x
                        }
@@ -835,7 +835,7 @@ func mallocgc(size uintptr, typ *_type,
        }
 
        if incallback {
-               entersyscall(0)
+               entersyscall()
        }
 
        return x
Index: libgo/go/runtime/norace_test.go
===================================================================
--- libgo/go/runtime/norace_test.go     (revision 263749)
+++ libgo/go/runtime/norace_test.go     (working copy)
@@ -34,12 +34,12 @@ func benchmarkSyscall(b *testing.B, work
        b.RunParallel(func(pb *testing.PB) {
                foo := 42
                for pb.Next() {
-                       runtime.Entersyscall(0)
+                       runtime.Entersyscall()
                        for i := 0; i < work; i++ {
                                foo *= 2
                                foo /= 2
                        }
-                       runtime.Exitsyscall(0)
+                       runtime.Exitsyscall()
                }
                _ = foo
        })
Index: libgo/go/runtime/proc.go
===================================================================
--- libgo/go/runtime/proc.go    (revision 263749)
+++ libgo/go/runtime/proc.go    (working copy)
@@ -1168,7 +1168,7 @@ func kickoff() {
        goexit1()
 }
 
-func mstart1(dummy int32) {
+func mstart1() {
        _g_ := getg()
 
        if _g_ != _g_.m.g0 {
@@ -2774,7 +2774,7 @@ func entersyscallblock_handoff() {
 //
 //go:nosplit
 //go:nowritebarrierrec
-func exitsyscall(dummy int32) {
+func exitsyscall() {
        _g_ := getg()
 
        _g_.m.locks++ // see comment in entersyscall
@@ -2984,13 +2984,13 @@ func exitsyscallclear(gp *g) {
 //go:linkname syscall_entersyscall syscall.Entersyscall
 //go:nosplit
 func syscall_entersyscall() {
-       entersyscall(0)
+       entersyscall()
 }
 
 //go:linkname syscall_exitsyscall syscall.Exitsyscall
 //go:nosplit
 func syscall_exitsyscall() {
-       exitsyscall(0)
+       exitsyscall()
 }
 
 func beforefork() {
Index: libgo/go/runtime/stubs.go
===================================================================
--- libgo/go/runtime/stubs.go   (revision 263749)
+++ libgo/go/runtime/stubs.go   (working copy)
@@ -199,16 +199,14 @@ func publicationBarrier()
 // getcallerpc returns the program counter (PC) of its caller's caller.
 // getcallersp returns the stack pointer (SP) of its caller's caller.
 // argp must be a pointer to the caller's first function argument.
-// The implementation may or may not use argp, depending on
-// the architecture. The implementation may be a compiler
-// intrinsic; there is not necessarily code implementing this
-// on every platform.
+// The implementation may be a compiler intrinsic; there is not
+// necessarily code implementing this on every platform.
 //
 // For example:
 //
 //     func f(arg1, arg2, arg3 int) {
 //             pc := getcallerpc()
-//             sp := getcallersp(unsafe.Pointer(&arg1))
+//             sp := getcallersp()
 //     }
 //
 // These two lines find the PC and SP immediately following
@@ -230,7 +228,7 @@ func publicationBarrier()
 func getcallerpc() uintptr
 
 //go:noescape
-func getcallersp(argp unsafe.Pointer) uintptr
+func getcallersp() uintptr
 
 func asmcgocall(fn, arg unsafe.Pointer) int32 {
        throw("asmcgocall")
@@ -309,9 +307,9 @@ func setSupportAES(v bool) {
 // Here for gccgo.
 func errno() int
 
-// Temporary for gccgo until we port proc.go.
-func entersyscall(int32)
-func entersyscallblock(int32)
+// For gccgo these are written in C.
+func entersyscall()
+func entersyscallblock()
 
 // For gccgo to call from C code, so that the C code and the Go code
 // can share the memstats variable for now.
Index: libgo/runtime/proc.c
===================================================================
--- libgo/runtime/proc.c        (revision 263749)
+++ libgo/runtime/proc.c        (working copy)
@@ -382,7 +382,7 @@ extern void kickoff(void)
   __asm__(GOSYM_PREFIX "runtime.kickoff");
 extern void minit(void)
   __asm__(GOSYM_PREFIX "runtime.minit");
-extern void mstart1(int32)
+extern void mstart1()
   __asm__(GOSYM_PREFIX "runtime.mstart1");
 extern void stopm(void)
   __asm__(GOSYM_PREFIX "runtime.stopm");
@@ -542,7 +542,7 @@ runtime_mstart(void *arg)
        }
 #endif
 
-       mstart1(0);
+       mstart1();
 
        // mstart1 does not return, but we need a return statement
        // here to avoid a compiler warning.
@@ -621,12 +621,12 @@ makeGContext(G* gp, byte* sp, uintptr sp
 // make g->sched refer to the caller's stack segment, because
 // entersyscall is going to return immediately after.
 
-void runtime_entersyscall(int32) __attribute__ ((no_split_stack));
+void runtime_entersyscall() __attribute__ ((no_split_stack));
 static void doentersyscall(uintptr, uintptr)
   __attribute__ ((no_split_stack, noinline));
 
 void
-runtime_entersyscall(int32 dummy __attribute__ ((unused)))
+runtime_entersyscall()
 {
        // Save the registers in the g structure so that any pointers
        // held in registers will be seen by the garbage collector.
@@ -638,8 +638,8 @@ runtime_entersyscall(int32 dummy __attri
        // callee-saved registers to access the TLS variable g.  We
        // don't want to put the ucontext_t on the stack because it is
        // large and we can not split the stack here.
-       doentersyscall((uintptr)runtime_getcallerpc(&dummy),
-                      (uintptr)runtime_getcallersp(&dummy));
+       doentersyscall((uintptr)runtime_getcallerpc(),
+                      (uintptr)runtime_getcallersp());
 }
 
 static void
@@ -672,15 +672,15 @@ static void doentersyscallblock(uintptr,
 
 // The same as runtime_entersyscall(), but with a hint that the syscall is 
blocking.
 void
-runtime_entersyscallblock(int32 dummy __attribute__ ((unused)))
+runtime_entersyscallblock()
 {
        // Save the registers in the g structure so that any pointers
        // held in registers will be seen by the garbage collector.
        getcontext(ucontext_arg(&g->gcregs[0]));
 
        // See comment in runtime_entersyscall.
-       doentersyscallblock((uintptr)runtime_getcallerpc(&dummy),
-                           (uintptr)runtime_getcallersp(&dummy));
+       doentersyscallblock((uintptr)runtime_getcallerpc(),
+                           (uintptr)runtime_getcallersp());
 }
 
 static void
Index: libgo/runtime/runtime.h
===================================================================
--- libgo/runtime/runtime.h     (revision 263749)
+++ libgo/runtime/runtime.h     (working copy)
@@ -268,7 +268,7 @@ void*       runtime_sysAlloc(uintptr, uint64*)
 void   runtime_sysFree(void*, uintptr, uint64*)
   __asm__ (GOSYM_PREFIX "runtime.sysFree");
 void   runtime_mprofinit(void);
-#define runtime_getcallersp(p) __builtin_frame_address(0)
+#define runtime_getcallersp() __builtin_frame_address(0)
 void   runtime_mcall(FuncVal*)
   __asm__ (GOSYM_PREFIX "runtime.mcall");
 int32  runtime_timediv(int64, int32, int32*)
@@ -305,12 +305,10 @@ void      runtime_schedtrace(bool)
 void   runtime_goparkunlock(Lock*, String, byte, intgo)
   __asm__ (GOSYM_PREFIX "runtime.goparkunlock");
 void   runtime_tsleep(int64, const char*);
-void   runtime_entersyscall(int32)
+void   runtime_entersyscall()
   __asm__ (GOSYM_PREFIX "runtime.entersyscall");
-void   runtime_entersyscallblock(int32)
+void   runtime_entersyscallblock()
   __asm__ (GOSYM_PREFIX "runtime.entersyscallblock");
-void   runtime_exitsyscall(int32)
-  __asm__ (GOSYM_PREFIX "runtime.exitsyscall");
 G*     __go_go(void (*pfn)(void*), void*);
 int32  runtime_callers(int32, Location*, int32, bool keep_callers);
 int64  runtime_nanotime(void)  // monotonic time
@@ -385,7 +383,7 @@ bool        runtime_notetsleepg(Note*, int64)
 #define runtime_munmap munmap
 #define runtime_madvise madvise
 #define runtime_memclr(buf, size) __builtin_memset((buf), 0, (size))
-#define runtime_getcallerpc(p) __builtin_return_address(0)
+#define runtime_getcallerpc() __builtin_return_address(0)
 
 #ifdef __rtems__
 void __wrap_rtems_task_variable_add(void **);

Reply via email to