summaryrefslogblamecommitdiff
path: root/lang/gnat/files/freebsdgcc28-patches
blob: 50b520273a144d8d90b46dd49d427f96cc663e91 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                                                       


                                                                        
 







                                                                                                                                 
 

                                                                                                                          
                                                
                                        
















































                                                                                                                       


























                                                                                          








































































































































                                                                               

                                        
 
                                  
 











                                                                     












                                                                  
 

                                                         
                                                
                                        




















                                                                       


















                                                                             

















































































































                                                                                     






































































































































































































































































































































                                                                                          
































                                                                                                                                          
--- config/i386/freebsd.h.orig	Fri Dec  5 04:15:34 1997
+++ config/i386/freebsd.h	Sun Mar 21 17:59:06 1999
@@ -26,8 +26,18 @@
 
 /* The svr4 ABI for the i386 says that records and unions are returned
    in memory.  */
+/* On FreeBSD, we do not. */
 #undef DEFAULT_PCC_STRUCT_RETURN
-#define DEFAULT_PCC_STRUCT_RETURN 1
+#define DEFAULT_PCC_STRUCT_RETURN 0
+
+/* This gets defined in tm.h->linux.h->svr4.h, and keeps us from using
+   libraries compiled with the native cc, so undef it. */
+#undef NO_DOLLAR_IN_LABEL
+
+/* FreeBSD using ELF does not support DWARF2 unwinding mechanisms.
+   Thus, need the equivalent of "-fsjlj-exceptions" (use setjmp/longjmp
+   for exceptions).  */
+#define DWARF2_UNWIND_INFO 0
 
 /* This is how to output an element of a case-vector that is relative.
    This is only used for PIC code.  See comments by the `casesi' insn in
@@ -140,7 +150,7 @@
 #define WCHAR_TYPE_SIZE BITS_PER_WORD
     
 #undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -D__ELF__ -D__FreeBSD__=2 -Asystem(FreeBSD)"
+#define CPP_PREDEFINES "-Di386 -Dunix -D__ELF__ -D__FreeBSD__=3 -Asystem(FreeBSD) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
 
 #undef CPP_SPEC
 #define CPP_SPEC "%(cpp_cpu) %[cpp_cpu] %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}"
--- configure.orig	Sat Feb 28 18:02:02 1998
+++ configure	Mon Feb  8 11:51:44 1999
@@ -677,9 +677,9 @@
 if test -z "$ac_aux_dir"; then
   { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
 fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+ac_config_guess="/bin/sh $ac_aux_dir/config.guess"
+ac_config_sub="/bin/sh $ac_aux_dir/config.sub"
+ac_configure="/bin/sh $ac_aux_dir/configure" # This should be Cygnus configure.
 
 
 # Do some error checking and defaulting for the host and target type.
@@ -2797,6 +2797,20 @@
 	a29k-*-*)			# Default a29k environment.
 		use_collect2=yes
 		;;
+	alpha*-*-freebsd*)
+		tm_file=alpha/freebsd.h
+		# On FreeBSD, the headers are already ok, except for math.h. (??right??)
+		fixincludes=fixinc.math
+		fixincludes=fixinc.math
+		tmake_file=t-libc-ok
+		;;
+	alpha-*-openbsd*)
+		tm_file=alpha/openbsd.h
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		tmake_file=t-libc-ok
+		xmake_file=x-openbsd
+		;;
 	alpha*-*-linux-gnuecoff*)
 		tm_file="${tm_file} alpha/linux.h"
 		xm_file="${xm_file} alpha/xm-linux.h"
@@ -3158,6 +3172,14 @@
 		use_collect2=yes
 		fixincludes=Makefile.in
 		;;
+	hppa*-*-openbsd*)
+		target_cpu_default=1
+		tm_file="pa/pa-openbsd.h"
+		xm_file=pa/xm-openbsd.h
+		xmake_file=x-openbsd
+		use_collect2=yes
+		fixincludes=Makefile.in
+		;;
 	i370-*-mvs*)
 		;;
 	i[34567]86-ibm-aix*)		# IBM PS/2 running AIX
@@ -3256,20 +3278,20 @@
 # Next line turned off because both 386BSD and BSD/386 use GNU ld.
 #		use_collect2=yes
 		;;
-	i[34567]86-*-freebsdelf*)
-		tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h"
+	i[34567]86-*-freebsdaout*)
+		tm_file=i386/freebsd-aout.h
 		# On FreeBSD, the headers are already ok, except for math.h.
 		fixincludes=fixinc.math
 		tmake_file=i386/t-freebsd
-		gas=yes
-		gnu_ld=yes
-		stabs=yes
 		;;
 	i[34567]86-*-freebsd*)
-		tm_file=i386/freebsd.h
+		tm_file="i386/i386.h i386/att.h linux.h i386/freebsd.h i386/perform.h"
 		# On FreeBSD, the headers are already ok, except for math.h.
 		fixincludes=fixinc.math
 		tmake_file=i386/t-freebsd
+		gas=yes
+		gnu_ld=yes
+		stabs=yes
 		;;
 	i[34567]86-*-netbsd*)
 		tm_file=i386/netbsd.h
@@ -3277,6 +3299,13 @@
 		fixincludes=fixinc.math
 		tmake_file=t-netbsd
 		;;
+	i[34567]86-*-openbsd*)
+		tm_file=i386/openbsd.h
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		tmake_file=t-libc-ok
+		xmake_file=x-openbsd
+		;;
 	i[34567]86-*-coff*)
 		tm_file=i386/i386-coff.h
 		tmake_file=i386/t-i386bare
@@ -3964,6 +3993,13 @@
 		fixincludes=fixinc.math
 		tmake_file=t-netbsd
 		;;
+	m68k-*-openbsd*)
+		tm_file=m68k/openbsd.h
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		tmake_file=t-libc-ok
+		xmake_file=x-openbsd
+		;;
 	m68k-*-sysv3*)			# Motorola m68k's running system V.3
 		xm_file=m68k/xm-m68kv.h
 		xmake_file=m68k/x-m68kv
@@ -4273,6 +4309,20 @@
 			prefix=$native_prefix
 		fi
 		;;
+	mips*el-*-openbsd*)  		    # MIPS running OpenBSD
+		tm_file=mips/openbsd-le.h
+		xmake_file=x-openbsd
+		tmake_file=t-libc-ok
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		;;
+	mips*-*-openbsd*)	    # MIPS big-endian running OpenBSD
+		tm_file=mips/openbsd-be.h
+		xmake_file=x-openbsd
+		tmake_file=t-libc-ok
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		;;
 	mips-sony-bsd* | mips-sony-newsos*)	# Sony NEWS 3600 or risc/news.
 		tm_file=mips/news4.h
 		if [ x$stabs = xyes ]; then
@@ -4612,6 +4662,13 @@
 		fixincludes=fixinc.math
 		tmake_file=t-netbsd
 		;;
+	ns32k-*-openbsd*)
+		tm_file=ns32k/openbsd.h
+		tmake_file=t-libc-ok
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		xmake_file=x-openbsd
+		;;
         pdp11-*-bsd)
 		tm_file="${tm_file} pdp11/2bsd.h"
                 ;;
@@ -4625,10 +4682,23 @@
 	romp-*-aos*)
 		use_collect2=yes
 		;;
+	romp-*-openbsd*)
+		tm_file=romp/openbsd.h
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		xmake_file=romp/x-openbsd
+		;;
 	romp-*-mach*)
 		xmake_file=romp/x-mach
 		use_collect2=yes
 		;;
+	powerpc-*-*bsd*)
+		tm_file=rs6000/openbsd.h
+	        tmake_file=rs6000/t-openbsd
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		xmake_file=rs6000/x-openbsd
+		;;
 	powerpc-*-sysv* | powerpc-*-elf*)
 		tm_file=rs6000/sysv4.h
 		xm_file=rs6000/xm-sysv4.h
@@ -4841,6 +4911,13 @@
 		fixincludes=fixinc.math
 		tmake_file=t-netbsd
 		;;
+	sparc-*-openbsd*)
+		tm_file=sparc/openbsd.h
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		tmake_file=t-libc-ok
+		xmake_file=x-openbsd
+		;;
 	sparc-*-bsd*)
 		tm_file=sparc/bsd.h
 		;;
@@ -5009,6 +5086,14 @@
 		# On NetBSD, the headers are already okay, except for math.h.
 		fixincludes=fixinc.math
 		tmake_file=t-netbsd
+		float_format=vax
+		;;
+	vax-*-openbsd*)
+		tm_file=vax/openbsd.h
+		tmake_file="t-libc-ok vax/t-openbsd"
+		# On OpenBSD, the headers are already okay.
+		fixincludes=Makefile.in
+		xmake_file=x-openbsd
 		float_format=vax
 		;;
 	vax-*-ultrix*)			# vaxen running ultrix
--- choose-temp.c.orig	Thu Dec  4 06:17:56 1997
+++ choose-temp.c	Tue Aug 11 04:05:05 1998
@@ -107,12 +107,17 @@
   base = try (getenv ("TMP"), base);
   base = try (getenv ("TEMP"), base);
 
+#ifdef COMMENT_OUT	/* XXX - P_tmpdir is not /tmp in 4.4BSD */
 #ifdef P_tmpdir
   base = try (P_tmpdir, base);
 #endif
+#endif  /* XXX */
 
   /* Try /usr/tmp, then /tmp.  */
+#ifdef COMMENT_OUT	/* XXX - want /tmp used, peroid.  Sometimes pkg_add can
+					 create a /usr/tmp, so beware. */
   base = try (usrtmp, base);
+#endif  /* XXX */
   base = try (tmp, base);
  
   /* If all else fails, use the current directory!  */
--- flags.h.orig	Wed Dec 31 05:02:33 1997
+++ flags.h	Wed Mar 31 00:08:39 1999
@@ -125,6 +125,10 @@
 
 extern int warn_aggregate_return;
 
+/* Nonzero means that -Wformat accepts certain non-ANSI formats.  */
+
+extern int flag_format_extensions;
+
 /* Nonzero if generating code to do profiling.  */
 
 extern int profile_flag;
@@ -215,6 +219,20 @@
    This is generally not a win.  */
 
 extern int flag_unroll_all_loops;
+
+/* Nonzero forces all invariant computations in loops to be moved
+   outside the loop. */
+
+extern int flag_move_all_movables;
+
+/* Nonzero forces all general induction variables in loops to be
+   strength reduced. */
+
+extern int flag_reduce_all_givs;
+
+/* Nonzero gets another run of loop_optimize performed. */
+
+extern int flag_rerun_loop_opt;
 
 /* Nonzero for -fcse-follow-jumps:
    have cse follow jumps to do a more extensive job.  */
--- toplev.c.orig	Wed Feb 25 18:04:46 1998
+++ toplev.c	Wed Mar 31 00:15:41 1999
@@ -463,6 +463,20 @@
 
 int flag_unroll_all_loops;
 
+/* Nonzero forces all invariant computations in loops to be moved
+   outside the loop. */
+
+int flag_move_all_movables = 0;
+
+/* Nonzero forces all general induction variables in loops to be
+   strength reduced. */
+
+int flag_reduce_all_givs = 0;
+
+/* Nonzero gets another run of loop_optimize performed. */
+
+int flag_rerun_loop_opt = 0;
+
 /* Nonzero for -fwritable-strings:
    store string constants in data segment and don't uniquize them.  */
 
@@ -691,6 +705,7 @@
   {"stack-check", &flag_stack_check, 1},
   {"bytecode", &output_bytecode, 1},
   {"check-memory-usage", &flag_check_memory_usage, 1},
+  {"format-extensions", &flag_format_extensions, 1},
   {"prefix-function-name", &flag_prefix_function_name, 1}
 };
 
@@ -880,6 +895,10 @@
   {"uninitialized", &warn_uninitialized, 1},
   {"inline", &warn_inline, 1}
 };
+
+/* Nonzero means that -Wformat accepts certain system-dependent formats.  */
+
+int flag_format_extensions = 0;
 
 /* Output files for assembler code (real compiler output)
    and debugging dumps.  */
--- loop.c.orig	Fri Feb  6 11:23:34 1998
+++ loop.c	Tue Aug 11 16:57:35 1998
@@ -1637,6 +1637,7 @@
 	     extra cost because something else was already moved.  */
 
 	  if (already_moved[regno]
+	      || flag_move_all_movables
 	      || (threshold * savings * m->lifetime) >= insn_count
 	      || (m->forces && m->forces->done
 		  && n_times_used[m->forces->regno] == 1))
@@ -3911,7 +3912,7 @@
 	     of such giv's whether or not we know they are used after the loop
 	     exit.  */
 
-	  if (v->lifetime * threshold * benefit < insn_count
+	  if (!flag_reduce_all_givs && v->lifetime * threshold * benefit < insn_count
 	      && ! bl->reversed)
 	    {
 	      if (loop_dump_stream)
--- cp/lex.c.orig	Wed Nov 26 12:13:20 1997
+++ cp/lex.c	Tue Aug 11 13:37:17 1998
@@ -3329,6 +3329,14 @@
 		  token_buffer[0] = '^';
 		  token_buffer[1] = 0;
 		}
+	      else if (ptr->token == NAMESPACE)
+		{
+		  static int warned;
+		  if (! warned)
+		    warning ("namespaces are mostly broken in this version of g++");
+
+		  warned = 1;
+		}
 
 	      value = (int) ptr->token;
 	    }
--- gcc.1.orig	Tue Feb 17 10:44:00 1998
+++ gcc.1	Tue Aug 11 13:30:01 1998
@@ -182,7 +182,7 @@
 \-Waggregate\-return
 \-Wcast\-align
 \-Wcast\-qual
-\-Wchar\-subscript
+\-Wchar\-subscripts
 \-Wcomment
 \-Wconversion
 \-Wenum\-clash
--- invoke.texi.orig	Tue Feb 17 10:54:05 1998
+++ invoke.texi	Tue Aug 11 13:29:38 1998
@@ -115,7 +115,7 @@
 @smallexample
 -fsyntax-only  -pedantic  -pedantic-errors
 -w  -W  -Wall  -Waggregate-return  -Wbad-function-cast
--Wcast-align  -Wcast-qual  -Wchar-subscript  -Wcomment
+-Wcast-align  -Wcast-qual  -Wchar-subscripts  -Wcomment
 -Wconversion  -Werror  -Wformat
 -Wid-clash-@var{len}  -Wimplicit -Wimplicit-int 
 -Wimplicit-function-declarations -Wimport  -Winline
@@ -153,6 +153,7 @@
 -frerun-cse-after-loop  -fschedule-insns
 -fschedule-insns2  -fstrength-reduce  -fthread-jumps
 -funroll-all-loops  -funroll-loops
+-fmove-all-movables  -freduce-all-givs  -frerun-loop-opt
 -O  -O0  -O1  -O2  -O3
 @end smallexample
 
@@ -2284,6 +2285,47 @@
 Perform the optimization of loop unrolling.  This is done for all loops
 and usually makes programs run more slowly.  @samp{-funroll-all-loops}
 implies @samp{-fstrength-reduce} as well as @samp{-frerun-cse-after-loop}.
+
+@item -fmove-all-movables
+Forces all invariant computations in loops to be moved
+outside the loop.
+This option is provided primarily to improve performance
+for some Fortran code, though it might improve code written
+in other languages.
+
+@emph{Note:} When compiling programs written in Fortran,
+this option is enabled by default.
+
+Analysis of Fortran code optimization and the resulting
+optimizations triggered by this option, and the
+@samp{-freduce-all-givs} and @samp{-frerun-loop-opt}
+options as well, were
+contributed by Toon Moene (@code{toon@@moene.indiv.nluug.nl}).
+
+Please let us (@code{fortran@@gnu.ai.mit.edu})
+know how use of these options affects
+the performance of your production code.
+We're very interested in code that runs @emph{slower}
+when these options are @emph{enabled}.
+
+@item -freduce-all-givs
+Forces all general-induction variables in loops to be
+strength-reduced.
+This option is provided primarily to improve performance
+for some Fortran code, though it might improve code written
+in other languages.
+
+@emph{Note:} When compiling programs written in Fortran,
+this option is enabled by default.
+
+@item -frerun-loop-opt
+Runs loop optimizations a second time.
+This option is provided primarily to improve performance
+for some Fortran code, though it might improve code written
+in other languages.
+
+@emph{Note:} When compiling programs written in Fortran,
+this option is enabled by default.
 
 @item -fno-peephole
 Disable any machine-specific peephole optimizations.
--- expmed.c.dist	Sat Nov  8 14:11:58 1997
+++ expmed.c	Thu Aug 13 11:18:13 1998
@@ -2249,7 +2249,8 @@
 	      rtx shift_subtarget = preserve ? 0 : accum;
 	      rtx add_target
 		= (opno == alg.ops - 1 && target != 0 && variant != add_variant
-		  ? target : 0);
+		   && ! preserve)
+		  ? target : 0;
 	      rtx accum_target = preserve ? 0 : accum;
 	      
 	      switch (alg.op[opno])
@@ -2716,6 +2717,7 @@
   optab optab1, optab2;
   int op1_is_constant, op1_is_pow2;
   int max_cost, extra_cost;
+  static HOST_WIDE_INT last_div_const = 0;
 
   op1_is_constant = GET_CODE (op1) == CONST_INT;
   op1_is_pow2 = (op1_is_constant
@@ -2825,8 +2827,15 @@
   size = GET_MODE_BITSIZE (mode);
 #endif
 
+  /* Only deduct something for a REM if the last divide done was
+     for a different constant.   Then set the constant of the last
+     divide.  */
   max_cost = div_cost[(int) compute_mode]
-    - (rem_flag ? mul_cost[(int) compute_mode] + add_cost : 0);
+    - (rem_flag && ! (last_div_const != 0 && op1_is_constant
+		      && INTVAL (op1) == last_div_const)
+       ? mul_cost[(int) compute_mode] + add_cost : 0);
+
+  last_div_const = ! rem_flag && op1_is_constant ? INTVAL (op1) : 0;
 
   /* Now convert to the best mode to use.  */
   if (compute_mode != mode)
--- configure.in.orig	Sat Feb 28 12:58:12 1998
+++ configure.in	Tue Feb  9 02:24:34 1999
@@ -303,6 +303,13 @@
 	a29k-*-*)			# Default a29k environment.
 		use_collect2=yes
 		;;
+	alpha*-*-freebsd*)
+		tm_file=alpha/freebsd.h
+		# On FreeBSD, the headers are already ok, except for math.h. (??right??)
+		fixincludes=fixinc.math
+		fixincludes=fixinc.math
+		tmake_file=t-libc-ok
+		;;
 	alpha*-*-linux-gnuecoff*)
 		tm_file="${tm_file} alpha/linux.h"
 		xm_file="${xm_file} alpha/xm-linux.h"
@@ -762,20 +769,20 @@
 # Next line turned off because both 386BSD and BSD/386 use GNU ld.
 #		use_collect2=yes
 		;;
-	i[[34567]]86-*-freebsdelf*)
-		tm_file="i386/i386.h i386/att.h linux.h i386/freebsd-elf.h i386/perform.h"
+	i[[34567]]86-*-freebsdaout*)
+		tm_file=i386/freebsd.h
 		# On FreeBSD, the headers are already ok, except for math.h.
 		fixincludes=fixinc.math
 		tmake_file=i386/t-freebsd
-		gas=yes
-		gnu_ld=yes
-		stabs=yes
 		;;
 	i[[34567]]86-*-freebsd*)
-		tm_file=i386/freebsd.h
+		tm_file="i386/i386.h i386/att.h linux.h i386/freebsd.h i386/perform.h"
 		# On FreeBSD, the headers are already ok, except for math.h.
 		fixincludes=fixinc.math
 		tmake_file=i386/t-freebsd
+		gas=yes
+		gnu_ld=yes
+		stabs=yes
 		;;
 	i[[34567]]86-*-netbsd*)
 		tm_file=i386/netbsd.h
--- c-common.c.orig	Wed Feb 18 19:16:13 1998
+++ c-common.c	Tue Mar 30 14:42:30 1999
@@ -623,6 +623,7 @@
 	    int format_num;
 	    int first_arg_num;
 	    int is_scan;
+	    int null_format_ok;
 	    tree argument;
 	    int arg_num;
 	
@@ -637,12 +638,26 @@
 		&& (!strcmp (IDENTIFIER_POINTER (format_type), "printf")
 		    || !strcmp (IDENTIFIER_POINTER (format_type),
 				"__printf__")))
-	      is_scan = 0;
+	      {
+	        is_scan = 0;
+	        null_format_ok = 0;
+	      }
+	    else if (TREE_CODE (format_type) == IDENTIFIER_NODE
+		&& (!strcmp (IDENTIFIER_POINTER (format_type), "printf0")
+		    || !strcmp (IDENTIFIER_POINTER (format_type),
+				"__printf0__")))
+	      {
+	        is_scan = 0;
+	        null_format_ok = 1;
+	      }
 	    else if (TREE_CODE (format_type) == IDENTIFIER_NODE
 		     && (!strcmp (IDENTIFIER_POINTER (format_type), "scanf")
 			 || !strcmp (IDENTIFIER_POINTER (format_type),
 				     "__scanf__")))
-	      is_scan = 1;
+	      {
+	        is_scan = 1;
+	        null_format_ok = 0;
+	      }
 	    else if (TREE_CODE (format_type) == IDENTIFIER_NODE)
 	      {
 		error ("`%s' is an unrecognized format function type",
@@ -651,7 +666,7 @@
 	      }
 	    else
 	      {
-		error ("unrecognized format specifier");
+		error_with_decl (decl, "unrecognized format specifier");
 		continue;
 	      }
 
@@ -718,7 +733,8 @@
 
 	    record_function_format (DECL_NAME (decl),
 				    DECL_ASSEMBLER_NAME (decl),
-				    is_scan, format_num, first_arg_num);
+				    is_scan, null_format_ok, format_num,
+				    first_arg_num);
 	    break;
 	  }
 
@@ -906,6 +922,7 @@
   int pointer_count;
   /* Type of argument if no length modifier is used.  */
   tree *nolen;
+  /* EGCS has tree *hhlen -- length modifier for shortening to byte */
   /* Type of argument if length modifier for shortening is used.
      If NULL, then this modifier is not allowed.  */
   tree *hlen;
@@ -926,6 +943,11 @@
 } format_char_info;
 
 static format_char_info print_char_table[] = {
+/* FreeBSD kernel extensions.  */
+  { "D",	1,	T_C,	NULL,	NULL,	NULL,	NULL,	NULL,	"-wp"		},
+  { "b",	1,	T_C,	NULL,	NULL,	NULL,	NULL,	NULL,	"-wp"		},
+  { "rz",	0,	NULL,	T_I,	T_L,	NULL,	NULL,	NULL,	"-wp0 +#"	},
+#define unextended_print_char_table	(print_char_table + 3)
   { "di",	0,	T_I,	T_I,	T_L,	T_LL,	T_LL,	T_ST,	"-wp0 +"	},
   { "oxX",	0,	T_UI,	T_UI,	T_UL,	T_ULL,	T_ULL,	T_ST,	"-wp0#"		},
   { "u",	0,	T_UI,	T_UI,	T_UL,	T_ULL,	T_ULL,	T_ST,	"-wp0"		},
@@ -960,6 +982,7 @@
   tree name;			/* identifier such as "printf" */
   tree assembler_name;		/* optional mangled identifier (for C++) */
   int is_scan;			/* TRUE if *scanf */
+  int null_format_ok;		/* TRUE if the format string may be NULL */
   int format_num;		/* number of format argument */
   int first_arg_num;		/* number of first arg (zero for varargs) */
 } function_format_info;
@@ -991,15 +1014,15 @@
 void
 init_function_format_info ()
 {
-  record_function_format (get_identifier ("printf"), NULL_TREE, 0, 1, 2);
-  record_function_format (get_identifier ("fprintf"), NULL_TREE, 0, 2, 3);
-  record_function_format (get_identifier ("sprintf"), NULL_TREE, 0, 2, 3);
-  record_function_format (get_identifier ("scanf"), NULL_TREE, 1, 1, 2);
-  record_function_format (get_identifier ("fscanf"), NULL_TREE, 1, 2, 3);
-  record_function_format (get_identifier ("sscanf"), NULL_TREE, 1, 2, 3);
-  record_function_format (get_identifier ("vprintf"), NULL_TREE, 0, 1, 0);
-  record_function_format (get_identifier ("vfprintf"), NULL_TREE, 0, 2, 0);
-  record_function_format (get_identifier ("vsprintf"), NULL_TREE, 0, 2, 0);
+  record_function_format (get_identifier ("printf"), NULL_TREE, 0, 0, 1, 2);
+  record_function_format (get_identifier ("fprintf"), NULL_TREE, 0, 0, 2, 3);
+  record_function_format (get_identifier ("sprintf"), NULL_TREE, 0, 0, 2, 3);
+  record_function_format (get_identifier ("scanf"), NULL_TREE, 1, 0, 1, 2);
+  record_function_format (get_identifier ("fscanf"), NULL_TREE, 1, 0, 2, 3);
+  record_function_format (get_identifier ("sscanf"), NULL_TREE, 1, 0, 2, 3);
+  record_function_format (get_identifier ("vprintf"), NULL_TREE, 0, 0, 1, 0);
+  record_function_format (get_identifier ("vfprintf"), NULL_TREE, 0, 0, 2, 0);
+  record_function_format (get_identifier ("vsprintf"), NULL_TREE, 0, 0, 2, 0);
 
   record_international_format (get_identifier ("gettext"), NULL_TREE, 1);
   record_international_format (get_identifier ("dgettext"), NULL_TREE, 2);
@@ -1016,11 +1039,12 @@
    (e.g. for varargs such as vfprintf).  */
 
 void
-record_function_format (name, assembler_name, is_scan,
+record_function_format (name, assembler_name, is_scan, null_format_ok,
 			format_num, first_arg_num)
       tree name;
       tree assembler_name;
       int is_scan;
+      int null_format_ok;
       int format_num;
       int first_arg_num;
 {
@@ -1044,6 +1068,7 @@
     }
 
   info->is_scan = is_scan;
+  info->null_format_ok = null_format_ok;
   info->format_num = format_num;
   info->first_arg_num = first_arg_num;
 }
@@ -1194,7 +1219,8 @@
 
   if (integer_zerop (format_tree))
     {
-      warning ("null format string");
+      if (!info->null_format_ok)
+	warning ("null format string");
       return;
     }
   if (TREE_CODE (format_tree) != ADDR_EXPR)
@@ -1329,6 +1355,7 @@
 		     It will work on most machines, because size_t and int
 		     have the same mode.  But might as well warn anyway,
 		     since it will fail on other machines.  */
+		  /* XXX should we allow unsigned ints here?  */
 		  if ((TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
 		       != integer_type_node)
 		      &&
@@ -1336,7 +1363,7 @@
 		       != unsigned_type_node))
 		    {
 		      sprintf (message,
-			       "field width is not type int (arg %d)",
+			       "precision is not type int (arg %d)",
 			       arg_num);
 		      warning (message);
 		    }
@@ -1371,6 +1398,7 @@
 		      cur_param = TREE_VALUE (params);
 		      params = TREE_CHAIN (params);
 		      ++arg_num;
+		      /* XXX should we allow unsigned ints here?  */
 		      if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
 			  != integer_type_node)
 		        {
@@ -1388,6 +1416,56 @@
 		}
 	    }
 	}
+      if (*format_chars == 'b')
+	{
+	  /* There should be an int arg to control the string arg.  */
+	  if (params == 0)
+	    {
+	      warning (tfaff);
+	      return;
+	    }
+	    if (info->first_arg_num != 0)
+	    {
+	      cur_param = TREE_VALUE (params);
+	      params = TREE_CHAIN (params);
+	      ++arg_num;
+	      if ((TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
+		   != integer_type_node)
+		  &&
+		  (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
+		   != unsigned_type_node))
+		{
+		  sprintf (message, "bitmap is not type int (arg %d)",
+			   arg_num);
+		  warning (message);
+		}
+	    }
+	}
+      if (*format_chars == 'D')
+	{
+	  /* There should be an unsigned char * arg before the string arg.  */
+	  if (params == 0)
+	    {
+	      warning (tfaff);
+	      return;
+	    }
+	    if (info->first_arg_num != 0)
+	    {
+	      cur_param = TREE_VALUE (params);
+	      params = TREE_CHAIN (params);
+	      ++arg_num;
+	      cur_type = TREE_TYPE (cur_param);
+	      if (TREE_CODE (cur_type) != POINTER_TYPE
+		  || TYPE_MAIN_VARIANT (TREE_TYPE (cur_type))
+		     != unsigned_char_type_node)
+		{
+		  sprintf (message,
+		      "ethernet address is not type unsigned char * (arg %d)",
+			   arg_num);
+		  warning (message);
+		}
+	    }
+	}
       if (*format_chars == 'h' || *format_chars == 'l')
 	length_char = *format_chars++;
       else if (*format_chars == 'q' || *format_chars == 'L')
@@ -1436,7 +1514,9 @@
 	  continue;
 	}
       format_chars++;
-      fci = info->is_scan ? scan_char_table : print_char_table;
+      fci = info->is_scan ? scan_char_table
+	    : flag_format_extensions ? print_char_table
+	    : unextended_print_char_table;
       while (fci->format_chars != 0
 	     && index (fci->format_chars, format_char) == 0)
 	  ++fci;
--- c-tree.h.orig	Fri Aug  8 13:09:02 1997
+++ c-tree.h	Tue Mar 30 14:14:51 1999
@@ -162,7 +162,7 @@
 extern void declare_function_name               PROTO((void));
 extern void decl_attributes                     PROTO((tree, tree, tree));
 extern void init_function_format_info		PROTO((void));
-extern void record_function_format		PROTO((tree, tree, int, int, int));
+extern void record_function_format		PROTO((tree, tree, int, int, int, int));
 extern void check_function_format		PROTO((tree, tree, tree));
 /* Print an error message for invalid operands to arith operation CODE.
    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
--- config/alpha/alpha.c.orig	Fri Feb  6 17:23:50 1998
+++ config/alpha/alpha.c	Tue Aug 11 04:06:42 1998
@@ -1843,7 +1843,7 @@
 /* Write a version stamp.  Don't write anything if we are running as a
    cross-compiler.  Otherwise, use the versions in /usr/include/stamp.h.  */
 
-#if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__linux__) && !defined(VMS)
+#if !defined(CROSS_COMPILE) && !defined(_WIN32) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__linux__) && !defined(VMS)
 #include <stamp.h>
 #endif
 
--- ginclude/stdarg.h.orig	Sat Oct 18 10:26:07 1997
+++ ginclude/stdarg.h	Tue Aug 11 13:27:03 1998
@@ -64,7 +64,7 @@
 
 #ifndef __GNUC_VA_LIST
 #define __GNUC_VA_LIST
-#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__)
+#if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX) || defined(__NetBSD__) || defined(__OpenBSD__)
 typedef char *__gnuc_va_list;
 #else
 typedef void *__gnuc_va_list;
--- ginclude/stddef.h.orig	Mon Oct 28 04:35:28 1996
+++ ginclude/stddef.h	Tue Aug 11 13:26:05 1998
@@ -24,7 +24,7 @@
 
 /* On 4.3bsd-net2, make sure ansi.h is included, so we have
    one less case to deal with in the following.  */
-#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__)
+#if defined (__BSD_NET2__) || defined (____386BSD____) || defined (__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__)
 #include <machine/ansi.h>
 #endif