+2010-01-05 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR target/42564
+ * config/sparc/sparc.h (SPARC_SYMBOL_REF_TLS_P): Delete.
+ * config/sparc/sparc-protos.h (legitimize_pic_address): Likewise.
+ (legitimize_tls_address): Likewise.
+ (sparc_tls_referenced_p): Likewise.
+ * config/sparc/sparc.c (sparc_expand_move): Use legitimize_tls_address
+ and adjust calls to legitimize_pic_address.
+ (legitimate_constant_p) Use sparc_tls_referenced_p.
+ (legitimate_pic_operand_p): Likewise.
+ (sparc_legitimate_address_p): Do not use SPARC_SYMBOL_REF_TLS_P.
+ (sparc_tls_symbol_ref_1): Delete.
+ (sparc_tls_referenced_p): Make static, recognize specific patterns.
+ (legitimize_tls_address): Make static, handle CONST patterns.
+ (legitimize_pic_address): Make static, remove unused parameter and
+ adjust recursive calls.
+ (sparc_legitimize_address): Make static, use sparc_tls_referenced_p
+ and adjust call to legitimize_pic_address.
+ (sparc_output_mi_thunk): Likewise.
+
2010-01-02 Uros Bizjak <ubizjak@gmail.com>
PR target/42448
extern bool constant_address_p (rtx);
extern bool legitimate_pic_operand_p (rtx);
extern int legitimate_address_p (enum machine_mode, rtx, int);
-extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
-extern rtx legitimize_tls_address (rtx);
extern rtx legitimize_address (rtx, rtx, enum machine_mode);
extern void sparc_emit_call_insn (rtx, rtx);
extern void sparc_defer_case_vector (rtx, rtx, int);
extern int fp_sethi_p (rtx);
extern int fp_mov_p (rtx);
extern int fp_high_losum_p (rtx);
-extern bool sparc_tls_referenced_p (rtx);
extern int mem_min_alignment (rtx, int);
extern int pic_address_needs_scratch (rtx);
extern int reg_unused_after (rtx, rtx);
static void sparc_va_start (tree, rtx);
static tree sparc_gimplify_va_arg (tree, tree, tree *, tree *);
static bool sparc_vector_mode_supported_p (enum machine_mode);
+static bool sparc_tls_referenced_p (rtx);
+static rtx legitimize_tls_address (rtx);
+static rtx legitimize_pic_address (rtx, rtx);
static bool sparc_pass_by_reference (CUMULATIVE_ARGS *,
enum machine_mode, const_tree, bool);
static int sparc_arg_partial_bytes (CUMULATIVE_ARGS *,
/* Fixup TLS cases. */
if (TARGET_HAVE_TLS
&& CONSTANT_P (operands[1])
- && GET_CODE (operands[1]) != HIGH
&& sparc_tls_referenced_p (operands [1]))
{
- rtx sym = operands[1];
- rtx addend = NULL;
-
- if (GET_CODE (sym) == CONST && GET_CODE (XEXP (sym, 0)) == PLUS)
- {
- addend = XEXP (XEXP (sym, 0), 1);
- sym = XEXP (XEXP (sym, 0), 0);
- }
-
- gcc_assert (SPARC_SYMBOL_REF_TLS_P (sym));
-
- sym = legitimize_tls_address (sym);
- if (addend)
- {
- sym = gen_rtx_PLUS (mode, sym, addend);
- sym = force_operand (sym, operands[0]);
- }
- operands[1] = sym;
+ operands[1] = legitimize_tls_address (operands[1]);
+ return false;
}
-
+
/* Fixup PIC cases. */
if (flag_pic && CONSTANT_P (operands[1]))
{
if (pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], mode, 0);
+ operands[1] = legitimize_pic_address (operands[1], NULL_RTX);
/* VxWorks does not impose a fixed gap between segments; the run-time
gap can be different from the object-file gap. We therefore can't
if (symbolic_operand (operands[1], mode))
{
operands[1] = legitimize_pic_address (operands[1],
- mode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
+ reload_in_progress
+ ? operands[0] : NULL_RTX);
return false;
}
}
bool
legitimate_constant_p (rtx x)
{
- rtx inner;
-
switch (GET_CODE (x))
{
- case SYMBOL_REF:
- /* TLS symbols are not constant. */
- if (SYMBOL_REF_TLS_MODEL (x))
- return false;
- break;
-
case CONST:
- inner = XEXP (x, 0);
-
- /* Offsets of TLS symbols are never valid.
- Discourage CSE from creating them. */
- if (GET_CODE (inner) == PLUS
- && SPARC_SYMBOL_REF_TLS_P (XEXP (inner, 0)))
+ case SYMBOL_REF:
+ if (sparc_tls_referenced_p (x))
return false;
break;
{
if (pic_address_needs_scratch (x))
return false;
- if (SPARC_SYMBOL_REF_TLS_P (x)
- || (GET_CODE (x) == CONST
- && GET_CODE (XEXP (x, 0)) == PLUS
- && SPARC_SYMBOL_REF_TLS_P (XEXP (XEXP (x, 0), 0))))
+ if (sparc_tls_referenced_p (x))
return false;
return true;
}
&& GET_CODE (rs2) != SUBREG
&& GET_CODE (rs2) != LO_SUM
&& GET_CODE (rs2) != MEM
- && ! SPARC_SYMBOL_REF_TLS_P (rs2)
+ && !(GET_CODE (rs2) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs2))
&& (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
&& (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
|| ((REG_P (rs1)
rs2 = NULL;
imm1 = XEXP (rs1, 1);
rs1 = XEXP (rs1, 0);
- if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
+ if (!CONSTANT_P (imm1)
+ || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
return 0;
}
}
rs1 = XEXP (addr, 0);
imm1 = XEXP (addr, 1);
- if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
+ if (!CONSTANT_P (imm1)
+ || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
return 0;
/* We can't allow TFmode in 32-bit mode, because an offset greater
return temp;
}
-/* Return 1 if *X is a thread-local symbol. */
+/* Return true if X contains a thread-local symbol. */
-static int
-sparc_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
-{
- return SPARC_SYMBOL_REF_TLS_P (*x);
-}
-
-/* Return 1 if X contains a thread-local symbol. */
-
-bool
+static bool
sparc_tls_referenced_p (rtx x)
{
if (!TARGET_HAVE_TLS)
return false;
- return for_each_rtx (&x, &sparc_tls_symbol_ref_1, 0);
+ if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
+ x = XEXP (XEXP (x, 0), 0);
+
+ if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x))
+ return true;
+
+ /* That's all we handle in legitimize_tls_address for now. */
+ return false;
}
/* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
this (thread-local) address. */
-rtx
+static rtx
legitimize_tls_address (rtx addr)
{
rtx temp1, temp2, temp3, ret, o0, got, insn;
gcc_unreachable ();
}
+ else if (GET_CODE (addr) == CONST)
+ {
+ rtx base, offset;
+
+ gcc_assert (GET_CODE (XEXP (addr, 0)) == PLUS);
+
+ base = legitimize_tls_address (XEXP (XEXP (addr, 0), 0));
+ offset = XEXP (XEXP (addr, 0), 1);
+
+ base = force_operand (base, NULL_RTX);
+ if (!(GET_CODE (offset) == CONST_INT && SMALL_INT (offset)))
+ offset = force_reg (Pmode, offset);
+ ret = gen_rtx_PLUS (Pmode, base, offset);
+ }
+
else
gcc_unreachable (); /* for now ... */
return ret;
}
-
/* Legitimize PIC addresses. If the address is already position-independent,
we return ORIG. Newly generated position-independent addresses go into a
reg. This is REG if nonzero, otherwise we allocate register(s) as
necessary. */
-rtx
-legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
- rtx reg)
+static rtx
+legitimize_pic_address (rtx orig, rtx reg)
{
if (GET_CODE (orig) == SYMBOL_REF
/* See the comment in sparc_expand_move. */
}
gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
- base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
- offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
- base == reg ? 0 : reg);
+ base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
+ offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
+ base == reg ? NULL_RTX : reg);
if (GET_CODE (offset) == CONST_INT)
{
if (x != orig_x && legitimate_address_p (mode, x, FALSE))
return x;
- if (SPARC_SYMBOL_REF_TLS_P (x))
+ if (sparc_tls_referenced_p (x))
x = legitimize_tls_address (x);
else if (flag_pic)
- x = legitimize_pic_address (x, mode, 0);
+ x = legitimize_pic_address (x, NULL_RTX);
else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
copy_to_mode_reg (Pmode, XEXP (x, 1)));
copy_to_mode_reg (Pmode, XEXP (x, 0)));
else if (GET_CODE (x) == SYMBOL_REF
|| GET_CODE (x) == CONST
- || GET_CODE (x) == LABEL_REF)
+ || GET_CODE (x) == LABEL_REF)
x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
+
return x;
}
/* Delay emitting the PIC helper function because it needs to
change the section and we are emitting assembly code. */
load_pic_register (true); /* clobbers %o7 */
- scratch = legitimize_pic_address (funexp, Pmode, scratch);
+ scratch = legitimize_pic_address (funexp, scratch);
seq = get_insns ();
end_sequence ();
emit_and_preserve (seq, spill_reg, spill_reg2);
} \
} while (0)
-#define SPARC_SYMBOL_REF_TLS_P(RTX) \
- (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
-
#define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
((CHAR) == '#' || (CHAR) == '*' || (CHAR) == '(' \
|| (CHAR) == ')' || (CHAR) == '_' || (CHAR) == '&')
+2010-01-05 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/tls/opt-15.c: New test.
+
2009-12-30 Ian Lance Taylor <iant@google.com>
PR middle-end/42099
PR c++/30659
* g++.dg/template/crash71.C: New.
-2007-10-28 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-28 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/32147
* gfortran.dg/module_md5_1.f90: Update hash-value.
* gfortran.dg/bounds_check_10.f90: Fix testcase.
-2007-10-13 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-13 Tobias Schl�ter <tobi@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/33254
PR tree-optimization/33572
* g++.dg/torture/pr33572.C: Replace with complete test.
-2007-10-08 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-08 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/33689
* gfortran.dg/spec_expr_5.f90: New.
PR libfortran/33683
* gfortran.dg/gamma_5.f90: New test case
-2007-10-07 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-07 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/20851
* initialization_1.f90: Fix dg-error annotations.
PR tree-optimization/33572
* g++.dg/torture/pr33572.C: New.
-2007-10-06 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-06 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/25076
* gfortran.dg/forall_11.f90: New.
PR tree-optimization/33627
* g++.dg/torture/pr33627.C: New testcase.
-2007-10-04 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-04 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/33626
* gfortran.dg/parens_6.f90: New.
* gfortran.dg/default_format_1.f90: XFAIL on ppc-darwin.
* gfortran.dg/default_format_2.f90: XFAIL on ppc-darwin.
-2007-10-03 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-10-03 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/33198
* gfortran.dg/common_errors_1.f90: New.
* gcc.target/i386/sse5-convert.c: Fix target selector and rename to...
* gcc.target/i386/pr33524.c: ...this.
-2007-09-28 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-09-28 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/33354
* gfortran.dg/minmaxloc_4.f90: New.
PR middle-end/7003
* gcc.target/powerpc/gcse-1.c: New test.
-2007-09-27 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-09-27 Tobias Schl�ter <tobi@gcc.gnu.org>
* gfortran.dg/array_initializer_3.f90: Adapt error annotations for
fixed capitalizations.
PR c++/14688
* g++.dg/inherit/override_attribs.C: New file.
-2007-09-23 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-09-23 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/33269
* io.c (check_format_string): Move NULL and constant checks into
* gcc.dg/sibcall-4.c: As for gcc.dg/sibcall-3.c.
* gcc.dg/tree-ssa/ssa-fre-3.c: Require !mips64.
-2007-09-20 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-09-20 Tobias Schl�ter <tobi@gcc.gnu.org>
* gfortran.dg/g77/19981216-0.f: Remove dg-warning annotation.
* gfortran.dg/io_constraints_1.f90: Make a -std=f95 test. Add
* gcc.target/cris/builtin_clz_v0.c: New testcase.
* gcc.target/cris/builtin_clz_v3.c: New testcase.
-2007-09-02 Tobias Schlüuter <tobi@gcc.gnu.org>
+2007-09-02 Tobias Schl�uter <tobi@gcc.gnu.org>
* gfortran.dg/substr_6.f90: New test.
PR fortran/30814
* gfortran.dg/pack_bounds_1.f90: New test case.
-2007-07-23 Daniel Franke <franke.daniel@gmail.com>
+2007-07-23 �Daniel Franke �<franke.daniel@gmail.com>
PR fortran/31639
* gfortran.dg/initialization_9.f90: New test.
* gcc.target/m68k/interrupt_thread-2.c: Likewise.
* gcc.target/m68k/interrupt_thread-3.c: Likewise.
-2007-07-12 Daniel Franke <franke.daniel@gmail.com>
+2007-07-12 �Daniel Franke �<franke.daniel@gmail.com>
PR fortran/31639
* gfortran.dg/func_decl_4.f90: New test.
* gcc.dg/tree-ssa/prefetch-6.c: New test.
-2007-05-29 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-05-29 Tobias Schl�ter <tobi@gcc.gnu.org>
* gfortran.dg/sizeof.f90: New.
PR tree-optimization/31885
* gcc.dg/tree-ssa/loop-29.c: New test.
-2007-05-10 Dominique d'Humières <dominiq@lps.ens.fr>
+2007-05-10 Dominique d'Humi�res <dominiq@lps.ens.fr>
* assumed_dummy_1.f90: Fix dg directive.
* char_initialiser_actual.f90: Likewise.
* gcc.dg/cpp/_Pragma6.c: Skip on fido-*-* and m68k-*-*.
-2007-04-17 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-04-17 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/31144
* gfortran.dg/module_naming_1.f90: New.
PR fortran/31550
* gfortran.dg/used_types_16.f90: New test.
-2007-04-13 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-04-13 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/18937
* gfortran.dg/goto_2.f90: New.
* gfortran.dg/c_by_val.c: Use GCC extensions instead of including
<complex.h>.
-2007-04-12 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-04-12 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/31250
* gfortran.dg/char_length_2.f90: New.
PR fortran/31193
* gfortran.dg/transfer_array_intrinsic_3.f90: New test.
-2007-03-22 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-03-22 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/20897
* gfortran.dg/derived_name_1.f90: New.
* gcc.target/ia64/builtin-popcount-1.c: New test case.
* gcc.target/ia64/builtin-popcount-2.c: Likewise.
-2007-02-11 Tobias Schlüter <tobi@gcc.gnu.org>
+2007-02-11 Tobias Schl�ter <tobi@gcc.gnu.org>
PR fortran/30478
* gfortran.dg/enum_4.f90: Update error message checks.
PR target/29248
* gcc.dg/rs6000-leaf.c: New.
-2006-12-20 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-12-20 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/25392
* gfortran.dg/f2c_8.f90: New test.
* gcc.c-torture/compile/vector-2.c: New test.
* gcc.c-torture/compile/vector-3.c: New test.
-2006-12-12 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-12-12 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
* lib/fortran-torture.exp: Update copyright years. Remove
obsolete comment. Test -ftree-vectorize where it makes sense.
* gnat.dg/string_slice.adb: New test.
-2006-07-01 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-07-01 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/19259
* gfortran.dg/semicolon_fixed.c: New.
PR tree-optimization/27409
* gcc.dg/torture/pr27409.c: New testcase.
-2006-05-07 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-05-07 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/27457
* gfortran.dg/select_6.f90: New.
PR fortran/25045
* optional_dim.f90: New test.
-2006-02-14 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-14 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/26277
* gfortran.dg/label_4.f90: New.
gfortran.dg/null_1.f90: New test.
-2006-02-10 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-10 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/14771
* gfortran.dg/parens_4.f90: New.
* gcc.dg/pr23372-1.c: Remove empty file.
-2006-02-09 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-09 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/14771
* gcc.dg/gomp/critical-3.c: Call cleanup-tree-dump.
* gcc.dg/tree-ssa/pr23382.c: Ditto.
-2006-02-07 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-02-07 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/25577
* gfortran.dg/mvbits_1.f90: New.
* gcc.target/i386/20060125-1.c: New test case.
* gcc.target/i386/20060125-2.c: New test case.
-2006-01-25 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
+2006-01-25 Tobias Schl�ter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/18540
* gfortran.dg/goto_1.f: New.
--- /dev/null
+/* PR target/42564 */
+/* This used to ICE on the SPARC because of an unrecognized TLS pattern. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -fPIC" } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-require-effective-target fpic } */
+
+extern void *memset(void *s, int c, __SIZE_TYPE__ n);
+
+struct S1 { int i; };
+
+struct S2
+{
+ int ver;
+ struct S1 s;
+};
+
+static __thread struct S2 m;
+
+void init(void)
+{
+ memset(&m.s, 0, sizeof(m.s));
+}