upgrade Linaro GCC 4.8 to 4.8-2013.11

Signed-off-by: Imre Kaloz <kaloz@openwrt.org>

SVN-Revision: 38922
This commit is contained in:
Imre Kaloz 2013-11-26 18:42:32 +00:00
parent eb811eadba
commit b1f4f27fc4
4 changed files with 9 additions and 177 deletions

View File

@ -34,10 +34,10 @@ ifeq ($(findstring linaro, $(CONFIG_GCC_VERSION)),linaro)
PKG_COMP:=bz2
endif
ifeq ($(CONFIG_GCC_VERSION),"4.8-linaro")
PKG_REV:=4.8-2013.08
PKG_VERSION:=4.8.2
PKG_REV:=4.8-2013.11
PKG_VERSION:=4.8.3
PKG_VERSION_MAJOR:=4.8
PKG_MD5SUM:=668e0f4250e35aff554b66accc9a3105
PKG_MD5SUM:=729f4ac34ad404892ecafb991bea2da5
PKG_COMP:=xz
endif
PKG_SOURCE_URL:=http://launchpad.net/gcc-linaro/$(PKG_VERSION_MAJOR)/$(PKG_REV)/+download/

View File

@ -1,167 +0,0 @@
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -1784,10 +1784,18 @@ commit_one_edge_insertion (edge e)
}
/* If the source has one successor and the edge is not abnormal,
- insert there. Except for the entry block. */
+ insert there. Except for the entry block.
+ Don't do this if the predecessor ends in a jump other than
+ unconditional simple jump. E.g. for asm goto that points all
+ its labels at the fallthru basic block, we can't insert instructions
+ before the asm goto, as the asm goto can have various of side effects,
+ and can't emit instructions after the asm goto, as it must end
+ the basic block. */
else if ((e->flags & EDGE_ABNORMAL) == 0
&& single_succ_p (e->src)
- && e->src != ENTRY_BLOCK_PTR)
+ && e->src != ENTRY_BLOCK_PTR
+ && (!JUMP_P (BB_END (e->src))
+ || simplejump_p (BB_END (e->src))))
{
bb = e->src;
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -613,6 +613,9 @@ tree_conflicts_with_clobbers_p (tree t,
CLOBBERS is a list of STRING_CST nodes each naming a hard register
that is clobbered by this insn.
+ LABELS is a list of labels, and if LABELS is non-NULL, FALLTHRU_BB
+ should be the fallthru basic block of the asm goto.
+
Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
Some elements of OUTPUTS may be replaced with trees representing temporary
values. The caller should copy those temporary values to the originally
@@ -622,7 +625,8 @@ tree_conflicts_with_clobbers_p (tree t,
static void
expand_asm_operands (tree string, tree outputs, tree inputs,
- tree clobbers, tree labels, int vol, location_t locus)
+ tree clobbers, tree labels, basic_block fallthru_bb,
+ int vol, location_t locus)
{
rtvec argvec, constraintvec, labelvec;
rtx body;
@@ -643,6 +647,7 @@ expand_asm_operands (tree string, tree o
enum machine_mode *inout_mode = XALLOCAVEC (enum machine_mode, noutputs);
const char **constraints = XALLOCAVEC (const char *, noutputs + ninputs);
int old_generating_concat_p = generating_concat_p;
+ rtx fallthru_label = NULL_RTX;
/* An ASM with no outputs needs to be treated as volatile, for now. */
if (noutputs == 0)
@@ -942,8 +947,24 @@ expand_asm_operands (tree string, tree o
/* Copy labels to the vector. */
for (i = 0, tail = labels; i < nlabels; ++i, tail = TREE_CHAIN (tail))
- ASM_OPERANDS_LABEL (body, i)
- = gen_rtx_LABEL_REF (Pmode, label_rtx (TREE_VALUE (tail)));
+ {
+ rtx r;
+ /* If asm goto has any labels in the fallthru basic block, use
+ a label that we emit immediately after the asm goto. Expansion
+ may insert further instructions into the same basic block after
+ asm goto and if we don't do this, insertion of instructions on
+ the fallthru edge might misbehave. See PR58670. */
+ if (fallthru_bb
+ && label_to_block_fn (cfun, TREE_VALUE (tail)) == fallthru_bb)
+ {
+ if (fallthru_label == NULL_RTX)
+ fallthru_label = gen_label_rtx ();
+ r = fallthru_label;
+ }
+ else
+ r = label_rtx (TREE_VALUE (tail));
+ ASM_OPERANDS_LABEL (body, i) = gen_rtx_LABEL_REF (Pmode, r);
+ }
generating_concat_p = old_generating_concat_p;
@@ -1067,6 +1088,9 @@ expand_asm_operands (tree string, tree o
emit_insn (body);
}
+ if (fallthru_label)
+ emit_label (fallthru_label);
+
/* For any outputs that needed reloading into registers, spill them
back to where they belong. */
for (i = 0; i < noutputs; ++i)
@@ -1087,6 +1111,7 @@ expand_asm_stmt (gimple stmt)
const char *s;
tree str, out, in, cl, labels;
location_t locus = gimple_location (stmt);
+ basic_block fallthru_bb = NULL;
/* Meh... convert the gimple asm operands into real tree lists.
Eventually we should make all routines work on the vectors instead
@@ -1122,6 +1147,9 @@ expand_asm_stmt (gimple stmt)
n = gimple_asm_nlabels (stmt);
if (n > 0)
{
+ edge fallthru = find_fallthru_edge (gimple_bb (stmt)->succs);
+ if (fallthru)
+ fallthru_bb = fallthru->dest;
t = labels = gimple_asm_label_op (stmt, 0);
for (i = 1; i < n; i++)
t = TREE_CHAIN (t) = gimple_asm_label_op (stmt, i);
@@ -1147,7 +1175,7 @@ expand_asm_stmt (gimple stmt)
/* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of
OUTPUTS some trees for where the values were actually stored. */
- expand_asm_operands (str, outputs, in, cl, labels,
+ expand_asm_operands (str, outputs, in, cl, labels, fallthru_bb,
gimple_asm_volatile_p (stmt), locus);
/* Copy all the intermediate outputs into the specified outputs. */
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr58670.c
@@ -0,0 +1,47 @@
+/* PR middle-end/58670 */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+
+#if defined (__i386__) || defined (__x86_64__)
+#define ASM_STR "bts $1, %0; jc %l[lab]"
+#endif
+
+__attribute__((noinline, noclone)) int
+foo (int a, int b)
+{
+ if (a)
+ return -3;
+#ifdef ASM_STR
+ asm volatile goto (ASM_STR : : "m" (b) : "memory" : lab);
+ return 0;
+lab:
+#endif
+ return 0;
+}
+
+int
+bar (int a, int b)
+{
+ if (a)
+ return -3;
+#ifdef ASM_STR
+ asm volatile goto (ASM_STR : : "m" (b) : "memory" : lab);
+ return 0;
+lab:
+#endif
+ return 0;
+}
+
+int
+main ()
+{
+ if (foo (1, 0) != -3
+ || foo (0, 3) != 0
+ || foo (1, 0) != -3
+ || foo (0, 0) != 0
+ || bar (1, 0) != -3
+ || bar (0, 3) != 0
+ || bar (1, 0) != -3
+ || bar (0, 0) != 0)
+ __builtin_abort ();
+ return 0;
+}

View File

@ -1,6 +1,6 @@
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -550,7 +550,7 @@ case ${target} in
@@ -551,7 +551,7 @@ case ${target} in
esac
# Common C libraries.
@ -9,7 +9,7 @@
# Common parts for widely ported systems.
case ${target} in
@@ -653,6 +653,9 @@ case ${target} in
@@ -654,6 +654,9 @@ case ${target} in
*-*-*uclibc*)
tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
;;
@ -306,9 +306,9 @@
CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \
- BIONIC_DYNAMIC_LINKERN32)
+ BIONIC_DYNAMIC_LINKERN32, MUSL_DYNAMIC_LINKERN32)
--- a/gcc/config/sparc/linux64.h 2013-09-10 10:02:45.663973856 +0100
+++ b/gcc/config/sparc/linux64.h 2013-09-10 10:03:17.871972435 +0100
@@ -104,6 +104,9 @@
--- a/gcc/config/sparc/linux64.h
+++ b/gcc/config/sparc/linux64.h
@@ -95,6 +95,9 @@ along with GCC; see the file COPYING3.
#define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2"
#define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux.so.2"
@ -318,4 +318,3 @@
#ifdef SPARC_BI_ARCH
#undef SUBTARGET_EXTRA_SPECS

View File

@ -1,6 +1,6 @@
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -17664,7 +17664,7 @@ rs6000_savres_strategy (rs6000_stack_t *
@@ -17661,7 +17661,7 @@ rs6000_savres_strategy (rs6000_stack_t *
/* Define cutoff for using out-of-line functions to save registers. */
if (DEFAULT_ABI == ABI_V4 || TARGET_ELF)
{