Sync FreeBSD gcc-4 build specs with gcc upstream diff -ur a/gcc/config/freebsd-spec.h b/gcc/config/freebsd-spec.h --- a/gcc/config/freebsd-spec.h 2007-10-18 11:25:55 +0100 +++ b/gcc/config/freebsd-spec.h 2007-10-18 11:23:13 +0100 @@ -63,34 +63,44 @@ /* Define the default FreeBSD-specific per-CPU hook code. */ #define FBSD_TARGET_CPU_CPP_BUILTINS() do {} while (0) -/* Provide a CPP_SPEC appropriate for FreeBSD. We just deal with the GCC - option `-posix', and PIC issues. */ +/* Provide a CPP_SPEC appropriate for FreeBSD. We just deal with the GCC + option `-posix', and PIC issues. Try to detect support for the + `long long' type. Unfortunately the GCC spec parser will not allow us + to properly detect the "iso9899:1990" and "iso9899:199409" forms of + -std=c89. Because of the ':' in the -std argument. :-( I have left + them in the spec as a place holder in hopes someone knows a way to make + the detection of them work. */ #define FBSD_CPP_SPEC " \ %(cpp_cpu) \ %(cpp_arch) \ + %{!ansi:%{!std=c89:%{!std=iso9899.1990:%{!std=iso9899.199409:-D_LONGLONG}}}} \ %{posix:-D_POSIX_SOURCE}" -/* Provide a STARTFILE_SPEC appropriate for FreeBSD. Here we add - the magical crtbegin.o file (see crtstuff.c) which provides part - of the support for getting C++ file-scope static object constructed - before entering `main'. */ - -#define FBSD_STARTFILE_SPEC \ - "%{!shared: \ - %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \ - %{!p:%{profile:gcrt1.o%s} \ - %{!profile:crt1.o%s}}}} \ - crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" - -/* Provide a ENDFILE_SPEC appropriate for FreeBSD. Here we tack on - the magical crtend.o file (see crtstuff.c) which provides part of - the support for getting C++ file-scope static object constructed - before entering `main', followed by a normal "finalizer" file, - `crtn.o'. */ - -#define FBSD_ENDFILE_SPEC \ - "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" +/* Provide a STARTFILE_SPEC appropriate for FreeBSD. Here we add the magical + crtbegin.o file (see crtstuff.c) which provides part of the support for + getting C++ file-scope static object constructed before entering `main'. */ + +#define FBSD_STARTFILE_SPEC "\ + %{!shared: \ + %{pg:gcrt1.o%s} \ + %{!pg: \ + %{p:gcrt1.o%s} \ + %{!p: \ + %{profile:gcrt1.o%s} \ + %{!profile:crt1.o%s}}}} \ + crti.o%s \ + %{static:crtbeginT.o%s;shared:crtbeginS.o%s;:crtbegin.o%s}" + +/* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386. Here we tack on + our own magical crtend.o file (see crtstuff.c) which provides part of + the support for getting C++ file-scope static object constructed before + entering `main', followed by the normal "finalizer" file, `crtn.o'. */ + +#define FBSD_ENDFILE_SPEC "\ + %{!shared:crtend.o%s} \ + %{shared:crtendS.o%s} \ + crtn.o%s " /* Provide a LIB_SPEC appropriate for FreeBSD as configured and as required by the user-land thread model. Before __FreeBSD_version @@ -119,7 +129,8 @@ %{pg: -lc_p} \ }" #else -#if FBSD_MAJOR < 5 +#include +#if __FreeBSD_version < 500016 #define FBSD_LIB_SPEC " \ %{!shared: \ %{!pg: \ @@ -133,13 +144,24 @@ #define FBSD_LIB_SPEC " \ %{!shared: \ %{!pg: %{pthread:-lpthread} -lc} \ - %{pg: %{pthread:-lpthread_p} -lc_p} \ - }" + %{pg: %{pthread:-lpthread_p} -lc_p}} \ + %{shared: \ + %{pthread:-lpthread} -lc} \ + " #endif #endif -#if FBSD_MAJOR < 6 +#if FBSD_MAJOR < 5 #define FBSD_DYNAMIC_LINKER "/usr/libexec/ld-elf.so.1" #else #define FBSD_DYNAMIC_LINKER "/libexec/ld-elf.so.1" #endif + +#if defined(HAVE_LD_EH_FRAME_HDR) +#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " +#endif + +/* Use --as-needed -lgcc_s for eh support. */ +#ifdef HAVE_LD_AS_NEEDED +#define USE_LD_AS_NEEDED 1 +#endif diff -ur a/gcc/config/i386/freebsd.h b/gcc/config/i386/freebsd.h --- a/gcc/config/i386/freebsd.h 2007-09-01 16:28:30 +0100 +++ b/gcc/config/i386/freebsd.h 2007-10-18 11:50:45 +0100 @@ -21,95 +21,143 @@ along with GCC; see the file COPYING3. If not see . */ +#undef CC1_SPEC +#define CC1_SPEC "%(cc1_cpu) %{profile:-p}" -#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); +/* 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. -/* Override the default comment-starter of "/". */ -#undef ASM_COMMENT_START -#define ASM_COMMENT_START "#" + When the -shared link option is used a final link is not being + done. */ -#undef ASM_APP_ON -#define ASM_APP_ON "#APP\n" +#undef LINK_SPEC +#define LINK_SPEC "\ + %{p:%nconsider using `-pg' instead of `-p' with gprof(1) } \ + %{v:-V} \ + %{assert*} %{R*} %{rpath*} %{defsym*} \ + %{shared:-Bshareable %{h*} %{soname*}} \ + %{!shared: \ + %{!static: \ + %{rdynamic: -export-dynamic} \ + %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ + %{static:-Bstatic}} \ + %{symbolic:-Bsymbolic}" -#undef ASM_APP_OFF -#define ASM_APP_OFF "#NO_APP\n" +/* Reset our STARTFILE_SPEC which was properly set in config/freebsd.h + but trashed by config//. */ -#undef DBX_REGISTER_NUMBER -#define DBX_REGISTER_NUMBER(n) \ - (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n]) +#undef STARTFILE_SPEC +#define STARTFILE_SPEC FBSD_STARTFILE_SPEC -#undef NO_PROFILE_COUNTERS -#define NO_PROFILE_COUNTERS 1 +/* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386. */ -/* Tell final.c that we don't need a label passed to mcount. */ +#undef ENDFILE_SPEC +#define ENDFILE_SPEC FBSD_ENDFILE_SPEC -#undef MCOUNT_NAME -#define MCOUNT_NAME ".mcount" -/* Make gcc agree with . */ +/************************[ Target stuff ]***********************************/ + +/* Define the actual types of some ANSI-mandated types. + Needs to agree with . GCC defaults come from c-decl.c, + c-common.c, and config//.h. */ #undef SIZE_TYPE #define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int") - + #undef PTRDIFF_TYPE #define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") - + #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE (TARGET_64BIT ? 32 : BITS_PER_WORD) -#undef SUBTARGET_EXTRA_SPECS /* i386.h bogusly defines it. */ +#undef SUBTARGET_EXTRA_SPECS /* i386.h bogusly defines it. */ #define SUBTARGET_EXTRA_SPECS \ { "fbsd_dynamic_linker", FBSD_DYNAMIC_LINKER } - -/* Provide a STARTFILE_SPEC appropriate for FreeBSD. Here we add - the magical crtbegin.o file (see crtstuff.c) which provides part - of the support for getting C++ file-scope static object constructed - before entering `main'. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{!shared: \ - %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \ - %{!p:%{profile:gcrt1.o%s} \ - %{!profile:crt1.o%s}}}} \ - crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" - -/* Provide a ENDFILE_SPEC appropriate for FreeBSD. Here we tack on - the magical crtend.o file (see crtstuff.c) which provides part of - the support for getting C++ file-scope static object constructed - before entering `main', followed by a normal "finalizer" file, - `crtn.o'. */ - -#undef ENDFILE_SPEC -#define ENDFILE_SPEC \ - "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%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. +#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); - I took out %{v:%{!V:-V}}. It is too much :-(. They can use - -Wl,-V. +#define TARGET_ELF 1 - When the -shared link option is used a final link is not being - done. */ +/* This goes away when the math emulator is fixed. */ +#undef TARGET_SUBTARGET_DEFAULT +#define TARGET_SUBTARGET_DEFAULT \ + (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387) -#undef LINK_SPEC -#define LINK_SPEC "\ - %{p:%nconsider using `-pg' instead of `-p' with gprof(1)} \ - %{v:-V} \ - %{assert*} %{R*} %{rpath*} %{defsym*} \ - %{shared:-Bshareable %{h*} %{soname*}} \ - %{!shared: \ - %{!static: \ - %{rdynamic:-export-dynamic} \ - %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ - %{static:-Bstatic}} \ - %{symbolic:-Bsymbolic}" +/* Don't default to pcc-struct-return, we want to retain compatibility with + older gcc versions AND pcc-struct-return is nonreentrant. + (even though the SVR4 ABI for the i386 says that records and unions are + returned in memory). */ + +#undef DEFAULT_PCC_STRUCT_RETURN +#define DEFAULT_PCC_STRUCT_RETURN 0 + +/* FreeBSD sets the rounding precision of the FPU to 53 bits. Let the + compiler get the contents of and std::numeric_limits correct. */ +#undef TARGET_96_ROUND_53_LONG_DOUBLE +#define TARGET_96_ROUND_53_LONG_DOUBLE (!TARGET_64BIT) + +/* Tell final.c that we don't need a label passed to mcount. */ +#define NO_PROFILE_COUNTERS 1 + +/* Output assembler code to FILE to begin profiling of the current function. + LABELNO is an optional label. */ + +#undef MCOUNT_NAME +#define MCOUNT_NAME ".mcount" + +/* Output assembler code to FILE to end profiling of the current function. */ + +#undef FUNCTION_PROFILER_EPILOGUE /* BDE will need to fix this. */ + + +/************************[ Assembler stuff ]********************************/ + +/* Override the default comment-starter of "/" from unix.h. */ +#undef ASM_COMMENT_START +#define ASM_COMMENT_START "#" + +/* Override the default comment-starter of "/APP" from unix.h. */ +#undef ASM_APP_ON +#define ASM_APP_ON "#APP\n" +#undef ASM_APP_OFF +#define ASM_APP_OFF "#NO_APP\n" + +/* XXX:DEO do we still need this override to defaults.h ?? */ +/* This is how to output a reference to a user-level label named NAME. */ +#undef ASM_OUTPUT_LABELREF +#define ASM_OUTPUT_LABELREF(FILE, NAME) \ + do { \ + const char *xname = (NAME); \ + /* Hack to avoid writing lots of rtl in \ + FUNCTION_PROFILER_EPILOGUE (). */ \ + if (*xname == '.' && strcmp(xname + 1, "mexitcount") == 0) \ + { \ + if (flag_pic) \ + fprintf ((FILE), "*%s@GOT(%%ebx)", xname); \ + else \ + fprintf ((FILE), "%s", xname); \ + } \ + else \ + { \ + if (xname[0] == '%') \ + xname += 2; \ + if (xname[0] == '*') \ + xname += 1; \ + else \ + fputs (user_label_prefix, FILE); \ + fputs (xname, FILE); \ + } \ +} while (0) + +/* This is how to hack on the symbol code of certain relcalcitrant + symbols to modify their output in output_pic_addr_const (). */ + +#undef ASM_HACK_SYMBOLREF_CODE /* BDE will need to fix this. */ /* A C statement to output to the stdio stream FILE an assembler command to advance the location counter to a multiple of 1< and std::numeric_limits correct. */ -#undef TARGET_96_ROUND_53_LONG_DOUBLE -#define TARGET_96_ROUND_53_LONG_DOUBLE (!TARGET_64BIT) +#undef DBX_REGISTER_NUMBER +#define DBX_REGISTER_NUMBER(n) (TARGET_64BIT ? dbx64_register_map[n] \ + : (write_symbols == DWARF2_DEBUG) \ + ? svr4_dbx_register_map[(n)] \ + : dbx_register_map[(n)]) + +/* The same functions are used to creating the DWARF2 debug info and C++ + unwind info (except.c). Regardless of the debug format requested, the + register numbers used in exception unwinding sections still have to be + DWARF compatible. IMO the GCC folks may be abusing the DBX_REGISTER_NUMBER + macro to mean too much. */ +#define DWARF_FRAME_REGNUM(n) (TARGET_64BIT ? dbx64_register_map[n] \ + : svr4_dbx_register_map[(n)]) + +/* stabs-in-elf has offsets relative to function beginning */ +#undef DBX_OUTPUT_LBRAC +#define DBX_OUTPUT_LBRAC(FILE, NAME) \ + do { \ + fprintf (asm_out_file, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \ + assemble_name (asm_out_file, NAME); \ + fputc ('-', asm_out_file); \ + assemble_name (asm_out_file, \ + XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \ + fprintf (asm_out_file, "\n"); \ + } while (0) + +#undef DBX_OUTPUT_RBRAC +#define DBX_OUTPUT_RBRAC(FILE, NAME) \ + do { \ + fprintf (asm_out_file, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \ + assemble_name (asm_out_file, NAME); \ + fputc ('-', asm_out_file); \ + assemble_name (asm_out_file, \ + XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \ + fprintf (asm_out_file, "\n"); \ + } while (0) diff -ur a/gcc/config.gcc b/gcc/config.gcc --- a/gcc/config.gcc 2007-10-18 11:23:15 +0100 +++ b/gcc/config.gcc 2007-10-18 12:06:59 +0100 @@ -409,7 +409,7 @@ # pleases around the provided core setting. gas=yes gnu_ld=yes - extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o" + extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o" case ${target} in *-*-freebsd3 | *-*-freebsd[3].*) tm_defines="${tm_defines} FBSD_MAJOR=3" ;;