https://gcc.gnu.org/g:5a809d4196577bb9f0c18d6f569acade6d1541f9
commit r14-10989-g5a809d4196577bb9f0c18d6f569acade6d1541f9 Author: Gaius Mulley <gaiusm...@gmail.com> Date: Tue Nov 26 15:56:48 2024 +0000 [PATCH] PR modula2/116378 m2 bootstrap fails on x86_64-darwin This patch fixes m2 bootstrap failure on x86_64-darwin. libc_open is defined with three parameters the last of which is an int for portability (rather than a vararg). This avoids portability problems by promoting mode_t to an int. In the future it could be tidied up by using the m2 optarg extension. gcc/m2/ChangeLog: PR modula2/116378 * gm2-libs-iso/TermFile.mod (termOpen): Add third argument for open. * gm2-libs/libc.def (open): Remove vararg and use INTEGER for mode parameter three. * mc-boot-ch/Glibc.c (tracedb_open): Replace mode_t with int. (libc_open): Rewrite without varargs. * mc-boot/Glibc.h (libc_open): Replace varargs with int mode. * pge-boot/Glibc.cc (libc_open): Rewrite. * pge-boot/Glibc.h (libc_open): Replace varargs with int mode. gcc/testsuite/ChangeLog: PR modula2/116378 * gm2/extensions/run/pass/testopen.mod: Add third argument for open. * gm2/isolib/run/pass/openlibc.mod: Ditto. * gm2/pim/run/pass/testaddr3.mod: Ditto. (cherry picked from commit 9cdde72d1cefdf2ffff52ad2eec1ff465dccb3ab) Signed-off-by: Gaius Mulley <gaiusm...@gmail.com> Diff: --- gcc/m2/gm2-libs-iso/TermFile.mod | 2 +- gcc/m2/gm2-libs/libc.def | 2 +- gcc/m2/mc-boot-ch/Glibc.c | 8 ++------ gcc/m2/mc-boot/Glibc.h | 2 +- gcc/m2/pge-boot/Glibc.cc | 9 ++------- gcc/m2/pge-boot/Glibc.h | 2 +- gcc/testsuite/gm2/extensions/run/pass/testopen.mod | 2 +- gcc/testsuite/gm2/isolib/run/pass/openlibc.mod | 2 +- gcc/testsuite/gm2/pim/run/pass/testaddr3.mod | 2 +- 9 files changed, 11 insertions(+), 20 deletions(-) diff --git a/gcc/m2/gm2-libs-iso/TermFile.mod b/gcc/m2/gm2-libs-iso/TermFile.mod index a3ad58ceba01..3347bdd4e869 100644 --- a/gcc/m2/gm2-libs-iso/TermFile.mod +++ b/gcc/m2/gm2-libs-iso/TermFile.mod @@ -503,7 +503,7 @@ BEGIN THEN fd := libc.open(ADR("/dev/tty"), O_WRONLY, 0600B) ELSE - fd := libc.open(ADR("/dev/tty"), O_RDONLY) + fd := libc.open(ADR("/dev/tty"), O_RDONLY, 0) END ; IF tcgetattr(fd, new)=0 THEN diff --git a/gcc/m2/gm2-libs/libc.def b/gcc/m2/gm2-libs/libc.def index f28f8b5f2bca..a314b59e43f1 100644 --- a/gcc/m2/gm2-libs/libc.def +++ b/gcc/m2/gm2-libs/libc.def @@ -211,7 +211,7 @@ PROCEDURE close (d: INTEGER) : [ INTEGER ] ; open - open the file, filename with flag and mode. *) -PROCEDURE open (filename: ADDRESS; oflag: INTEGER; ...) : INTEGER ; +PROCEDURE open (filename: ADDRESS; oflag: INTEGER; mode: INTEGER) : INTEGER ; (* diff --git a/gcc/m2/mc-boot-ch/Glibc.c b/gcc/m2/mc-boot-ch/Glibc.c index 492f17f6bdc7..5ad1711bc643 100644 --- a/gcc/m2/mc-boot-ch/Glibc.c +++ b/gcc/m2/mc-boot-ch/Glibc.c @@ -67,7 +67,7 @@ tracedb (const char *format, ...) static void -tracedb_open (const void *p, int flags, mode_t mode) +tracedb_open (const void *p, int flags, int mode) { #if defined(BUILD_MC_LIBC_TRACE) bool item_written = false; @@ -343,15 +343,11 @@ libc_creat (char *p, mode_t mode) EXTERN int -libc_open (void *p, int oflag, ...) +libc_open (void *p, int oflag, int mode) { - va_list arg; - va_start (arg, oflag); - mode_t mode = va_arg (arg, mode_t); tracedb_open (p, oflag, mode); int result = open (reinterpret_cast <char *> (p), oflag, mode); tracedb_result (result); - va_end (arg); return result; } diff --git a/gcc/m2/mc-boot/Glibc.h b/gcc/m2/mc-boot/Glibc.h index 2f7fac46d771..957232345f56 100644 --- a/gcc/m2/mc-boot/Glibc.h +++ b/gcc/m2/mc-boot/Glibc.h @@ -178,7 +178,7 @@ EXTERN int libc_close (int d); open - open the file, filename with flag and mode. */ -EXTERN int libc_open (void * filename, int oflag, ...); +EXTERN int libc_open (void * filename, int oflag, int mode); /* creat - creates a new file diff --git a/gcc/m2/pge-boot/Glibc.cc b/gcc/m2/pge-boot/Glibc.cc index a63b328ed608..7ea40d0f0c11 100644 --- a/gcc/m2/pge-boot/Glibc.cc +++ b/gcc/m2/pge-boot/Glibc.cc @@ -224,14 +224,9 @@ libc_creat (char *p, mode_t mode) EXTERN int -libc_open (void *p, int oflag, ...) +libc_open (void *p, int oflag, int mode) { - va_list arg; - va_start (arg, oflag); - mode_t mode = va_arg (arg, mode_t); - int result = open (reinterpret_cast <char *> (p), oflag, mode); - va_end (arg); - return result; + return open (reinterpret_cast <char *> (p), oflag, mode); } EXTERN diff --git a/gcc/m2/pge-boot/Glibc.h b/gcc/m2/pge-boot/Glibc.h index a5558932348b..0a5481ef5239 100644 --- a/gcc/m2/pge-boot/Glibc.h +++ b/gcc/m2/pge-boot/Glibc.h @@ -178,7 +178,7 @@ EXTERN int libc_close (int d); open - open the file, filename with flag and mode. */ -EXTERN int libc_open (void * filename, int oflag, ...); +EXTERN int libc_open (void * filename, int oflag, int mode); /* creat - creates a new file diff --git a/gcc/testsuite/gm2/extensions/run/pass/testopen.mod b/gcc/testsuite/gm2/extensions/run/pass/testopen.mod index a36d2e0eae1e..56dd6f65ea0d 100644 --- a/gcc/testsuite/gm2/extensions/run/pass/testopen.mod +++ b/gcc/testsuite/gm2/extensions/run/pass/testopen.mod @@ -24,7 +24,7 @@ PROCEDURE foo ; VAR fd: INTEGER ; BEGIN - fd := open(ADR("/dev/tty"), 0) + fd := open(ADR("/dev/tty"), 0, 0) END foo ; BEGIN diff --git a/gcc/testsuite/gm2/isolib/run/pass/openlibc.mod b/gcc/testsuite/gm2/isolib/run/pass/openlibc.mod index b9a9d04e2a93..510bb36a8cfd 100644 --- a/gcc/testsuite/gm2/isolib/run/pass/openlibc.mod +++ b/gcc/testsuite/gm2/isolib/run/pass/openlibc.mod @@ -26,6 +26,6 @@ CONST VAR fd: INTEGER ; BEGIN - fd := libc.open(ADR("/dev/tty"), O_RDONLY) ; + fd := libc.open(ADR("/dev/tty"), O_RDONLY, 0) ; libc.printf("fd = %d\n", fd) END openlibc. diff --git a/gcc/testsuite/gm2/pim/run/pass/testaddr3.mod b/gcc/testsuite/gm2/pim/run/pass/testaddr3.mod index b31d0a4b0470..d85f65b00061 100644 --- a/gcc/testsuite/gm2/pim/run/pass/testaddr3.mod +++ b/gcc/testsuite/gm2/pim/run/pass/testaddr3.mod @@ -23,5 +23,5 @@ FROM libc IMPORT open ; VAR fd: INTEGER ; BEGIN - fd := open(ADR(__FILE__), 0) + fd := open(ADR(__FILE__), 0, 0) END testaddr3.