[ARM] PR target/78253 Call weak function instead of strong when called through pointer.
authorChristophe Lyon <christophe.lyon@linaro.org>
Wed, 11 Jan 2017 16:13:14 +0000 (16:13 +0000)
committerChristophe Lyon <clyon@gcc.gnu.org>
Wed, 11 Jan 2017 16:13:14 +0000 (17:13 +0100)
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

gcc/ChangeLog
gcc/config/arm/arm.c

index 35fff84af6c054651d1698116284f050e2d58ebb..1f7edd6c23a56e4f746e5ea3d71f15115dc6592b 100644 (file)
@@ -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
index 1fbeb56756f59fe50b081806cd8f4e5582c96ddc..96777f00137ea1047011719202c7eb4bb28cda2d 100644 (file)
@@ -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);