This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] new FreeBSD/alpha support
- To: gcc-patches at gcc dot gnu dot org
- Subject: Re: [PATCH] new FreeBSD/alpha support
- From: "David O'Brien" <obrien at FreeBSD dot org>
- Date: Fri, 6 Oct 2000 21:49:06 -0700
- Organization: The NUXI BSD group
- References: <20001004224341.A50778@dragon.nuxi.com>
- Reply-To: obrien at FreeBSD dot org
This revised patch set adds new architectural support for FreeBSD running
on the DEC Alpha. This a first step, to get the compiler itself
bootstrapping (and useful for cross-compilers). I'm working on some
remaining test suite failures for C++.
Permission to apply?
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/egcs/gcc/ChangeLog,v
retrieving revision 1.7927
diff -u -r1.7927 ChangeLog
--- ChangeLog 2000/10/06 18:12:05 1.7927
+++ ChangeLog 2000/10/07 04:47:44
@@ -1,3 +1,10 @@
+2000-10-06 David O'Brien <obrien@dragon.nuxi.com>
+
+ * config/alpha/freebsd.h: New file -- FreeBSD/alpha architecture file.
+ * POTFILES.in: Add config/alpha/freebsd.h
+ * configure.in: Add alpha*-freebsd support.
+ * configure: Rebuilt.
+
2000-10-06 Alexandre Oliva <aoliva@redhat.com>
* config/sh/sh.md (call, call_value): Use `TARGET_SH2' instead of
Index: configure.in
===================================================================
RCS file: /cvs/gcc/egcs/gcc/configure.in,v
retrieving revision 1.433
diff -u -r1.433 configure.in
--- configure.in 2000/10/04 20:53:28 1.433
+++ configure.in 2000/10/07 04:47:45
@@ -792,6 +792,20 @@
thread_file='posix'
fi
;;
+ alpha*-*-freebsd*)
+ tm_file="${tm_file} freebsd.h alpha/elf.h alpha/freebsd.h"
+ target_cpu_default="MASK_GAS"
+ tmake_file="t-freebsd alpha/t-crtbe"
+ xmake_file=none
+ gas=yes gnu_ld=yes
+ stabs=yes
+ case x${enable_threads} in
+ xyes | xpthreads | xposix)
+ thread_file='posix'
+ tmake_file="${tmake_file} t-freebsd-thread"
+ ;;
+ esac
+ ;;
alpha*-*-netbsd*)
tm_file="${tm_file} alpha/elf.h alpha/netbsd.h alpha/netbsd-elf.h"
target_cpu_default="MASK_GAS"
Index: po/ChangeLog
===================================================================
RCS file: /cvs/gcc/egcs/gcc/po/ChangeLog,v
retrieving revision 1.31
diff -u -r1.31 ChangeLog
--- ChangeLog 2000/09/29 01:56:01 1.31
+++ ChangeLog 2000/10/07 04:47:45
@@ -1,3 +1,7 @@
+2000-10-04 David O'Brien <obrien@FreeBSD.org>
+
+ * POTFILES.in: Add config/alpha/freebsd.h
+
2000-09-28 David O'Brien <obrien@FreeBSD.org>
* po/POTFILES.in: Adjust for move of freebsd.h -> freebsd-aout.h
Index: po/POTFILES.in
===================================================================
RCS file: /cvs/gcc/egcs/gcc/po/POTFILES.in,v
retrieving revision 1.30
diff -u -r1.30 POTFILES.in
--- POTFILES.in 2000/09/29 01:56:01 1.30
+++ POTFILES.in 2000/10/07 04:47:45
@@ -86,6 +86,7 @@
config/alpha/alpha.h
config/alpha/alpha32.h
config/alpha/elf.h
+config/alpha/freebsd.h
config/alpha/linux-ecoff.h
config/alpha/linux-elf.h
config/alpha/linux.h
Index: config/alpha/freebsd.h
===================================================================
RCS file: freebsd.h
diff -N freebsd.h
--- /dev/null Tue May 5 13:32:27 1998
+++ freebsd.h Fri Oct 6 21:47:45 2000
@@ -0,0 +1,187 @@
+/* Definitions for DEC Alpha/AXP running FreeBSD using the ELF format
+ Copyright (C) 2000 Free Software Foundation, Inc.
+ Contributed by BSDi, written by David O'Brien <obrien@FreeBSD.org>
+
+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, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+#undef CPP_PREDEFINES
+#define CPP_PREDEFINES \
+ "-D__ELF__ -Dunix -D__FreeBSD__ -Asystem(unix) -Asystem(bsd) -Asystem(FreeBSD)"
+
+/* Provide a CPP_SPEC appropriate for FreeBSD/alpha. Besides the dealing with
+ the GCC option `-posix', and PIC issues as on all FreeBSD platforms, we must
+ deal with the Alpha's FP issues. */
+
+#undef CPP_SPEC
+#define CPP_SPEC "%(cpp_cpu) \
+ %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} \
+ %{posix:-D_POSIX_SOURCE} \
+ %{mieee:-D_IEEE_FP} \
+ %{mieee-with-inexact:-D_IEEE_FP -D_IEEE_FP_INEXACT}"
+
+#undef LINK_SPEC
+#define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \
+ %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
+ %{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}}"
+
+/* Provide an ASM_SPEC appropriate for a FreeBSD/Alpha target. This differs
+ from the generic FreeBSD ASM_SPEC in that no special handling of PIC is
+ necessary on the Alpha. */
+/* Per Richard Henderson <rth@cygnus.com>, it is better to use the `.arch'
+ directive in the assembly file. alpha/elf.h gives us this in
+ "ASM_FILE_START".
+#undef ASM_SPEC
+#define ASM_SPEC " %| %{mcpu=*:-m%*}"
+*/
+
+/* XXX, if FreeBSD/Alpha grows a crti.o file, we can use the alpha/elf.h
+ definition. */
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC \
+ "%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
+ %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+
+/* Provide a ENDFILE_SPEC appropriate for ELF. Here we tack on the
+ magical crtend.o file which provides part of the support for
+ getting C++ file-scope static object constructed before entering
+ `main'. */
+/* XXX, if FreeBSD/Alpha grows a crtn.o file, we can use the alpha/elf.h
+ definition. */
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "%{!shared:crtend.o%s} %{shared:crtendS.o%s}"
+
+
+/************************[ Target stuff ]***********************************/
+
+/* Define the actual types of some ANSI-mandated types.
+ Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c,
+ c-common.c, and config/<arch>/<arch>.h. */
+
+/* alpha.h gets this wrong for FreeBSD. We use the GCC defaults instead. */
+#undef WCHAR_TYPE
+
+#undef WCHAR_UNSIGNED
+#define WCHAR_UNSIGNED 0
+
+#undef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE 32
+
+/* Handle cross-compilation on 32-bits machines (such as i386) for 64-bits
+ machines (Alpha in this case). */
+
+#if defined(__i386__)
+#undef HOST_BITS_PER_LONG
+#define HOST_BITS_PER_LONG 32
+#undef HOST_WIDE_INT
+#define HOST_WIDE_INT long long
+#undef HOST_BITS_PER_WIDE_INT
+#define HOST_BITS_PER_WIDE_INT 64
+#endif
+
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (FreeBSD/alpha ELF)");
+
+#define TARGET_ELF 1
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_FP | MASK_FPREGS | MASK_GAS)
+
+#undef HAS_INIT_SECTION
+
+/* Output assembler code to FILE to increment profiler label # LABELNO
+ for profiling a function entry. Under FreeBSD/Alpha, the assembler does
+ nothing special with -pg. */
+
+#undef FUNCTION_PROFILER
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+ fputs ("\tjsr $28,_mcount\n", (FILE))
+
+/* Show that we need a GP when profiling. */
+#undef TARGET_PROFILING_NEEDS_GP
+#define TARGET_PROFILING_NEEDS_GP 1
+
+
+/************************[ Assembler stuff ]********************************/
+
+#undef ASM_OUTPUT_SOURCE_LINE
+#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
+ alpha_output_lineno (STREAM, LINE)
+
+/* Support const sections and the ctors and dtors sections for g++.
+ Note that there appears to be two different ways to support const
+ sections at the moment. You can either #define the symbol
+ READONLY_DATA_SECTION (giving it some code which switches to the
+ readonly data section) or else you can #define the symbols
+ EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
+ SELECT_RTX_SECTION. We do both here just to be on the safe side. */
+
+#undef CTORS_SECTION_FUNCTION
+#define CTORS_SECTION_FUNCTION \
+void \
+ctors_section () \
+{ \
+ if (in_section != in_ctors) \
+ { \
+ fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
+ in_section = in_ctors; \
+ } \
+}
+
+#undef DTORS_SECTION_FUNCTION
+#define DTORS_SECTION_FUNCTION \
+void \
+dtors_section () \
+{ \
+ if (in_section != in_dtors) \
+ { \
+ fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
+ in_section = in_dtors; \
+ } \
+}
+
+/* Some imports from svr4.h in support of shared libraries. Currently,
+ we need the DECLARE_OBJECT_SIZE stuff. */
+
+/* This is how we tell the assembler that a symbol is weak. */
+/* XXX, alpha/elf.h does not do the ".globl". Should FreeBSD/Alpha? */
+
+#undef ASM_WEAKEN_LABEL
+#define ASM_WEAKEN_LABEL(FILE,NAME) \
+ do { fputs ("\t.globl\t", FILE); assemble_name (FILE, NAME); \
+ fputc ('\n', FILE); \
+ fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
+ fputc ('\n', FILE); } while (0)
+
+
+/************************[ Debugger stuff ]*********************************/
+
+/* This is the char to use for continuation (in case we need to turn
+ continuation back on). */
+
+#undef DBX_CONTIN_CHAR
+#define DBX_CONTIN_CHAR '?'