From: danglin Date: Sat, 29 Oct 2011 15:57:00 +0000 (+0000) Subject: PR target/50691 X-Git-Tag: upstream/4.9.2~16683 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f784d2ac579e08597b9bb566dd9cc914d76b93c7;p=platform%2Fupstream%2Flinaro-gcc.git PR target/50691 config/pa/pa.c (emit_move_sequence): Legitimize TLS symbol references. (pa_legitimate_constant_p): Return false for TLS_MODEL_GLOBAL_DYNAMIC and TLS_MODEL_LOCAL_DYNAMIC symbol references. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180655 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f25b3f0..08687df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-10-29 John David Anglin + + PR target/50691 + config/pa/pa.c (emit_move_sequence): Legitimize TLS symbol references. + (pa_legitimate_constant_p): Return false for TLS_MODEL_GLOBAL_DYNAMIC + and TLS_MODEL_LOCAL_DYNAMIC symbol references. + 2011-10-29 Georg-Johann Lay PR target/50887 diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 66e3fc7..85ccf89 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -1781,6 +1781,11 @@ emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg) /* Handle the most common case: storing into a register. */ else if (register_operand (operand0, mode)) { + /* Legitimize TLS symbol references. This happens for references + that aren't a legitimate constant. */ + if (PA_SYMBOL_REF_TLS_P (operand1)) + operand1 = legitimize_tls_address (operand1); + if (register_operand (operand1, mode) || (GET_CODE (operand1) == CONST_INT && cint_ok_for_move (INTVAL (operand1))) @@ -10271,6 +10276,16 @@ pa_legitimate_constant_p (enum machine_mode mode, rtx x) if (!NEW_HP_ASSEMBLER && !TARGET_GAS && GET_CODE (x) == LABEL_REF) return false; + /* TLS_MODEL_GLOBAL_DYNAMIC and TLS_MODEL_LOCAL_DYNAMIC are not + legitimate constants. */ + if (PA_SYMBOL_REF_TLS_P (x)) + { + enum tls_model model = SYMBOL_REF_TLS_MODEL (x); + + if (model == TLS_MODEL_GLOBAL_DYNAMIC || model == TLS_MODEL_LOCAL_DYNAMIC) + return false; + } + if (TARGET_64BIT && GET_CODE (x) == CONST_DOUBLE) return false;