Hi

This bug causes the compiler to create a Thumb-2 TBB instruction with
a jump table containing an out of range value in a .byte field:

whatever.s:148: Error: value of 256 too large for field of 1 bytes at 100

This occurs because the jump table is followed with a ".align 1" due
to ASM_OUTPUT_CASE_END, but the 'shorten' phase does not account for
the space taken by this align directive.

This patch addresses the issue by removing ASM_OUTPUT_CASE_END from
arm.h, and ensuring that the alignment after an ADDR_DIFF_VEC is
instead inserted by aligning the label following the barrier which
follows it. This is achieved by defining LABEL_ALIGN_AFTER_BARRIER
appropriately.

Bootstrapped/checked on arm-unknown-linux-gnueabihf.

OK for trunk, and backporting to 4.8?



2014-04-02  Charles Baylis  <charles.bay...@linaro.org>

        PR target/60609
        * config/arm/arm.h (ASM_OUTPUT_CASE_END) Remove.
        (LABEL_ALIGN_AFTER_BARRIER) Align barriers which occur after
        ADDR_DIFF_VEC.


2014-04-02  Charles Baylis  <charles.bay...@linaro.org>

        PR target/60609
        * g++.dg/torture/pr60609.C: New test.
From 9b0c1ada23e2b210b02ebaee2f599bb5205a91d6 Mon Sep 17 00:00:00 2001
From: Charles Baylis <charles.bay...@linaro.org>
Date: Thu, 3 Apr 2014 10:57:33 +0100
Subject: [PATCH] fix for PR target/60609

2014-04-02  Charles Baylis  <charles.bay...@linaro.org>

	PR target/60609
	* config/arm/arm.h (ASM_OUTPUT_CASE_END) Remove.
	(LABEL_ALIGN_AFTER_BARRIER) Align barriers which occur after
	ADDR_DIFF_VEC.

2014-04-02  Charles Baylis  <charles.bay...@linaro.org>

	PR target/60609
	* g++.dg/torture/pr60609.C: New test.
---
 gcc/config/arm/arm.h                   |  11 +-
 gcc/testsuite/g++.dg/torture/pr60609.C | 252 +++++++++++++++++++++++++++++++++
 2 files changed, 255 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/torture/pr60609.C

diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 7ca47a7..a4bbd12 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -2194,14 +2194,9 @@ extern int making_const_table;
 #undef ASM_OUTPUT_BEFORE_CASE_LABEL
 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) /* Empty.  */
 
-/* Make sure subsequent insns are aligned after a TBB.  */
-#define ASM_OUTPUT_CASE_END(FILE, NUM, JUMPTABLE)	\
-  do							\
-    {							\
-      if (GET_MODE (PATTERN (JUMPTABLE)) == QImode)	\
-	ASM_OUTPUT_ALIGN (FILE, 1);			\
-    }							\
-  while (0)
+#define LABEL_ALIGN_AFTER_BARRIER(LABEL)                \
+   (GET_CODE (PATTERN (prev_active_insn (LABEL))) == ADDR_DIFF_VEC \
+   ? 1 : 0)
 
 #define ARM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL) 	\
   do							\
diff --git a/gcc/testsuite/g++.dg/torture/pr60609.C b/gcc/testsuite/g++.dg/torture/pr60609.C
new file mode 100644
index 0000000..9ddec0b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr60609.C
@@ -0,0 +1,252 @@
+/* { dg-do assemble } */
+
+class exception
+{
+};
+class bad_alloc:exception
+{
+};
+class logic_error:exception
+{
+};
+class domain_error:logic_error
+{
+};
+class invalid_argument:logic_error
+{
+};
+class length_error:logic_error
+{
+};
+class overflow_error:exception
+{
+};
+typedef int mpz_t[];
+template < class > class __gmp_expr;
+template <> class __gmp_expr < mpz_t >
+{
+    ~__gmp_expr ();
+};
+
+class PIP_Solution_Node;
+class internal_exception
+{
+    ~internal_exception ();
+};
+class not_an_integer:internal_exception
+{
+};
+class not_a_variable:internal_exception
+{
+};
+class not_an_optimization_mode:internal_exception
+{
+};
+class not_a_bounded_integer_type_width:internal_exception
+{
+};
+class not_a_bounded_integer_type_representation:internal_exception
+{
+};
+class not_a_bounded_integer_type_overflow:internal_exception
+{
+};
+class not_a_complexity_class:internal_exception
+{
+};
+class not_a_control_parameter_name:internal_exception
+{
+};
+class not_a_control_parameter_value:internal_exception
+{
+};
+class not_a_pip_problem_control_parameter_name:internal_exception
+{
+};
+class not_a_pip_problem_control_parameter_value:internal_exception
+{
+};
+class not_a_relation:internal_exception
+{
+};
+class ppl_handle_mismatch:internal_exception
+{
+};
+class timeout_exception
+{
+    ~timeout_exception ();
+};
+class deterministic_timeout_exception:timeout_exception
+{
+};
+void __assert_fail (const char *, const char *, int, int *)
+__attribute__ ((__noreturn__));
+void PL_get_pointer (void *);
+int Prolog_is_address ();
+inline int
+Prolog_get_address (void **p1)
+{
+    Prolog_is_address ()? static_cast <
+    void >(0) : __assert_fail ("Prolog_is_address", "./swi_cfli.hh", 0, 0);
+    PL_get_pointer (p1);
+    return 0;
+}
+
+class non_linear:internal_exception
+{
+};
+class not_unsigned_integer:internal_exception
+{
+};
+class not_universe_or_empty:internal_exception
+{
+};
+class not_a_nil_terminated_list:internal_exception
+{
+};
+class PPL_integer_out_of_range
+{
+    __gmp_expr < mpz_t > n;
+};
+void handle_exception ();
+template < typename T > T * term_to_handle (int, const char *)
+{
+    if (Prolog_is_address ())
+    {
+        void *p;
+        Prolog_get_address (&p);
+        return static_cast < T * >(0);
+    }
+    throw;
+}
+
+void
+ppl_new_MIP_Problem_from_MIP_Problem ()
+try
+{
+    term_to_handle < int >(0, "ppl_new_MIP_Problem_from_MIP_Problem/2");
+}
+
+catch (exception &)
+{
+}
+
+int
+ppl_PIP_Tree_Node_parametric_values ()
+{
+    try
+    {
+        PIP_Solution_Node *a = term_to_handle < PIP_Solution_Node > (0, 0);
+	(void)a;
+        return 1;
+    }
+    catch (internal_exception &)
+    {
+    }
+    catch (not_unsigned_integer &)
+    {
+        handle_exception ();
+    }
+    catch (non_linear &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_variable &)
+    {
+        handle_exception ();
+    }
+    catch (not_an_integer &)
+    {
+        handle_exception ();
+    }
+    catch (ppl_handle_mismatch &)
+    {
+        handle_exception ();
+    }
+    catch (not_an_optimization_mode &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_complexity_class &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_bounded_integer_type_width &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_bounded_integer_type_representation &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_bounded_integer_type_overflow &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_control_parameter_name &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_control_parameter_value &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_pip_problem_control_parameter_name &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_pip_problem_control_parameter_value &)
+    {
+        handle_exception ();
+    }
+    catch (not_universe_or_empty &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_relation &)
+    {
+        handle_exception ();
+    }
+    catch (not_a_nil_terminated_list &)
+    {
+        handle_exception ();
+    }
+    catch (PPL_integer_out_of_range &)
+    {
+        handle_exception ();
+    }
+    catch (int &)
+    {
+    } catch (timeout_exception &)
+    {
+        handle_exception ();
+    } catch (deterministic_timeout_exception &)
+    {
+        handle_exception ();
+    } catch (overflow_error &)
+    {
+        handle_exception ();
+    } catch (domain_error &)
+    {
+        handle_exception ();
+    } catch (length_error &)
+    {
+        handle_exception ();
+    } catch (invalid_argument &)
+    {
+        handle_exception ();
+    } catch (logic_error &)
+    {
+        handle_exception ();
+    } catch (bad_alloc &)
+    {
+        handle_exception ();
+    } catch (exception &)
+    {
+        handle_exception ();
+    } catch ( ...)
+    {
+        handle_exception ();
+    }
+    return 0;
+}
-- 
1.8.3.2

Reply via email to