home *** CD-ROM | disk | FTP | other *** search
- diff -2rcN dh5:gcc-2.1.orig/config/amiga.c gcc-2.1/config/amiga.c
- *** dh5:gcc-2.1.orig/config/amiga.c
- --- gcc-2.1/config/amiga.c Sat Apr 18 22:37:16 1992
- ***************
- *** 0 ****
- --- 1,127 ----
- + /* amiga.c: Functions for Amiga as target machine for GNU C compiler */
- +
- + /* NOTE: ATTRIBUTE STUFF IS NOT WORKING CURRENTLY !!!!! */
- +
- + #include "m68k.c"
- + #include "tree.h"
- +
- + struct attribute {
- + tree ident;
- + int saveds : 1,
- + interrupt : 1;
- + };
- +
- +
- + static struct attribute *a_tab = 0;
- + static int a_index, a_size;
- +
- + void
- + add_attr_entry (attr)
- + struct attribute *attr;
- + {
- + if (! a_tab)
- + {
- + a_size = 10;
- + a_index = 0;
- + a_tab = (struct attribute *) xmalloc (a_size * sizeof (struct attribute));
- + }
- +
- + if (a_index == a_size)
- + {
- + a_size <<= 1;
- + a_tab = (struct attribute *) xrealloc (a_tab, a_size * sizeof (struct attribute));
- + }
- +
- + a_tab[a_index++] = *attr;
- + }
- +
- +
- + void
- + attr_do_saveds (function_ident)
- + tree function_ident;
- + {
- + struct attribute attr, *a;
- + int i;
- +
- + for (i = 0, a = a_tab; i < a_index; i++, a++)
- + if (a->ident == function_ident)
- + {
- + a->saveds = 1;
- + return;
- + }
- +
- + /* create a new entry for this function */
- + attr.ident = function_ident;
- + attr.saveds = 1;
- + attr.interrupt = 0;
- + add_attr_entry (&attr);
- + }
- +
- + void
- + attr_do_interrupt (function_ident)
- + tree function_ident;
- + {
- + struct attribute attr, *a;
- + int i;
- +
- + for (i = 0, a = a_tab; i < a_index; i++, a++)
- + if (a->ident == function_ident)
- + {
- + /* __interrupt implies __saveds */
- + a->saveds = 1;
- + a->interrupt = 1;
- + return;
- + }
- +
- + /* create a new entry for this function */
- + attr.ident = function_ident;
- + attr.saveds = 1;
- + attr.interrupt = 1;
- + add_attr_entry (&attr);
- + }
- +
- + int
- + attr_does_saveds (function_name)
- + char *function_name;
- + {
- + tree ident = get_identifier (function_name);
- + struct attribute *attr;
- + int i;
- +
- + for (i = 0, attr = a_tab; i < a_index; i++, attr++)
- + if (attr->ident == ident)
- + return attr->saveds;
- +
- + return 0;
- + }
- +
- + int
- + attr_does_interrupt (function_name)
- + char *function_name;
- + {
- + tree ident = get_identifier (function_name);
- + struct attribute *attr;
- + int i;
- +
- + for (i = 0, attr = a_tab; i < a_index; i++, attr++)
- + if (attr->ident == ident)
- + return attr->interrupt;
- +
- + return 0;
- + }
- +
- +
- +
- + /* Does operand (which is a symbolic_operand) live in text space? If
- + so SYMBOL_REF_FLAG, which is set by ENCODE_SECTION_INFO, will be true.*/
- +
- + int
- + read_only_operand (operand)
- + rtx operand;
- + {
- + if (GET_CODE (operand) == CONST)
- + operand = XEXP (XEXP (operand, 0), 0);
- + if (GET_CODE (operand) == SYMBOL_REF)
- + return SYMBOL_REF_FLAG (operand) || CONSTANT_POOL_ADDRESS_P (operand);
- + return 1;
- + }
- diff -2rcN dh5:gcc-2.1.orig/config/amiga.h gcc-2.1/config/amiga.h
- *** dh5:gcc-2.1.orig/config/amiga.h
- --- gcc-2.1/config/amiga.h Sat Apr 18 23:16:53 1992
- ***************
- *** 0 ****
- --- 1,398 ----
- + /* Definitions of target machine for GNU compiler. amiga 68000/68020 version.
- + Copyright (C) 1987, 1988 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
- +
- + /* This comment is here to see if it will keep amiga's cpp from dying. */
- +
- + #include "m68k.h"
- +
- + /* See tm-m68k.h. 7 means 68020 with 68881. */
- +
- + #ifndef TARGET_DEFAULT
- + #define TARGET_DEFAULT 0
- + #endif
- +
- + /* Define __HAVE_FPA__ or __HAVE_68881__ in preprocessor,
- + according to the -m flags.
- + This will control the use of inline 68881 insns in certain macros.
- + Also inform the program which CPU this is for. */
- +
- + #if TARGET_DEFAULT & 02
- +
- + /* -m68881 is the default */
- + #define CPP_SPEC \
- + "%{!msoft-float:%{mfpa:-D__HAVE_FPA__ }%{!mfpa:-D__HAVE_68881__ }}\
- + %{!ansi:%{m68000:-Dmc68010}%{mc68000:-Dmc68010}%{!mc68000:%{!m68000:-Dmc68020}}}"
- +
- + #else
- +
- + /* -msoft-float is the default, assume -mc68000 as well */
- + #define CPP_SPEC \
- + "%{m68881:-D__HAVE_68881__ }\
- + %{!ansi:%{m68020:-Dmc68020}%{mc68020:-Dmc68020}%{!mc68020:%{!m68020:-Dmc68010}}}"
- +
- + #endif
- +
- + /* These compiler options take an argument. We ignore -target for now. */
- +
- + /* #define WORD_SWITCH_TAKES_ARG(STR) (!strcmp (STR, "target")) */
- +
- + /* -m68000 requires special flags to the assembler. */
- +
- + #if TARGET_DEFAULT & 01
- +
- + #define ASM_SPEC \
- + "%{m68000:-mc68010}%{mc68000:-mc68010}%{!mc68000:%{!m68000:-mc68020}} %{msmall-code:-l} "
- +
- + #else
- +
- + #define ASM_SPEC \
- + "%{m68020:-mc68020}%{mc68020:-mc68020}%{!mc68020:%{!m68020:-mc68010}} %{msmall-code:-l} "
- +
- + #endif
- +
- + /* amiga/amigados are the new "standard" defines for the Amiga, MCH_AMIGA
- + * was used before and is included for compatibility reasons */
- +
- + #define CPP_PREDEFINES "-Dmc68000 -Damiga -Damigados -DMCH_AMIGA -DAMIGA"
- +
- + /* STARTFILE_SPEC to include amiga floating point initialization
- + This is necessary (tr: amiga does it) for both the m68881 and the fpa
- + routines.
- + Note that includes knowledge of the default specs for gcc, ie. no
- + args translates to the same effect as -m68881
- + I'm not sure what would happen below if people gave contradictory
- + arguments (eg. -msoft-float -mfpa) */
- +
- + /* for now, we only have a single set of crt0.o, this could change in
- + the future. */
- + #define STARTFILE_SPEC \
- + "%{resident:rcrt0.o%s}%{!resident:%{!fbaserel:%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}%{fbaserel:%{pg:bgcrt0.o%s}%{!pg:%{p:bmcrt0.o%s}%{!p:bcrt0.o%s}}}}"
- +
- +
- + /* Specify library to handle `-a' basic block profiling.
- + Control choice of libm.a (if user says -lm)
- + based on fp arith default and options. */
- +
- + /* for now, no different math libraries exist, there probably *will*
- + * be some in the future. */
- + #define LIB_SPEC "%{g:-lg} %{resident:-lbc}%{!resident:%{fbaserel:%{!p:%{!pg:-lbc}}%{p:-lbc_p}%{pg:-lbc_p}}%{!fbaserel:%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}}"
- +
- + /* if debugging, tell the linker to output amiga-hunk symbols *and*
- + * a BSD compatible debug hunk */
- +
- + #define LINK_SPEC "%{g:-amiga-debug-hunk} %{fbaserel:-databss-together} %{resident:-databss-together} "
- +
- + #define CC1_SPEC "%{resident:-fbaserel} "
- +
- + #define CC1PLUS_SPEC "%{resident:-fbaserel} "
- +
- + /* Omit frame pointer at high optimization levels. */
- +
- + #define OPTIMIZATION_OPTIONS(OPTIMIZE) \
- + { \
- + if (OPTIMIZE >= 2) \
- + flag_omit_frame_pointer = 1; \
- + }
- +
- + /* provide a dummy entry for the small-code switch. This is currently only
- + needed by the assembler (explanations: m68k.h) */
- +
- + #undef TARGET_SWITCHES
- + #define TARGET_SWITCHES \
- + { { "68020", 5}, \
- + { "c68020", 5}, \
- + { "68881", 2}, \
- + { "bitfield", 4}, \
- + { "68000", -5}, \
- + { "c68000", -5}, \
- + { "soft-float", -0102}, \
- + { "nobitfield", -4}, \
- + { "rtd", 8}, \
- + { "nortd", -8}, \
- + { "short", 040}, \
- + { "noshort", -040}, \
- + { "fpa", 0100}, \
- + { "nofpa", -0100}, \
- + { "sky", 0200}, \
- + { "nosky", -0200}, \
- + { "68040", 0407}, \
- + { "68030", -01400}, \
- + { "68030", 7}, \
- + { "68040-only", 01000}, \
- + { "small-code", 0 }, \
- + { "", TARGET_DEFAULT}}
- +
- + /* Every structure or union's size must be a multiple of 2 bytes. */
- +
- + #define STRUCTURE_SIZE_BOUNDARY 16
- +
- + /* This is BSD, so it wants DBX format. */
- +
- + #define DBX_DEBUGGING_INFO
- +
- + /* Allow folding division by zero. */
- + #define REAL_INFINITY
- +
- + /* This is how to output an assembler line defining a `double' constant. */
- +
- + #undef ASM_OUTPUT_DOUBLE
- + #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
- + { \
- + if (REAL_VALUE_ISINF (VALUE)) \
- + fprintf (FILE, "\t.double 0r%s99e999\n", (VALUE) > 0 ? "" : "-"); \
- + else if (isnan (VALUE)) \
- + { \
- + union { double d; long l[2];} t; \
- + t.d = (VALUE); \
- + fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n", t.l[0], t.l[1]); \
- + } \
- + else \
- + fprintf (FILE, "\t.double 0r%.17g\n", VALUE); \
- + }
- +
- + /* This is how to output an assembler line defining a `float' constant. */
- +
- + #undef ASM_OUTPUT_FLOAT
- + #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
- + { \
- + if (REAL_VALUE_ISINF (VALUE)) \
- + fprintf (FILE, "\t.single 0r%s99e999\n", (VALUE) > 0 ? "" : "-"); \
- + else if (isnan (VALUE)) \
- + { \
- + union { float f; long l;} t; \
- + t.f = (VALUE); \
- + fprintf (FILE, "\t.long 0x%lx\n", t.l); \
- + } \
- + else \
- + fprintf (FILE, "\t.single 0r%.9g\n", VALUE); \
- + }
- +
- + /* This is how to output an assembler lines defining floating operands.
- + There's no way to output a NaN's fraction, so we lose it. */
- +
- + #undef ASM_OUTPUT_FLOAT_OPERAND
- + #define ASM_OUTPUT_FLOAT_OPERAND(FILE,VALUE) \
- + (REAL_VALUE_ISINF ((VALUE)) \
- + ? asm_fprintf (FILE, "%I0r%s99e999", ((VALUE) > 0 ? "" : "-")) \
- + : (VALUE) == -0.0 \
- + ? asm_fprintf (FILE, "%I0r-0.0") \
- + : asm_fprintf (FILE, "%I0r%.9g", (VALUE)))
- +
- + #undef ASM_OUTPUT_DOUBLE_OPERAND
- + #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
- + (REAL_VALUE_ISINF ((VALUE)) \
- + ? asm_fprintf (FILE, "%I0r%s99e999", ((VALUE) > 0 ? "" : "-")) \
- + : (VALUE) == -0.0 \
- + ? asm_fprintf (FILE, "%I0r-0.0") \
- + : asm_fprintf (FILE, "%I0r%.17g", (VALUE)))
- +
- + /* use A5 as framepointer instead of A6, this makes A6 available as a
- + * general purpose register, and can thus be used without problems in
- + * direct library calls. */
- + #undef FRAME_POINTER_REGNUM
- + #define FRAME_POINTER_REGNUM 13
- + #undef ARG_POINTER_REGNUM
- + #define ARG_POINTER_REGNUM 13
- +
- + /* we use A4 for this, not A5, which is the framepointer */
- + #undef PIC_OFFSET_TABLE_REGNUM
- + #define PIC_OFFSET_TABLE_REGNUM 12
- +
- + #define STANDARD_INCLUDE_DIR "gcc:include"
- + #define MD_STARTFILE_PREFIX "gcc:lib/"
- +
- + /* we do have an ansi-complient c-library ;-) */
- + #define HAVE_ATEXIT
- + #define HAVE_VPRINTF
- + #define HAVE_VFPRINTF
- + #define HAVE_PUTENV
- + #define HAVE_STRERROR
- +
- + #define ENVIRON_SEPARATOR ','
- +
- + /* setup a default shell return value for those (gazillion..) programs that
- + (inspite of ANSI-C) declare main() to be void (or even VOID...) */
- +
- + #define DEFAULT_MAIN_RETURN c_expand_return (integer_zero_node)
- +
- + /* given that symbolic_operand(X), return TRUE if no special
- + base relative relocation is necessary */
- +
- + #define LEGITIMATE_BASEREL_OPERAND_P(X) \
- + (flag_pic == 3 && read_only_operand (X))
- +
- + #undef LEGITIMATE_PIC_OPERAND_P
- + #define LEGITIMATE_PIC_OPERAND_P(X) \
- + (! symbolic_operand (X, VOIDmode) || LEGITIMATE_BASEREL_OPERAND_P (X))
- +
- +
- + /* Define this macro if references to a symbol must be treated
- + differently depending on something about the variable or
- + function named by the symbol (such as what section it is in).
- +
- + The macro definition, if any, is executed immediately after the
- + rtl for DECL or other node is created.
- + The value of the rtl will be a `mem' whose address is a
- + `symbol_ref'.
- +
- + The usual thing for this macro to do is to a flag in the
- + `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
- + name string in the `symbol_ref' (if one bit is not enough
- + information).
- +
- + On the Amiga we use this to indicate if a symbol is in text or
- + data space. */
- +
- + #define ENCODE_SECTION_INFO(DECL)\
- + do \
- + { \
- + if (TREE_CODE (DECL) == FUNCTION_DECL) \
- + SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1; \
- + else \
- + { \
- + rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
- + ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \
- + if (RTX_UNCHANGING_P (rtl) && !MEM_VOLATILE_P (rtl)) \
- + SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1; \
- + } \
- + } \
- + while (0)
- +
- + #if 0
- + #undef SELECT_RTX_SECTION
- + #define SELECT_RTX_SECTION(MODE, X) \
- + { \
- + if (!flag_pic || LEGITIMATE_BASEREL_OPERAND_P (X)) \
- + readonly_data_section(); \
- + else if (LEGITIMATE_PIC_OPERAND_P (X)) \
- + readonly_data_section(); \
- + else \
- + data_section(); \
- + }
- + #else
- + #undef SELECT_RTX_SECTION
- + #define SELECT_RTX_SECTION(MODE, X) readonly_data_section ();
- + #endif
- +
- + /* according to varasm.c, RELOC referrs *only* to whether constants (!)
- + are addressed by address. This doesn't matter in baserelative code,
- + so we allow (inspite of flag_pic) readonly_data_section() in that
- + case */
- +
- + #undef SELECT_SECTION
- + #define SELECT_SECTION(DECL, RELOC) \
- + { \
- + if (TREE_CODE (DECL) == STRING_CST) \
- + { \
- + if (! flag_writable_strings) \
- + readonly_data_section (); \
- + else \
- + data_section (); \
- + } \
- + else if (TREE_CODE (DECL) == VAR_DECL) \
- + { \
- + if ((flag_pic && flag_pic != 3 && RELOC) \
- + || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \
- + data_section (); \
- + else \
- + readonly_data_section (); \
- + } \
- + else \
- + readonly_data_section (); \
- + }
- +
- +
- +
- + /* starting support for amiga specific keywords (NOT CURRENTLY WORKING!)
- + * --------------------------------------------
- + */
- +
- + /* validate attributes that don't take a parameter. Currently we support
- + * __attribute__ (saveds) and __attribute__ (interrupt)
- + */
- + #define HANDLE_ATTRIBUTE0(attr) \
- + (strcmp(attr, "saveds") != 0 && strcmp(attr, "interrupt") != 0)
- +
- + /* (c-common.c)
- + * install additional attributes
- + */
- + #define HANDLE_EXTRA_ATTRIBUTES(a) \
- + if (TREE_VALUE (a) != 0 \
- + && TREE_CODE (TREE_VALUE (a)) == IDENTIFIER_NODE \
- + && TREE_VALUE (a) == get_identifier ("saveds")) \
- + { \
- + if (TREE_CODE (decl) != FUNCTION_DECL) \
- + { \
- + warning_with_decl (decl, \
- + "saveds attribute specified for non-function `%s'"); \
- + return; \
- + } \
- + \
- + attr_do_saveds (DECL_NAME (decl)); \
- + } \
- + else if (TREE_VALUE (a) != 0 \
- + && TREE_CODE (TREE_VALUE (a)) == IDENTIFIER_NODE \
- + && TREE_VALUE (a) == get_identifier ("interrupt")) \
- + { \
- + if (TREE_CODE (decl) != FUNCTION_DECL) \
- + { \
- + warning_with_decl (decl, \
- + "saveds attribute specified for non-function `%s'"); \
- + return; \
- + } \
- + \
- + attr_do_interrupt (DECL_NAME (decl)); \
- + } \
- +
- +
- + #define PROLOGUE_EXTRA_SAVE(mask) \
- + { extern char *current_function_name; \
- + /* saveds makes the function preserve d1/a0/a1 as well */ \
- + if (attr_does_saveds (current_function_name)) \
- + mask |= 0x40c0; } \
- +
- +
- + #define EPILOGUE_EXTRA_RESTORE(mask, nregs) \
- + { extern char *current_function_name; \
- + /* restore those extra registers */ \
- + if (attr_does_saveds (current_function_name)) \
- + { \
- + mask |= 0x0302; \
- + nregs += 3; \
- + } } \
- +
- +
- + #define EPILOGUE_EXTRA_BARRIER_KLUDGE(stream) \
- + { extern char *current_function_name; \
- + /* PLEASE Help! how is this done cleaner?? */ \
- + if (attr_does_saveds (current_function_name)) \
- + { \
- + fprintf (stderr, \
- + "warning: couldn't cleanup `saveds'-stack in `%s'.\n"); \
- + fprintf (stderr, \
- + " this is only ok, if the function never returns!\n"); \
- + } } \
- +
- +
- + #define EPILOGUE_EXTRA_TEST(stream) \
- + { extern char *current_function_name; \
- + /* with the interrupt-attribute, we have to set the cc before rts */ \
- + if (attr_does_interrupt (current_function_name)) \
- + asm_fprintf (stream, "\ttstl %s\n", reg_names[0]); } \
- +
- diff -2rcN dh5:gcc-2.1.orig/config/m68k.c gcc-2.1/config/m68k.c
- *** dh5:gcc-2.1.orig/config/m68k.c Mon Apr 20 02:35:38 1992
- --- gcc-2.1/config/m68k.c Sat Apr 18 21:58:21 1992
- ***************
- *** 57,61 ****
- finalize_pic ()
- {
- ! if (flag_pic && current_function_uses_pic_offset_table)
- emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
- }
- --- 57,61 ----
- finalize_pic ()
- {
- ! if (flag_pic && (flag_pic < 3) && current_function_uses_pic_offset_table)
- emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
- }
- ***************
- *** 205,209 ****
- #endif
- }
- ! if (flag_pic && current_function_uses_pic_offset_table)
- {
- #ifdef MOTOROLA
- --- 208,212 ----
- #endif
- }
- ! if (flag_pic && (flag_pic < 3) && current_function_uses_pic_offset_table)
- {
- #ifdef MOTOROLA
- ***************
- *** 795,804 ****
- if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
- {
- if (reg == 0)
- abort ();
-
- ! pic_ref = gen_rtx (MEM, Pmode,
- ! gen_rtx (PLUS, Pmode,
- ! pic_offset_table_rtx, orig));
- current_function_uses_pic_offset_table = 1;
- RTX_UNCHANGING_P (pic_ref) = 1;
- --- 807,824 ----
- if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
- {
- + #ifdef LEGITIMATE_BASEREL_OPERAND_P
- + if (LEGITIMATE_BASEREL_OPERAND_P (orig))
- + return orig;
- + #endif
- +
- if (reg == 0)
- abort ();
-
- ! if (flag_pic == 3)
- ! pic_ref = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, orig);
- ! else
- ! pic_ref = gen_rtx (MEM, Pmode,
- ! gen_rtx (PLUS, Pmode,
- ! pic_offset_table_rtx, orig));
- current_function_uses_pic_offset_table = 1;
- RTX_UNCHANGING_P (pic_ref) = 1;
- ***************
- *** 832,835 ****
- --- 852,856 ----
- /* Likewise, should we set special REG_NOTEs here? */
- }
- +
- return pic_ref;
- }
- ***************
- *** 1884,1887 ****
- --- 1905,1910 ----
- if ((flag_pic == 2) && (breg == pic_offset_table_rtx))
- fprintf (file, ":l");
- + if ((flag_pic == 3) && (breg == pic_offset_table_rtx))
- + fprintf (file, ":W");
- }
- fprintf (file, "(%s", reg_names[REGNO (breg)]);
- ***************
- *** 1899,1902 ****
- --- 1922,1927 ----
- if ((flag_pic == 2) && (breg == pic_offset_table_rtx))
- fprintf (file, ":l");
- + if ((flag_pic == 3) && (breg == pic_offset_table_rtx))
- + fprintf (file, ":W");
- }
- if (addr != 0 && ireg != 0)
- diff -2rcN dh5:gcc-2.1.orig/config/m68k.h gcc-2.1/config/m68k.h
- *** dh5:gcc-2.1.orig/config/m68k.h Mon Apr 20 02:35:41 1992
- --- gcc-2.1/config/m68k.h Thu Apr 16 20:16:07 1992
- ***************
- *** 327,333 ****
-
- #define CONDITIONAL_REGISTER_USAGE \
- ! { \
- ! if (flag_pic) \
- ! fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
- }
-
- --- 327,336 ----
-
- #define CONDITIONAL_REGISTER_USAGE \
- ! { \
- ! if (flag_pic) \
- ! fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
- ! /* prevent saving/restoring of the base reg */ \
- ! if (flag_pic == 3) \
- ! call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
- }
-
- diff -2rcN dh5:gcc-2.1.orig/config/m68k.md gcc-2.1/config/m68k.md
- *** dh5:gcc-2.1.orig/config/m68k.md Mon Apr 20 02:35:51 1992
- --- gcc-2.1/config/m68k.md Thu Apr 16 18:05:26 1992
- ***************
- *** 705,715 ****
- if (flag_pic && symbolic_operand (operands[1], SImode))
- {
- ! /* The source is an address which requires PIC relocation.
- ! Call legitimize_pic_address with the source, mode, and a relocation
- ! register (a new pseudo, or the final destination if reload_in_progress
- ! is set). Then fall through normally */
- ! extern rtx legitimize_pic_address();
- ! rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
- ! operands[1] = legitimize_pic_address (operands[1], SImode, temp);
- }
- }")
- --- 705,720 ----
- if (flag_pic && symbolic_operand (operands[1], SImode))
- {
- ! #ifdef LEGITIMATE_BASEREL_OPERAND_P
- ! if (flag_pic != 3 || !LEGITIMATE_BASEREL_OPERAND_P (operands[1]))
- ! #endif
- ! {
- ! /* The source is an address which requires PIC relocation.
- ! Call legitimize_pic_address with the source, mode, and a relocation
- ! register (a new pseudo, or the final destination if reload_in_progress
- ! is set). Then fall through normally */
- ! extern rtx legitimize_pic_address();
- ! rtx temp = reload_in_progress ? operands[0] : gen_reg_rtx (Pmode);
- ! operands[1] = legitimize_pic_address (operands[1], SImode, temp);
- ! }
- }
- }")
- ***************
- *** 4588,4592 ****
- "
- {
- ! if (flag_pic && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
- operands[0] = gen_rtx (MEM, GET_MODE (operands[0]),
- force_reg (Pmode, XEXP (operands[0], 0)));
- --- 4593,4597 ----
- "
- {
- ! if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
- operands[0] = gen_rtx (MEM, GET_MODE (operands[0]),
- force_reg (Pmode, XEXP (operands[0], 0)));
- ***************
- *** 4599,4603 ****
- ;; Operand 1 not really used on the m68000.
-
- ! "! flag_pic"
- "*
- #ifdef MOTOROLA
- --- 4604,4608 ----
- ;; Operand 1 not really used on the m68000.
-
- ! "(! flag_pic || flag_pic == 3)"
- "*
- #ifdef MOTOROLA
- ***************
- *** 4614,4618 ****
- ;; Operand 1 not really used on the m68000.
-
- ! "flag_pic"
- "*
- return \"jsr %0\";
- --- 4619,4623 ----
- ;; Operand 1 not really used on the m68000.
-
- ! "(flag_pic && flag_pic < 3)"
- "*
- return \"jsr %0\";
- ***************
- *** 4630,4634 ****
- "
- {
- ! if (flag_pic && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
- operands[1] = gen_rtx (MEM, GET_MODE (operands[1]),
- force_reg (Pmode, XEXP (operands[1], 0)));
- --- 4635,4639 ----
- "
- {
- ! if (flag_pic && flag_pic < 3 && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
- operands[1] = gen_rtx (MEM, GET_MODE (operands[1]),
- force_reg (Pmode, XEXP (operands[1], 0)));
- ***************
- *** 4641,4645 ****
- (match_operand:SI 2 "general_operand" "g")))]
- ;; Operand 2 not really used on the m68000.
- ! "! flag_pic"
- "*
- #ifdef MOTOROLA
- --- 4646,4650 ----
- (match_operand:SI 2 "general_operand" "g")))]
- ;; Operand 2 not really used on the m68000.
- ! "(! flag_pic || flag_pic == 3)"
- "*
- #ifdef MOTOROLA
- ***************
- *** 4656,4660 ****
- (match_operand:SI 2 "general_operand" "g")))]
- ;; Operand 2 not really used on the m68000.
- ! "flag_pic"
- "*
- return \"jsr %1\";
- --- 4661,4665 ----
- (match_operand:SI 2 "general_operand" "g")))]
- ;; Operand 2 not really used on the m68000.
- ! "(flag_pic && flag_pic < 3)"
- "*
- return \"jsr %1\";
- diff -2rcN dh5:gcc-2.1.orig/expr.c gcc-2.1/expr.c
- *** dh5:gcc-2.1.orig/expr.c Mon Apr 20 02:40:47 1992
- --- gcc-2.1/expr.c Thu Apr 16 21:14:25 1992
- ***************
- *** 1699,1702 ****
- --- 1699,1708 ----
- argvec = (struct arg *) alloca (nargs * sizeof (struct arg));
-
- + /* how would you do this RIGHT ?? fake a DECL node? dunno... */
- + #ifdef ENCODE_SECTION_INFO
- + /* mark it as a function (to be in the text section that is) */
- + SYMBOL_REF_FLAG (fun) = 1;
- + #endif
- +
- INIT_CUMULATIVE_ARGS (args_so_far, (tree)0, fun);
-
- diff -2rcN dh5:gcc-2.1.orig/toplev.c gcc-2.1/toplev.c
- *** dh5:gcc-2.1.orig/toplev.c Mon Apr 20 02:44:21 1992
- --- gcc-2.1/toplev.c Thu Apr 16 21:34:22 1992
- ***************
- *** 464,467 ****
- --- 464,468 ----
- {"pic", &flag_pic, 1},
- {"PIC", &flag_pic, 2},
- + {"baserel", &flag_pic, 3},
- {"common", &flag_no_common, 0},
- {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
-