aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2023-06-19 14:57:54 -0700
committerIan Lance Taylor <iant@golang.org>2023-06-20 09:55:58 -0700
commitefecb298d880cda20f8d7bea2d7b500a9752ce56 (patch)
treecb5ff167247485a62c29a27164ea4787bf94d001 /libgo
parent0be3a051c03965c5c0385b783837154902bc08fa (diff)
downloadgcc-efecb298d880cda20f8d7bea2d7b500a9752ce56.zip
gcc-efecb298d880cda20f8d7bea2d7b500a9752ce56.tar.gz
gcc-efecb298d880cda20f8d7bea2d7b500a9752ce56.tar.bz2
runtime: use a C function to call mmap
The final argument to mmap, of type off_t, varies. In CL 445375 we changed it to always use the C off_t type, but that broke 32-bit big-endian Linux systems. On those systems, using the C off_t type requires calling the mmap64 function. In C this is automatically handled by the <sys/mman.h> file. In Go, we would have to change the magic //extern comment to call mmap64 when appropriate. Rather than try to get that right, we instead go through a C function that uses C implicit type conversions to pick the right type. Fixes PR go/110297 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/504415
Diffstat (limited to 'libgo')
-rw-r--r--libgo/Makefile.am1
-rw-r--r--libgo/Makefile.in22
-rw-r--r--libgo/go/runtime/mem_gccgo.go6
-rw-r--r--libgo/runtime/go-mmap.c21
-rw-r--r--libgo/runtime/runtime.h3
5 files changed, 38 insertions, 15 deletions
diff --git a/libgo/Makefile.am b/libgo/Makefile.am
index 207d5a9..920f8cc 100644
--- a/libgo/Makefile.am
+++ b/libgo/Makefile.am
@@ -462,6 +462,7 @@ runtime_files = \
runtime/go-memclr.c \
runtime/go-memmove.c \
runtime/go-memequal.c \
+ runtime/go-mmap.c \
runtime/go-nanotime.c \
runtime/go-now.c \
runtime/go-nosys.c \
diff --git a/libgo/Makefile.in b/libgo/Makefile.in
index 0ff6ff4..6176eb5 100644
--- a/libgo/Makefile.in
+++ b/libgo/Makefile.in
@@ -246,15 +246,15 @@ am__objects_4 = runtime/aeshash.lo runtime/go-assert.lo \
runtime/go-construct-map.lo runtime/go-ffi.lo \
runtime/go-fieldtrack.lo runtime/go-matherr.lo \
runtime/go-memclr.lo runtime/go-memmove.lo \
- runtime/go-memequal.lo runtime/go-nanotime.lo \
- runtime/go-now.lo runtime/go-nosys.lo runtime/go-strerror.lo \
- runtime/go-reflect-call.lo runtime/go-setenv.lo \
- runtime/go-signal.lo runtime/go-unsafe-pointer.lo \
- runtime/go-unsetenv.lo runtime/go-unwind.lo \
- runtime/go-varargs.lo runtime/env_posix.lo runtime/panic.lo \
- runtime/print.lo runtime/proc.lo runtime/runtime_c.lo \
- runtime/stack.lo runtime/yield.lo $(am__objects_2) \
- $(am__objects_3)
+ runtime/go-memequal.lo runtime/go-mmap.lo \
+ runtime/go-nanotime.lo runtime/go-now.lo runtime/go-nosys.lo \
+ runtime/go-strerror.lo runtime/go-reflect-call.lo \
+ runtime/go-setenv.lo runtime/go-signal.lo \
+ runtime/go-unsafe-pointer.lo runtime/go-unsetenv.lo \
+ runtime/go-unwind.lo runtime/go-varargs.lo \
+ runtime/env_posix.lo runtime/panic.lo runtime/print.lo \
+ runtime/proc.lo runtime/runtime_c.lo runtime/stack.lo \
+ runtime/yield.lo $(am__objects_2) $(am__objects_3)
am_libgo_llgo_la_OBJECTS = $(am__objects_4)
libgo_llgo_la_OBJECTS = $(am_libgo_llgo_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
@@ -914,6 +914,7 @@ runtime_files = \
runtime/go-memclr.c \
runtime/go-memmove.c \
runtime/go-memequal.c \
+ runtime/go-mmap.c \
runtime/go-nanotime.c \
runtime/go-now.c \
runtime/go-nosys.c \
@@ -1385,6 +1386,8 @@ runtime/go-memmove.lo: runtime/$(am__dirstamp) \
runtime/$(DEPDIR)/$(am__dirstamp)
runtime/go-memequal.lo: runtime/$(am__dirstamp) \
runtime/$(DEPDIR)/$(am__dirstamp)
+runtime/go-mmap.lo: runtime/$(am__dirstamp) \
+ runtime/$(DEPDIR)/$(am__dirstamp)
runtime/go-nanotime.lo: runtime/$(am__dirstamp) \
runtime/$(DEPDIR)/$(am__dirstamp)
runtime/go-now.lo: runtime/$(am__dirstamp) \
@@ -1454,6 +1457,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-memclr.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-memequal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-memmove.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-mmap.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-nanotime.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-nosys.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@runtime/$(DEPDIR)/go-now.Plo@am__quote@
diff --git a/libgo/go/runtime/mem_gccgo.go b/libgo/go/runtime/mem_gccgo.go
index 1e84f4f..e7b51ff 100644
--- a/libgo/go/runtime/mem_gccgo.go
+++ b/libgo/go/runtime/mem_gccgo.go
@@ -14,8 +14,8 @@ import (
//go:linkname sysAlloc
//go:linkname sysFree
-//extern mmap
-func sysMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off _libgo_off_t_type) unsafe.Pointer
+//extern __go_mmap
+func sysMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uintptr) unsafe.Pointer
//extern munmap
func munmap(addr unsafe.Pointer, length uintptr) int32
@@ -38,7 +38,7 @@ func init() {
}
func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uintptr) (unsafe.Pointer, int) {
- p := sysMmap(addr, n, prot, flags, fd, _libgo_off_t_type(off))
+ p := sysMmap(addr, n, prot, flags, fd, off)
if uintptr(p) == _MAP_FAILED {
return nil, errno()
}
diff --git a/libgo/runtime/go-mmap.c b/libgo/runtime/go-mmap.c
new file mode 100644
index 0000000..b2327ba
--- /dev/null
+++ b/libgo/runtime/go-mmap.c
@@ -0,0 +1,21 @@
+/* go-mmap.c -- functions for calling C mmap functions.
+
+ Copyright 2023 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. */
+
+#include "config.h"
+
+#include <stdint.h>
+#include <sys/mman.h>
+
+/* The exact C function to call varies between mmap and mmap64, and
+ the size of the off_t argument also varies. Here we provide a
+ function that Go code can call with consistent types. */
+
+void *
+__go_mmap(void *addr, uintptr_t length, int32_t prot, int32_t flags,
+ int32_t fd, uintptr_t offset)
+{
+ return mmap(addr, length, prot, flags, fd, offset);
+}
diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h
index b3dc4fd..699770d 100644
--- a/libgo/runtime/runtime.h
+++ b/libgo/runtime/runtime.h
@@ -355,9 +355,6 @@ bool runtime_notetsleepg(Note*, int64) // false - timeout
/*
* low level C-called
*/
-#define runtime_mmap mmap
-#define runtime_munmap munmap
-#define runtime_madvise madvise
#define runtime_memclr(buf, size) __builtin_memset((buf), 0, (size))
#define runtime_getcallerpc() __builtin_return_address(0)