patches/gcc/2.95.3/100-arm-linux.patch
changeset 1617 7d70bcf940a9
parent 1602 1ba79f2126df
parent 1616 1fda13e5d961
child 1618 7f52e1cca71e
     1.1 --- a/patches/gcc/2.95.3/100-arm-linux.patch	Wed Oct 28 12:03:38 2009 +0100
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,647 +0,0 @@
     1.4 ---------- snip -------
     1.5 -Downloaded from ftp://ftp.linux.org.uk/pub/armlinux/toolchain/src-2.95.3/gcc-2.95.3.diff.bz2
     1.6 -Not sure what it fixes, but this appears to be The Patch used with gcc-2.95.3 on arm.
     1.7 ---------- snip -------
     1.8 -
     1.9 -diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.c gcc-2.95.3/gcc/config/arm/arm.c
    1.10 ---- gcc-2.95.3-orig/gcc/config/arm/arm.c	Thu Jan 25 15:03:24 2001
    1.11 -+++ gcc-2.95.3/gcc/config/arm/arm.c	Fri Jul 20 19:39:11 2001
    1.12 -@@ -1529,27 +1529,34 @@
    1.13 -       return gen_rtx_PLUS (Pmode, base, offset);
    1.14 -     }
    1.15 -   else if (GET_CODE (orig) == LABEL_REF)
    1.16 --    current_function_uses_pic_offset_table = 1;
    1.17 --
    1.18 --  return orig;
    1.19 --}
    1.20 -+    {
    1.21 -+      current_function_uses_pic_offset_table = 1;
    1.22 - 
    1.23 --static rtx pic_rtx;
    1.24 -+      if (NEED_PLT_GOT)
    1.25 -+	{
    1.26 -+	  rtx pic_ref, address = gen_reg_rtx (Pmode);
    1.27 -+	  
    1.28 -+	  emit_insn (gen_pic_load_addr (address, orig));
    1.29 -+	  pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
    1.30 -+				  address);
    1.31 -+	  emit_move_insn (address, pic_ref);
    1.32 -+	  return address;
    1.33 -+	}
    1.34 -+    }
    1.35 - 
    1.36 --int
    1.37 --is_pic(x)
    1.38 --     rtx x;
    1.39 --{
    1.40 --  if (x == pic_rtx)
    1.41 --    return 1;
    1.42 --  return 0;
    1.43 -+  return orig;
    1.44 - }
    1.45 - 
    1.46 -+/* Generate code to load the PIC register.  PROLOGUE is true if
    1.47 -+   called from arm_expand_prologue (in which case we want the 
    1.48 -+   generated insns at the start of the function);  false if called
    1.49 -+   by an exception receiver that needs the PIC register reloaded
    1.50 -+   (in which case the insns are just dumped at the current location).  */
    1.51 - void
    1.52 --arm_finalize_pic ()
    1.53 -+arm_finalize_pic (int prologue)
    1.54 - {
    1.55 - #ifndef AOF_ASSEMBLER
    1.56 --  rtx l1, pic_tmp, pic_tmp2, seq;
    1.57 -+  rtx l1, pic_tmp, pic_tmp2, seq, pic_rtx;
    1.58 -   rtx global_offset_table;
    1.59 - 
    1.60 -   if (current_function_uses_pic_offset_table == 0)
    1.61 -@@ -1578,7 +1585,10 @@
    1.62 - 
    1.63 -   seq = gen_sequence ();
    1.64 -   end_sequence ();
    1.65 --  emit_insn_after (seq, get_insns ());
    1.66 -+  if (prologue)
    1.67 -+    emit_insn_after (seq, get_insns ());
    1.68 -+  else
    1.69 -+    emit_insn (seq);
    1.70 - 
    1.71 -   /* Need to emit this whether or not we obey regdecls,
    1.72 -      since setjmp/longjmp can cause life info to screw up.  */
    1.73 -@@ -5327,7 +5337,13 @@
    1.74 -   if (frame_pointer_needed)
    1.75 -     live_regs += 4;
    1.76 - 
    1.77 --  if (live_regs)
    1.78 -+  if (live_regs == 1 && regs_ever_live[LR_REGNUM]
    1.79 -+      && ! lr_save_eliminated && ! really_return)
    1.80 -+    {
    1.81 -+      output_asm_insn (reverse ? "ldr%?%D0\t%|lr, [%|sp}, #4"
    1.82 -+      		       : "ldr%?%d0\t%|lr, [%|sp], #4", &operand);
    1.83 -+    }
    1.84 -+  else if (live_regs)
    1.85 -     {
    1.86 -       if (lr_save_eliminated || ! regs_ever_live[14])
    1.87 -         live_regs++;
    1.88 -@@ -5446,7 +5462,7 @@
    1.89 -   rtx           x;
    1.90 - 
    1.91 -   length = strlen (name);
    1.92 --  alignlength = (length + 1) + 3 & ~3;
    1.93 -+  alignlength = ((length + 1) + 3) & ~3;
    1.94 -   
    1.95 -   ASM_OUTPUT_ASCII (stream, name, length + 1);
    1.96 -   ASM_OUTPUT_ALIGN (stream, 2);
    1.97 -@@ -5838,6 +5854,9 @@
    1.98 -   int store_arg_regs = 0;
    1.99 -   int volatile_func = (optimize > 0
   1.100 - 		       && TREE_THIS_VOLATILE (current_function_decl));
   1.101 -+  rtx ip_rtx;
   1.102 -+  int fp_offset = 0;
   1.103 -+  rtx insn;
   1.104 - 
   1.105 -   /* Naked functions don't have prologues.  */
   1.106 -   if (arm_naked_function_p (current_function_decl))
   1.107 -@@ -5859,11 +5878,59 @@
   1.108 - 	live_regs_mask |= 0x4000;
   1.109 -     }
   1.110 - 
   1.111 -+  ip_rtx = gen_rtx_REG (SImode, IP_REGNUM);
   1.112 -+
   1.113 -   if (frame_pointer_needed)
   1.114 -     {
   1.115 -+      if (current_function_needs_context)
   1.116 -+	{
   1.117 -+	  /* The Static chain register is the same as the IP register
   1.118 -+	     used as a scratch register during stack frame creation.
   1.119 -+	     To get around this need to find somewhere to store IP
   1.120 -+	     whilst the frame is being created.  We try the following
   1.121 -+	     places in order:
   1.122 -+	     
   1.123 -+	       1. An unused argument register.
   1.124 -+	       2. A slot on the stack above the frame.  (This only
   1.125 -+	          works if the function is not a varargs function).
   1.126 -+		  
   1.127 -+	     If neither of these places is available, we abort (for now).  */
   1.128 -+	  if (regs_ever_live[3] == 0)
   1.129 -+	    {
   1.130 -+	      insn = gen_rtx_REG (SImode, 3);
   1.131 -+	      insn = gen_rtx_SET (SImode, insn, ip_rtx);
   1.132 -+	      insn = emit_insn (insn);
   1.133 -+	      RTX_FRAME_RELATED_P (insn) = 1;	  
   1.134 -+	    }
   1.135 -+	  else if (current_function_pretend_args_size == 0)
   1.136 -+	    {
   1.137 -+	      insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
   1.138 -+	      insn = gen_rtx_MEM (SImode, insn);
   1.139 -+	      insn = gen_rtx_SET (VOIDmode, insn, ip_rtx);
   1.140 -+	      insn = emit_insn (insn);
   1.141 -+	      RTX_FRAME_RELATED_P (insn) = 1;
   1.142 -+	      fp_offset = 4;
   1.143 -+	    }
   1.144 -+	  else
   1.145 -+	    /* FIXME - the way to handle this situation is to allow
   1.146 -+	       the pretend args to be dumped onto the stack, then
   1.147 -+	       reuse r3 to save IP.  This would involve moving the
   1.148 -+	       copying os SP into IP until after the pretend args
   1.149 -+	       have been dumped, but this is not too hard.  */
   1.150 -+	    error ("Unable to find a temporary location for static chanin register");
   1.151 -+	}
   1.152 -+
   1.153 -       live_regs_mask |= 0xD800;
   1.154 --      emit_insn (gen_movsi (gen_rtx_REG (SImode, 12),
   1.155 --			    stack_pointer_rtx));
   1.156 -+      if (fp_offset)
   1.157 -+	{
   1.158 -+	  insn = gen_rtx_PLUS (SImode, stack_pointer_rtx, GEN_INT (fp_offset));
   1.159 -+	  insn = gen_rtx_SET  (SImode, ip_rtx, insn);
   1.160 -+	}
   1.161 -+      else
   1.162 -+	insn = gen_movsi (ip_rtx, stack_pointer_rtx);
   1.163 -+      
   1.164 -+       insn = emit_insn (insn);
   1.165 -+       RTX_FRAME_RELATED_P (insn) = 1;
   1.166 -     }
   1.167 - 
   1.168 -   if (current_function_pretend_args_size)
   1.169 -@@ -5927,9 +5994,31 @@
   1.170 -     }
   1.171 - 
   1.172 -   if (frame_pointer_needed)
   1.173 --    emit_insn (gen_addsi3 (hard_frame_pointer_rtx, gen_rtx_REG (SImode, 12),
   1.174 --			   (GEN_INT
   1.175 --			    (-(4 + current_function_pretend_args_size)))));
   1.176 -+    {
   1.177 -+      insn = GEN_INT (-(4 + current_function_pretend_args_size + fp_offset));
   1.178 -+      insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx, ip_rtx, insn));
   1.179 -+      RTX_FRAME_RELATED_P (insn) = 1;
   1.180 -+      
   1.181 -+      if (current_function_needs_context)
   1.182 -+	{
   1.183 -+	  /* Recover the static chain register.  */
   1.184 -+	  if (regs_ever_live [3] == 0)
   1.185 -+	    {
   1.186 -+	      insn = gen_rtx_REG (SImode, 3);
   1.187 -+	      insn = gen_rtx_SET (SImode, ip_rtx, insn);
   1.188 -+	      insn = emit_insn (insn);
   1.189 -+	      RTX_FRAME_RELATED_P (insn) = 1;	  
   1.190 -+	    }
   1.191 -+	  else /* if (current_function_pretend_args_size == 0) */
   1.192 -+	    {
   1.193 -+	      insn = gen_rtx_PLUS (SImode, hard_frame_pointer_rtx, GEN_INT (4));
   1.194 -+	      insn = gen_rtx_MEM (SImode, insn);
   1.195 -+	      insn = gen_rtx_SET (SImode, ip_rtx, insn);
   1.196 -+	      insn = emit_insn (insn);
   1.197 -+	      RTX_FRAME_RELATED_P (insn) = 1;	  
   1.198 -+	    }
   1.199 -+	}
   1.200 -+    }
   1.201 - 
   1.202 -   if (amount != const0_rtx)
   1.203 -     {
   1.204 -diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.h gcc-2.95.3/gcc/config/arm/arm.h
   1.205 ---- gcc-2.95.3-orig/gcc/config/arm/arm.h	Thu Jan 25 15:03:26 2001
   1.206 -+++ gcc-2.95.3/gcc/config/arm/arm.h	Fri Jul 20 19:39:11 2001
   1.207 -@@ -601,14 +601,20 @@
   1.208 -   (TREE_CODE (EXP) == STRING_CST        \
   1.209 -    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
   1.210 - 
   1.211 -+#ifndef STRUCTURE_SIZE_BOUNDARY
   1.212 - /* Every structures size must be a multiple of 32 bits.  */
   1.213 - /* This is for compatibility with ARMCC.  ARM SDT Reference Manual
   1.214 -    (ARM DUI 0020D) page 2-20 says "Structures are aligned on word
   1.215 -    boundaries".  */
   1.216 --#ifndef STRUCTURE_SIZE_BOUNDARY
   1.217 --#define STRUCTURE_SIZE_BOUNDARY 32
   1.218 -+/* Setting this to 32 produces more efficient code, but the value set in previous
   1.219 -+   versions of this toolchain was 8, which produces more compact structures. The
   1.220 -+   command line option -mstructure_size_boundary=<n> can be used to change this
   1.221 -+   value.  */
   1.222 -+#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
   1.223 - #endif
   1.224 - 
   1.225 -+extern int arm_structure_size_boundary;
   1.226 -+
   1.227 - /* Used when parsing command line option -mstructure_size_boundary.  */
   1.228 - extern const char * structure_size_string;
   1.229 - 
   1.230 -@@ -768,6 +774,9 @@
   1.231 - /* Specify the registers used for certain standard purposes.
   1.232 -    The values of these macros are register numbers.  */
   1.233 - 
   1.234 -+/* Register which holds return address from a subroutine call.  */
   1.235 -+#define LR_REGNUM		14
   1.236 -+
   1.237 - /* Define this if the program counter is overloaded on a register.  */
   1.238 - #define PC_REGNUM		15
   1.239 - 
   1.240 -@@ -777,6 +786,9 @@
   1.241 - /* Base register for access to local variables of the function.  */
   1.242 - #define FRAME_POINTER_REGNUM	25
   1.243 - 
   1.244 -+/* Scratch register - used in all kinds of places, eg trampolines.  */
   1.245 -+#define IP_REGNUM		12
   1.246 -+
   1.247 - /* Define this to be where the real frame pointer is if it is not possible to
   1.248 -    work out the offset between the frame pointer and the automatic variables
   1.249 -    until after register allocation has taken place.  FRAME_POINTER_REGNUM
   1.250 -@@ -798,7 +810,7 @@
   1.251 - /* The native (Norcroft) Pascal compiler for the ARM passes the static chain
   1.252 -    as an invisible last argument (possible since varargs don't exist in
   1.253 -    Pascal), so the following is not true.  */
   1.254 --#define STATIC_CHAIN_REGNUM	8
   1.255 -+#define STATIC_CHAIN_REGNUM	12
   1.256 - 
   1.257 - /* Register in which address to store a structure value
   1.258 -    is passed to a function.  */
   1.259 -@@ -1248,7 +1260,12 @@
   1.260 - {									\
   1.261 -   int volatile_func = arm_volatile_func ();				\
   1.262 -   if ((FROM) == ARG_POINTER_REGNUM && (TO) == HARD_FRAME_POINTER_REGNUM)\
   1.263 --    (OFFSET) = 0;							\
   1.264 -+    {                                                                   \
   1.265 -+      if (! current_function_needs_context || ! frame_pointer_needed)   \
   1.266 -+        (OFFSET) = 0;                                                   \
   1.267 -+      else                                                              \
   1.268 -+        (OFFSET) = 4;                                                   \
   1.269 -+    }                                                                   \
   1.270 -   else if ((FROM) == FRAME_POINTER_REGNUM				\
   1.271 - 	   && (TO) == STACK_POINTER_REGNUM)				\
   1.272 -     (OFFSET) = (current_function_outgoing_args_size			\
   1.273 -@@ -1379,8 +1396,10 @@
   1.274 - 
   1.275 -    On the ARM, allow any integer (invalid ones are removed later by insn
   1.276 -    patterns), nice doubles and symbol_refs which refer to the function's
   1.277 --   constant pool XXX.  */
   1.278 --#define LEGITIMATE_CONSTANT_P(X)	(! label_mentioned_p (X))
   1.279 -+   constant pool XXX.
   1.280 -+
   1.281 -+   When generating PIC code, allow anything.  */
   1.282 -+#define LEGITIMATE_CONSTANT_P(X)	(flag_pic || ! label_mentioned_p (X))
   1.283 - 
   1.284 - /* Symbols in the text segment can be accessed without indirecting via the
   1.285 -    constant pool; it may take an extra binary operation, but this is still
   1.286 -@@ -1496,9 +1515,8 @@
   1.287 - 	      && INTVAL (op) <= 31)					\
   1.288 - 	    goto LABEL;							\
   1.289 -         }								\
   1.290 --      /* NASTY: Since this limits the addressing of unsigned byte loads */      \
   1.291 -       range = ((MODE) == HImode || (MODE) == QImode)                    \
   1.292 --              ? (arm_arch4 ? 256 : 4095) : 4096;                        \
   1.293 -+              ? (((MODE) == HImode && arm_arch4) ? 256 : 4095) : 4096;  \
   1.294 -       if (code == CONST_INT && INTVAL (INDEX) < range			\
   1.295 - 	  && INTVAL (INDEX) > -range)  	      				\
   1.296 -         goto LABEL;							\
   1.297 -@@ -1812,14 +1830,15 @@
   1.298 -    data addresses in memory.  */
   1.299 - #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
   1.300 - 
   1.301 --#define FINALIZE_PIC arm_finalize_pic ()
   1.302 -+#define FINALIZE_PIC arm_finalize_pic (1)
   1.303 - 
   1.304 --/* We can't directly access anything that contains a symbol,
   1.305 -+/* We can't directly access anything that contains a symbol or label,
   1.306 -    nor can we indirect via the constant pool.  */
   1.307 - #define LEGITIMATE_PIC_OPERAND_P(X)				\
   1.308 --	(! symbol_mentioned_p (X)				\
   1.309 -+	(! symbol_mentioned_p (X) && ! label_mentioned_p (X)	\
   1.310 - 	 && (! CONSTANT_POOL_ADDRESS_P (X)			\
   1.311 --	     || ! symbol_mentioned_p (get_pool_constant (X))))
   1.312 -+	     || (! symbol_mentioned_p (get_pool_constant (X)))  \
   1.313 -+		&& (! label_mentioned_p (get_pool_constant (X)))))
   1.314 -  
   1.315 - /* We need to know when we are making a constant pool; this determines
   1.316 -    whether data needs to be in the GOT or can be referenced via a GOT
   1.317 -@@ -2046,17 +2065,9 @@
   1.318 -   else output_addr_const(STREAM, X);					\
   1.319 - }
   1.320 - 
   1.321 --/* Handles PIC addr specially */
   1.322 - #define OUTPUT_INT_ADDR_CONST(STREAM,X) \
   1.323 -   {									\
   1.324 --    if (flag_pic && GET_CODE(X) == CONST && is_pic(X))			\
   1.325 --      {									\
   1.326 --	output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 0), 0));	\
   1.327 --	fputs(" - (", STREAM);						\
   1.328 --	output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 1), 0));	\
   1.329 --	fputs(")", STREAM);						\
   1.330 --      }									\
   1.331 --    else output_addr_const(STREAM, X);					\
   1.332 -+    output_addr_const(STREAM, X);					\
   1.333 - 									\
   1.334 -     /* Mark symbols as position independent.  We only do this in the	\
   1.335 -       .text segment, not in the .data segment. */			\
   1.336 -@@ -2170,8 +2181,7 @@
   1.337 - int    arm_return_in_memory PROTO ((Tree));
   1.338 - int    legitimate_pic_operand_p PROTO ((Rtx));
   1.339 - Rtx    legitimize_pic_address PROTO ((Rtx, Mmode, Rtx));
   1.340 --int    is_pic PROTO ((Rtx));
   1.341 --void   arm_finalize_pic PROTO ((void));
   1.342 -+void   arm_finalize_pic PROTO ((int));
   1.343 - int    arm_rtx_costs RTX_CODE_PROTO ((Rtx, Rcode));
   1.344 - int    arm_adjust_cost PROTO ((Rtx, Rtx, Rtx, int));
   1.345 - int    const_double_rtx_ok_for_fpu PROTO ((Rtx));
   1.346 -diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.md gcc-2.95.3/gcc/config/arm/arm.md
   1.347 ---- gcc-2.95.3-orig/gcc/config/arm/arm.md	Thu Jan 25 15:03:27 2001
   1.348 -+++ gcc-2.95.3/gcc/config/arm/arm.md	Fri Jul 20 19:39:11 2001
   1.349 -@@ -2629,7 +2629,8 @@
   1.350 - 			   : preserve_subexpressions_p ()));
   1.351 -       DONE;
   1.352 -     }
   1.353 --  if (CONSTANT_P (operands[1]) && flag_pic)
   1.354 -+  if ((CONSTANT_P (operands[1]) || symbol_mentioned_p (operands[1])
   1.355 -+        || label_mentioned_p (operands[1])) && flag_pic)
   1.356 -     operands[1] = legitimize_pic_address (operands[1], SImode,
   1.357 - 					  ((reload_in_progress
   1.358 - 					    || reload_completed)
   1.359 -@@ -2721,6 +2722,15 @@
   1.360 -   return \"add%?\\t%0, %|pc, %0\";
   1.361 - ")
   1.362 - 
   1.363 -+(define_expand "builtin_setjmp_receiver"
   1.364 -+  [(label_ref (match_operand 0 "" ""))]
   1.365 -+  "flag_pic"
   1.366 -+  "
   1.367 -+{
   1.368 -+  arm_finalize_pic (0);
   1.369 -+  DONE;
   1.370 -+}")
   1.371 -+
   1.372 - ;; If copying one reg to another we can set the condition codes according to
   1.373 - ;; its value.  Such a move is common after a return from subroutine and the
   1.374 - ;; result is being tested against zero.
   1.375 -@@ -6184,15 +6194,20 @@
   1.376 - 	abort ();
   1.377 -       return \"\";
   1.378 -     }
   1.379 --  strcpy (pattern, \"stmfd\\t%m0!, {%1\");
   1.380 --  for (i = 1; i < XVECLEN (operands[2], 0); i++)
   1.381 -+  if (XVECLEN (operands[2], 0) > 1)
   1.382 -     {
   1.383 --      strcat (pattern, \", %|\");
   1.384 --      strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i),
   1.385 -+      strcpy (pattern, \"stmfd\\t%m0!, {%1\");
   1.386 -+      for (i = 1; i < XVECLEN (operands[2], 0); i++)
   1.387 -+        {
   1.388 -+           strcat (pattern, \", %|\");
   1.389 -+           strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i),
   1.390 - 					      0))]);
   1.391 -+        }
   1.392 -+      strcat (pattern, \"}\");
   1.393 -+      output_asm_insn (pattern, operands);
   1.394 -     }
   1.395 --  strcat (pattern, \"}\");
   1.396 --  output_asm_insn (pattern, operands);
   1.397 -+  else
   1.398 -+    output_asm_insn (\"str\\t%1, [%m0, #-4]!\", operands);
   1.399 -   return \"\";
   1.400 - }"
   1.401 - [(set_attr "type" "store4")])
   1.402 -diff -urN gcc-2.95.3-orig/gcc/config/arm/elf.h gcc-2.95.3/gcc/config/arm/elf.h
   1.403 ---- gcc-2.95.3-orig/gcc/config/arm/elf.h	Mon May 31 10:21:53 1999
   1.404 -+++ gcc-2.95.3/gcc/config/arm/elf.h	Fri Jul 20 19:39:11 2001
   1.405 -@@ -167,15 +167,6 @@
   1.406 - #define MULTILIB_DEFAULTS { "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" }
   1.407 - #endif
   1.408 - 
   1.409 --/* Setting this to 32 produces more efficient code, but the value set in previous
   1.410 --   versions of this toolchain was 8, which produces more compact structures. The
   1.411 --   command line option -mstructure_size_boundary=<n> can be used to change this
   1.412 --   value.  */
   1.413 --#undef  STRUCTURE_SIZE_BOUNDARY
   1.414 --#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
   1.415 --
   1.416 --extern int arm_structure_size_boundary;
   1.417 --
   1.418 - /* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
   1.419 -    is a valid machine specific attribute for DECL.
   1.420 -    The attributes in ATTRIBUTES have previously been assigned to DECL.  */
   1.421 -diff -urN gcc-2.95.3-orig/gcc/config/arm/linux-gas.h gcc-2.95.3/gcc/config/arm/linux-gas.h
   1.422 ---- gcc-2.95.3-orig/gcc/config/arm/linux-gas.h	Mon Feb 22 17:47:57 1999
   1.423 -+++ gcc-2.95.3/gcc/config/arm/linux-gas.h	Fri Jul 20 19:39:11 2001
   1.424 -@@ -1,6 +1,6 @@
   1.425 - /* Definitions of target machine for GNU compiler.
   1.426 -    ARM Linux-based GNU systems version.
   1.427 --   Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
   1.428 -+   Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
   1.429 -    Contributed by Russell King  <rmk92@ecs.soton.ac.uk>.
   1.430 - 
   1.431 - This file is part of GNU CC.
   1.432 -@@ -79,5 +79,7 @@
   1.433 -   register unsigned long _beg __asm ("a1") = (unsigned long) (BEG);	\
   1.434 -   register unsigned long _end __asm ("a2") = (unsigned long) (END);	\
   1.435 -   register unsigned long _flg __asm ("a3") = 0;				\
   1.436 --  __asm __volatile ("swi 0x9f0002");					\
   1.437 -+  __asm __volatile ("swi 0x9f0002		@ sys_cacheflush"	\
   1.438 -+		    : "=r" (_beg)					\
   1.439 -+		    : "0" (_beg), "r" (_end), "r" (_flg));		\
   1.440 - }
   1.441 -diff -urN gcc-2.95.3-orig/gcc/config/arm/t-linux gcc-2.95.3/gcc/config/arm/t-linux
   1.442 ---- gcc-2.95.3-orig/gcc/config/arm/t-linux	Fri Mar 26 16:30:20 1999
   1.443 -+++ gcc-2.95.3/gcc/config/arm/t-linux	Fri Jul 20 20:46:19 2001
   1.444 -@@ -1,6 +1,6 @@
   1.445 - # Just for these, we omit the frame pointer since it makes such a big
   1.446 - # difference.  It is then pointless adding debugging.
   1.447 --TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC
   1.448 -+TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC 
   1.449 - LIBGCC2_DEBUG_CFLAGS = -g0
   1.450 - 
   1.451 - # Don't build enquire
   1.452 -diff -urN gcc-2.95.3-orig/gcc/final.c gcc-2.95.3/gcc/final.c
   1.453 ---- gcc-2.95.3-orig/gcc/final.c	Mon Mar 12 13:07:59 2001
   1.454 -+++ gcc-2.95.3/gcc/final.c	Fri Jul 20 19:39:11 2001
   1.455 -@@ -3652,8 +3652,9 @@
   1.456 - 
   1.457 -       output_addr_const (file, XEXP (x, 0));
   1.458 -       fprintf (file, "-");
   1.459 --      if (GET_CODE (XEXP (x, 1)) == CONST_INT
   1.460 --	  && INTVAL (XEXP (x, 1)) < 0)
   1.461 -+      if ((GET_CODE (XEXP (x, 1)) == CONST_INT
   1.462 -+	   && INTVAL (XEXP (x, 1)) < 0)
   1.463 -+	  || GET_CODE (XEXP (x, 1)) != CONST_INT)
   1.464 - 	{
   1.465 - 	  fprintf (file, ASM_OPEN_PAREN);
   1.466 - 	  output_addr_const (file, XEXP (x, 1));
   1.467 -diff -urN gcc-2.95.3-orig/gcc/function.c gcc-2.95.3/gcc/function.c
   1.468 ---- gcc-2.95.3-orig/gcc/function.c	Thu Jan 25 15:03:15 2001
   1.469 -+++ gcc-2.95.3/gcc/function.c	Fri Jul 20 19:39:10 2001
   1.470 -@@ -3053,6 +3053,105 @@
   1.471 -    extracted by usage MEM with narrower mode. */
   1.472 - static rtx purge_addressof_replacements;
   1.473 - 
   1.474 -+/* Return 1 if X and Y are identical-looking rtx's.
   1.475 -+   This is the Lisp function EQUAL for rtx arguments.  */
   1.476 -+
   1.477 -+int
   1.478 -+rtx_equal_for_addressof_p (x, y)
   1.479 -+     rtx x, y;
   1.480 -+{
   1.481 -+  register int i;
   1.482 -+  register int j;
   1.483 -+  register enum rtx_code code;
   1.484 -+  register char *fmt;
   1.485 -+
   1.486 -+  if (x == y)
   1.487 -+    return 1;
   1.488 -+  if (x == 0 || y == 0)
   1.489 -+    return 0;
   1.490 -+
   1.491 -+  code = GET_CODE (x);
   1.492 -+  /* Rtx's of different codes cannot be equal.  */
   1.493 -+  if (code != GET_CODE (y))
   1.494 -+    return 0;
   1.495 -+
   1.496 -+  /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.
   1.497 -+     (REG:SI x) and (REG:HI x) are NOT equivalent. 
   1.498 -+     But (MEM:SI x) and (MEM:HI x) are equivalent for our purposes.  */
   1.499 -+
   1.500 -+  if (code != MEM && (GET_MODE (x) != GET_MODE (y)))
   1.501 -+    return 0;
   1.502 -+
   1.503 -+  /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively.  */
   1.504 -+
   1.505 -+  if (code == REG)
   1.506 -+    return REGNO (x) == REGNO (y);
   1.507 -+  else if (code == LABEL_REF)
   1.508 -+    return XEXP (x, 0) == XEXP (y, 0);
   1.509 -+  else if (code == SYMBOL_REF)
   1.510 -+    return XSTR (x, 0) == XSTR (y, 0);
   1.511 -+  else if (code == SCRATCH || code == CONST_DOUBLE)
   1.512 -+    return 0;
   1.513 -+
   1.514 -+  /* Compare the elements.  If any pair of corresponding elements
   1.515 -+     fail to match, return 0 for the whole things.  */
   1.516 -+
   1.517 -+  fmt = GET_RTX_FORMAT (code);
   1.518 -+  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
   1.519 -+    {
   1.520 -+      switch (fmt[i])
   1.521 -+	{
   1.522 -+	case 'w':
   1.523 -+	  if (XWINT (x, i) != XWINT (y, i))
   1.524 -+	    return 0;
   1.525 -+	  break;
   1.526 -+
   1.527 -+	case 'n':
   1.528 -+	case 'i':
   1.529 -+	  if (XINT (x, i) != XINT (y, i))
   1.530 -+	    return 0;
   1.531 -+	  break;
   1.532 -+
   1.533 -+	case 'V':
   1.534 -+	case 'E':
   1.535 -+	  /* Two vectors must have the same length.  */
   1.536 -+	  if (XVECLEN (x, i) != XVECLEN (y, i))
   1.537 -+	    return 0;
   1.538 -+
   1.539 -+	  /* And the corresponding elements must match.  */
   1.540 -+	  for (j = 0; j < XVECLEN (x, i); j++)
   1.541 -+	    if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
   1.542 -+	      return 0;
   1.543 -+	  break;
   1.544 -+
   1.545 -+	case 'e':
   1.546 -+	  if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
   1.547 -+	    return 0;
   1.548 -+	  break;
   1.549 -+
   1.550 -+	case 'S':
   1.551 -+	case 's':
   1.552 -+	  if (strcmp (XSTR (x, i), XSTR (y, i)))
   1.553 -+	    return 0;
   1.554 -+	  break;
   1.555 -+
   1.556 -+	case 'u':
   1.557 -+	  /* These are just backpointers, so they don't matter.  */
   1.558 -+	  break;
   1.559 -+
   1.560 -+	case '0':
   1.561 -+	  break;
   1.562 -+
   1.563 -+	  /* It is believed that rtx's at this level will never
   1.564 -+	     contain anything but integers and other rtx's,
   1.565 -+	     except for within LABEL_REFs and SYMBOL_REFs.  */
   1.566 -+	default:
   1.567 -+	  abort ();
   1.568 -+	}
   1.569 -+    }
   1.570 -+  return 1;
   1.571 -+}
   1.572 -+
   1.573 - /* Helper function for purge_addressof.  See if the rtx expression at *LOC
   1.574 -    in INSN needs to be changed.  If FORCE, always put any ADDRESSOFs into
   1.575 -    the stack.  */
   1.576 -@@ -3133,7 +3232,7 @@
   1.577 - 	      for (tem = purge_bitfield_addressof_replacements;
   1.578 - 		   tem != NULL_RTX;
   1.579 - 		   tem = XEXP (XEXP (tem, 1), 1))
   1.580 --		if (rtx_equal_p (x, XEXP (tem, 0)))
   1.581 -+		if (rtx_equal_for_addressof_p (x, XEXP (tem, 0)))
   1.582 - 		  {
   1.583 - 		    *loc = XEXP (XEXP (tem, 1), 0);
   1.584 - 		    return;
   1.585 -@@ -3143,7 +3242,7 @@
   1.586 - 	      for (tem = purge_addressof_replacements;
   1.587 - 		   tem != NULL_RTX;
   1.588 - 		   tem = XEXP (XEXP (tem, 1), 1))
   1.589 --		if (rtx_equal_p (XEXP (x, 0), XEXP (tem, 0)))
   1.590 -+		if (rtx_equal_for_addressof_p (XEXP (x, 0), XEXP (tem, 0)))
   1.591 - 		  {
   1.592 - 		    rtx z = XEXP (XEXP (tem, 1), 0);
   1.593 - 
   1.594 -diff -urN gcc-2.95.3-orig/gcc/jump.c gcc-2.95.3/gcc/jump.c
   1.595 ---- gcc-2.95.3-orig/gcc/jump.c	Thu Oct 21 08:24:03 1999
   1.596 -+++ gcc-2.95.3/gcc/jump.c	Fri Jul 20 19:39:10 2001
   1.597 -@@ -115,7 +115,7 @@
   1.598 - static rtx delete_unreferenced_labels	PROTO((rtx));
   1.599 - static void delete_noop_moves		PROTO((rtx));
   1.600 - static int calculate_can_reach_end	PROTO((rtx, int, int));
   1.601 --static int duplicate_loop_exit_test	PROTO((rtx));
   1.602 -+static int duplicate_loop_exit_test	PROTO((rtx, int));
   1.603 - static void find_cross_jump		PROTO((rtx, rtx, int, rtx *, rtx *));
   1.604 - static void do_cross_jump		PROTO((rtx, rtx, rtx));
   1.605 - static int jump_back_p			PROTO((rtx, rtx));
   1.606 -@@ -338,7 +338,7 @@
   1.607 - 	      && simplejump_p (temp1))
   1.608 - 	    {
   1.609 - 	      temp = PREV_INSN (insn);
   1.610 --	      if (duplicate_loop_exit_test (insn))
   1.611 -+	      if (duplicate_loop_exit_test (insn, after_regscan))
   1.612 - 		{
   1.613 - 		  changed = 1;
   1.614 - 		  next = NEXT_INSN (temp);
   1.615 -@@ -2548,8 +2548,9 @@
   1.616 -    values of regno_first_uid and regno_last_uid.  */
   1.617 - 
   1.618 - static int
   1.619 --duplicate_loop_exit_test (loop_start)
   1.620 -+duplicate_loop_exit_test (loop_start, after_regscan)
   1.621 -      rtx loop_start;
   1.622 -+     int after_regscan;
   1.623 - {
   1.624 -   rtx insn, set, reg, p, link;
   1.625 -   rtx copy = 0, first_copy = 0;
   1.626 -@@ -2662,6 +2663,9 @@
   1.627 - 	    reg_map[REGNO (reg)] = gen_reg_rtx (GET_MODE (reg));
   1.628 - 	  }
   1.629 -       }
   1.630 -+
   1.631 -+  if (after_regscan)
   1.632 -+    reg_scan_update (exitcode, lastexit, max_reg);
   1.633 - 
   1.634 -   /* Now copy each insn.  */
   1.635 -   for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn))
   1.636 -diff -urN gcc-2.95.3-orig/gcc/varasm.c gcc-2.95.3/gcc/varasm.c
   1.637 ---- gcc-2.95.3-orig/gcc/varasm.c	Mon Feb 19 15:02:02 2001
   1.638 -+++ gcc-2.95.3/gcc/varasm.c	Fri Jul 20 19:39:11 2001
   1.639 -@@ -3286,7 +3286,10 @@
   1.640 - 	  value->un.addr.offset = - INTVAL (XEXP (x, 1));
   1.641 - 	}
   1.642 -       else
   1.643 --	abort ();
   1.644 -+	{
   1.645 -+	  value->un.addr.base = x;
   1.646 -+	  value->un.addr.offset = 0;
   1.647 -+	}
   1.648 -       break;
   1.649 - 
   1.650 -     default: