]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
modula2: Fix up bootstrap on powerpc64le-linux [PR108147]
authorJakub Jelinek <jakub@redhat.com>
Mon, 19 Dec 2022 13:20:36 +0000 (14:20 +0100)
committerJakub Jelinek <jakub@redhat.com>
Mon, 19 Dec 2022 14:00:08 +0000 (15:00 +0100)
As mentioned in the PR, bootstrap with m2 enabled currently fails
on powerpc64le-linux, we get weird ICE after printing some diagnostics.
The problem is that mc creates from *.def prototypes like
extern void m2linemap_WarningAtf (m2linemap_location_t location, void * message);
but the actual function definitions use
void m2linemap_WarningAtf (m2linemap_location_t location, void * message,
...) { code }
and on powerpc64le-linux such lying about the prototype results in
wrong-code, on the caller side we assume the function isn't varargs
and so don't reserve 64 bytes in the frame for it, while the callee
relies on the area being reserved and stores into it.

Fixed by adding non-stdarg wrappers around stdarg functions (because
we want va_list and pass it to diagnostics functions).

2022-12-19  Jakub Jelinek  <jakub@redhat.com>

PR modula2/108147
* gm2-gcc/m2linemap.def (ErrorAtf, WarningAtf, NoteAtf):
Comment out prototypes with varargs.
* gm2-gcc/m2linemap.h (m2linemap_ErrorAtf, m2linemap_WarningAtf,
m2linemap_NoteAtf): No longer varargs.
* gm2-gcc/m2linemap.cc (m2linemap_ErrorAtf): Turned into a
non-varargs wrapper around ...
(m2linemap_ErrorAtf_1): ... this.  New static function.
(m2linemap_WarningAtf): Turned into a non-varargs wrapper around ...
(m2linemap_WarningAtf_1): ... this.  New static function.
(m2linemap_NoteAtf): Turned into a non-varargs wrapper around ...
(m2linemap_NoteAtf_1): ... this.  New static function.

gcc/m2/gm2-gcc/m2linemap.cc
gcc/m2/gm2-gcc/m2linemap.def
gcc/m2/gm2-gcc/m2linemap.h

index c1c6e2b58a6444281793ec35c86de547fcc00624..c6189b7f1abbbb0039de7b52f59c2a2c8b66a821 100644 (file)
@@ -182,8 +182,8 @@ m2linemap_ErrorAt (location_t location, char *message)
 
 /* m2linemap_ErrorAtf - wraps up an error message.  */
 
-void
-m2linemap_ErrorAtf (location_t location, const char *message, ...)
+static void
+m2linemap_ErrorAtf_1 (location_t location, const char *message, ...)
 {
   diagnostic_info diagnostic;
   va_list ap;
@@ -195,10 +195,16 @@ m2linemap_ErrorAtf (location_t location, const char *message, ...)
   va_end (ap);
 }
 
+void
+m2linemap_ErrorAtf (location_t location, const char *message)
+{
+  m2linemap_ErrorAtf_1 (location, message);
+}
+
 /* m2linemap_WarningAtf - wraps up a warning message.  */
 
-void
-m2linemap_WarningAtf (location_t location, const char *message, ...)
+static void
+m2linemap_WarningAtf_1 (location_t location, const char *message, ...)
 {
   diagnostic_info diagnostic;
   va_list ap;
@@ -210,10 +216,16 @@ m2linemap_WarningAtf (location_t location, const char *message, ...)
   va_end (ap);
 }
 
+void
+m2linemap_WarningAtf (location_t location, const char *message)
+{
+  m2linemap_WarningAtf_1 (location, message);
+}
+
 /* m2linemap_NoteAtf - wraps up a note message.  */
 
-void
-m2linemap_NoteAtf (location_t location, const char *message, ...)
+static void
+m2linemap_NoteAtf_1 (location_t location, const char *message, ...)
 {
   diagnostic_info diagnostic;
   va_list ap;
@@ -225,6 +237,12 @@ m2linemap_NoteAtf (location_t location, const char *message, ...)
   va_end (ap);
 }
 
+void
+m2linemap_NoteAtf (location_t location, const char *message)
+{
+  m2linemap_NoteAtf_1 (location, message);
+}
+
 /* m2linemap_internal_error - allow Modula-2 to use the GCC internal error.  */
 
 void
index 2c5d11d1b01b009e4305322c44df6f1bdafb0fbe..689dcb4b4e194043ce4b233ef357e46b0cfcc535 100644 (file)
@@ -47,11 +47,6 @@ PROCEDURE GetLineNoFromLocation (location: location_t) : INTEGER ;
 PROCEDURE GetColumnNoFromLocation (location: location_t) : INTEGER ;
 PROCEDURE GetFilenameFromLocation (location: location_t) : ADDRESS ;
 PROCEDURE ErrorAt (location: location_t; message: ADDRESS) ;
-(*
-PROCEDURE ErrorAtf (location: location_t; message: ADDRESS; ...) ;
-PROCEDURE WarningAtf (location: location_t; message: ADDRESS; ...) ;
-PROCEDURE NoteAtf (location: location_t; message: ADDRESS; ...) ;
-*)
 PROCEDURE ErrorAtf (location: location_t; message: ADDRESS) ;
 PROCEDURE WarningAtf (location: location_t; message: ADDRESS) ;
 PROCEDURE NoteAtf (location: location_t; message: ADDRESS) ;
index 5de5c2665c9c4e4e26d68a04c4e9b54d77e35786..6941983284f40e48a53de5c19b916b101d3b6a60 100644 (file)
@@ -55,9 +55,9 @@ EXTERN int m2linemap_GetLineNoFromLocation (location_t location);
 EXTERN int m2linemap_GetColumnNoFromLocation (location_t location);
 EXTERN const char *m2linemap_GetFilenameFromLocation (location_t location);
 EXTERN void m2linemap_ErrorAt (location_t location, char *message);
-EXTERN void m2linemap_ErrorAtf (location_t location, const char *message, ...);
-EXTERN void m2linemap_WarningAtf (location_t location, const char *message, ...);
-EXTERN void m2linemap_NoteAtf (location_t location, const char *message, ...);
+EXTERN void m2linemap_ErrorAtf (location_t location, const char *message);
+EXTERN void m2linemap_WarningAtf (location_t location, const char *message);
+EXTERN void m2linemap_NoteAtf (location_t location, const char *message);
 EXTERN void m2linemap_internal_error (const char *message);