diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2000-01-12 19:37:06 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2000-01-12 19:37:06 -0500 |
commit | 512b62fb1bdb3e758207b6bf72eb1024848e8ec6 (patch) | |
tree | d3dff74afbeffac820b068280d9d819772186d74 /gcc/config/i386/beos-elf.h | |
parent | 6bb88f3be6ef0f0ad8b7a3819ddefafa63283e76 (diff) | |
download | gcc-512b62fb1bdb3e758207b6bf72eb1024848e8ec6.zip gcc-512b62fb1bdb3e758207b6bf72eb1024848e8ec6.tar.gz gcc-512b62fb1bdb3e758207b6bf72eb1024848e8ec6.tar.bz2 |
configure.in (i?86-*-beos{pe,elf,}*): Recognize.
* configure.in (i?86-*-beos{pe,elf,}*): Recognize.
* i386/t-beos, i386/x-beos, i386/xm-beos.h: New files.
* i386/beos-elf.h, i386/beos-pe.h: New files.
* Makefile.in (CROSS_SYSTEM_HEADER_DIR): New.
* cross-make (SYSTEM_HEADER_DIR): Define using
CROSS_SYSTEM_HEADER_DIR.
* gcc.c (LIBRARY_PATH_ENV): Provide default.
(process_command): Use it.
(main): Likewise. Kill trailing = from env vars.
(build_search_list): Put it back.
* collect2.c (main): Use LIBRARY_PATH_ENV.
* configure.in (GCC_NEED_DECLARATIONS): Add environ.
* toplev.c: Use NEED_DECLARATION_ENVIRON.
* tm.texi (Frame Layout): Document SMALL_STACK.
* c-common.c (c_common_nodes_and_builtins): Check it.
* system.h: Undef alloca after including glibc's <stdlib.h>,
if USE_C_ALLOCA is defined.
* gcc.c (set_input): New fn.
(main): After all input files are compiled, reset the input file
info to the first.
* aclocal.m4 (rindex, index): If already defined, don't attempt
to redefine.
* ginclude/varargs.h: (__va_list__): Define ifndef.
* ginclude/stdarg.h: Likewise.
* ginclude/stddef.h (__WCHAR_TYPE__) [BEOS]: Use int
instead of unsigned char.
* hash.h (true, false, boolean): Undef before enum.
From-SVN: r31366
Diffstat (limited to 'gcc/config/i386/beos-elf.h')
-rw-r--r-- | gcc/config/i386/beos-elf.h | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/gcc/config/i386/beos-elf.h b/gcc/config/i386/beos-elf.h new file mode 100644 index 0000000..44524df --- /dev/null +++ b/gcc/config/i386/beos-elf.h @@ -0,0 +1,436 @@ +/* Definitions for Intel x86 running BeOS + Copyright (C) 1998-99, 2000 Free Software Foundation, Inc. + +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. */ + +#include <i386/i386.h> /* Base i386 target machine definitions */ +#include <i386/att.h> /* Use the i386 AT&T assembler syntax */ +#include <svr4.h> /* some common stuff */ + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (i386 BeOS/ELF)"); + +/* Change debugging to Dwarf2. */ +#undef PREFERRED_DEBUGGING_TYPE +#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG + +/* 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 1 + +#undef ASM_COMMENT_START +#define ASM_COMMENT_START " #" + +/* 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, BODY, VALUE, REL) \ + fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE) + +/* Indicate that jump tables go in the text section. This is + necessary when compiling PIC code. */ +#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) + +/* Copy this from the svr4 specifications... */ +/* Define the register numbers to be used in Dwarf debugging information. + The SVR4 reference port C compiler uses the following register numbers + in its Dwarf output code: + 0 for %eax (gnu regno = 0) + 1 for %ecx (gnu regno = 2) + 2 for %edx (gnu regno = 1) + 3 for %ebx (gnu regno = 3) + 4 for %esp (gnu regno = 7) + 5 for %ebp (gnu regno = 6) + 6 for %esi (gnu regno = 4) + 7 for %edi (gnu regno = 5) + The following three DWARF register numbers are never generated by + the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 + believes these numbers have these meanings. + 8 for %eip (no gnu equivalent) + 9 for %eflags (no gnu equivalent) + 10 for %trapno (no gnu equivalent) + It is not at all clear how we should number the FP stack registers + for the x86 architecture. If the version of SDB on x86/svr4 were + a bit less brain dead with respect to floating-point then we would + have a precedent to follow with respect to DWARF register numbers + for x86 FP registers, but the SDB on x86/svr4 is so completely + broken with respect to FP registers that it is hardly worth thinking + of it as something to strive for compatibility with. + The version of x86/svr4 SDB I have at the moment does (partially) + seem to believe that DWARF register number 11 is associated with + the x86 register %st(0), but that's about all. Higher DWARF + register numbers don't seem to be associated with anything in + particular, and even for DWARF regno 11, SDB only seems to under- + stand that it should say that a variable lives in %st(0) (when + asked via an `=' command) if we said it was in DWARF regno 11, + but SDB still prints garbage when asked for the value of the + variable in question (via a `/' command). + (Also note that the labels SDB prints for various FP stack regs + when doing an `x' command are all wrong.) + Note that these problems generally don't affect the native SVR4 + C compiler because it doesn't allow the use of -O with -g and + because when it is *not* optimizing, it allocates a memory + location for each floating-point variable, and the memory + location is what gets described in the DWARF AT_location + attribute for the variable in question. + Regardless of the severe mental illness of the x86/svr4 SDB, we + do something sensible here and we use the following DWARF + register numbers. Note that these are all stack-top-relative + numbers. + 11 for %st(0) (gnu regno = 8) + 12 for %st(1) (gnu regno = 9) + 13 for %st(2) (gnu regno = 10) + 14 for %st(3) (gnu regno = 11) + 15 for %st(4) (gnu regno = 12) + 16 for %st(5) (gnu regno = 13) + 17 for %st(6) (gnu regno = 14) + 18 for %st(7) (gnu regno = 15) +*/ +#undef DBX_REGISTER_NUMBER +#define 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)) + +/* Output assembler code to FILE to increment profiler label # LABELNO + for profiling a function entry. */ + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ +{ \ + if (flag_pic) \ + { \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ + LPREFIX, (LABELNO)); \ + fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ + } \ + else \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \ + fprintf (FILE, "\tcall mcount\n"); \ + } \ +} + +#undef SIZE_TYPE +#define SIZE_TYPE "long unsigned int" + +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE "long int" + +#undef WCHAR_TYPE +#define WCHAR_TYPE "short unsigned int" + +#undef WCHAR_UNSIGNED +#define WCHAR_UNSIGNED 1 + +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE 16 + +#undef CPP_PREDEFINES +#define CPP_PREDEFINES "-D__ELF__ -D__BEOS__ -D__INTEL__ -D_X86_=1 \ +-D__stdcall=__attribute__((__stdcall__)) \ +-D__cdecl=__attribute__((__cdecl__)) \ +-D__declspec(x)=__attribute__((x)) \ +-Asystem(beos)" + +#undef CPP_SPEC +#define CPP_SPEC "%(cpp_cpu) %{!no-fPIC:%{!no-fpic:-D__PIC__ -D__pic__}}" + +/* BeOS uses lots of multichars, so don't warn about them unless the + user explicitly asks for the warnings with -Wmultichar. Note that + CC1_SPEC is used for both cc1 and cc1plus. */ + +#undef CC1_SPEC +#define CC1_SPEC "%{!no-fpic:%{!fPIC:-fpic}} %{!Wmultichar: -Wno-multichar} %(cc1_cpu) %{profile:-p}" + +#undef CC1PLUS_SPEC +#define CC1PLUS_SPEC "%{!Wctor-dtor-privacy:-Wno-ctor-dtor-privacy}" + +/* Provide a LINK_SPEC appropriate for BeOS. 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. */ + +/* If ELF is the default format, we should not use /lib/elf. */ + +#undef LINK_SPEC +#define LINK_SPEC "%{!o*:-o %b} -m elf_i386_be -shared -Bsymbolic %{nostart:-e 0}" + +/* Provide start and end file specs appropriate to glibc. */ + +/* LIB_SPEC for BeOS */ +#undef LIB_SPEC +#define LIB_SPEC "-lnet -lroot" + +/* gcc runtime lib is built into libroot.so on BeOS */ +/* ??? This is gonna be lovely when the next release of gcc has + some new symbol in, so that links start failing. */ +#undef LIBGCC_SPEC +#define LIBGCC_SPEC "" + +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "crti.o%s crtbegin.o%s %{!nostart:start_dyn.o%s}" + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "crtend.o%s crtn.o%s" + +/* Get perform_* macros to build libgcc.a. */ +#include "i386/perform.h" + +/* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named + NAME whose size is SIZE bytes and alignment is ALIGN bytes. + Try to use asm_output_aligned_bss to implement this macro. */ + +#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ + asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) + +/* A C statement to output to the stdio stream FILE an assembler + command to advance the location counter to a multiple of 1<<LOG + bytes if it is within MAX_SKIP bytes. + + This is used to align code labels according to Intel recommendations. */ + +#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN +#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ + if ((LOG)!=0) \ + if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ + else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) +#endif + +/* + * Support for __declspec(dllimport) & __declspec(dllexport). + */ + +/* We don't care about dllimport. */ + +#define TARGET_NOP_FUN_DLLIMPORT 1 + +/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS + is a valid machine specific attribute for DECL. + The attributes in ATTRIBUTES have previously been assigned to DECL. */ + +#undef VALID_MACHINE_DECL_ATTRIBUTE +#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \ + i386_pe_valid_decl_attribute_p (DECL, ATTRIBUTES, IDENTIFIER, ARGS) +extern int i386_pe_valid_decl_attribute_p (); + +/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS + is a valid machine specific attribute for TYPE. + The attributes in ATTRIBUTES have previously been assigned to TYPE. */ + +#undef VALID_MACHINE_TYPE_ATTRIBUTE +#define VALID_MACHINE_TYPE_ATTRIBUTE(TYPE, ATTRIBUTES, IDENTIFIER, ARGS) \ + i386_pe_valid_type_attribute_p (TYPE, ATTRIBUTES, IDENTIFIER, ARGS) +extern int i386_pe_valid_type_attribute_p (); + +#define MERGE_MACHINE_DECL_ATTRIBUTES(OLD, NEW) \ + i386_pe_merge_decl_attributes ((OLD), (NEW)) +extern union tree_node *i386_pe_merge_decl_attributes (); + +/* Used to implement dllexport overriding dllimport semantics. It's also used + to handle vtables - the first pass won't do anything because + DECL_CONTEXT (DECL) will be 0 so i386_pe_dll{ex,im}port_p will return 0. + It's also used to handle dllimport override semantics. */ +#if 0 +#define REDO_SECTION_INFO_P(DECL) \ + ((DECL_MACHINE_ATTRIBUTES (DECL) != NULL_TREE) \ + || (TREE_CODE (DECL) == VAR_DECL && DECL_VIRTUAL_P (DECL))) +#else +#define REDO_SECTION_INFO_P(DECL) 1 +#endif + +/* Used only here locally. If the decl has been exported, emit the + necessary assembly. */ + +#define ASM_EXPORT_DECL(FILE, NAME, DECL) \ + do { \ + if ((DECL) && i386_pe_dllexport_p (DECL)) \ + { \ + fprintf ((FILE), ".section .exports\n"); \ + fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \ + assemble_name (FILE, NAME); \ + fprintf ((FILE), "\"\n.previous\n"); \ + } \ + } while (0) + +/* Write the extra assembler code needed to declare a function properly. + Some svr4 assemblers need to also have something extra said about the + function's return value. We allow for that here. */ + +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ + do { \ + ASM_EXPORT_DECL(FILE, NAME, DECL); \ + fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \ + assemble_name (FILE, NAME); \ + putc (',', FILE); \ + fprintf (FILE, TYPE_OPERAND_FMT, "function"); \ + putc ('\n', FILE); \ + ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ + ASM_OUTPUT_LABEL(FILE, NAME); \ + } while (0) + +/* Write the extra assembler code needed to declare an object properly. */ + +#undef ASM_DECLARE_OBJECT_NAME +#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ + do { \ + ASM_EXPORT_DECL(FILE, NAME, DECL); \ + fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \ + assemble_name (FILE, NAME); \ + putc (',', FILE); \ + fprintf (FILE, TYPE_OPERAND_FMT, "object"); \ + putc ('\n', FILE); \ + size_directive_output = 0; \ + if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \ + { \ + size_directive_output = 1; \ + fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ + assemble_name (FILE, NAME); \ + putc (',', FILE); \ + fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \ + int_size_in_bytes (TREE_TYPE (DECL))); \ + fputc ('\n', FILE); \ + } \ + ASM_OUTPUT_LABEL(FILE, NAME); \ + } while (0) + +/* Similarly for COMMON symbols. */ + +#undef ASM_OUTPUT_ALIGNED_COMMON +#undef ASM_OUTPUT_ALIGNED_DECL_COMMON +#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ + do { \ + ASM_EXPORT_DECL(FILE, NAME, DECL); \ + fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ + } while (0) + +#undef ASM_OUTPUT_ALIGNED_LOCAL +#undef ASM_OUTPUT_ALIGNED_DECL_LOCAL +#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ + do { \ + fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), "\n"); \ + ASM_OUTPUT_ALIGNED_DECL_COMMON((FILE), (DECL), (NAME), (SIZE), (ALIGN)); \ + } while (0) + +/* This macro gets just the user-specified name out of the string in a + SYMBOL_REF. Discard trailing @[NUM] encoded by ENCODE_SECTION_INFO. */ +/* Unused except to let winnt.c compile. */ + +#undef STRIP_NAME_ENCODING +#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) ((VAR) = (SYMBOL_NAME)) + +/* For native compiler, use standard BeOS include file search paths + rooted in /boot/develop/headers. For a cross compiler, don't + expect the host to use the BeOS directory scheme, and instead look + for the BeOS include files relative to TOOL_INCLUDE_DIR. Yes, we + use ANSI string concatenation here (FIXME) */ + +#ifndef CROSS_COMPILE +#undef INCLUDE_DEFAULTS +#define INCLUDE_DEFAULTS \ + { \ + { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },\ + { GCC_INCLUDE_DIR, "GCC", 0, 0 },\ + { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1}, \ + { "/boot/develop/headers/be/add-ons/graphics", 0, 0, 0 },\ + { "/boot/develop/headers/be/devel", 0, 0, 0 },\ + { "/boot/develop/headers/be/translation", 0, 0, 0 },\ + { "/boot/develop/headers/be/mail", 0, 0, 0 },\ + { "/boot/develop/headers/gnu", 0, 0, 0 },\ + { "/boot/develop/headers/be/drivers", 0, 0, 0 },\ + { "/boot/develop/headers/be/opengl", 0, 0, 0 },\ + { "/boot/develop/headers/be/game", 0, 0, 0 },\ + { "/boot/develop/headers/be/support", 0, 0, 0 },\ + { "/boot/develop/headers/be/storage", 0, 0, 0 },\ + { "/boot/develop/headers/be/kernel", 0, 0, 0 },\ + { "/boot/develop/headers/be/net", 0, 0, 0 },\ + { "/boot/develop/headers/be/midi", 0, 0, 0 },\ + { "/boot/develop/headers/be/media", 0, 0, 0 },\ + { "/boot/develop/headers/be/interface", 0, 0, 0 },\ + { "/boot/develop/headers/be/device", 0, 0, 0 },\ + { "/boot/develop/headers/be/app", 0, 0, 0 },\ + { "/boot/develop/headers/cpp", 0, 0, 0 },\ + { "/boot/develop/headers/posix", 0, 0, 0 },\ + { "/boot/develop/headers/be/precompiled", 0, 0, 0 },\ + { "/boot/develop/headers/be", 0, 0, 0 },\ + { "/boot/develop/headers", 0, 0, 0 }, \ + { 0, 0, 0, 0 } \ + }; +#else /* CROSS_COMPILE */ +#undef INCLUDE_DEFAULTS +#define INCLUDE_DEFAULTS \ + { \ + { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 },\ + { GCC_INCLUDE_DIR, "GCC", 0, 0 },\ + { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1}, \ + { CROSS_INCLUDE_DIR "/be/add-ons/graphics", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/devel", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/translation", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/mail", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/gnu", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/drivers", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/opengl", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/game", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/support", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/storage", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/kernel", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/net", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/midi", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/media", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/interface", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/device", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/app", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/cpp", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/posix", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be/precompiled", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR "/be", 0, 0, 0 },\ + { CROSS_INCLUDE_DIR , 0, 0, 0 }, \ + { 0, 0, 0, 0 } \ + }; +#endif + +/* Whee. LIBRARY_PATH is Be's LD_LIBRARY_PATH, which of course will + cause nasty problems if we override it. */ +#define LIBRARY_PATH_ENV "BELIBRARIES" + +/* BeOS doesn't have a separate math library. */ +#define MATH_LIBRARY "" + +/* BeOS headers are C++-aware (and often use C++). */ +#define NO_IMPLICIT_EXTERN_C + +/* Define this macro if in some cases global symbols from one translation + unit may not be bound to undefined symbols in another translation unit + without user intervention. For instance, under Microsoft Windows + symbols must be explicitly imported from shared libraries (DLLs). */ +#define MULTIPLE_SYMBOL_SPACES |