aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2017-01-11 23:14:47 +0100
committerYvan Roux <yvan.roux@linaro.org>2017-01-30 14:46:57 +0100
commit226a39cd147ef2032b4f11f5716544c3ac82efbe (patch)
tree4ed7fb33cc4aec71ee582fd0db141fb1b732c8d7
parent9a896bc4a0380d09d7ab3500f1e459e0686c025d (diff)
gcc/
Backport from trunk r244320. 2017-01-11 Christophe Lyon <christophe.lyon@linaro.org> PR target/78253 * config/arm/arm.c (legitimize_pic_address): Handle reference to weak symbol. (arm_assemble_integer): Likewise. Change-Id: I477d2f99ddb334594188c53dd06d13591f941b97
-rw-r--r--gcc/config/arm/arm.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index d87e53f7cff..d96a6f8888f 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -7162,9 +7162,13 @@ legitimize_pic_address (rtx orig, machine_mode mode, rtx reg)
same segment as the GOT. Unfortunately, the flexibility of linker
scripts means that we can't be sure of that in general, so assume
that GOTOFF is never valid on VxWorks. */
+ /* References to weak symbols cannot be resolved locally: they
+ may be overridden by a non-weak definition at link time. */
if ((GET_CODE (orig) == LABEL_REF
- || (GET_CODE (orig) == SYMBOL_REF &&
- SYMBOL_REF_LOCAL_P (orig)))
+ || (GET_CODE (orig) == SYMBOL_REF
+ && SYMBOL_REF_LOCAL_P (orig)
+ && (SYMBOL_REF_DECL (orig)
+ ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)))
&& NEED_GOT_RELOC
&& arm_pic_data_is_text_relative)
insn = arm_pic_static_addr (orig, reg);
@@ -23549,8 +23553,14 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
{
/* See legitimize_pic_address for an explanation of the
TARGET_VXWORKS_RTP check. */
+ /* References to weak symbols cannot be resolved locally:
+ they may be overridden by a non-weak definition at link
+ time. */
if (!arm_pic_data_is_text_relative
- || (GET_CODE (x) == SYMBOL_REF && !SYMBOL_REF_LOCAL_P (x)))
+ || (GET_CODE (x) == SYMBOL_REF
+ && (!SYMBOL_REF_LOCAL_P (x)
+ || (SYMBOL_REF_DECL (x)
+ ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
fputs ("(GOT)", asm_out_file);
else
fputs ("(GOTOFF)", asm_out_file);