From e70bd3dc1961543d10142c8884755cdaf4fd86e7 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Sun, 12 Apr 1998 11:04:57 -0600 Subject: [PATCH] Initial revision From-SVN: r19141 --- gcc/config/i386/osf1elf.h | 260 +++++++++++++++++++++++++++++++++++ gcc/config/i386/osf1elfgdb.h | 7 + gcc/config/i386/t-osf1elf | 18 +++ gcc/config/i386/x-osf1elf | 8 ++ 4 files changed, 293 insertions(+) create mode 100644 gcc/config/i386/osf1elf.h create mode 100644 gcc/config/i386/osf1elfgdb.h create mode 100644 gcc/config/i386/t-osf1elf create mode 100644 gcc/config/i386/x-osf1elf diff --git a/gcc/config/i386/osf1elf.h b/gcc/config/i386/osf1elf.h new file mode 100644 index 00000000000..da61e8b5674 --- /dev/null +++ b/gcc/config/i386/osf1elf.h @@ -0,0 +1,260 @@ +/* OSF/1 1.3 now is compitable with SVR4, so include sysv4.h, and + put difference here. */ + +#include +#include "i386/sysv4.h" /* Base i386 target machine definitions */ +#define _sys_siglist sys_siglist +extern char *sys_siglist[]; + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (i386 OSF/1)"); + +/* WORD_SWITCH_TAKES_ARG defined in svr4 is not correct. We also + need an extra -soname */ +#undef WORD_SWITCH_TAKES_ARG +#define WORD_SWITCH_TAKES_ARG(STR) \ + (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ + || !strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \ + || !strcmp (STR, "Tbss") || !strcmp (STR, "soname")) + +/* Note, -fpic and -fPIC are equivalent */ +#undef CPP_SPEC +#define CPP_SPEC "\ +%{fpic: -D__SHARED__} %{fPIC: %{!fpic: -D__SHARED__}} \ +%{.S: %{!ansi:%{!traditional:%{!traditional-cpp:%{!ftraditional: -traditional}}}}} \ +%{.S: -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \ +%{.cc: -D__LANGUAGE_C_PLUS_PLUS} \ +%{.cxx: -D__LANGUAGE_C_PLUS_PLUS} \ +%{.C: -D__LANGUAGE_C_PLUS_PLUS} \ +%{.m: -D__LANGUAGE_OBJECTIVE_C} \ +%{!.S: -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C}}" + +/* -mmcount or -mno-mcount should be used with -pg or -p */ +#undef CC1_SPEC +#define CC1_SPEC "%{p: %{!mmcount: %{!mno-mcount: -mno-mcount }}} \ +%{!p: %{pg: %{!mmcount: %{!mno-mcount: -mno-mcount }}}}" + +/* Note, -D__NO_UNDERSCORES__ -D__ELF__ are provided in the older version of + OSF/1 gcc. We keep them here, so that old /usr/include/i386/asm.h works. + */ +#undef CPP_PREDEFINES +#define CPP_PREDEFINES \ + "-D__NO_UNDERSCORES__ -D__ELF__ -DOSF -DOSF1 -Di386 -Dunix -Asystem(xpg4) -Asystem(osf1) -Acpu(i386) -Amachine(i386)" + +/* current OSF/1 doesn't provide separate crti.o and gcrti.o (and also, crtn.o + and gcrtn.o) for profile. */ + +#undef STARTFILE_SPEC +#define STARTFILE_SPEC "%{!shared: \ + %{!symbolic: \ + %{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}}\ + crti.o%s \ + crtbegin.o%s" + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "crtend.o%s crtn.o%s" + +#undef ASM_SPEC +#define ASM_SPEC "%{v*: -v}" + +#undef LINK_SPEC +#define LINK_SPEC "%{v*: -v} \ + %{h*} %{z*} \ + %{dy:-call_shared} %{dn:-static} \ + %{static:-static} \ + %{shared:-shared} \ + %{call_shared:-call_shared} \ + %{symbolic:-Bsymbolic -shared -call_shared} \ + %{!dy: %{!dn: %{!static: %{!shared: %{!symbolic: \ + %{noshrlib: -static } \ + %{!noshrlib: -call_shared}}}}}}" + +#undef MD_EXEC_PREFIX +#define MD_EXEC_PREFIX "/usr/ccs/gcc/" + +#undef MD_STARTFILE_PREFIX +#define MD_STARTFILE_PREFIX "/usr/ccs/lib/" + +/* Define this macro meaning that gcc should find the library 'libgcc.a' + by hand, rather than passing the argument '-lgcc' to tell the linker + to do the search */ +#define LINK_LIBGCC_SPECIAL + +/* This goes with LINK_LIBGCC_SPECIAL, we need tell libgcc.a differently */ +#undef LIBGCC_SPEC +#define LIBGCC_SPEC "%{!shared:%{!symbolic:libgcc.a%s}}" + +/* A C statement to output assembler commands which will identify the object + file as having been compile with GNU CC. We don't need or want this for + OSF1. */ +#undef ASM_IDENTIFY_GCC +#define ASM_IDENTIFY_GCC(FILE) + +/* 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. */ +#define ASM_IDENTIFY_LANGUAGE(STREAM) \ +{ \ + if (strcmp (lang_identify (), "c") != 0) \ + output_lang_identify (STREAM); \ +} + +/* Specify size_t, ptrdiff_t, and wchar_t types. */ +#undef SIZE_TYPE +#undef PTRDIFF_TYPE +#undef WCHAR_TYPE +#undef WCHAR_TYPE_SIZE + +#define SIZE_TYPE "long unsigned int" +#define PTRDIFF_TYPE "int" +#define WCHAR_TYPE "unsigned int" +#define WCHAR_TYPE_SIZE BITS_PER_WORD + +/* Turn off long double being 96 bits. */ +#undef LONG_DOUBLE_TYPE_SIZE +#define LONG_DOUBLE_TYPE_SIZE 64 + +/* Work with OSF/1 profile */ +#define MASK_NO_MCOUNT 000200000000 /* profiling uses mcount_ptr */ + +#define TARGET_MCOUNT ((target_flags & MASK_NO_MCOUNT) == 0) + +#undef SUBTARGET_SWITCHES +#define SUBTARGET_SWITCHES \ + { "mcount", -MASK_NO_MCOUNT}, \ + { "no-mcount", MASK_NO_MCOUNT}, + +/* This macro generates the assembly code for function entry. + FILE is a stdio stream to output the code to. + SIZE is an int: how many units of temporary storage to allocate. + Refer to the array `regs_ever_live' to determine which registers + to save; `regs_ever_live[I]' is nonzero if register number I + is ever used in the function. This macro is responsible for + knowing which registers should not be saved even if used. + + We override it here to allow for the new profiling code to go before + the prologue and the old mcount code to go after the prologue (and + after %ebx has been set up for ELF shared library support). */ +#if 0 +#define OSF_PROFILE_BEFORE_PROLOGUE \ + (!TARGET_MCOUNT \ + && !current_function_needs_context \ + && (!flag_pic \ + || !frame_pointer_needed \ + || (!current_function_uses_pic_offset_table \ + && !current_function_uses_const_pool))) +#else +#define OSF_PROFILE_BEFORE_PROLOGUE 0 +#endif +#undef FUNCTION_PROLOGUE +#define FUNCTION_PROLOGUE(FILE, SIZE) \ +do \ + { \ + char *prefix = ""; \ + char *lprefix = LPREFIX; \ + int labelno = profile_label_no; \ + \ + if (profile_flag && OSF_PROFILE_BEFORE_PROLOGUE) \ + { \ + if (!flag_pic) \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); \ + fprintf (FILE, "\tcall *%s_mcount_ptr\n", prefix); \ + } \ + \ + else \ + { \ + static int call_no = 0; \ + \ + fprintf (FILE, "\tcall %sPc%d\n", lprefix, call_no); \ + fprintf (FILE, "%sPc%d:\tpopl %%eax\n", lprefix, call_no); \ + fprintf (FILE, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-%sPc%d],%%eax\n", \ + lprefix, call_no++); \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%eax),%%edx\n", \ + lprefix, labelno); \ + fprintf (FILE, "\tmovl %s_mcount_ptr@GOT(%%eax),%%eax\n", \ + prefix); \ + fprintf (FILE, "\tcall *(%%eax)\n"); \ + } \ + } \ + \ + function_prologue (FILE, SIZE); \ + } \ +while (0) + +/* A C statement or compound statement to output to FILE some assembler code to + call the profiling subroutine `mcount'. Before calling, the assembler code + must load the address of a counter variable into a register where `mcount' + expects to find the address. The name of this variable is `LP' followed by + the number LABELNO, so you would generate the name using `LP%d' in a + `fprintf'. + + The details of how the address should be passed to `mcount' are determined + by your operating system environment, not by GNU CC. To figure them out, + compile a small program for profiling using the system's installed C + compiler and look at the assembler code that results. */ + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ +do \ + { \ + if (!OSF_PROFILE_BEFORE_PROLOGUE) \ + { \ + char *prefix = ""; \ + char *lprefix = LPREFIX; \ + int labelno = LABELNO; \ + \ + /* Note that OSF/rose blew it in terms of calling mcount, \ + since OSF/rose prepends a leading underscore, but mcount's \ + doesn't. At present, we keep this kludge for ELF as well \ + to allow old kernels to build profiling. */ \ + \ + if (flag_pic \ + && !current_function_uses_pic_offset_table \ + && !current_function_uses_const_pool) \ + abort (); \ + \ + if (TARGET_MCOUNT && flag_pic) \ + { \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ + lprefix, labelno); \ + fprintf (FILE, "\tcall *%smcount@GOT(%%ebx)\n", prefix); \ + } \ + \ + else if (TARGET_MCOUNT) \ + { \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); \ + fprintf (FILE, "\tcall %smcount\n", prefix); \ + } \ + \ + else if (flag_pic && frame_pointer_needed) \ + { \ + fprintf (FILE, "\tmovl 4(%%ebp),%%ecx\n"); \ + fprintf (FILE, "\tpushl %%ecx\n"); \ + fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ + lprefix, labelno); \ + fprintf (FILE, "\tmovl _mcount_ptr@GOT(%%ebx),%%eax\n"); \ + fprintf (FILE, "\tcall *(%%eax)\n"); \ + fprintf (FILE, "\tpopl %%eax\n"); \ + } \ + \ + else if (frame_pointer_needed) \ + { \ + fprintf (FILE, "\tmovl 4(%%ebp),%%ecx\n"); \ + fprintf (FILE, "\tpushl %%ecx\n"); \ + fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); \ + fprintf (FILE, "\tcall *_mcount_ptr\n"); \ + fprintf (FILE, "\tpopl %%eax\n"); \ + } \ + \ + else \ + abort (); \ + } \ + } \ +while (0) + +#if defined (CROSS_COMPILE) && defined (HOST_BITS_PER_INT) && defined (HOST_BITS_PER_LONG) && defined (HOST_BITS_PER_LONGLONG) +#if (HOST_BITS_PER_INT==32) && (HOST_BITS_PER_LONG==64) && (HOST_BITS_PER_LONGLONG==64) +#define REAL_ARITHMETIC +#endif +#endif diff --git a/gcc/config/i386/osf1elfgdb.h b/gcc/config/i386/osf1elfgdb.h new file mode 100644 index 00000000000..af6efa2d0de --- /dev/null +++ b/gcc/config/i386/osf1elfgdb.h @@ -0,0 +1,7 @@ +/* Target definitions for GNU compiler for Intel 80386 running OSF/1 1.3+ + with gas and gdb. */ + +/* Use stabs instead of DWARF debug format. */ +#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG + +#include "i386/osf1elf.h" diff --git a/gcc/config/i386/t-osf1elf b/gcc/config/i386/t-osf1elf new file mode 100644 index 00000000000..77c7df1a6df --- /dev/null +++ b/gcc/config/i386/t-osf1elf @@ -0,0 +1,18 @@ +# Assemble startup files. +crti.o: $(srcdir)/config/i386/osf1-ci.asm $(GCC_PASSES) + sed -e '/^!/d' <$(srcdir)/config/i386/osf1-ci.asm >crti.s + $(GCC_FOR_TARGET) -c -o crti.o crti.s +crtn.o: $(srcdir)/config/i386/osf1-cn.asm $(GCC_PASSES) + sed -e '/^!/d' <$(srcdir)/config/i386/osf1-cn.asm >crtn.s + $(GCC_FOR_TARGET) -c -o crtn.o crtn.s + +# The pushl in CTOR initialization interferes with frame pointer elimination. + +# We need to use -fPIC when we are using gcc to compile the routines in +# crtstuff.c. This is only really needed when we are going to use gcc/g++ +# to produce a shared library, but since we don't know ahead of time when +# we will be doing that, we just always use -fPIC when compiling the +# routines in crtstuff.c. + +CRTSTUFF_T_CFLAGS = -fPIC -fno-omit-frame-pointer +TARGET_LIBGCC2_CFLAGS = -fPIC diff --git a/gcc/config/i386/x-osf1elf b/gcc/config/i386/x-osf1elf new file mode 100644 index 00000000000..146738107f6 --- /dev/null +++ b/gcc/config/i386/x-osf1elf @@ -0,0 +1,8 @@ +# Defaults for OSF/1 1.3+ +CC = $(OLDCC) +CLIB = -lld +INSTALL = installbsd -c +OLDCC = /usr/ccs/gcc/gcc +X_CFLAGS = -static + +# FIXPROTO_DEFINES = -D_XOPEN_SOURCE