aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2017-01-11 16:13:14 +0000
committerChristophe Lyon <clyon@gcc.gnu.org>2017-01-11 17:13:14 +0100
commit6027c4b5cab74a36ad932e2b96238297e0704dfe (patch)
treecc956dfc3dd7565f4f37165f67865b0acbf5edc9 /gcc
parentb744bf4e18d4c1422cdffbfeed30490252b3f64e (diff)
downloadgcc-6027c4b5cab74a36ad932e2b96238297e0704dfe.zip
gcc-6027c4b5cab74a36ad932e2b96238297e0704dfe.tar.gz
gcc-6027c4b5cab74a36ad932e2b96238297e0704dfe.tar.bz2
[ARM] PR target/78253 Call weak function instead of strong when called through pointer.
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. From-SVN: r244320
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.c16
2 files changed, 20 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 35fff84..1f7edd6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2017-01-11 Richard Earnshaw <rearnsha@arm.com>
* config.gcc: Use new awk script to check CPU, FPU and architecture
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 1fbeb56..96777f0 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -7269,10 +7269,14 @@ 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. */
rtx_insn *insn;
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);
@@ -22475,8 +22479,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);