91 lines
2.7 KiB
Diff
91 lines
2.7 KiB
Diff
http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=197510
|
|
Fix PR48308 for the 4.6 branch.
|
|
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48308
|
|
Bug 48308 - [4.6 Regression] crosscompiling to arm fails with assembler: can't resolve '.LC4' {.rodata.str1.1 section} - '.LPIC4' {*UND* section}
|
|
CSP 723931 Bug in GCC-4.6 is preventing compilation of openssl.
|
|
|
|
--- gcc-4_6-branch-org/gcc/combine.c 2013/04/05 08:10:58 197509
|
|
+++ gcc-4_6-branch/gcc/combine.c 2013/04/05 08:31:13 197510
|
|
@@ -341,14 +341,14 @@
|
|
/* Record one modification to rtl structure
|
|
to be undone by storing old_contents into *where. */
|
|
|
|
-enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE };
|
|
+enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE, UNDO_LINKS };
|
|
|
|
struct undo
|
|
{
|
|
struct undo *next;
|
|
enum undo_kind kind;
|
|
union { rtx r; int i; enum machine_mode m; } old_contents;
|
|
- union { rtx *r; int *i; } where;
|
|
+ union { rtx *r; int *i; } where;
|
|
};
|
|
|
|
/* Record a bunch of changes to be undone, up to MAX_UNDO of them.
|
|
@@ -671,7 +671,8 @@
|
|
that are perfectly valid, so we'd waste too much effort for
|
|
little gain doing the checks here. Focus on catching invalid
|
|
transformations involving integer constants. */
|
|
- if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
|
|
+ if (oldval
|
|
+ && GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
|
|
&& CONST_INT_P (newval))
|
|
{
|
|
/* Sanity check that we're replacing oldval with a CONST_INT
|
|
@@ -762,6 +763,34 @@
|
|
}
|
|
|
|
#define SUBST_MODE(INTO, NEWVAL) do_SUBST_MODE(&(INTO), (NEWVAL))
|
|
+
|
|
+#ifndef HAVE_cc0
|
|
+
|
|
+/* Similar to SUBST, but NEWVAL is a LOG_LINKS expression. */
|
|
+
|
|
+static void
|
|
+do_SUBST_LINK (rtx *into, rtx newval)
|
|
+{
|
|
+ struct undo *buf;
|
|
+ rtx oldval = *into;
|
|
+ if (oldval == newval)
|
|
+ return;
|
|
+
|
|
+ if (undobuf.frees)
|
|
+ buf = undobuf.frees, undobuf.frees = buf->next;
|
|
+ else
|
|
+ buf = XNEW (struct undo);
|
|
+
|
|
+ buf->kind = UNDO_LINKS;
|
|
+ buf->where.r = into;
|
|
+ buf->old_contents.r = oldval;
|
|
+ *into = newval;
|
|
+
|
|
+ buf->next = undobuf.undos, undobuf.undos = buf;
|
|
+}
|
|
+
|
|
+#define SUBST_LINK(oldval, newval) do_SUBST_LINK (&oldval, newval)
|
|
+#endif
|
|
|
|
/* Subroutine of try_combine. Determine whether the combine replacement
|
|
patterns NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to
|
|
@@ -2871,6 +2900,7 @@
|
|
SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
|
|
SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
|
|
SET_DEST (PATTERN (i1)));
|
|
+ SUBST_LINK (LOG_LINKS (i2), alloc_INSN_LIST (i1, LOG_LINKS (i2)));
|
|
}
|
|
}
|
|
#endif
|
|
@@ -4474,6 +4504,11 @@
|
|
case UNDO_MODE:
|
|
adjust_reg_mode (*undo->where.r, undo->old_contents.m);
|
|
break;
|
|
+
|
|
+ case UNDO_LINKS:
|
|
+ *undo->where.r = undo->old_contents.r;
|
|
+ break;
|
|
+
|
|
default:
|
|
gcc_unreachable ();
|
|
}
|