aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorChung-Ju Wu <jasonwucj@gmail.com>2015-01-13 06:06:34 +0000
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>2015-01-13 06:06:34 +0000
commit4855be843467f337cd50f0d081e0a524e6ab4d77 (patch)
tree4633b6d235806a32aa620ec6ad35c5c286ffe1e8 /gcc/config
parent511a41d799f2a3b9946d5176ff0f5404077d2bec (diff)
downloadgcc-4855be843467f337cd50f0d081e0a524e6ab4d77.zip
gcc-4855be843467f337cd50f0d081e0a524e6ab4d77.tar.gz
gcc-4855be843467f337cd50f0d081e0a524e6ab4d77.tar.bz2
[NDS32] Consider -mcmodel=X in nds32_legitimate_address_p implementation.
gcc/ * config/nds32/nds32.c (nds32_legitimate_address_p): Consider TARGET_CMODEL_LARGE and TARGET_CMODEL_MEDIUM cases. From-SVN: r219515
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/nds32/nds32.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c
index 5128bfa..192816f 100644
--- a/gcc/config/nds32/nds32.c
+++ b/gcc/config/nds32/nds32.c
@@ -1961,24 +1961,27 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict)
return nds32_address_register_rtx_p (x, strict);
case SYMBOL_REF:
-
- if (!TARGET_GP_DIRECT
+ /* (mem (symbol_ref A)) => [symbol_ref] */
+ /* If -mcmodel=large, the 'symbol_ref' is not a valid address
+ during or after LRA/reload phase. */
+ if (TARGET_CMODEL_LARGE
&& (reload_completed
|| reload_in_progress
|| lra_in_progress))
return false;
-
- /* (mem (symbol_ref A)) => [symbol_ref] */
- return !currently_expanding_to_rtl;
-
- case CONST:
-
- if (!TARGET_GP_DIRECT
+ /* If -mcmodel=medium and the symbol references to rodata section,
+ the 'symbol_ref' is not a valid address during or after
+ LRA/reload phase. */
+ if (TARGET_CMODEL_MEDIUM
+ && NDS32_SYMBOL_REF_RODATA_P (x)
&& (reload_completed
|| reload_in_progress
|| lra_in_progress))
return false;
+ return true;
+
+ case CONST:
/* (mem (const (...)))
=> [ + const_addr ], where const_addr = symbol_ref + const_int */
if (GET_CODE (XEXP (x, 0)) == PLUS)
@@ -1989,9 +1992,30 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict)
rtx op1 = XEXP (plus_op, 1);
if (GET_CODE (op0) == SYMBOL_REF && CONST_INT_P (op1))
- return true;
- else
- return false;
+ {
+ /* Now we see the [ + const_addr ] pattern, but we need
+ some further checking. */
+ /* If -mcmodel=large, the 'const_addr' is not a valid address
+ during or after LRA/reload phase. */
+ if (TARGET_CMODEL_LARGE
+ && (reload_completed
+ || reload_in_progress
+ || lra_in_progress))
+ return false;
+ /* If -mcmodel=medium and the symbol references to rodata section,
+ the 'const_addr' is not a valid address during or after
+ LRA/reload phase. */
+ if (TARGET_CMODEL_MEDIUM
+ && NDS32_SYMBOL_REF_RODATA_P (op0)
+ && (reload_completed
+ || reload_in_progress
+ || lra_in_progress))
+ return false;
+
+ /* At this point we can make sure 'const_addr' is a
+ valid address. */
+ return true;
+ }
}
return false;