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},
