patches/gcc/4.4.0/300-pr40105.patch
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
yann@1393
     1
diff -durN gcc-4.4.0.orig/gcc/Makefile.in gcc-4.4.0/gcc/Makefile.in
yann@1393
     2
--- gcc-4.4.0.orig/gcc/Makefile.in	2009-03-25 13:00:32.000000000 +0100
yann@1393
     3
+++ gcc-4.4.0/gcc/Makefile.in	2009-05-27 21:38:50.000000000 +0200
yann@1393
     4
@@ -2785,7 +2785,8 @@
yann@1393
     5
    value-prof.h $(TREE_INLINE_H) $(TARGET_H)
yann@1393
     6
 cfgrtl.o : cfgrtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
yann@1393
     7
    $(FLAGS_H) insn-config.h $(BASIC_BLOCK_H) $(REGS_H) hard-reg-set.h \
yann@1393
     8
-   output.h $(TOPLEV_H) $(FUNCTION_H) except.h $(TM_P_H) insn-config.h $(EXPR_H) \
yann@1393
     9
+   output.h $(TOPLEV_H) $(FUNCTION_H) except.h $(TM_P_H) $(INSN_ATTR_H) \
yann@1393
    10
+   insn-config.h $(EXPR_H) \
yann@1393
    11
    $(CFGLAYOUT_H) $(CFGLOOP_H) $(OBSTACK_H) $(TARGET_H) $(TREE_H) \
yann@1393
    12
    tree-pass.h $(DF_H) $(GGC_H)
yann@1393
    13
 cfganal.o : cfganal.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
yann@1393
    14
diff -durN gcc-4.4.0.orig/gcc/cfgrtl.c gcc-4.4.0/gcc/cfgrtl.c
yann@1393
    15
--- gcc-4.4.0.orig/gcc/cfgrtl.c	2008-12-12 22:16:09.000000000 +0100
yann@1393
    16
+++ gcc-4.4.0/gcc/cfgrtl.c	2009-05-27 21:38:50.000000000 +0200
yann@1393
    17
@@ -53,6 +53,7 @@
yann@1393
    18
 #include "toplev.h"
yann@1393
    19
 #include "tm_p.h"
yann@1393
    20
 #include "obstack.h"
yann@1393
    21
+#include "insn-attr.h"
yann@1393
    22
 #include "insn-config.h"
yann@1393
    23
 #include "cfglayout.h"
yann@1393
    24
 #include "expr.h"
yann@1393
    25
@@ -427,13 +428,27 @@
yann@1393
    26
   return 0;
yann@1393
    27
 }
yann@1393
    28
 
yann@1393
    29
+static unsigned int
yann@1393
    30
+rest_of_pass_free_cfg (void)
yann@1393
    31
+{
yann@1393
    32
+#ifdef DELAY_SLOTS
yann@1393
    33
+  /* The resource.c machinery uses DF but the CFG isn't guaranteed to be
yann@1393
    34
+     valid at that point so it would be too late to call df_analyze.  */
yann@1393
    35
+  if (optimize > 0 && flag_delayed_branch)
yann@1393
    36
+    df_analyze ();
yann@1393
    37
+#endif
yann@1393
    38
+
yann@1393
    39
+  free_bb_for_insn ();
yann@1393
    40
+  return 0;
yann@1393
    41
+}
yann@1393
    42
+
yann@1393
    43
 struct rtl_opt_pass pass_free_cfg =
yann@1393
    44
 {
yann@1393
    45
  {
yann@1393
    46
   RTL_PASS,
yann@1393
    47
   NULL,                                 /* name */
yann@1393
    48
   NULL,                                 /* gate */
yann@1393
    49
-  free_bb_for_insn,                     /* execute */
yann@1393
    50
+  rest_of_pass_free_cfg,                /* execute */
yann@1393
    51
   NULL,                                 /* sub */
yann@1393
    52
   NULL,                                 /* next */
yann@1393
    53
   0,                                    /* static_pass_number */
yann@1393
    54
diff -durN gcc-4.4.0.orig/gcc/resource.c gcc-4.4.0/gcc/resource.c
yann@1393
    55
--- gcc-4.4.0.orig/gcc/resource.c	2009-02-20 16:20:38.000000000 +0100
yann@1393
    56
+++ gcc-4.4.0/gcc/resource.c	2009-05-27 21:38:50.000000000 +0200
yann@1393
    57
@@ -135,8 +135,6 @@
yann@1393
    58
 static int
yann@1393
    59
 find_basic_block (rtx insn, int search_limit)
yann@1393
    60
 {
yann@1393
    61
-  basic_block bb;
yann@1393
    62
-
yann@1393
    63
   /* Scan backwards to the previous BARRIER.  Then see if we can find a
yann@1393
    64
      label that starts a basic block.  Return the basic block number.  */
yann@1393
    65
   for (insn = prev_nonnote_insn (insn);
yann@1393
    66
@@ -157,11 +155,8 @@
yann@1393
    67
   for (insn = next_nonnote_insn (insn);
yann@1393
    68
        insn && LABEL_P (insn);
yann@1393
    69
        insn = next_nonnote_insn (insn))
yann@1393
    70
-    {
yann@1393
    71
-      FOR_EACH_BB (bb)
yann@1393
    72
-	if (insn == BB_HEAD (bb))
yann@1393
    73
-	  return bb->index;
yann@1393
    74
-    }
yann@1393
    75
+    if (BLOCK_FOR_INSN (insn))
yann@1393
    76
+      return BLOCK_FOR_INSN (insn)->index;
yann@1393
    77
 
yann@1393
    78
   return -1;
yann@1393
    79
 }
yann@1393
    80
@@ -848,13 +843,12 @@
yann@1393
    81
    (with no intervening active insns) to see if any of them start a basic
yann@1393
    82
    block.  If we hit the start of the function first, we use block 0.
yann@1393
    83
 
yann@1393
    84
-   Once we have found a basic block and a corresponding first insns, we can
yann@1393
    85
-   accurately compute the live status from basic_block_live_regs and
yann@1393
    86
-   reg_renumber.  (By starting at a label following a BARRIER, we are immune
yann@1393
    87
-   to actions taken by reload and jump.)  Then we scan all insns between
yann@1393
    88
-   that point and our target.  For each CLOBBER (or for call-clobbered regs
yann@1393
    89
-   when we pass a CALL_INSN), mark the appropriate registers are dead.  For
yann@1393
    90
-   a SET, mark them as live.
yann@1393
    91
+   Once we have found a basic block and a corresponding first insn, we can
yann@1393
    92
+   accurately compute the live status (by starting at a label following a
yann@1393
    93
+   BARRIER, we are immune to actions taken by reload and jump.)  Then we
yann@1393
    94
+   scan all insns between that point and our target.  For each CLOBBER (or
yann@1393
    95
+   for call-clobbered regs when we pass a CALL_INSN), mark the appropriate
yann@1393
    96
+   registers are dead.  For a SET, mark them as live.
yann@1393
    97
 
yann@1393
    98
    We have to be careful when using REG_DEAD notes because they are not
yann@1393
    99
    updated by such things as find_equiv_reg.  So keep track of registers
yann@1393
   100
@@ -954,13 +948,10 @@
yann@1393
   101
      TARGET.  Otherwise, we must assume everything is live.  */
yann@1393
   102
   if (b != -1)
yann@1393
   103
     {
yann@1393
   104
-      regset regs_live = DF_LR_IN (BASIC_BLOCK (b));
yann@1393
   105
+      regset regs_live = df_get_live_in (BASIC_BLOCK (b));
yann@1393
   106
       rtx start_insn, stop_insn;
yann@1393
   107
 
yann@1393
   108
-      /* Compute hard regs live at start of block -- this is the real hard regs
yann@1393
   109
-	 marked live, plus live pseudo regs that have been renumbered to
yann@1393
   110
-	 hard regs.  */
yann@1393
   111
-
yann@1393
   112
+      /* Compute hard regs live at start of block.  */
yann@1393
   113
       REG_SET_TO_HARD_REG_SET (current_live_regs, regs_live);
yann@1393
   114
 
yann@1393
   115
       /* Get starting and ending insn, handling the case where each might
yann@1393
   116
@@ -1046,10 +1037,24 @@
yann@1393
   117
 
yann@1393
   118
 	  else if (LABEL_P (real_insn))
yann@1393
   119
 	    {
yann@1393
   120
+	      basic_block bb;
yann@1393
   121
+
yann@1393
   122
 	      /* A label clobbers the pending dead registers since neither
yann@1393
   123
 		 reload nor jump will propagate a value across a label.  */
yann@1393
   124
 	      AND_COMPL_HARD_REG_SET (current_live_regs, pending_dead_regs);
yann@1393
   125
 	      CLEAR_HARD_REG_SET (pending_dead_regs);
yann@1393
   126
+
yann@1393
   127
+	      /* We must conservatively assume that all registers that used
yann@1393
   128
+		 to be live here still are.  The fallthrough edge may have
yann@1393
   129
+		 left a live register uninitialized.  */
yann@1393
   130
+	      bb = BLOCK_FOR_INSN (real_insn);
yann@1393
   131
+	      if (bb)
yann@1393
   132
+		{
yann@1393
   133
+		  HARD_REG_SET extra_live;
yann@1393
   134
+
yann@1393
   135
+		  REG_SET_TO_HARD_REG_SET (extra_live, df_get_live_in (bb));
yann@1393
   136
+		  IOR_HARD_REG_SET (current_live_regs, extra_live);
yann@1393
   137
+		}
yann@1393
   138
 	    }
yann@1393
   139
 
yann@1393
   140
 	  /* The beginning of the epilogue corresponds to the end of the
yann@1393
   141
@@ -1121,6 +1126,7 @@
yann@1393
   142
 init_resource_info (rtx epilogue_insn)
yann@1393
   143
 {
yann@1393
   144
   int i;
yann@1393
   145
+  basic_block bb;
yann@1393
   146
 
yann@1393
   147
   /* Indicate what resources are required to be valid at the end of the current
yann@1393
   148
      function.  The condition code never is and memory always is.  If the
yann@1393
   149
@@ -1189,6 +1195,11 @@
yann@1393
   150
   /* Allocate and initialize the tables used by mark_target_live_regs.  */
yann@1393
   151
   target_hash_table = XCNEWVEC (struct target_info *, TARGET_HASH_PRIME);
yann@1393
   152
   bb_ticks = XCNEWVEC (int, last_basic_block);
yann@1393
   153
+
yann@1393
   154
+  /* Set the BLOCK_FOR_INSN of each label that starts a basic block.  */
yann@1393
   155
+  FOR_EACH_BB (bb)
yann@1393
   156
+    if (LABEL_P (BB_HEAD (bb)))
yann@1393
   157
+      BLOCK_FOR_INSN (BB_HEAD (bb)) = bb;
yann@1393
   158
 }
yann@1393
   159
 
yann@1393
   160
 /* Free up the resources allocated to mark_target_live_regs ().  This
yann@1393
   161
@@ -1197,6 +1208,8 @@
yann@1393
   162
 void
yann@1393
   163
 free_resource_info (void)
yann@1393
   164
 {
yann@1393
   165
+  basic_block bb;
yann@1393
   166
+
yann@1393
   167
   if (target_hash_table != NULL)
yann@1393
   168
     {
yann@1393
   169
       int i;
yann@1393
   170
@@ -1222,6 +1235,10 @@
yann@1393
   171
       free (bb_ticks);
yann@1393
   172
       bb_ticks = NULL;
yann@1393
   173
     }
yann@1393
   174
+
yann@1393
   175
+  FOR_EACH_BB (bb)
yann@1393
   176
+    if (LABEL_P (BB_HEAD (bb)))
yann@1393
   177
+      BLOCK_FOR_INSN (BB_HEAD (bb)) = NULL;
yann@1393
   178
 }
yann@1393
   179
 
yann@1393
   180
 /* Clear any hashed information that we have stored for INSN.  */