kumquat-buildroot/package/gcc/arc-2014.08/400-call-arc_hazard-before-branch-shortening.patch
Alexey Brodkin b94949efb3 ARC: gcc - fixes for improperly calculated jump/branch offsets
Symptoms usually seen are like that:
--->---
Error: operand out of range (128 is not between -128 and 127)
--->---
where range may differ.

Since compiler tries to use jump/branch instructions with the shortest encoding
of offset it's important to calculate required offset properly.

In case of miscalculation by compiler later assembler throws an error because of
inability to encode requested value.

Fixes are taken from current development branch of GCC for ARC and will be a
part of the next release of ARC tools, so at that point patch should be dropped.

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Anton Kolesov <akolesov@synopsys.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
2014-10-08 20:55:28 +02:00

97 lines
2.8 KiB
Diff

Call arc_hazard before branch shortening
On attempt to compile busybox (1.22.1) from buildroot master following build
error happened:
--->---
$ arc-linux-gcc -Iinclude -Ilibbb -include include/autoconf.h -D_FILE_OFFSET_BITS=64 -fstack-protector-all -fno-guess-branch-probability -Os -c -o libbb/xfuncs.o libbb/xfuncs.c
xfuncs.s: Assembler messages:
xfuncs.s:444: Error: operand out of range (128 is not between -128 and 127)
--->---
Fix is taken from current development branch of GCC for ARC and will be a
part of the next release of ARC tools, so at that point patch should be dropped.
https://github.com/foss-for-synopsys-dwc-arc-processors/gcc/commit/37ba2006be0b8c629d2f8ba6c5ec2819bd0269e5
Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
---
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 7d64f69..30baae1 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -6520,6 +6520,16 @@ workaround_arc_anomaly (void)
{
rtx insn, succ0, succ1;
+ /* For any architecture: call arc_hazard here. */
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ {
+ succ0 = next_real_insn(insn);
+ if (arc_hazard (insn, succ0))
+ {
+ emit_insn_before (gen_nopv (), succ0);
+ }
+ }
+
if (!TARGET_ARC700)
return;
@@ -8710,7 +8720,7 @@ arc_loop_hazard (rtx pred, rtx succ)
succ_bb = BLOCK_FOR_INSN (NEXT_INSN (label));
}
- if (succ_bb && REGNO_REG_SET_P (df_get_live_in (succ_bb), LP_COUNT))
+ if (succ_bb && REGNO_REG_SET_P (df_get_live_out (succ_bb), LP_COUNT))
return true;
return false;
diff --git a/gcc/testsuite/gcc.target/arc/pr9000798619.c b/gcc/testsuite/gcc.target/arc/pr9000798619.c
new file mode 100644
index 0000000..b08b32d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/pr9000798619.c
@@ -0,0 +1,42 @@
+/* { dg-do assemble } */
+/* { dg-options "-Os -fstack-protector-all -fno-guess-branch-probability" } */
+/* The arc_hazard introduces a NOP which is not taken into account by
+ branch shortening step, resulting in an out of range branch
+ offset (ARC700 architecture). */
+
+typedef unsigned char uint8_t;
+extern int *const bb_errno;
+
+char* hex2bin(char *dst, const char *str, int count)
+{
+ (*bb_errno) = 22;
+ while (*str && count) {
+ uint8_t val;
+ uint8_t c = *str++;
+ if (((unsigned char)((c) - '0') <= 9))
+ val = c - '0';
+ else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
+ val = (c|0x20) - ('a' - 10);
+ else
+ return ((void *)0);
+ val <<= 4;
+ c = *str;
+ if (((unsigned char)((c) - '0') <= 9))
+ val |= c - '0';
+ else if ((c|0x20) >= 'a' && (c|0x20) <= 'f')
+ val |= (c|0x20) - ('a' - 10);
+ else if (c == ':' || c == '\0')
+ val >>= 4;
+ else
+ return ((void *)0);
+
+ *dst++ = val;
+ if (c != '\0')
+ str++;
+ if (*str == ':')
+ str++;
+ count--;
+ }
+ (*bb_errno) = (*str ? 34 : 0);
+ return dst;
+}