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.

Reply via email to