summaryrefslogtreecommitdiff
path: root/lang/gcc27
diff options
context:
space:
mode:
authorDavid E. O'Brien <obrien@FreeBSD.org>2000-03-22 19:10:42 +0000
committerDavid E. O'Brien <obrien@FreeBSD.org>2000-03-22 19:10:42 +0000
commit910033a07677949c4e92a8848f5f15b8cde63a0b (patch)
tree45b411beaffa330eddbe13d6e002c0fb1afe6ec9 /lang/gcc27
parentFix the URL in one of the MASTER_SITES. (diff)
Port of the GCC 2.7.2.3 that was the base compiler in FreeBSD 2.2.x thru 3.x.
Notes
Notes: svn path=/head/; revision=26961
Diffstat (limited to 'lang/gcc27')
-rw-r--r--lang/gcc27/Makefile76
-rw-r--r--lang/gcc27/distinfo2
-rw-r--r--lang/gcc27/files/freebsd.h.i386575
-rw-r--r--lang/gcc27/files/patch-Makefile.in70
-rw-r--r--lang/gcc27/files/patch-c-common.c226
-rw-r--r--lang/gcc27/files/patch-c-tree.h11
-rw-r--r--lang/gcc27/files/patch-cccp.133
-rw-r--r--lang/gcc27/files/patch-cccp.c30
-rw-r--r--lang/gcc27/files/patch-combine.c154
-rw-r--r--lang/gcc27/files/patch-configure44
-rw-r--r--lang/gcc27/files/patch-cse.c20
-rw-r--r--lang/gcc27/files/patch-dbxout.c26
-rw-r--r--lang/gcc27/files/patch-decl.c35
-rw-r--r--lang/gcc27/files/patch-dwarfout.c20
-rw-r--r--lang/gcc27/files/patch-emit-rtl.c37
-rw-r--r--lang/gcc27/files/patch-except.c37
-rw-r--r--lang/gcc27/files/patch-extend.texi25
-rw-r--r--lang/gcc27/files/patch-final.c60
-rw-r--r--lang/gcc27/files/patch-flags.h13
-rw-r--r--lang/gcc27/files/patch-function.c34
-rw-r--r--lang/gcc27/files/patch-g++.c11
-rw-r--r--lang/gcc27/files/patch-gcc.1137
-rw-r--r--lang/gcc27/files/patch-gcc.c229
-rw-r--r--lang/gcc27/files/patch-glimits.h15
-rw-r--r--lang/gcc27/files/patch-gxxint.texi73
-rw-r--r--lang/gcc27/files/patch-i386.c62
-rw-r--r--lang/gcc27/files/patch-i386.h53
-rw-r--r--lang/gcc27/files/patch-i386.md20
-rw-r--r--lang/gcc27/files/patch-invoke.texi40
-rw-r--r--lang/gcc27/files/patch-libgcc2.c31
-rw-r--r--lang/gcc27/files/patch-print-tree.c29
-rw-r--r--lang/gcc27/files/patch-ptree.c23
-rw-r--r--lang/gcc27/files/patch-reload.c11
-rw-r--r--lang/gcc27/files/patch-reno.texi11
-rw-r--r--lang/gcc27/files/patch-sched.c55
-rw-r--r--lang/gcc27/files/patch-sendmsg.c21
-rw-r--r--lang/gcc27/files/patch-stdarg.h40
-rw-r--r--lang/gcc27/files/patch-stddef.h20
-rw-r--r--lang/gcc27/files/patch-toplev.c21
-rw-r--r--lang/gcc27/files/patch-varargs.h37
-rw-r--r--lang/gcc27/files/patch-x-freebsd8
-rw-r--r--lang/gcc27/pkg-comment1
-rw-r--r--lang/gcc27/pkg-descr8
-rw-r--r--lang/gcc27/pkg-plist390
44 files changed, 2874 insertions, 0 deletions
diff --git a/lang/gcc27/Makefile b/lang/gcc27/Makefile
new file mode 100644
index 000000000000..7764db4133d8
--- /dev/null
+++ b/lang/gcc27/Makefile
@@ -0,0 +1,76 @@
+# ex:ts=8
+# Ports collection makefile for: gcc
+# Version required: 2.8.1
+# Date created: 17 Jan 1998
+# Whom: David O'Brien <obrien@NUXI.com>
+#
+# $FreeBSD$
+#
+
+DISTNAME= gcc-2.7.2.3
+CATEGORIES= lang
+MASTER_SITES= ${MASTER_SITE_GNU} \
+ ftp://ftp.gnu.org/gnu/libg++/ \
+ ftp://ftp.duke.edu/pub/gnu/libg++/ \
+ ftp://ftp.net.ohio-state.edu/disk/c/gnu/gnu-0.2/src/
+MASTER_SITE_SUBDIR= gcc
+DISTFILES= ${DISTNAME}${EXTRACT_SUFX} libg++-2.7.2${EXTRACT_SUFX}
+
+MAINTAINER= obrien@FreeBSD.org
+
+NO_CDROM= 'old version, not worth the cost in real estate'
+
+.include <bsd.port.pre.mk>
+
+GCC_VER= 2.7.2.3
+CONFIGURE_TARGET= ${ARCH}-portbld-freebsd${OSREL}
+PLIST_SUB= GNUHOST=${CONFIGURE_TARGET} GCC_VER=${GCC_VER}
+CONFIGURE_ARGS= --with-gnu-as --with-gnu-ld --with-stabs \
+ --with-gxx-include-dir=${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}/include/g++
+GNU_CONFIGURE= yes
+USE_GMAKE= yes
+ALL_TARGET= bootstrap
+MAN1= cccp27.1 g++27.1 gcc27.1
+
+pre-fetch:
+ @${ECHO} "GCC ${DISTNAME:S/^gcc-//} for ${OPSYS} ${OSREL} ${PORTOBJFORMAT}"
+
+pre-patch:
+ @${MV} ${WRKSRC}/config/i386/freebsd.h ${WRKSRC}/config/i386/freebsd-aout.h
+
+pre-configure:
+ @(MAJ=`sysctl -n kern.osreldate | ${SED} -e '/.....$$/s///'` ; \
+ ${SED} -e "s:__FreeBSD__[0-9=]*:__FreeBSD__=$${MAJ}:" ${FILESDIR}/freebsd.h.${ARCH} \
+ >${WRKSRC}/config/${ARCH}/freebsd.h )
+
+XGCC= "${WRKSRC}/stage2/xgcc -B${WRKSRC}/stage2/"
+post-build:
+ cd ${WRKDIR}/libg++-2.7.2 ; env CC=${XGCC} CXX=${XGCC} ./configure ${CONFIGURE_ARGS}
+ cd ${WRKDIR}/libg++-2.7.2 ; ${SETENV} ${MAKE_ENV} ${GMAKE} CC=${XGCC} CXX=${XGCC}
+
+post-install:
+ cd ${WRKDIR}/libg++-2.7.2 ; ${SETENV} ${MAKE_ENV} ${GMAKE} CC=${XGCC} CXX=${XGCC} install
+ @${RM} -f ${PREFIX}/bin/c++ \
+ ${PREFIX}/bin/genclass ${PREFIX}/bin/gperf \
+ ${PREFIX}/bin/protoize ${PREFIX}/bin/unprotoize \
+ ${PREFIX}/man/man1/gperf.1 ${PREFIX}/man/man1/configure.1
+ @${RM} -rf ${PREFIX}/bin/c++ ${PREFIX}/${CONFIGURE_TARGET}
+ @(for prog in ${PREFIX}/bin/gcc ${PREFIX}/bin/g++ \
+ ${PREFIX}/bin/${CONFIGURE_TARGET}-gcc \
+ ${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}/cc1 \
+ ${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}/cc1obj \
+ ${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}/cc1plus \
+ ${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}/cpp ; \
+ do strip $$prog ; \
+ done)
+ @${MV} -f ${PREFIX}/bin/gcc ${PREFIX}/bin/gcc27
+ @${MV} -f ${PREFIX}/bin/g++ ${PREFIX}/bin/g++27
+ @${MV} ${PREFIX}/man/man1/cccp.1 ${PREFIX}/man/man1/cccp27.1
+ @${MV} ${PREFIX}/man/man1/g++.1 ${PREFIX}/man/man1/g++27.1
+ @${MV} ${PREFIX}/man/man1/gcc.1 ${PREFIX}/man/man1/gcc27.1
+ @${RM} -rf ${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}/g++-include
+ @${MV} ${PREFIX}/lib/libg++.a ${PREFIX}/lib/libiberty.a \
+ ${PREFIX}/lib/libstdc++.a ${PREFIX}/lib/g++-include \
+ ${PREFIX}/lib/gcc-lib/${CONFIGURE_TARGET}/${GCC_VER}
+
+.include <bsd.port.post.mk>
diff --git a/lang/gcc27/distinfo b/lang/gcc27/distinfo
new file mode 100644
index 000000000000..75711eca382c
--- /dev/null
+++ b/lang/gcc27/distinfo
@@ -0,0 +1,2 @@
+MD5 (gcc-2.7.2.3.tar.gz) = 9f75fc7a5f13b691aabe8c1b775a4604
+MD5 (libg++-2.7.2.tar.gz) = cfc85fb62113b72aa4f9688e08b385c4
diff --git a/lang/gcc27/files/freebsd.h.i386 b/lang/gcc27/files/freebsd.h.i386
new file mode 100644
index 000000000000..acd5b27529d9
--- /dev/null
+++ b/lang/gcc27/files/freebsd.h.i386
@@ -0,0 +1,575 @@
+/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
+ Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+ Contributed by Eric Youngdale.
+ Modified for stabs-in-ELF by H.J. Lu.
+ Adapted from Linux version by John Polstra.
+ Added support for generating "old a.out gas" on the fly by Peter Wemm.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* $FreeBSD$ */
+
+/* A lie, I guess, but the general idea behind FreeBSD/ELF is that we are
+ supposed to be outputting something that will assemble under SVr4.
+ This gets us pretty close. */
+#include <i386/i386.h> /* Base i386 target machine definitions */
+#include <i386/att.h> /* Use the i386 AT&T assembler syntax */
+#include <linux.h> /* some common stuff */
+
+/* Don't assume anything about the header files. */
+#define NO_IMPLICIT_EXTERN_C
+
+/* This defines which switch letters take arguments. On svr4, most of
+ the normal cases (defined in gcc.c) apply, and we also have -h* and
+ -z* options (for the linker). We have a slightly different mix. We
+ have -R (alias --rpath), no -z, --soname (-h), --assert etc. */
+
+#undef SWITCH_TAKES_ARG
+#define SWITCH_TAKES_ARG(CHAR) \
+ ( (CHAR) == 'D' \
+ || (CHAR) == 'U' \
+ || (CHAR) == 'o' \
+ || (CHAR) == 'e' \
+ || (CHAR) == 'T' \
+ || (CHAR) == 'u' \
+ || (CHAR) == 'I' \
+ || (CHAR) == 'm' \
+ || (CHAR) == 'L' \
+ || (CHAR) == 'A' \
+ || (CHAR) == 'h' \
+ || (CHAR) == 'z' /* ignored by ld */ \
+ || (CHAR) == 'R')
+
+#undef WORD_SWITCH_TAKES_ARG
+#define WORD_SWITCH_TAKES_ARG(STR) \
+ (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \
+ || !strcmp (STR, "rpath") || !strcmp (STR, "rpath-link") \
+ || !strcmp (STR, "soname") || !strcmp (STR, "defsym") \
+ || !strcmp (STR, "assert") || !strcmp (STR, "dynamic-linker"))
+
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD)");
+
+#define MASK_PROFILER_EPILOGUE 010000000000
+#define MASK_AOUT 004000000000 /* a.out not elf */
+#define MASK_UNDERSCORES 002000000000 /* use leading _ */
+
+#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE)
+#define TARGET_AOUT (target_flags & MASK_AOUT)
+#define TARGET_ELF ((target_flags & MASK_AOUT) == 0)
+#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0)
+
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \
+ { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \
+ { "aout", MASK_AOUT}, \
+ { "no-aout", -MASK_AOUT}, \
+ { "underscores", MASK_UNDERSCORES}, \
+ { "no-underscores", -MASK_UNDERSCORES},
+
+/* 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 0
+
+/* Prefix for internally generated assembler labels. If we aren't using
+ underscores, we are using prefix `.'s to identify labels that should
+ be ignored, as in `i386/gas.h' --karl@cs.umb.edu */
+#undef LPREFIX
+#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
+
+/* Override the default comment-starter of "/". */
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START "#"
+
+#undef COMMENT_BEGIN
+#define COMMENT_BEGIN "#"
+
+#undef ASM_APP_ON
+#define ASM_APP_ON "#APP\n"
+
+#undef ASM_APP_OFF
+#define ASM_APP_OFF "#NO_APP\n"
+
+/* Output at beginning of assembler file. */
+/* The .file command should always begin the output. */
+
+#undef ASM_FILE_START
+#define ASM_FILE_START(FILE) \
+ do { \
+ output_file_directive (FILE, main_input_filename); \
+ if (TARGET_ELF) \
+ fprintf (FILE, "\t.version\t\"01.01\"\n"); \
+ } while (0)
+
+/* Identify the front-end which produced this file. To keep symbol
+ space down, and not confuse kdb, only do this if the language is
+ not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */
+#undef ASM_IDENTIFY_LANGUAGE
+#define ASM_IDENTIFY_LANGUAGE(STREAM) \
+{ \
+ if (strcmp (lang_identify (), "c") != 0) \
+ output_lang_identify (STREAM); \
+}
+
+/* This is how to store into the string BUF
+ the symbol_ref name of an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class.
+ This is suitable for output with `assemble_name'. */
+#undef ASM_GENERATE_INTERNAL_LABEL
+#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
+ sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \
+ (PREFIX), (NUMBER))
+
+/* This is how to output an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class. */
+#undef ASM_OUTPUT_INTERNAL_LABEL
+#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
+ fprintf (FILE, "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \
+ PREFIX, NUM)
+
+/* This is how to output a reference to a user-level label named NAME. */
+#undef ASM_OUTPUT_LABELREF
+#define ASM_OUTPUT_LABELREF(FILE,NAME) \
+ fprintf (FILE, "%s%s", (TARGET_UNDERSCORES) ? "_" : "", NAME)
+
+
+/* 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
+ i386.md for an explanation of the expression this outputs. */
+#undef ASM_OUTPUT_ADDR_DIFF_ELT
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
+ fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
+
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(FILE,LOG) \
+ if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG))
+
+/* Align labels, etc. at 4-byte boundaries.
+ For the 486, align to 16-byte boundary for sake of cache. */
+#undef ASM_OUTPUT_ALIGN_CODE
+#define ASM_OUTPUT_ALIGN_CODE(FILE) \
+ fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_jumps)
+
+/* Align start of loop at 4-byte boundary. */
+#undef ASM_OUTPUT_LOOP_ALIGN
+#define ASM_OUTPUT_LOOP_ALIGN(FILE) \
+ fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_loops)
+
+
+/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */
+#undef USE_CONST_SECTION
+#define USE_CONST_SECTION TARGET_ELF
+
+/* A C statement (sans semicolon) to output an element in the table of
+ global constructors. */
+#undef ASM_OUTPUT_CONSTRUCTOR
+#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
+ do { \
+ if (TARGET_ELF) { \
+ ctors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } else { \
+ fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
+ (TARGET_UNDERSCORES) ? "_" : ""); \
+ assemble_name (asm_out_file, name); \
+ fputc ('\n', asm_out_file); \
+ } \
+ } while (0)
+
+/* A C statement (sans semicolon) to output an element in the table of
+ global destructors. */
+#undef ASM_OUTPUT_DESTRUCTOR
+#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
+ do { \
+ if (TARGET_ELF) { \
+ dtors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } else { \
+ fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
+ (TARGET_UNDERSCORES) ? "_" : ""); \
+ assemble_name (asm_out_file, name); \
+ fputc ('\n', asm_out_file); \
+ } \
+ } while (0)
+
+/* This says how to output assembler code to declare an
+ uninitialized internal linkage data object. Under SVR4,
+ the linker seems to want the alignment of data objects
+ to depend on their types. We do exactly that here. */
+
+#undef ASM_OUTPUT_ALIGNED_LOCAL
+#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), "\n"); \
+ ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
+ } else { \
+ int rounded = (SIZE); \
+ if (rounded == 0) rounded = 1; \
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \
+ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \
+ fputs (".lcomm ", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u\n", (rounded)); \
+ } \
+} while (0)
+
+#undef ASM_OUTPUT_ALIGNED_COMMON
+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
+ } else { \
+ int rounded = (SIZE); \
+ if (rounded == 0) rounded = 1; \
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \
+ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \
+ fputs (".comm ", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u\n", (rounded)); \
+ } \
+} while (0)
+
+/* Turn off svr4.h version, it chokes the old gas. The old layout
+ works fine under new gas anyway. */
+#undef ASM_OUTPUT_ASCII
+
+/* How to output some space */
+#undef ASM_OUTPUT_SKIP
+#define ASM_OUTPUT_SKIP(FILE,SIZE) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \
+ } else { \
+ fprintf (FILE, "\t.space %u\n", (SIZE)); \
+ } \
+} while (0)
+
+#undef ASM_OUTPUT_SOURCE_LINE
+#define ASM_OUTPUT_SOURCE_LINE(file, line) \
+do { \
+ static int sym_lineno = 1; \
+ if (TARGET_ELF) { \
+ fprintf (file, ".stabn 68,0,%d,.LM%d-", line, sym_lineno); \
+ assemble_name (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
+ fprintf (file, "\n.LM%d:\n", sym_lineno); \
+ sym_lineno += 1; \
+ } else { \
+ fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \
+ } \
+} while (0)
+
+/* in elf, the function stabs come first, before the relative offsets */
+#undef DBX_FUNCTION_FIRST
+#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF
+
+/* tag end of file in elf mode */
+#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
+#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf (FILE, "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO); \
+ } \
+} while (0)
+
+/* stabs-in-elf has offsets relative to function beginning */
+#undef DBX_OUTPUT_LBRAC
+#define DBX_OUTPUT_LBRAC(file,name) \
+do { \
+ fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \
+ assemble_name (asmfile, buf); \
+ if (TARGET_ELF) { \
+ fputc ('-', asmfile); \
+ assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
+ } \
+ fprintf (asmfile, "\n"); \
+} while (0)
+
+#undef DBX_OUTPUT_RBRAC
+#define DBX_OUTPUT_RBRAC(file,name) \
+do { \
+ fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \
+ assemble_name (asmfile, buf); \
+ if (TARGET_ELF) { \
+ fputc ('-', asmfile); \
+ assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
+ } \
+ fprintf (asmfile, "\n"); \
+} while (0)
+
+
+/* Define macro used to output shift-double opcodes when the shift
+ count is in %cl. Some assemblers require %cl as an argument;
+ some don't.
+
+ *OLD* GAS requires the %cl argument, so override i386/unix.h. */
+
+#undef AS3_SHIFT_DOUBLE
+#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d)
+
+/* Indicate that jump tables go in the text section. This is
+ necessary when compiling PIC code. */
+#define JUMP_TABLES_IN_TEXT_SECTION
+
+/* override the exception table positioning */
+#define EXCEPTION_SECTION_FUNCTION \
+do { \
+ if (TARGET_ELF) { \
+ named_section (NULL_TREE, ".gcc_except_table"); \
+ } else { \
+ if (flag_pic) \
+ data_section (); \
+ else \
+ readonly_data_section (); \
+ } \
+} while (0);
+
+/* supply our own hook for calling __main() from main() */
+#define GEN_CALL__MAIN \
+ do { \
+ if (!(TARGET_ELF)) \
+ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \
+ VOIDmode, 0); \
+ } while (0)
+
+/* Use dollar signs in special g++ assembler names. */
+#undef NO_DOLLAR_IN_LABEL
+
+/* Map i386 registers to the numbers dwarf expects. Of course this is different
+ from what stabs expects. */
+
+#undef DWARF_DBX_REGISTER_NUMBER
+#define DWARF_DBX_REGISTER_NUMBER(n) \
+((n) == 0 ? 0 \
+ : (n) == 1 ? 2 \
+ : (n) == 2 ? 1 \
+ : (n) == 3 ? 3 \
+ : (n) == 4 ? 6 \
+ : (n) == 5 ? 7 \
+ : (n) == 6 ? 5 \
+ : (n) == 7 ? 4 \
+ : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
+ : (-1))
+
+/* Now what stabs expects in the register. */
+#define STABS_DBX_REGISTER_NUMBER(n) \
+((n) == 0 ? 0 : \
+ (n) == 1 ? 2 : \
+ (n) == 2 ? 1 : \
+ (n) == 3 ? 3 : \
+ (n) == 4 ? 6 : \
+ (n) == 5 ? 7 : \
+ (n) == 6 ? 4 : \
+ (n) == 7 ? 5 : \
+ (n) + 4)
+
+#undef DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \
+ ? DWARF_DBX_REGISTER_NUMBER(n) \
+ : STABS_DBX_REGISTER_NUMBER(n))
+
+/* Tell final.c that we don't need a label passed to mcount. */
+#define NO_PROFILE_DATA
+
+/* Output assembler code to FILE to increment profiler label # LABELNO
+ for profiling a function entry. */
+/* Redefine this to not pass an unused label in %edx. */
+
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+{ \
+ if (flag_pic) \
+ fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", \
+ TARGET_AOUT ? "mcount" : ".mcount"); \
+ else \
+ fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \
+}
+
+#define FUNCTION_PROFILER_EPILOGUE(FILE) \
+{ \
+ if (TARGET_PROFILER_EPILOGUE) \
+ { \
+ if (flag_pic) \
+ fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", \
+ TARGET_AOUT ? "mexitcount" : ".mexitcount"); \
+ else \
+ fprintf (FILE, "\tcall %s\n", \
+ TARGET_AOUT ? "mexitcount" : ".mexitcount"); \
+ } \
+}
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#define WCHAR_UNSIGNED 0
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE BITS_PER_WORD
+
+/* FREEBSD_NATIVE is defined when gcc is integrated into the FreeBSD
+ source tree so it can be configured appropriately without using
+ the GNU configure/build mechanism. */
+
+#ifdef FREEBSD_NATIVE
+
+/* Look for the include files in the system-defined places. */
+
+#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
+
+#define GCC_INCLUDE_DIR "/usr/include"
+
+/* FreeBSD has GCC_INCLUDE_DIR first. */
+#define INCLUDE_DEFAULTS \
+ { \
+ { GCC_INCLUDE_DIR, 0, 0 }, \
+ { GPLUSPLUS_INCLUDE_DIR, 1, 1 }, \
+ { 0, 0, 0 } \
+ }
+
+/* Under FreeBSD, the normal location of the compiler back ends is the
+ /usr/libexec directory. */
+
+#define STANDARD_EXEC_PREFIX "/usr/libexec/"
+
+/* Under FreeBSD, the normal location of the various *crt*.o files is the
+ /usr/lib directory. */
+
+#define STANDARD_STARTFILE_PREFIX "/usr/lib/"
+
+/* On FreeBSD, gcc is called 'cc' */
+#define GCC_NAME "cc"
+
+/* FreeBSD is 4.4BSD derived */
+#define bsd4_4
+
+#endif /* FREEBSD_NATIVE */
+
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__ -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
+
+#undef CPP_SPEC
+#if TARGET_CPU_DEFAULT == 2
+#define CPP_SPEC "\
+%{!maout: -D__ELF__} \
+%{munderscores: -D__UNDERSCORES__} \
+%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
+%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}"
+#else
+#define CPP_SPEC "\
+%{!maout: -D__ELF__} \
+%{munderscores: -D__UNDERSCORES__} \
+%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
+%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}"
+#endif
+
+#undef CC1_SPEC
+#define CC1_SPEC "\
+%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
+%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}"
+
+#undef ASM_SPEC
+#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}"
+
+/* Like the default, except no -lg, and no -p. */
+#undef LIB_SPEC
+#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:%{!kthread:-lc}%{kthread:-lpthread -lc}}%{pthread:-lc_r}}%{pg:%{!pthread:%{!kthread:-lc_p}%{kthread:-lpthread_p -lc_p}}%{pthread:-lc_r_p}}}"
+
+/* Let gcc locate this for us according to the -m rules */
+#undef LIBGCC_SPEC
+#define LIBGCC_SPEC "%{!shared:libgcc.a%s}"
+
+/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support
+ for the special GCC options -static and -shared, which allow us to
+ link things in one of these three modes by applying the appropriate
+ combinations of options at link-time. We like to support here for
+ as many of the other GNU linker options as possible. But I don't
+ have the time to search for those flags. I am sure how to add
+ support for -soname shared_object_name. H.J.
+
+ When the -shared link option is used a final link is not being
+ done. */
+
+#undef LINK_SPEC
+#define LINK_SPEC "\
+ %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
+ %{maout: %{shared:-Bshareable} \
+ %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
+ %{pg:-Bstatic} %{Z}} \
+ %{assert*} %{R*}} \
+ %{!maout: \
+ -m elf_i386 \
+ %{Wl,*:%*} \
+ %{assert*} %{R*} %{rpath*} %{defsym*} \
+ %{shared:-Bshareable %{h*} %{soname*}} \
+ %{symbolic:-Bsymbolic} \
+ %{!shared: \
+ %{!static: \
+ %{rdynamic: -export-dynamic} \
+ %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
+ %{static:-Bstatic}}}"
+
+/* Get perform_* macros to build libgcc.a. */
+#include "i386/perform.h"
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "\
+ %{maout: %{shared:c++rt0.o%s} \
+ %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \
+ %{!maout: %{!shared: \
+ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
+ crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}"
+
+/* This goes away when the math emulator is fixed. */
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301)
+
+#define HAVE_ATEXIT
+#define HAVE_PUTENV
+
+/* to assist building libgcc2.c */
+#ifndef __ELF__
+#undef OBJECT_FORMAT_ELF
+#endif
+
+/* Defined to the name of the compiler; if using a cross compiler, the
+ Makefile should compile this file with the proper name
+ (e.g., "i386-aout-gcc"). */
+#define GCC_NAME "gcc27"
diff --git a/lang/gcc27/files/patch-Makefile.in b/lang/gcc27/files/patch-Makefile.in
new file mode 100644
index 000000000000..2b2a1260148d
--- /dev/null
+++ b/lang/gcc27/files/patch-Makefile.in
@@ -0,0 +1,70 @@
+--- Makefile.in.orig Fri Aug 8 08:58:17 1997
++++ Makefile.in Wed Mar 22 10:36:29 2000
+@@ -196,6 +196,10 @@
+ # Directory in which the compiler finds executables, libraries, etc.
+ libsubdir = $(libdir)/gcc-lib/$(target)/$(version)
+ # Directory in which the compiler finds g++ includes.
++#
++# XXX: Note that the below is blown away by ``configure''.
++# Great GNU idiots, just great documentaton.
++#
+ gxx_include_dir= $(libdir)/g++-include
+ # Directory to search for site-specific includes.
+ includedir = $(local_prefix)/include
+@@ -245,7 +249,7 @@
+ # -g1 causes output of debug info only for file-scope entities.
+ # we use this here because that should be enough, and also
+ # so that -g1 will be tested.
+-LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) -g1
++LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) -g1 -g0
+
+ # Additional options to use when compiling libgcc2.a.
+ # Some targets override this to -Iinclude
+@@ -746,6 +750,7 @@
+ libgcc1.null: $(GCC_PASSES)
+ echo "__foo () {}" > dummy.c
+ $(GCC_FOR_TARGET) $(GCC_CFLAGS) -c dummy.c
++ ld -r -x dummy$(objext); mv a.out dummy$(objext)
+ $(OLDAR) $(OLDAR_FLAGS) libgcc1.null dummy$(objext)
+ rm -f dummy$(objext) dummy.c
+
+@@ -777,6 +782,7 @@
+ $(OLDCC) $(CCLIBFLAGS) $(INCLUDES) -c -DL$${name} $(srcdir)/libgcc1.c; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ mv libgcc1$(objext) $${name}$(objext); \
++ ld -r -x $${name}$(objext); mv a.out $${name}$(objext); \
+ $(OLDAR) $(OLDAR_FLAGS) tmplibgcc1.a $${name}$(objext); \
+ rm -f $${name}$(objext); \
+ done
+@@ -796,6 +802,7 @@
+ else true; fi; \
+ $(OLDCC) $(CCLIBFLAGS) $(INCLUDES) -c $${file}; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
++ ld -r -x $${name}$(objext); mv a.out $${name}$(objext); \
+ $(OLDAR) $(OLDAR_FLAGS) tmplibgcc1.a $${name}$(objext); \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ rm -f $${name}.s $${name}$(objext); \
+@@ -825,6 +832,7 @@
+ $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} libgcc1.S; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
+ mv libgcc1$(objext) $${name}$(objext); \
++ ld -r -x $${name}$(objext); mv a.out $${name}$(objext); \
+ $(AR) $(AR_FLAGS) tmplibgcc1.a $${name}$(objext); \
+ rm -f $${name}$(objext); \
+ done
+@@ -875,6 +883,7 @@
+ $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c -DL$${name} \
+ $(srcdir)/libgcc2.c -o $${name}$(objext); \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
++ ld -r -x $${name}$(objext); mv a.out $${name}$(objext); \
+ $(AR) $(AR_FLAGS) tmplibgcc2.a $${name}$(objext); \
+ rm -f $${name}$(objext); \
+ done
+@@ -895,6 +904,7 @@
+ else true; fi; \
+ $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c $${file}; \
+ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
++ ld -r -x $${oname}$(objext); mv a.out $${oname}$(objext); \
+ $(AR) $(AR_FLAGS) tmplibgcc2.a $${oname}$(objext); \
+ rm -f $${name}.s $${oname}$(objext); \
+ else true; \
diff --git a/lang/gcc27/files/patch-c-common.c b/lang/gcc27/files/patch-c-common.c
new file mode 100644
index 000000000000..056160b10e3e
--- /dev/null
+++ b/lang/gcc27/files/patch-c-common.c
@@ -0,0 +1,226 @@
+--- c-common.c.orig Thu Oct 19 16:18:29 1995
++++ c-common.c Mon Mar 20 13:29:10 2000
+@@ -536,6 +536,7 @@
+ int format_num;
+ int first_arg_num;
+ int is_scan;
++ int null_format_ok;
+ tree argument;
+ int arg_num;
+
+@@ -550,15 +551,30 @@
+ && (!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
+ {
+- error ("unrecognized format specifier for `%s'");
++ error_with_decl (decl,
++ "unrecognized format specifier for `%s'");
+ continue;
+ }
+
+@@ -625,7 +641,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;
+ }
+
+@@ -696,6 +713,11 @@
+ } format_char_info;
+
+ static format_char_info print_char_table[] = {
++/* FreeBSD kernel extensions. */
++ { "D", 1, T_C, NULL, NULL, NULL, NULL, "-wp" },
++ { "b", 1, T_C, NULL, NULL, NULL, NULL, "-wp" },
++ { "rz", 0, T_I, T_I, T_L, NULL, NULL, "-wp0 +#" },
++#define unextended_print_char_table (print_char_table + 3)
+ { "di", 0, T_I, T_I, T_L, T_LL, T_LL, "-wp0 +" },
+ { "oxX", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, "-wp0#" },
+ { "u", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, "-wp0" },
+@@ -730,6 +752,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;
+@@ -748,15 +771,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 information for argument format checking. FUNCTION_IDENT is
+@@ -769,11 +792,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;
+ {
+@@ -797,6 +821,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;
+ }
+@@ -876,7 +901,8 @@
+ format_tree = TREE_OPERAND (format_tree, 0); /* strip coercion */
+ 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)
+@@ -1050,11 +1076,12 @@
+ 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)
+ {
+ sprintf (message,
+- "field width is not type int (arg %d)",
++ "precision is not type int (arg %d)",
+ arg_num);
+ warning (message);
+ }
+@@ -1067,6 +1094,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' || *format_chars == 'q' ||
+ *format_chars == 'L')
+ length_char = *format_chars++;
+@@ -1094,7 +1171,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;
+@@ -2048,6 +2127,12 @@
+ return real_zerop (expr) ? boolean_false_node : boolean_true_node;
+
+ case ADDR_EXPR:
++ /* If we are taking the address of a external decl, it might be zero
++ if it is weak, so we cannot optimize. */
++ if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (expr, 0))) == 'd'
++ && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
++ break;
++
+ if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
+ return build (COMPOUND_EXPR, boolean_type_node,
+ TREE_OPERAND (expr, 0), boolean_true_node);
diff --git a/lang/gcc27/files/patch-c-tree.h b/lang/gcc27/files/patch-c-tree.h
new file mode 100644
index 000000000000..b4ef9b129562
--- /dev/null
+++ b/lang/gcc27/files/patch-c-tree.h
@@ -0,0 +1,11 @@
+--- c-tree.h.orig Thu Jun 15 04:13:40 1995
++++ c-tree.h Mon Mar 20 13:29:10 2000
+@@ -159,7 +159,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). */
diff --git a/lang/gcc27/files/patch-cccp.1 b/lang/gcc27/files/patch-cccp.1
new file mode 100644
index 000000000000..e11d1e2da9fb
--- /dev/null
+++ b/lang/gcc27/files/patch-cccp.1
@@ -0,0 +1,33 @@
+--- cccp.1.orig Thu Mar 30 04:22:44 1995
++++ cccp.1 Mon Mar 20 13:29:10 2000
+@@ -1,13 +1,13 @@
+ .\" Copyright (c) 1991, 1992, 1993 Free Software Foundation \-*-Text-*-
+ .\" See section COPYING for conditions for redistribution
+-.TH cpp 1 "30apr1993" "GNU Tools" "GNU Tools"
++.TH cpp 1 "April 30, 1993" "FreeBSD" "GNU Tools"
+ .SH NAME
+-cccp, cpp \- The GNU C-Compatible Compiler Preprocessor.
++cpp \- The GNU C-Compatible Compiler Preprocessor.
+ .SH SYNOPSIS
+ .hy 0
+ .na
+ .TP
+-.B cccp
++.B cpp
+ .RB "[\|" \-$ "\|]"
+ .RB "[\|" \-A \c
+ .I predicate\c
+@@ -142,13 +142,6 @@
+ Most often when you use the C preprocessor you will not have to invoke it
+ explicitly: the C compiler will do so automatically. However, the
+ preprocessor is sometimes useful individually.
+-
+-When you call the preprocessor individually, either name
+-(\c
+-.B cpp\c
+-\& or \c
+-.B cccp\c
+-\&) will do\(em\&they are completely synonymous.
+
+ The C preprocessor expects two file names as arguments, \c
+ .I infile\c
diff --git a/lang/gcc27/files/patch-cccp.c b/lang/gcc27/files/patch-cccp.c
new file mode 100644
index 000000000000..1265960ce5c1
--- /dev/null
+++ b/lang/gcc27/files/patch-cccp.c
@@ -0,0 +1,30 @@
+--- cccp.c.orig Thu Oct 26 15:07:26 1995
++++ cccp.c Mon Mar 20 13:29:10 2000
+@@ -4923,6 +4923,7 @@
+ register char *from;
+ char *p, *dir;
+
++#ifndef FREEBSD_NATIVE
+ if (searchptr && ! searchptr->got_name_map)
+ {
+ searchptr->name_map = read_name_map (searchptr->fname
+@@ -4945,6 +4946,7 @@
+ }
+ }
+ }
++#endif
+
+ /* Try to find a mapping file for the particular directory we are
+ looking in. Thus #include <sys/types.h> will look up sys/types.h
+@@ -4981,9 +4983,11 @@
+ dir[p - filename] = '\0';
+ from = p + 1;
+ }
++#ifndef FREEBSD_NATIVE
+ for (map = read_name_map (dir); map; map = map->map_next)
+ if (! strcmp (map->map_from, from))
+ return open (map->map_to, O_RDONLY, 0666);
++#endif
+
+ return open (filename, O_RDONLY, 0666);
+ }
diff --git a/lang/gcc27/files/patch-combine.c b/lang/gcc27/files/patch-combine.c
new file mode 100644
index 000000000000..769a4a385f68
--- /dev/null
+++ b/lang/gcc27/files/patch-combine.c
@@ -0,0 +1,154 @@
+--- combine.c.orig Sun Nov 26 11:32:07 1995
++++ combine.c Mon Mar 20 13:29:10 2000
+@@ -440,7 +440,7 @@
+ static int use_crosses_set_p PROTO((rtx, int));
+ static void reg_dead_at_p_1 PROTO((rtx, rtx));
+ static int reg_dead_at_p PROTO((rtx, rtx));
+-static void move_deaths PROTO((rtx, int, rtx, rtx *));
++static void move_deaths PROTO((rtx, rtx, int, rtx, rtx *));
+ static int reg_bitfield_target_p PROTO((rtx, rtx));
+ static void distribute_notes PROTO((rtx, rtx, rtx, rtx, rtx, rtx));
+ static void distribute_links PROTO((rtx));
+@@ -2077,8 +2077,38 @@
+ undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
+ }
+
+- /* We now know that we can do this combination. Merge the insns and
+- update the status of registers and LOG_LINKS. */
++ /* We now know that we can do this combination. */
++
++ /* Earlier we did all the checks required to determine if we could
++ logically combine three insns into one. Then we determined that
++ the machine description would not let us do it in one, but would
++ let us do it in two. Thus when generating two insns, they must,
++ in general, be adjacent -- one logical instruction if you will.
++
++ We could be complicated and figure out some rules that would allow
++ us to not move the insn, but it seems likely that the scheduler will
++ do as good with no muss. */
++
++ if (newi2pat && NEXT_INSN (i2) != i3)
++ {
++ rtx n = NEXT_INSN(i2);
++ int c = INSN_CUID(i2);
++
++ /* Move the instruction */
++ reorder_insns(i2, i2, PREV_INSN (i3));
++
++ /* Update the CUID map */
++ while (1)
++ {
++ uid_cuid[INSN_UID (n)] = c;
++ if (n == i2)
++ break;
++ n = NEXT_INSN(n);
++ ++c;
++ }
++ }
++
++ /* Merge the insns and update the status of registers and LOG_LINKS. */
+
+ {
+ rtx i3notes, i2notes, i1notes = 0;
+@@ -2186,11 +2216,18 @@
+ }
+
+ /* Get death notes for everything that is now used in either I3 or
+- I2 and used to die in a previous insn. */
++ I2 and used to die in a previous insn. If we built two new
++ patterns, move from i1 to i2 then i2 to i3 so that we get the
++ proper movement on registers that i2 modifies. */
+
+- move_deaths (newpat, i1 ? INSN_CUID (i1) : INSN_CUID (i2), i3, &midnotes);
+ if (newi2pat)
+- move_deaths (newi2pat, INSN_CUID (i1), i2, &midnotes);
++ {
++ move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
++ move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
++ }
++ else
++ move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
++ i3, &midnotes);
+
+ /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
+ if (i3notes)
+@@ -10372,12 +10409,15 @@
+ TO_INSN (exclusive), put a REG_DEAD note for that register in the
+ list headed by PNOTES.
+
++ That said, don't move registers killed by maybe_kill_insn.
++
+ This is done when X is being merged by combination into TO_INSN. These
+ notes will then be distributed as needed. */
+
+ static void
+-move_deaths (x, from_cuid, to_insn, pnotes)
++move_deaths (x, maybe_kill_insn, from_cuid, to_insn, pnotes)
+ rtx x;
++ rtx maybe_kill_insn;
+ int from_cuid;
+ rtx to_insn;
+ rtx *pnotes;
+@@ -10392,6 +10432,11 @@
+ register rtx where_dead = reg_last_death[regno];
+ register rtx before_dead, after_dead;
+
++ /* Don't move the register if it gets killed in between from and to */
++ if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
++ && !reg_referenced_p (x, maybe_kill_insn))
++ return;
++
+ /* WHERE_DEAD could be a USE insn made by combine, so first we
+ make sure that we have insns with valid INSN_CUID values. */
+ before_dead = where_dead;
+@@ -10449,7 +10494,7 @@
+
+ for (i = regno + 1; i < ourend; i++)
+ move_deaths (gen_rtx (REG, reg_raw_mode[i], i),
+- from_cuid, to_insn, &oldnotes);
++ maybe_kill_insn, from_cuid, to_insn, &oldnotes);
+ }
+
+ if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
+@@ -10470,7 +10515,7 @@
+ {
+ rtx dest = SET_DEST (x);
+
+- move_deaths (SET_SRC (x), from_cuid, to_insn, pnotes);
++ move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
+
+ /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
+ that accesses one word of a multi-word item, some
+@@ -10485,7 +10530,7 @@
+ == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
+ + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
+ {
+- move_deaths (dest, from_cuid, to_insn, pnotes);
++ move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
+ return;
+ }
+
+@@ -10499,7 +10544,8 @@
+ being replaced so the old value is not used in this insn. */
+
+ if (GET_CODE (dest) == MEM)
+- move_deaths (XEXP (dest, 0), from_cuid, to_insn, pnotes);
++ move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
++ to_insn, pnotes);
+ return;
+ }
+
+@@ -10515,10 +10561,11 @@
+ {
+ register int j;
+ for (j = XVECLEN (x, i) - 1; j >= 0; j--)
+- move_deaths (XVECEXP (x, i, j), from_cuid, to_insn, pnotes);
++ move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
++ to_insn, pnotes);
+ }
+ else if (fmt[i] == 'e')
+- move_deaths (XEXP (x, i), from_cuid, to_insn, pnotes);
++ move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
+ }
+ }
+
diff --git a/lang/gcc27/files/patch-configure b/lang/gcc27/files/patch-configure
new file mode 100644
index 000000000000..e4e626e7c231
--- /dev/null
+++ b/lang/gcc27/files/patch-configure
@@ -0,0 +1,44 @@
+--- configure.orig Wed Aug 13 10:23:24 1997
++++ configure Wed Mar 22 10:37:04 2000
+@@ -80,7 +80,7 @@
+ exec_prefix='$(prefix)'
+ #
+ # The default g++ include directory is $(libdir)/g++-include.
+-gxx_include_dir='$(libdir)/g++-include'
++gxx_include_dir='$(libsubdir)/g++-include'
+
+ # Default --program-transform-name to nothing.
+ program_transform_name=
+@@ -931,9 +931,31 @@
+ # Next line turned off because both 386BSD and BSD/386 use GNU ld.
+ # use_collect2=yes
+ ;;
+- i[3456]86-*-freebsd*)
++ alpha-*-freebsd*)
++ cpu_type=alpha
++ tm_file=alpha/freebsd-elf.h
++ xm_file=alpha/xm-freebsd.h
++ # On FreeBSD, the headers are already ok.
++ fixincludes=Makefile.in
++ xmake_file=alpha/x-freebsd
++ gas=yes
++ gnu_ld=yes
++ stabs=yes
++ ;;
++ i[345]86-*-freebsd*)
+ cpu_type=i386
+ tm_file=i386/freebsd.h
++ xm_file=i386/xm-freebsd.h
++ # On FreeBSD, the headers are already ok.
++ fixincludes=Makefile.in
++ xmake_file=i386/x-freebsd
++ gas=yes
++ gnu_ld=yes
++ stabs=yes
++ ;;
++ i[3456]86-*-freebsdaout*)
++ cpu_type=i386
++ tm_file=i386/freebsd-aout.h
+ xm_file=i386/xm-freebsd.h
+ # On FreeBSD, the headers are already ok.
+ fixincludes=Makefile.in
diff --git a/lang/gcc27/files/patch-cse.c b/lang/gcc27/files/patch-cse.c
new file mode 100644
index 000000000000..6999c620c327
--- /dev/null
+++ b/lang/gcc27/files/patch-cse.c
@@ -0,0 +1,20 @@
+--- cse.c.orig Fri Aug 8 08:30:25 1997
++++ cse.c Mon Mar 20 13:29:11 2000
+@@ -7567,10 +7567,15 @@
+ and that's just as good as a structure element
+ in implying that we need not invalidate scalar variables.
+ However, we must allow QImode aliasing of scalars, because the
+- ANSI C standard allows character pointers to alias anything. */
++ ANSI C standard allows character pointers to alias anything.
++ We must also allow AND addresses, because they may generate
++ accesses outside the object being referenced. This is used to
++ generate aligned addresses from unaligned adresses, e.g., the
++ Alpha storeqi_unaligned pattern. */
+ if (! ((MEM_IN_STRUCT_P (written)
+ || GET_CODE (XEXP (written, 0)) == PLUS)
+- && GET_MODE (written) != QImode))
++ && GET_MODE (written) != QImode
++ && GET_CODE (XEXP (written, 0)) != AND))
+ writes_ptr->all = 1;
+ writes_ptr->nonscalar = 1;
+ }
diff --git a/lang/gcc27/files/patch-dbxout.c b/lang/gcc27/files/patch-dbxout.c
new file mode 100644
index 000000000000..f953388faf19
--- /dev/null
+++ b/lang/gcc27/files/patch-dbxout.c
@@ -0,0 +1,26 @@
+--- dbxout.c.orig Thu Jun 15 04:27:10 1995
++++ dbxout.c Mon Mar 20 13:29:11 2000
+@@ -2494,6 +2494,11 @@
+ {
+ #ifdef DBX_FUNCTION_FIRST
+ dbxout_really_begin_function (decl);
++#else
++#ifdef DBX_CHECK_FUNCTION_FIRST
++ if (DBX_CHECK_FUNCTION_FIRST)
++ dbxout_really_begin_function (decl);
++#endif
+ #endif
+ }
+
+@@ -2509,6 +2514,11 @@
+ {
+ #ifndef DBX_FUNCTION_FIRST
+ dbxout_really_begin_function (decl);
++#else
++#ifdef DBX_CHECK_FUNCTION_FIRST
++ if (!(DBX_CHECK_FUNCTION_FIRST))
++ dbxout_really_begin_function (decl);
++#endif
+ #endif
+ dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
+ #ifdef DBX_OUTPUT_FUNCTION_END
diff --git a/lang/gcc27/files/patch-decl.c b/lang/gcc27/files/patch-decl.c
new file mode 100644
index 000000000000..371a50eefc14
--- /dev/null
+++ b/lang/gcc27/files/patch-decl.c
@@ -0,0 +1,35 @@
+--- cp/decl.c.orig Mon Oct 23 15:25:44 1995
++++ cp/decl.c Mon Mar 20 13:29:12 2000
+@@ -1486,7 +1486,7 @@
+ tree t;
+ int i = 0, len;
+ fprintf (stderr, " blocks=");
+- fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks);
++ fprintf (stderr, HOST_PTR_PRINTF, (void *) lvl->blocks);
+ fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d",
+ list_length (lvl->incomplete), lvl->parm_flag, lvl->keep);
+ if (lvl->tag_transparent)
+@@ -1609,7 +1609,7 @@
+ for (level = stack; level != global_binding_level; level = level->level_chain)
+ {
+ fprintf (stderr, "binding level ");
+- fprintf (stderr, HOST_PTR_PRINTF, level);
++ fprintf (stderr, HOST_PTR_PRINTF, (void *) level);
+ fprintf (stderr, "\n");
+ print_binding_level (level);
+ }
+@@ -1620,11 +1620,11 @@
+ {
+ struct binding_level *b;
+ fprintf (stderr, "current_binding_level=");
+- fprintf (stderr, HOST_PTR_PRINTF, current_binding_level);
++ fprintf (stderr, HOST_PTR_PRINTF, (void *) current_binding_level);
+ fprintf (stderr, "\nclass_binding_level=");
+- fprintf (stderr, HOST_PTR_PRINTF, class_binding_level);
++ fprintf (stderr, HOST_PTR_PRINTF, (void *) class_binding_level);
+ fprintf (stderr, "\nglobal_binding_level=");
+- fprintf (stderr, HOST_PTR_PRINTF, global_binding_level);
++ fprintf (stderr, HOST_PTR_PRINTF, (void *) global_binding_level);
+ fprintf (stderr, "\n");
+ if (class_binding_level)
+ {
diff --git a/lang/gcc27/files/patch-dwarfout.c b/lang/gcc27/files/patch-dwarfout.c
new file mode 100644
index 000000000000..e34ad028983f
--- /dev/null
+++ b/lang/gcc27/files/patch-dwarfout.c
@@ -0,0 +1,20 @@
+--- dwarfout.c.orig Thu Oct 26 18:40:07 1995
++++ dwarfout.c Mon Mar 20 13:29:11 2000
+@@ -1095,7 +1095,7 @@
+ byte |= 0x80;
+ fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) byte);
+ if (flag_verbose_asm && value == 0)
+- fprintf (asm_out_file, "\t%s ULEB128 number - value = %u",
++ fprintf (asm_out_file, "\t%s ULEB128 number - value = %lu",
+ ASM_COMMENT_START, orig_value);
+ fputc ('\n', asm_out_file);
+ }
+@@ -1127,7 +1127,7 @@
+ }
+ fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) byte);
+ if (flag_verbose_asm && more == 0)
+- fprintf (asm_out_file, "\t%s SLEB128 number - value = %d",
++ fprintf (asm_out_file, "\t%s SLEB128 number - value = %ld",
+ ASM_COMMENT_START, orig_value);
+ fputc ('\n', asm_out_file);
+ }
diff --git a/lang/gcc27/files/patch-emit-rtl.c b/lang/gcc27/files/patch-emit-rtl.c
new file mode 100644
index 000000000000..47fc792c8c73
--- /dev/null
+++ b/lang/gcc27/files/patch-emit-rtl.c
@@ -0,0 +1,37 @@
+--- emit-rtl.c.orig Thu Sep 14 13:09:30 1995
++++ emit-rtl.c Mon Mar 20 13:29:11 2000
+@@ -159,6 +159,10 @@
+ rtx static_chain_incoming_rtx; /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */
+ rtx pic_offset_table_rtx; /* (REG:Pmode PIC_OFFSET_TABLE_REGNUM) */
+
++/* This is used to implement __builtin_return_address for some machines.
++ See for instance the MIPS port. */
++rtx return_address_pointer_rtx; /* (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM) */
++
+ rtx virtual_incoming_args_rtx; /* (REG:Pmode VIRTUAL_INCOMING_ARGS_REGNUM) */
+ rtx virtual_stack_vars_rtx; /* (REG:Pmode VIRTUAL_STACK_VARS_REGNUM) */
+ rtx virtual_stack_dynamic_rtx; /* (REG:Pmode VIRTUAL_STACK_DYNAMIC_REGNUM) */
+@@ -345,6 +349,11 @@
+ && ! reload_in_progress)
+ return arg_pointer_rtx;
+ #endif
++#ifdef RETURN_ADDRESS_POINTER_REGNUM
++ if (return_address_pointer_rtx && regno == RETURN_ADDRESS_POINTER_REGNUM
++ && mode == Pmode && ! reload_in_progress)
++ return return_address_pointer_rtx;
++#endif
+ if (stack_pointer_rtx && regno == STACK_POINTER_REGNUM && mode == Pmode
+ && ! reload_in_progress)
+ return stack_pointer_rtx;
+@@ -3391,6 +3400,11 @@
+ arg_pointer_rtx = stack_pointer_rtx;
+ else
+ arg_pointer_rtx = gen_rtx (REG, Pmode, ARG_POINTER_REGNUM);
++
++#ifdef RETURN_ADDRESS_POINTER_REGNUM
++ return_address_pointer_rtx = gen_rtx (REG, Pmode,
++ RETURN_ADDRESS_POINTER_REGNUM);
++#endif
+
+ /* Create the virtual registers. Do so here since the following objects
+ might reference them. */
diff --git a/lang/gcc27/files/patch-except.c b/lang/gcc27/files/patch-except.c
new file mode 100644
index 000000000000..be774facd771
--- /dev/null
+++ b/lang/gcc27/files/patch-except.c
@@ -0,0 +1,37 @@
+--- cp/except.c.orig Wed Oct 11 19:29:08 1995
++++ cp/except.c Mon Mar 20 13:29:12 2000
+@@ -148,6 +148,9 @@
+ void
+ exception_section ()
+ {
++#ifdef EXCEPTION_SECTION_FUNCTION
++ EXCEPTION_SECTION_FUNCTION;
++#else
+ #ifdef ASM_OUTPUT_SECTION_NAME
+ named_section (NULL_TREE, ".gcc_except_table");
+ #else
+@@ -160,6 +163,7 @@
+ readonly_data_section ();
+ #endif
+ #endif
++#endif
+ }
+
+
+@@ -1614,9 +1618,15 @@
+ void
+ register_exception_table ()
+ {
++ rtx addr = gen_rtx (SYMBOL_REF, Pmode, "__EXCEPTION_TABLE__");
++
++#ifdef MARK_LOCAL_ADDRESS
++ MARK_LOCAL_ADDRESS(addr);
++#endif
++
+ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__register_exceptions"), 0,
+ VOIDmode, 1,
+- gen_rtx (SYMBOL_REF, Pmode, "__EXCEPTION_TABLE__"),
++ addr,
+ Pmode);
+ }
+
diff --git a/lang/gcc27/files/patch-extend.texi b/lang/gcc27/files/patch-extend.texi
new file mode 100644
index 000000000000..5a6c1963e6b0
--- /dev/null
+++ b/lang/gcc27/files/patch-extend.texi
@@ -0,0 +1,25 @@
+--- extend.texi.orig Fri Sep 1 22:46:47 1995
++++ extend.texi Mon Mar 20 13:29:11 2000
+@@ -1394,13 +1394,15 @@
+ @code{my_format}.
+
+ The parameter @var{archetype} determines how the format string is
+-interpreted, and should be either @code{printf} or @code{scanf}. The
+-parameter @var{string-index} specifies which argument is the format
+-string argument (starting from 1), while @var{first-to-check} is the
+-number of the first argument to check against the format string. For
+-functions where the arguments are not available to be checked (such as
+-@code{vprintf}), specify the third parameter as zero. In this case the
+-compiler only checks the format string for consistency.
++interpreted, and should be @code{printf}, @code{printf0}, or
++@code{scanf}. @code{printf0} allows the format string to be a null
++pointer, while @code{printf} does not. The parameter @var{string-index}
++specifies which argument is the format string argument (starting
++from 1), while @var{first-to-check} is the number of the first
++argument to check against the format string. For functions where
++the arguments are not available to be checked (such as @code{vprintf}),
++specify the third parameter as zero. In this case the compiler
++only checks the format string for consistency.
+
+ In the example above, the format string (@code{my_format}) is the second
+ argument of the function @code{my_print}, and the arguments to check
diff --git a/lang/gcc27/files/patch-final.c b/lang/gcc27/files/patch-final.c
new file mode 100644
index 000000000000..d930738eac1f
--- /dev/null
+++ b/lang/gcc27/files/patch-final.c
@@ -0,0 +1,60 @@
+--- final.c.orig Sun Nov 26 10:50:00 1995
++++ final.c Mon Mar 20 13:29:11 2000
+@@ -345,6 +345,8 @@
+ /* zero word */
+ assemble_integer (const0_rtx, UNITS_PER_WORD, 1);
+
++ fprintf(asm_out_file,".stabs \"bbset\", 25, 0, 0, LPBX0\n");
++
+ /* address of filename */
+ ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 1);
+ assemble_integer (gen_rtx (SYMBOL_REF, Pmode, name), UNITS_PER_WORD, 1);
+@@ -914,6 +916,9 @@
+ leaf_renumber_regs (first);
+ #endif
+
++ if (profile_block_flag)
++ add_bb (file);
++
+ /* The Sun386i and perhaps other machines don't work right
+ if the profiling code comes after the prologue. */
+ #ifdef PROFILE_BEFORE_PROLOGUE
+@@ -971,14 +976,18 @@
+ profile_function (file)
+ FILE *file;
+ {
++#ifndef NO_PROFILE_DATA
+ int align = MIN (BIGGEST_ALIGNMENT, POINTER_SIZE);
++#endif /* not NO_PROFILE_DATA */
+ int sval = current_function_returns_struct;
+ int cxt = current_function_needs_context;
+
++#ifndef NO_PROFILE_DATA
+ data_section ();
+ ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
+ ASM_OUTPUT_INTERNAL_LABEL (file, "LP", profile_label_no);
+ assemble_integer (const0_rtx, POINTER_SIZE / BITS_PER_UNIT, 1);
++#endif /* not NO_PROFILE_DATA */
+
+ text_section ();
+
+@@ -1066,6 +1075,9 @@
+ FUNCTION_EPILOGUE (file, get_frame_size ());
+ #endif
+
++ if (profile_block_flag)
++ add_bb (file);
++
+ #ifdef SDB_DEBUGGING_INFO
+ if (write_symbols == SDB_DEBUG)
+ sdbout_end_epilogue ();
+@@ -1487,6 +1499,9 @@
+ if (prescan > 0)
+ break;
+ new_block = 1;
++#ifdef FINAL_PRESCAN_INSN
++ FINAL_PRESCAN_INSN (insn, NULL_RTX, 0);
++#endif
+ #ifdef SDB_DEBUGGING_INFO
+ if (write_symbols == SDB_DEBUG && LABEL_NAME (insn))
+ sdbout_label (insn);
diff --git a/lang/gcc27/files/patch-flags.h b/lang/gcc27/files/patch-flags.h
new file mode 100644
index 000000000000..83598ef23ed8
--- /dev/null
+++ b/lang/gcc27/files/patch-flags.h
@@ -0,0 +1,13 @@
+--- flags.h.orig Thu Jun 15 04:34:11 1995
++++ flags.h Mon Mar 20 13:29:11 2000
+@@ -338,6 +338,10 @@
+
+ /* Tag all structures with __attribute__(packed) */
+ extern int flag_pack_struct;
++
++/* Nonzero means that -Wformat accepts certain non-ANSI formats. */
++
++extern int flag_format_extensions;
+
+ /* Other basic status info about current function. */
+
diff --git a/lang/gcc27/files/patch-function.c b/lang/gcc27/files/patch-function.c
new file mode 100644
index 000000000000..300b54d9e14e
--- /dev/null
+++ b/lang/gcc27/files/patch-function.c
@@ -0,0 +1,34 @@
+--- function.c.orig Wed Aug 13 10:23:26 1997
++++ function.c Mon Mar 20 13:29:11 2000
+@@ -4887,18 +4887,23 @@
+ #define HAS_INIT_SECTION
+ #endif
+
++#ifndef GEN_CALL__MAIN
++#ifndef HAS_INIT_SECTION
++#define GEN_CALL__MAIN \
++ do { \
++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \
++ VOIDmode, 0); \
++ } while (0)
++#endif
++#endif
++
+ void
+ expand_main_function ()
+ {
++#ifdef GEN_CALL__MAIN
+ if (!output_bytecode)
+- {
+- /* The zero below avoids a possible parse error */
+- 0;
+-#if !defined (HAS_INIT_SECTION)
+- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0,
+- VOIDmode, 0);
+-#endif /* not HAS_INIT_SECTION */
+- }
++ GEN_CALL__MAIN;
++#endif
+ }
+
+ extern struct obstack permanent_obstack;
diff --git a/lang/gcc27/files/patch-g++.c b/lang/gcc27/files/patch-g++.c
new file mode 100644
index 000000000000..d6e2672d4b6c
--- /dev/null
+++ b/lang/gcc27/files/patch-g++.c
@@ -0,0 +1,11 @@
+--- cp/g++.c.orig Mon Nov 20 14:08:53 1995
++++ cp/g++.c Mon Mar 20 13:29:12 2000
+@@ -415,7 +415,7 @@
+ programname = p;
+
+ if (argc == 1)
+- fatal ("No input files specified.\n");
++ fatal ("No input files specified");
+
+ #ifndef __MSDOS__
+ /* We do a little magic to find out where the main gcc executable
diff --git a/lang/gcc27/files/patch-gcc.1 b/lang/gcc27/files/patch-gcc.1
new file mode 100644
index 000000000000..1b52da4886b7
--- /dev/null
+++ b/lang/gcc27/files/patch-gcc.1
@@ -0,0 +1,137 @@
+--- gcc.1.orig Sun Nov 26 11:11:33 1995
++++ gcc.1 Mon Mar 20 13:29:11 2000
+@@ -438,7 +438,17 @@
+ \-m486
+ \-mno\-486
+ \-msoft\-float
++\-mrtd
++\-mregparm
++\-msvr3\-shlib
++\-mno\-ieee\-fp
+ \-mno\-fp\-ret\-in\-387
++\-mfancy\-math\-387
++\-mno\-wide\-multiply
++\-mdebug\-addr
++\-mno\-move
++\-mprofiler\-epilogue
++\-reg\-alloc=LIST
+ .Sp
+ .I HPPA Options
+ .br
+@@ -511,6 +521,16 @@
+ \-fverbose\-asm
+ .ad b
+ .hy 1
++.SH FreeBSD SPECIFIC OPTIONS
++.TP
++.BI "\-pthread"
++Link a user-threaded process against libc_r instead of libc. Objects linked
++into user-threaded processes should be compiled with -D_THREAD_SAFE.
++.TP
++.BI "\-kthread"
++Link a kernel-threaded process against libpthread in addition to libc.
++Objects linked into kernel-threaded processes should be compiled with
++-D_THREAD_SAFE.
+ .SH OVERALL OPTIONS
+ .TP
+ .BI "\-x " "language"
+@@ -1179,13 +1199,17 @@
+ .B \-M\c
+ \&\|' but the output mentions only the user header files
+ included with `\|\c
+-.B #include "\c
++.B
++#include "\c
+ .I file\c
++.B
+ \&"\c
+ \&\|'. System header files
+ included with `\|\c
+-.B #include <\c
++.B
++#include <\c
+ .I file\c
++.B
+ \&>\c
+ \&\|' are omitted.
+ .TP
+@@ -1462,8 +1486,10 @@
+ \&"\c
+ \&\|';
+ they are not searched for `\|\c
+-.B #include <\c
++.B
++#include <\c
+ .I file\c
++.B
+ \&>\c
+ \&\|'.
+ .Sp
+@@ -1961,7 +1987,7 @@
+ .B \-Wnested-externs
+ Warn if an \c
+ .B extern\c
+-\& declaration is encountered within an function.
++\& declaration is encountered within a function.
+ .TP
+ .B \-Wenum\-clash
+ Warn about conversion between different enumeration types (C++ only).
+@@ -2909,17 +2935,17 @@
+ .B \-mcypress
+ .TP
+ .B \-msupersparc
+-These two options select the processor for which the code is optimised.
++These two options select the processor for which the code is optimized.
+ .Sp
+ With
+ .B \-mcypress
+-(the default), the compiler optimises code for the Cypress CY7C602 chip, as
++(the default), the compiler optimizes code for the Cypress CY7C602 chip, as
+ used in the SparcStation/SparcServer 3xx series. This is also appropriate for
+ the older SparcStation 1, 2, IPX etc.
+ .Sp
+ With
+ .B \-msupersparc
+-the compiler optimises code for the SuperSparc cpu, as used in the SparcStation
++the compiler optimizes code for the SuperSparc cpu, as used in the SparcStation
+ 10, 1000 and 2000 series. This flag also enables use of the full SPARC v8
+ instruction set.
+ .PP
+@@ -3490,7 +3516,7 @@
+ value.
+ .TP
+ .B \-nocpp
+-Tell the MIPS assembler to not run it's preprocessor over user
++Tell the MIPS assembler to not run its preprocessor over user
+ assembler files (with a `\|\c
+ .B .s\c
+ \&\|' suffix) when assembling them.
+@@ -3498,6 +3524,7 @@
+ These `\|\c
+ .B \-m\c
+ \&\|' options are defined for the Intel 80386 family of computers:
++.TP
+ .B \-m486
+ .TP
+ .B \-mno\-486
+@@ -3534,6 +3561,11 @@
+ .B \-mno-fp-ret-in-387\c
+ \&\|' causes such values to be returned
+ in ordinary CPU registers instead.
++.TP
++.B \-mprofiler-epilogue
++.TP
++.B \-mno-profiler-epilogue
++Generate extra code to write profile information for function exits.
+ .PP
+ These `\|\c
+ .B \-m\c
+@@ -4069,7 +4101,7 @@
+ .B /tmp\c
+ \&).
+ .SH "SEE ALSO"
+-cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
++cpp(1), as(1), ld(1), gdb(1).
+ .br
+ .RB "`\|" gcc "\|', `\|" cpp \|',
+ .RB "`\|" as "\|', `\|" ld \|',
diff --git a/lang/gcc27/files/patch-gcc.c b/lang/gcc27/files/patch-gcc.c
new file mode 100644
index 000000000000..bd00b5c711d7
--- /dev/null
+++ b/lang/gcc27/files/patch-gcc.c
@@ -0,0 +1,229 @@
+--- gcc.c.orig Tue Jun 24 11:42:50 1997
++++ gcc.c Mon Mar 20 13:29:11 2000
+@@ -32,6 +32,7 @@
+ compilation is specified by a string called a "spec". */
+
+ #include <sys/types.h>
++#include <sys/wait.h>
+ #include <ctype.h>
+ #include <signal.h>
+ #include <sys/stat.h>
+@@ -53,6 +54,9 @@
+ #include <varargs.h>
+ #endif
+ #include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <string.h>
+
+ /* Include multi-lib information. */
+ #include "multilib.h"
+@@ -1620,7 +1624,6 @@
+ char **envp;
+ int num_envs = 0;
+ int name_len = 1;
+- int str_len = strlen (str);
+ char *p = str;
+ int ch;
+
+@@ -2095,7 +2098,7 @@
+ /* Exec the program. */
+ (*func) (program, argv);
+ perror_exec (program);
+- exit (-1);
++ _exit (1);
+ /* NOTREACHED */
+ return 0;
+
+@@ -2324,6 +2327,10 @@
+ char *language;
+ };
+
++#if defined(FREEBSD_NATIVE) && defined(__i386__)
++static int objformat_aout = 0;
++#endif
++
+ /* Also a vector of input files specified. */
+
+ static struct infile *infiles;
+@@ -2469,6 +2476,39 @@
+ }
+ }
+
++#if defined(FREEBSD_NATIVE) && defined(__i386__)
++ {
++ /* first hint is /etc/objformat */
++ FILE *fp = fopen("/etc/objformat", "r");
++ if (fp) {
++ char buf[1024];
++ buf[1023] = '\0';
++ while (fgets(buf, sizeof(buf) - 1, fp) != NULL) {
++ i = strlen(buf);
++ if (buf[i - 1] == '\n')
++ buf[i - 1] = '\0';
++ if (strcmp(buf, "OBJFORMAT=aout") == 0)
++ objformat_aout = 1;
++ else if (strcmp(buf, "OBJFORMAT=elf") == 0)
++ objformat_aout = 0;
++ else
++ fprintf(stderr, "Unrecognized line in /etc/objformat: %s\n", buf);
++ }
++ fclose(fp);
++ }
++ /* but the user $OBJFORMAT overrides system default */
++ temp = getenv("OBJFORMAT");
++ if (temp) {
++ if (strcmp(temp, "aout") == 0)
++ objformat_aout = 1;
++ else if (strcmp(temp, "elf") == 0)
++ objformat_aout = 0;
++ else
++ fprintf(stderr, "Unrecognized value of $OBJFORMAT: %s\n", temp);
++ }
++ }
++#endif
++
+ /* Convert new-style -- options to old-style. */
+ translate_options (&argc, &argv);
+
+@@ -2478,6 +2518,19 @@
+
+ for (i = 1; i < argc; i++)
+ {
++#if defined(FREEBSD_NATIVE) && defined(__i386__)
++ /* .. and command line args override all */
++ if (strcmp (argv[i], "-aout") == 0)
++ {
++ objformat_aout = 1;
++ continue;
++ }
++ else if (strcmp (argv[i], "-elf") == 0)
++ {
++ objformat_aout = 0;
++ continue;
++ }
++#endif
+ if (! strcmp (argv[i], "-dumpspecs"))
+ {
+ printf ("*asm:\n%s\n\n", asm_spec);
+@@ -2703,6 +2756,18 @@
+ (such as cpp) rather than those of the host system. */
+ /* Use 2 as fourth arg meaning try just the machine as a suffix,
+ as well as trying the machine and the version. */
++#ifdef FREEBSD_NATIVE
++#if defined(__i386__)
++ if (objformat_aout) {
++ n_switches++; /* add implied -maout */
++ add_prefix (&exec_prefixes, "/usr/libexec/aout/", 0, 0, NULL_PTR);
++ } else
++ add_prefix (&exec_prefixes, "/usr/libexec/elf/", 0, 0, NULL_PTR);
++#endif
++ add_prefix (&exec_prefixes, "/usr/libexec/", 0, 0, NULL_PTR);
++ add_prefix (&exec_prefixes, "/usr/bin/", 0, 0, NULL_PTR);
++ add_prefix (&startfile_prefixes, "/usr/libdata/gcc/", 0, 0, NULL_PTR);
++#else /* not FREEBSD_NATIVE */
+ #ifndef OS2
+ add_prefix (&exec_prefixes, standard_exec_prefix, 0, 2, NULL_PTR);
+ add_prefix (&exec_prefixes, standard_exec_prefix_1, 0, 2, NULL_PTR);
+@@ -2710,6 +2775,7 @@
+
+ add_prefix (&startfile_prefixes, standard_exec_prefix, 0, 1, NULL_PTR);
+ add_prefix (&startfile_prefixes, standard_exec_prefix_1, 0, 1, NULL_PTR);
++#endif /* FREEBSD_NATIVE */
+
+ tooldir_prefix = concat3 (tooldir_base_prefix, spec_machine,
+ dir_separator_str);
+@@ -2744,12 +2810,14 @@
+ dir_separator_str, tooldir_prefix);
+ }
+
++#ifndef FREEBSD_NATIVE
+ add_prefix (&exec_prefixes,
+ concat3 (tooldir_prefix, "bin", dir_separator_str),
+ 0, 0, NULL_PTR);
+ add_prefix (&startfile_prefixes,
+ concat3 (tooldir_prefix, "lib", dir_separator_str),
+ 0, 0, NULL_PTR);
++#endif /* FREEBSD_NATIVE */
+
+ /* More prefixes are enabled in main, after we read the specs file
+ and determine whether this is cross-compilation or not. */
+@@ -2768,6 +2836,19 @@
+ to the copy in the vector of switches.
+ Store all the infiles in their vector. */
+
++#if defined(FREEBSD_NATIVE) && defined(__i386__)
++ if (objformat_aout == 1) {
++ switches[n_switches].part1 = "maout";
++ switches[n_switches].args = 0;
++ switches[n_switches].live_cond = 0;
++ switches[n_switches].valid = 0;
++ n_switches++;
++ putenv("OBJFORMAT=aout");
++ } else {
++ putenv("OBJFORMAT=elf");
++ }
++#endif
++
+ for (i = 1; i < argc; i++)
+ {
+ /* Just skip the switches that were handled by the preceding loop. */
+@@ -2787,6 +2868,12 @@
+ ;
+ else if (! strcmp (argv[i], "-print-multi-directory"))
+ ;
++#if defined(FREEBSD_NATIVE) && defined(__i386__)
++ else if (! strcmp (argv[i], "-aout"))
++ ;
++ else if (! strcmp (argv[i], "-elf"))
++ ;
++#endif
+ else if (argv[i][0] == '+' && argv[i][1] == 'e')
+ {
+ /* Compensate for the +e options to the C++ front-end;
+@@ -3770,7 +3857,7 @@
+ {
+ int c1 = *p++; /* Select first or second version number. */
+ char *v = compiler_version;
+- char *q, *copy;
++ char *q;
+ /* If desired, advance to second version number. */
+ if (c1 == '2')
+ {
+@@ -4266,8 +4353,10 @@
+
+ /* Read specs from a file if there is one. */
+
++#ifndef FREEBSD_NATIVE
+ machine_suffix = concat4 (spec_machine, dir_separator_str,
+ spec_version, dir_separator_str);
++#endif
+ just_machine_suffix = concat (spec_machine, dir_separator_str);
+
+ specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
+@@ -4326,6 +4415,7 @@
+ 0, 0, NULL_PTR);
+ }
+
++#ifndef FREEBSD_NATIVE
+ add_prefix (&startfile_prefixes, standard_startfile_prefix_1, 0, 0,
+ NULL_PTR);
+ add_prefix (&startfile_prefixes, standard_startfile_prefix_2, 0, 0,
+@@ -4333,6 +4423,8 @@
+ #if 0 /* Can cause surprises, and one can use -B./ instead. */
+ add_prefix (&startfile_prefixes, "./", 0, 1, NULL_PTR);
+ #endif
++#endif /* FREEBSD_NATIVE */
++
+ }
+ else
+ {
+@@ -4423,7 +4515,7 @@
+ }
+
+ if (n_infiles == 0)
+- fatal ("No input files");
++ fatal ("No input files specified");
+
+ /* Make a place to record the compiler output file names
+ that correspond to the input files. */
diff --git a/lang/gcc27/files/patch-glimits.h b/lang/gcc27/files/patch-glimits.h
new file mode 100644
index 000000000000..4c1f7dd5462d
--- /dev/null
+++ b/lang/gcc27/files/patch-glimits.h
@@ -0,0 +1,15 @@
+--- glimits.h.orig Wed Sep 29 14:30:54 1993
++++ glimits.h Mon Mar 20 13:29:11 2000
+@@ -63,7 +63,11 @@
+ /* Minimum and maximum values a `signed long int' can hold.
+ (Same as `int'). */
+ #ifndef __LONG_MAX__
+-#define __LONG_MAX__ 2147483647L
++# ifndef __alpha__
++# define __LONG_MAX__ 2147483647L
++# else
++# define __LONG_MAX__ 9223372036854775807L
++# endif /* __alpha__ */
+ #endif
+ #undef LONG_MIN
+ #define LONG_MIN (-LONG_MAX-1)
diff --git a/lang/gcc27/files/patch-gxxint.texi b/lang/gcc27/files/patch-gxxint.texi
new file mode 100644
index 000000000000..fd53d384d3b6
--- /dev/null
+++ b/lang/gcc27/files/patch-gxxint.texi
@@ -0,0 +1,73 @@
+--- cp/gxxint.texi.orig Wed Oct 11 19:29:39 1995
++++ cp/gxxint.texi Mon Mar 20 13:29:12 2000
+@@ -1285,13 +1285,13 @@
+ copy value onto heap
+ jump throw (Ln, id, address of copy of value on heap)
+
+- try {
++ try @{
+ +Lstart: the start of the main EH region
+ |... ...
+ +Lend: the end of the main EH region
+- } catch (T o) {
++ @} catch (T o) @{
+ ...1
+- }
++ @}
+ Lresume:
+ nop used to make sure there is something before
+ the next region ends, if there is one
+@@ -1312,7 +1312,7 @@
+ [
+ [
+ call throw_type_match
+- if (eq) {
++ if (eq) @{
+ ] these lines disappear when there is no catch condition
+ +Lsregion2:
+ | ...1
+@@ -1320,7 +1320,7 @@
+ |Lhandler: handler for the region Lsregion2-Leregion2
+ | rethrow (Lresume, same id, same obj);
+ +Leregion2
+- }
++ @}
+ ] there are zero or more of these sections, depending upon how many
+ catch clauses there are
+ ----------------------------- expand_end_all_catch --------------------------
+@@ -1336,7 +1336,7 @@
+
+ start_all_catch emits labels: Lresume,
+
+-#end example
++@end example
+
+ The __unwind_function takes a pointer to the throw handler, and is
+ expected to pop the stack frame that was built to call it, as well as
+@@ -1346,7 +1346,7 @@
+ into. The way I normally start is to compile:
+
+ void *g;
+- foo(void* a) { g = a; }
++ foo(void* a) @{ g = a; @}
+
+ with -S, and change the thing that alters the PC (return, or ret
+ usually) to not alter the PC, making sure to leave all other semantics
+@@ -1453,7 +1453,7 @@
+ should also be removed, although not doing this is harmless in terms of
+ semantics.
+
+-#end itemize
++@end itemize
+
+ The above is not meant to be exhaustive, but does include all things I
+ have thought of so far. I am sure other limitations exist.
+@@ -1515,7 +1515,7 @@
+
+ The eh archive (~mrs/eh) might be good reading for understanding the Ada
+ perspective, and some of kenners mindset, and a detailed explanation
+-(Message-Id: <9308301130.AA10543@vlsi1.ultra.nyu.edu>) of the concepts
++(Message-Id: <9308301130.AA10543@@vlsi1.ultra.nyu.edu>) of the concepts
+ involved.
+
+ Here is a guide to existing backend type code. It is all in
diff --git a/lang/gcc27/files/patch-i386.c b/lang/gcc27/files/patch-i386.c
new file mode 100644
index 000000000000..46a5c61a4ae9
--- /dev/null
+++ b/lang/gcc27/files/patch-i386.c
@@ -0,0 +1,62 @@
+--- config/i386/i386.c.orig Sun Oct 22 04:13:21 1995
++++ config/i386/i386.c Mon Mar 20 13:29:12 2000
+@@ -1460,7 +1460,8 @@
+ int limit;
+ rtx xops[4];
+ int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
+- || current_function_uses_const_pool);
++ || current_function_uses_const_pool
++ || profile_flag || profile_block_flag);
+
+ xops[0] = stack_pointer_rtx;
+ xops[1] = frame_pointer_rtx;
+@@ -1521,8 +1522,16 @@
+ int nregs = 0;
+ int reglimit = (frame_pointer_needed
+ ? FRAME_POINTER_REGNUM : STACK_POINTER_REGNUM);
+- int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
+- || current_function_uses_const_pool);
++
++#ifdef FUNCTION_PROFILER_EPILOGUE
++ if (profile_flag)
++ return 0;
++#endif
++
++ if (flag_pic && (current_function_uses_pic_offset_table
++ || current_function_uses_const_pool
++ || profile_flag || profile_block_flag))
++ return 0;
+
+ #ifdef NON_SAVING_SETJMP
+ if (NON_SAVING_SETJMP && current_function_calls_setjmp)
+@@ -1533,8 +1542,7 @@
+ return 0;
+
+ for (regno = reglimit - 1; regno >= 0; regno--)
+- if ((regs_ever_live[regno] && ! call_used_regs[regno])
+- || (regno == PIC_OFFSET_TABLE_REGNUM && pic_reg_used))
++ if (regs_ever_live[regno] && ! call_used_regs[regno])
+ nregs++;
+
+ return nregs == 0 || ! frame_pointer_needed;
+@@ -1557,6 +1565,11 @@
+ int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
+ || current_function_uses_const_pool);
+
++#ifdef FUNCTION_PROFILER_EPILOGUE
++ if (profile_flag)
++ FUNCTION_PROFILER_EPILOGUE (file);
++#endif
++
+ /* Compute the number of registers to pop */
+
+ limit = (frame_pointer_needed
+@@ -2438,7 +2451,7 @@
+ REAL_VALUE_FROM_CONST_DOUBLE (r, x);
+ REAL_VALUE_TO_TARGET_SINGLE (r, l);
+ PRINT_IMMED_PREFIX (file);
+- fprintf (file, "0x%x", l);
++ fprintf (file, "0x%lx", l);
+ }
+ /* These float cases don't actually occur as immediate operands. */
+ else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) == DFmode)
diff --git a/lang/gcc27/files/patch-i386.h b/lang/gcc27/files/patch-i386.h
new file mode 100644
index 000000000000..258b948c2d41
--- /dev/null
+++ b/lang/gcc27/files/patch-i386.h
@@ -0,0 +1,53 @@
+--- config/i386/i386.h.orig Fri Sep 22 15:42:57 1995
++++ config/i386/i386.h Mon Mar 20 13:29:12 2000
+@@ -1286,6 +1286,22 @@
+ } \
+ while (0)
+
++/* Define this macro if a SYMBOL_REF representing a non-global
++ address must be marked specially. This is called for
++ compiler-generated local symbols, such as "__EXCEPTION_TABLE__".
++
++ On i386, if using PIC, we use this to set the rtx's
++ SYMBOL_REF_FLAG, so that we may access it directly as
++ an offset from the GOT register. */
++
++#define MARK_LOCAL_ADDRESS(X) \
++do \
++ { \
++ if (flag_pic && GET_CODE (X) == SYMBOL_REF) \
++ SYMBOL_REF_FLAG (X) = 1; \
++ } \
++while (0)
++
+ /* Initialize data used by insn expanders. This is called from
+ init_emit, once for each function, before code is generated.
+ For 386, clear stack slot assignments remembered from previous
+@@ -1621,7 +1637,7 @@
+ do { long l[2]; \
+ REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \
+ if (sizeof (int) == sizeof (long)) \
+- fprintf (FILE, "%s 0x%x,0x%x\n", ASM_LONG, l[0], l[1]); \
++ fprintf (FILE, "%s 0x%x,0x%x\n", ASM_LONG, (int) l[0], (int) l[1]); \
+ else \
+ fprintf (FILE, "%s 0x%lx,0x%lx\n", ASM_LONG, l[0], l[1]); \
+ } while (0)
+@@ -1633,7 +1649,8 @@
+ do { long l[3]; \
+ REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l); \
+ if (sizeof (int) == sizeof (long)) \
+- fprintf (FILE, "%s 0x%x,0x%x,0x%x\n", ASM_LONG, l[0], l[1], l[2]); \
++ fprintf (FILE, "%s 0x%x,0x%x,0x%x\n", ASM_LONG, \
++ (int) l[0], (int) l[1], (int) l[2]); \
+ else \
+ fprintf (FILE, "%s 0x%lx,0x%lx,0x%lx\n", ASM_LONG, l[0], l[1], l[2]); \
+ } while (0)
+@@ -1644,7 +1661,7 @@
+ do { long l; \
+ REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
+ if (sizeof (int) == sizeof (long)) \
+- fprintf ((FILE), "%s 0x%x\n", ASM_LONG, l); \
++ fprintf ((FILE), "%s 0x%x\n", ASM_LONG, (int) l); \
+ else \
+ fprintf ((FILE), "%s 0x%lx\n", ASM_LONG, l); \
+ } while (0)
diff --git a/lang/gcc27/files/patch-i386.md b/lang/gcc27/files/patch-i386.md
new file mode 100644
index 000000000000..459e2dfc44eb
--- /dev/null
+++ b/lang/gcc27/files/patch-i386.md
@@ -0,0 +1,20 @@
+--- config/i386/i386.md.orig Mon Aug 21 10:27:58 1995
++++ config/i386/i386.md Mon Mar 20 13:29:12 2000
+@@ -5312,10 +5312,17 @@
+ coprocessor registers as containing a possible return value,
+ simply pretend the untyped call returns a complex long double
+ value. */
++#if 1
++ /* this may be part of (set (reg: ..) (call_insn ...)), and we can't
++ directly set a fp register from the call. so we revert to the
++ old behavior - jlemon@netcom.com (Jonathan Lemon) */
++ emit_call_insn (gen_call (operands[0], const0_rtx, NULL, const0_rtx));
++#else
+ emit_call_insn (TARGET_80387
+ ? gen_call_value (gen_rtx (REG, XCmode, FIRST_FLOAT_REG),
+ operands[0], const0_rtx)
+ : gen_call (operands[0], const0_rtx));
++#endif
+
+ for (i = 0; i < XVECLEN (operands[2], 0); i++)
+ {
diff --git a/lang/gcc27/files/patch-invoke.texi b/lang/gcc27/files/patch-invoke.texi
new file mode 100644
index 000000000000..176bee9f8c6b
--- /dev/null
+++ b/lang/gcc27/files/patch-invoke.texi
@@ -0,0 +1,40 @@
+--- invoke.texi.orig Tue Oct 3 08:40:43 1995
++++ invoke.texi Mon Mar 20 13:29:11 2000
+@@ -281,9 +281,10 @@
+ -mstats -EL -EB -G @var{num} -nocpp
+
+ @emph{i386 Options}
+--m486 -m386 -mieee-fp -mno-fancy-math-387
+--mno-fp-ret-in-387 -msoft-float -msvr3-shlib
+--mno-wide-multiply -mrtd -malign-double
++-m386 -m486 -mno-fancy-math-387
++-mno-fp-ret-in-387 -mno-ieee-fp -mno-wide-multiply
++-mprofiler-epilogue -mrtd -msoft-float
++-msvr3-shlib -malign-double
+ -mreg-alloc=@var{list} -mregparm=@var{num}
+ -malign-jumps=@var{num} -malign-loops=@var{num}
+ -malign-functions=@var{num}
+@@ -3669,8 +3670,8 @@
+ Control whether or not code is optimized for a 486 instead of an
+ 386. Code generated for an 486 will run on a 386 and vice versa.
+
+-@item -mieee-fp
+-@itemx -mno-ieee-fp
++@item -mno-ieee-fp
++@itemx -mieee-fp
+ Control whether or not the compiler uses IEEE floating point
+ comparisons. These handle correctly the case where the result of a
+ comparison is unordered.
+@@ -3728,6 +3729,12 @@
+ Control whether GNU CC uses the @code{mul} and @code{imul} that produce
+ 64 bit results in @code{eax:edx} from 32 bit operands to do @code{long
+ long} multiplies and 32-bit division by constants.
++
++@item -mprofiler-epilogue
++@itemx -mno-profiler-epilogue
++Generate extra code to write profile information for function exits.
++This option has no effect except in combination with @samp{-g} or
++@samp{-pg}.
+
+ @item -mrtd
+ Use a different function-calling convention, in which functions that
diff --git a/lang/gcc27/files/patch-libgcc2.c b/lang/gcc27/files/patch-libgcc2.c
new file mode 100644
index 000000000000..3445284f34d1
--- /dev/null
+++ b/lang/gcc27/files/patch-libgcc2.c
@@ -0,0 +1,31 @@
+--- libgcc2.c.orig Sun Nov 26 11:39:21 1995
++++ libgcc2.c Mon Mar 20 13:29:11 2000
+@@ -2106,9 +2106,7 @@
+ (*p++) ();
+ #endif
+ }
+-#endif
+
+-#ifndef INIT_SECTION_ASM_OP
+ /* Run all the global constructors on entry to the program. */
+
+ #ifndef ON_EXIT
+@@ -2128,9 +2126,7 @@
+ DO_GLOBAL_CTORS_BODY;
+ ON_EXIT (__do_global_dtors, 0);
+ }
+-#endif /* no INIT_SECTION_ASM_OP */
+
+-#if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main)
+ /* Subroutine called automatically by `main'.
+ Compiling a global function named `main'
+ produces an automatic call to this function at the beginning.
+@@ -2165,7 +2161,7 @@
+
+ /* We declare the lists here with two elements each,
+ so that they are valid empty lists if no other definition is loaded. */
+-#if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
++#if (!defined(INIT_SECTION_ASM_OP) || !defined(OBJECT_FORMAT_ELF)) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
+ #if defined(__NeXT__) || defined(_AIX)
+ /* After 2.3, try this definition on all systems. */
+ func_ptr __CTOR_LIST__[2] = {0, 0};
diff --git a/lang/gcc27/files/patch-print-tree.c b/lang/gcc27/files/patch-print-tree.c
new file mode 100644
index 000000000000..c5e25b6fc8e9
--- /dev/null
+++ b/lang/gcc27/files/patch-print-tree.c
@@ -0,0 +1,29 @@
+--- print-tree.c.orig Thu Jun 15 04:56:40 1995
++++ print-tree.c Mon Mar 20 13:29:11 2000
+@@ -82,7 +82,7 @@
+ if (indent > 0)
+ fprintf (file, " ");
+ fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
+- fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
++ fprintf (file, HOST_PTR_PRINTF, (void *) node);
+
+ if (class == 'd')
+ {
+@@ -259,7 +259,7 @@
+
+ /* Print the slot this node is in, and its code, and address. */
+ fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
+- fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
++ fprintf (file, HOST_PTR_PRINTF, (void *) node);
+
+ /* Print the name, if any. */
+ if (class == 'd')
+@@ -456,7 +456,7 @@
+ {
+ fprintf (file, "saved-insns ");
+ fprintf (file, HOST_PTR_PRINTF,
+- (HOST_WIDE_INT) DECL_SAVED_INSNS (node));
++ (void *) DECL_SAVED_INSNS (node));
+ }
+ }
+
diff --git a/lang/gcc27/files/patch-ptree.c b/lang/gcc27/files/patch-ptree.c
new file mode 100644
index 000000000000..61733517bfe2
--- /dev/null
+++ b/lang/gcc27/files/patch-ptree.c
@@ -0,0 +1,23 @@
+--- cp/ptree.c.orig Wed Jun 28 13:38:11 1995
++++ cp/ptree.c Mon Mar 20 13:29:12 2000
+@@ -46,17 +46,17 @@
+ if (DECL_MAIN_VARIANT (node))
+ {
+ fprintf (file, " decl-main-variant ");
+- fprintf (file, HOST_PTR_PRINTF, DECL_MAIN_VARIANT (node));
++ fprintf (file, HOST_PTR_PRINTF, (void *) DECL_MAIN_VARIANT (node));
+ }
+ if (DECL_PENDING_INLINE_INFO (node))
+ {
+ fprintf (file, " pending-inline-info ");
+- fprintf (file, HOST_PTR_PRINTF, DECL_PENDING_INLINE_INFO (node));
++ fprintf (file, HOST_PTR_PRINTF, (void *) DECL_PENDING_INLINE_INFO (node));
+ }
+ if (DECL_TEMPLATE_INFO (node))
+ {
+ fprintf (file, " template-info ");
+- fprintf (file, HOST_PTR_PRINTF, DECL_TEMPLATE_INFO (node));
++ fprintf (file, HOST_PTR_PRINTF, (void *) DECL_TEMPLATE_INFO (node));
+ }
+ }
+
diff --git a/lang/gcc27/files/patch-reload.c b/lang/gcc27/files/patch-reload.c
new file mode 100644
index 000000000000..e3dbd9961a1d
--- /dev/null
+++ b/lang/gcc27/files/patch-reload.c
@@ -0,0 +1,11 @@
+--- reload.c.orig Sat Nov 11 05:23:54 1995
++++ reload.c Mon Mar 20 13:29:11 2000
+@@ -5899,7 +5899,7 @@
+ fprintf (stderr, ", inc by %d\n", reload_inc[r]);
+
+ if (reload_nocombine[r])
+- fprintf (stderr, ", can combine", reload_nocombine[r]);
++ fprintf (stderr, ", can combine");
+
+ if (reload_secondary_p[r])
+ fprintf (stderr, ", secondary_reload_p");
diff --git a/lang/gcc27/files/patch-reno.texi b/lang/gcc27/files/patch-reno.texi
new file mode 100644
index 000000000000..e49f4392a477
--- /dev/null
+++ b/lang/gcc27/files/patch-reno.texi
@@ -0,0 +1,11 @@
+--- cp/reno.texi.orig Thu Apr 14 19:00:39 1994
++++ cp/reno.texi Mon Mar 20 13:29:12 2000
+@@ -4,7 +4,7 @@
+ @ifinfo
+ @format
+ START-INFO-DIR-ENTRY
+-* Reno 1: (reno-1). The GNU C++ Renovation Project, Phase 1.
++* Reno 1: (reno). The GNU C++ Renovation Project, Phase 1.
+ END-INFO-DIR-ENTRY
+ @end format
+ @end ifinfo
diff --git a/lang/gcc27/files/patch-sched.c b/lang/gcc27/files/patch-sched.c
new file mode 100644
index 000000000000..a2a69d6ecd2a
--- /dev/null
+++ b/lang/gcc27/files/patch-sched.c
@@ -0,0 +1,55 @@
+--- sched.c.orig Thu Jun 15 05:06:39 1995
++++ sched.c Mon Mar 20 13:29:12 2000
+@@ -794,11 +794,14 @@
+ changed. A volatile and non-volatile reference can be interchanged
+ though.
+
+- A MEM_IN_STRUCT reference at a non-QImode varying address can never
++ A MEM_IN_STRUCT reference at a non-QImode non-AND varying address can never
+ conflict with a non-MEM_IN_STRUCT reference at a fixed address. We must
+ allow QImode aliasing because the ANSI C standard allows character
+ pointers to alias anything. We are assuming that characters are
+- always QImode here. */
++ always QImode here. We also must allow AND addresses, because they may
++ generate accesses outside the object being referenced. This is used to
++ generate aligned addresses from unaligned addresses, for instance, the
++ alpha storeqi_unaligned pattern. */
+
+ /* Read dependence: X is read after read in MEM takes place. There can
+ only be a dependence here if both reads are volatile. */
+@@ -833,9 +836,11 @@
+ SIZE_FOR_MODE (x), XEXP (x, 0), 0)
+ && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
+ && GET_MODE (mem) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
+ && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
+ && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
+ && GET_MODE (x) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
+ && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
+ }
+
+@@ -857,9 +862,11 @@
+ SIZE_FOR_MODE (x), XEXP (x, 0), 0)
+ && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
+ && GET_MODE (mem) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
+ && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
+ && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
+ && GET_MODE (x) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
+ && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
+ }
+
+@@ -875,9 +882,11 @@
+ SIZE_FOR_MODE (x), XEXP (x, 0), 0)
+ && ! (MEM_IN_STRUCT_P (mem) && rtx_addr_varies_p (mem)
+ && GET_MODE (mem) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
+ && ! MEM_IN_STRUCT_P (x) && ! rtx_addr_varies_p (x))
+ && ! (MEM_IN_STRUCT_P (x) && rtx_addr_varies_p (x)
+ && GET_MODE (x) != QImode
++ && GET_CODE (XEXP (mem, 0)) != AND
+ && ! MEM_IN_STRUCT_P (mem) && ! rtx_addr_varies_p (mem))));
+ }
+
diff --git a/lang/gcc27/files/patch-sendmsg.c b/lang/gcc27/files/patch-sendmsg.c
new file mode 100644
index 000000000000..e46f36c35eed
--- /dev/null
+++ b/lang/gcc27/files/patch-sendmsg.c
@@ -0,0 +1,21 @@
+--- objc/sendmsg.c.orig Thu Jun 15 05:45:10 1995
++++ objc/sendmsg.c Mon Mar 20 13:29:13 2000
+@@ -542,12 +542,15 @@
+ #endif
+ );
+
+- printf("arrays: %d = %ld bytes\n", narrays, (int)narrays*sizeof(struct sarray));
++ printf("arrays: %d = %lu bytes\n",
++ narrays, (unsigned long)narrays*sizeof(struct sarray));
+ total += narrays*sizeof(struct sarray);
+- printf("buckets: %d = %ld bytes\n", nbuckets, (int)nbuckets*sizeof(struct sbucket));
++ printf("buckets: %d = %lu bytes\n",
++ nbuckets, (unsigned long)nbuckets*sizeof(struct sbucket));
+ total += nbuckets*sizeof(struct sbucket);
+
+- printf("idxtables: %d = %ld bytes\n", idxsize, (int)idxsize*sizeof(void*));
++ printf("idxtables: %d = %lu bytes\n",
++ idxsize, (unsigned long)idxsize*sizeof(void*));
+ total += idxsize*sizeof(void*);
+ printf("-----------------------------------\n");
+ printf("total: %d bytes\n", total);
diff --git a/lang/gcc27/files/patch-stdarg.h b/lang/gcc27/files/patch-stdarg.h
new file mode 100644
index 000000000000..d29ba5ab8870
--- /dev/null
+++ b/lang/gcc27/files/patch-stdarg.h
@@ -0,0 +1,40 @@
+--- ginclude/stdarg.h.orig Tue Sep 12 09:50:36 1995
++++ ginclude/stdarg.h Mon Mar 20 13:29:13 2000
+@@ -43,6 +43,15 @@
+ #else
+
+ /* Define __gnuc_va_list. */
++#if defined (__FreeBSD__)
++/* This is the correct way to handle all BSD NET2 and BSD 4.4 systems. */
++#include <machine/ansi.h>
++#ifdef _BSD_VA_LIST_
++typedef _BSD_VA_LIST_ __gnuc_va_list;
++#else
++typedef _VA_LIST_ __gnuc_va_list;
++#endif
++#else
+
+ #ifndef __GNUC_VA_LIST
+ #define __GNUC_VA_LIST
+@@ -52,6 +61,7 @@
+ typedef void *__gnuc_va_list;
+ #endif
+ #endif
++#endif
+
+ /* Define the standard macros for the user,
+ if this invocation was from the user program. */
+@@ -116,8 +126,13 @@
+ #undef _VA_LIST
+ #endif
+
++#if 0
++/* BSD 4.4 actually spells the name _BSD_VA_LIST_ and requires it to be
++ * defined and usable in place of va_list when the latter name is not
++ * allowed (e.g., in stdio.h - see above). */
+ #ifdef _BSD_VA_LIST
+ #undef _BSD_VA_LIST
++#endif
+ #endif
+
+ #ifdef __svr4__
diff --git a/lang/gcc27/files/patch-stddef.h b/lang/gcc27/files/patch-stddef.h
new file mode 100644
index 000000000000..36068d02636d
--- /dev/null
+++ b/lang/gcc27/files/patch-stddef.h
@@ -0,0 +1,20 @@
+--- ginclude/stddef.h.orig Sat Aug 19 13:39:22 1995
++++ ginclude/stddef.h Mon Mar 20 13:29:13 2000
+@@ -257,7 +257,7 @@
+
+ /* In 4.3bsd-net2, leave these undefined to indicate that size_t, etc.
+ are already defined. */
+-#ifdef _ANSI_H_
++#if defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_)
+ /* The references to _GCC_PTRDIFF_T_, _GCC_SIZE_T_, and _GCC_WCHAR_T_
+ are probably typos and should be removed before 2.8 is released. */
+ #ifdef _GCC_PTRDIFF_T_
+@@ -285,7 +285,7 @@
+ #undef _WCHAR_T_
+ #undef _BSD_WCHAR_T_
+ #endif
+-#endif /* _ANSI_H_ */
++#endif /* defined(_ANSI_H_) || defined(_MACHINE_ANSI_H_) */
+
+ #endif /* __sys_stdtypes_h */
+
diff --git a/lang/gcc27/files/patch-toplev.c b/lang/gcc27/files/patch-toplev.c
new file mode 100644
index 000000000000..66f6449fd5b1
--- /dev/null
+++ b/lang/gcc27/files/patch-toplev.c
@@ -0,0 +1,21 @@
+--- toplev.c.orig Fri Oct 20 14:56:35 1995
++++ toplev.c Mon Mar 20 13:29:12 2000
+@@ -521,6 +521,10 @@
+ /* Tag all structures with __attribute__(packed) */
+ int flag_pack_struct = 0;
+
++/* Nonzero means that -Wformat accepts certain system-dependent formats. */
++
++int flag_format_extensions = 0;
++
+ /* Table of language-independent -f options.
+ STRING is the option name. VARIABLE is the address of the variable.
+ ON_VALUE is the value to store in VARIABLE
+@@ -567,6 +571,7 @@
+ {"verbose-asm", &flag_verbose_asm, 1},
+ {"gnu-linker", &flag_gnu_linker, 1},
+ {"pack-struct", &flag_pack_struct, 1},
++ {"format-extensions", &flag_format_extensions, 1},
+ {"bytecode", &output_bytecode, 1}
+ };
+
diff --git a/lang/gcc27/files/patch-varargs.h b/lang/gcc27/files/patch-varargs.h
new file mode 100644
index 000000000000..d97cb883f1d8
--- /dev/null
+++ b/lang/gcc27/files/patch-varargs.h
@@ -0,0 +1,37 @@
+--- ginclude/varargs.h.orig Sun Aug 13 15:18:55 1995
++++ ginclude/varargs.h Mon Mar 20 13:29:13 2000
+@@ -78,12 +78,22 @@
+
+ #ifndef __GNUC_VA_LIST
+ #define __GNUC_VA_LIST
++#if defined (__FreeBSD__)
++/* This is the correct way to handle all BSD NET2 and BSD 4.4 systems. */
++#include <machine/ansi.h>
++#ifdef _BSD_VA_LIST_
++typedef _BSD_VA_LIST_ __gnuc_va_list;
++#else
++typedef _VA_LIST_ __gnuc_va_list;
++#endif
++#else
+ #if defined(__svr4__) || defined(_AIX) || defined(_M_UNIX)
+ typedef char *__gnuc_va_list;
+ #else
+ typedef void *__gnuc_va_list;
+ #endif
+ #endif
++#endif
+
+ #define va_start(AP) AP=(char *) &__builtin_va_alist
+
+@@ -185,6 +195,11 @@
+
+ /* The next BSD release (if there is one) wants this symbol to be
+ undefined instead of _VA_LIST_. */
++#if 0
++/* BSD 4.4 actually spells the name _BSD_VA_LIST_ and requires it to be
++ * defined and usable in place of va_list when the latter name is not
++ * allowed (e.g., in stdio.h - see ginclude/stdarg.h). */
+ #ifdef _BSD_VA_LIST
+ #undef _BSD_VA_LIST
++#endif
+ #endif
diff --git a/lang/gcc27/files/patch-x-freebsd b/lang/gcc27/files/patch-x-freebsd
new file mode 100644
index 000000000000..d1472f31ce82
--- /dev/null
+++ b/lang/gcc27/files/patch-x-freebsd
@@ -0,0 +1,8 @@
+--- config/i386/x-freebsd.orig Mon Oct 31 04:52:41 1994
++++ config/i386/x-freebsd Mon Mar 20 13:19:55 2000
+@@ -1,3 +1,4 @@
+ # Don't run fixproto
+ STMP_FIXPROTO =
+-CLIB=-lgnumalloc
++# Use only native include files
++USER_H =
diff --git a/lang/gcc27/pkg-comment b/lang/gcc27/pkg-comment
new file mode 100644
index 000000000000..f7345586e15d
--- /dev/null
+++ b/lang/gcc27/pkg-comment
@@ -0,0 +1 @@
+Base C/C++ compiler from FreeBSD 2.2.x & 3.x (for your old code)
diff --git a/lang/gcc27/pkg-descr b/lang/gcc27/pkg-descr
new file mode 100644
index 000000000000..d698d6f9472d
--- /dev/null
+++ b/lang/gcc27/pkg-descr
@@ -0,0 +1,8 @@
+GCC 2.7.2.3 was the base compiler in FreeBSD 2.2.x thru 3.x. The new
+EGCS/GCC Project compiler is used in FreeBSD 4.0 and later. Because of
+the large number of changes to the new C++ compiler (mostly for ISO-C++
+compliance), this ancient version of the GNU's C/C++ compiler is offered
+to allow you to build legacy systems on the latest and greatest FreeBSD
+offering.
+
+-- David O'Brien <obrien@NUXI.com>
diff --git a/lang/gcc27/pkg-plist b/lang/gcc27/pkg-plist
new file mode 100644
index 000000000000..3317c61714d1
--- /dev/null
+++ b/lang/gcc27/pkg-plist
@@ -0,0 +1,390 @@
+@comment $FreeBSD$
+bin/g++27
+bin/gcc27
+bin/%%GNUHOST%%-gcc
+@comment @unexec install-info --delete %D/info/cpp.info %D/info/dir
+@comment @unexec install-info --delete %D/info/gcc.info %D/info/dir
+info/cpp.info
+info/cpp.info-1
+info/cpp.info-2
+info/cpp.info-3
+info/gcc.info
+info/gcc.info-1
+info/gcc.info-10
+info/gcc.info-11
+info/gcc.info-12
+info/gcc.info-13
+info/gcc.info-14
+info/gcc.info-15
+info/gcc.info-16
+info/gcc.info-17
+info/gcc.info-18
+info/gcc.info-19
+info/gcc.info-2
+info/gcc.info-20
+info/gcc.info-21
+info/gcc.info-22
+info/gcc.info-23
+info/gcc.info-24
+info/gcc.info-25
+info/gcc.info-3
+info/gcc.info-4
+info/gcc.info-5
+info/gcc.info-6
+info/gcc.info-7
+info/gcc.info-8
+info/gcc.info-9
+@exec install-info
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/SYSCALLS.c.X
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/cc1
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/cc1obj
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/cc1plus
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/cpp
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/ACG.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/AllocRing.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Binomial.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/BitSet.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/BitString.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Complex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/CursesW.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/DLList.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/DiscUnif.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Erlang.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Fix.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Fix16.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Fix24.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Geom.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/GetOpt.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/HypGeom.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Incremental.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Integer.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/LogNorm.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/MLCG.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/NegExp.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Normal.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Obstack.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Pix.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/PlotFile.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Poisson.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/RNG.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Random.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Rational.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Regex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/RndInt.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/SFile.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/SLList.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/SmplHist.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/SmplStat.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/String.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Uniform.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/Weibull.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/_G_config.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/algo.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/algobase.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/algorithm
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/bitdo1.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/bitdo2.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/bitprims.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/bool.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/builtin.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/builtinbuf.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/bvector.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cassert
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cctype
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cerrno
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cfloat
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/ciso646
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/climits
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/clocale
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cmath
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/compare.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/complex
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/complex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/csetjmp
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/csignal
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cstdarg
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cstddef
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cstdio
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cstdlib
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cstring
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/ctime
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cwchar
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/cwctype
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/defalloc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/deque
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/deque.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/editbuf.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/exception
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/faralloc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/fdeque.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/flist.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/floatio.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/fmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/fmultmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/fmultset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/fset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/fstream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/function.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/functional
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/AVLMap.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/AVLMap.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/AVLSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/AVLSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/AVec.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/AVec.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/BSTSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/BSTSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Bag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Bag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHMap.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHMap.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHNode.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHNode.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/CHSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/DLDeque.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/DLDeque.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/DLList.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/DLList.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Deque.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Deque.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/FPQueue.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/FPQueue.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/FPStack.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/FPStack.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/FPlex.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/FPlex.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/List.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/List.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/MPlex.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/MPlex.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Map.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Map.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OSLBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OSLBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OSLSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OSLSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OXPBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OXPBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OXPSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/OXPSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/PHPQ.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/PHPQ.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/PQ.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/PQ.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/PSList.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/PVec.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Plex.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Plex.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Queue.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Queue.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/RAVLMap.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/RAVLMap.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/RPlex.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/RPlex.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLList.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLList.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLQueue.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLQueue.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLStack.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SLStack.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Set.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Set.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SkipBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SkipBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SkipMap.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SkipMap.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SkipSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SkipSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayMap.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayMap.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayNode.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayNode.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayPQ.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplayPQ.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplaySet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/SplaySet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Stack.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Stack.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VHBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VHBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VHMap.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VHMap.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VHSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VHSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VOHSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VOHSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VQueue.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VQueue.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VStack.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/VStack.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Vec.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/Vec.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPBag.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPBag.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPDeque.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPDeque.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPPQ.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPPQ.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPQueue.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPQueue.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPSet.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPSet.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPStack.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPStack.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPlex.ccP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/XPlex.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/defs.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/intSList.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen/intVec.hP
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/generic.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/getpagesize.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hdeque.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/heap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hlist.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hmultmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hmultset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hugalloc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/hvector.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/indstream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iolibio.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iomanip.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iostdio.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iostream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iostreamP.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/istream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iterator
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/iterator.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/lbvector.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/ldeque.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/libc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/libio.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/libioP.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/list
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/list.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/llist.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/lmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/lmultmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/lmultset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/lngalloc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/lset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/map
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/map.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/memory
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/minmax.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/multimap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/multiset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/neralloc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/new
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/new.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/nmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/nmultmap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/nmultset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/nset.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/numeric
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/osfcn.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/ostream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/pair.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/parsestream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/pfstream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/procbuf.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/projectn.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/queue
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/rx.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/set
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/set.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stack
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stack.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/bastring.cc
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/bastring.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cassert.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cctype.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cerrno.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cfloat.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cinst.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/ciso646.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/climits.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/clocale.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cmath.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/complex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/complext.cc
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/complext.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/csetjmp.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/csignal.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cstdarg.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cstddef.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cstdio.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cstdlib.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cstring.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/ctime.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cwchar.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/cwctype.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/dcomplex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/exception.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/fcomplex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/ldcomplex.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/new.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/sinst.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/stddef.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/stdexcept.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/straits.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/string.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std/typeinfo.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stddef
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stdexcept
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stdiostream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stl.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/strclass.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/stream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/streambuf.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/strfile.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/string
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/strstream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/swap.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/sysent.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/tempbuf.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/tree.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/typeinfo
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/typemacros.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/utility
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/vector
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/vector.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/README
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/float.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/limits.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/NXConstStr.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/Object.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/Protocol.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/encoding.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/hash.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/list.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/objc-api.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/objc.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/sarray.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/typedstream.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/syslimits.h
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/libg++.a
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/libgcc.a
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/libiberty.a
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/libobjc.a
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/libstdc++.a
+lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/specs
+@dirrm lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/gen
+@dirrm lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/std
+@dirrm lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/g++-include/
+@dirrm lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/objc/
+@dirrm lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%/include/
+@dirrm lib/gcc-lib/%%GNUHOST%%/%%GCC_VER%%
+@dirrm lib/gcc-lib/%%GNUHOST%%
+@dirrm lib/gcc-lib