From: Jakub Jelinek Date: Thu, 10 Apr 2014 07:45:21 +0000 (+0200) Subject: backport: re PR target/58595 (internal compiler error: in gen_movsi when compiling... X-Git-Tag: releases/gcc-4.8.3~155 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03251c6ad572d52b06a7560337ae906752badea2;p=thirdparty%2Fgcc.git backport: re PR target/58595 (internal compiler error: in gen_movsi when compiling on arm some files of lttng-tools with -fPIE) Backport from mainline 2014-03-06 Jakub Jelinek Meador Inge PR target/58595 * config/arm/arm.c (arm_tls_symbol_p): Remove. (arm_legitimize_address): Call legitimize_tls_address for any arm_tls_referenced_p expression, handle constant addend. Call it before testing for !TARGET_ARM. (thumb_legitimize_address): Don't handle arm_tls_symbol_p here. 2014-03-06 Jakub Jelinek PR target/58595 * gcc.dg/tls/pr58595.c: New test. From-SVN: r209262 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab35ff055c20..e1335a8fbfa7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2014-04-10 Jakub Jelinek + + Backport from mainline + 2014-03-06 Jakub Jelinek + Meador Inge + + PR target/58595 + * config/arm/arm.c (arm_tls_symbol_p): Remove. + (arm_legitimize_address): Call legitimize_tls_address for any + arm_tls_referenced_p expression, handle constant addend. Call it + before testing for !TARGET_ARM. + (thumb_legitimize_address): Don't handle arm_tls_symbol_p here. + 2014-04-09 Bill Schmidt Backport from mainline r208750 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 46631b6e1a3d..5bc66034ed93 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -230,7 +230,6 @@ static tree arm_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *); static void arm_option_override (void); static unsigned HOST_WIDE_INT arm_shift_truncation_mask (enum machine_mode); static bool arm_cannot_copy_insn_p (rtx); -static bool arm_tls_symbol_p (rtx x); static int arm_issue_rate (void); static void arm_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED; static bool arm_output_addr_const_extra (FILE *, rtx); @@ -6587,6 +6586,32 @@ legitimize_tls_address (rtx x, rtx reg) rtx arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode) { + if (arm_tls_referenced_p (x)) + { + rtx addend = NULL; + + if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS) + { + addend = XEXP (XEXP (x, 0), 1); + x = XEXP (XEXP (x, 0), 0); + } + + if (GET_CODE (x) != SYMBOL_REF) + return x; + + gcc_assert (SYMBOL_REF_TLS_MODEL (x) != 0); + + x = legitimize_tls_address (x, NULL_RTX); + + if (addend) + { + x = gen_rtx_PLUS (SImode, x, addend); + orig_x = x; + } + else + return x; + } + if (!TARGET_ARM) { /* TODO: legitimize_address for Thumb2. */ @@ -6595,9 +6620,6 @@ arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode) return thumb_legitimize_address (x, orig_x, mode); } - if (arm_tls_symbol_p (x)) - return legitimize_tls_address (x, NULL_RTX); - if (GET_CODE (x) == PLUS) { rtx xop0 = XEXP (x, 0); @@ -6709,9 +6731,6 @@ arm_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode) rtx thumb_legitimize_address (rtx x, rtx orig_x, enum machine_mode mode) { - if (arm_tls_symbol_p (x)) - return legitimize_tls_address (x, NULL_RTX); - if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1)) && (INTVAL (XEXP (x, 1)) >= 32 * GET_MODE_SIZE (mode) @@ -7002,20 +7021,6 @@ thumb_legitimize_reload_address (rtx *x_p, /* Test for various thread-local symbols. */ -/* Return TRUE if X is a thread-local symbol. */ - -static bool -arm_tls_symbol_p (rtx x) -{ - if (! TARGET_HAVE_TLS) - return false; - - if (GET_CODE (x) != SYMBOL_REF) - return false; - - return SYMBOL_REF_TLS_MODEL (x) != 0; -} - /* Helper for arm_tls_referenced_p. */ static int diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9cad3240eea7..256e8b50f3d4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-04-10 Jakub Jelinek + + Backport from mainline + 2014-03-06 Jakub Jelinek + + PR target/58595 + * gcc.dg/tls/pr58595.c: New test. + 2014-04-07 Martin Jambor PR ipa/60640 diff --git a/gcc/testsuite/gcc.dg/tls/pr58595.c b/gcc/testsuite/gcc.dg/tls/pr58595.c new file mode 100644 index 000000000000..d830e76d4a5d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tls/pr58595.c @@ -0,0 +1,28 @@ +/* PR target/58595 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +/* { dg-additional-options "-fpic" { target fpic } } */ +/* { dg-require-effective-target tls } */ +/* { dg-require-effective-target sync_int_long } */ + +struct S { unsigned long a, b; }; +__thread struct S s; +void bar (unsigned long *); + +__attribute__((noinline)) void +foo (void) +{ + int i; + for (i = 0; i < 10; i++) + __sync_fetch_and_add (&s.b, 1L); +} + +int +main () +{ + s.b = 12; + foo (); + if (s.b != 22) + __builtin_abort (); + return 0; +}