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
This commit is contained in:
parent
0be3a051c0
commit
efecb298d8
6 changed files with 39 additions and 16 deletions
|
@ -1,4 +1,4 @@
|
|||
a3a3c3a2d1bc6a8ca51b302d08c94ef27cdd8f0f
|
||||
6a1d165c2218cd127ee937a1f45599075762f716
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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@
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
21
libgo/runtime/go-mmap.c
Normal file
21
libgo/runtime/go-mmap.c
Normal file
|
@ -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);
|
||||
}
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue