From 37ed60c071d0750078f8964f1c43e2c77ee2d02f Mon Sep 17 00:00:00 2001 From: clyon Date: Wed, 11 Jan 2017 16:13:14 +0000 Subject: [PATCH] [ARM] PR target/78253 Call weak function instead of strong when called through pointer. 2017-01-11 Christophe Lyon PR target/78253 * config/arm/arm.c (legitimize_pic_address): Handle reference to weak symbol. (arm_assemble_integer): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@244320 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/arm/arm.c | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35fff84af6c..1f7edd6c23a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-01-11 Christophe Lyon + + PR target/78253 + * config/arm/arm.c (legitimize_pic_address): Handle reference to + weak symbol. + (arm_assemble_integer): Likewise. + 2017-01-11 Richard Earnshaw * 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 1fbeb56756f..96777f00137 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); -- 2.11.4.GIT