Fix diagnostic errors
[binutils-gdb.git] / bfd / elf32-ppc.c
index 8629380dd85f635d5fad1a458d1276af89c9dd57..5e9251bdb9faad12b85d26fb03c41a50e243cfb9 100644 (file)
@@ -2405,13 +2405,24 @@ ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
 
     case NT_PRPSINFO:
       {
-       char data[128];
+       char data[128] ATTRIBUTE_NONSTRING;
        va_list ap;
 
        va_start (ap, note_type);
        memset (data, 0, sizeof (data));
        strncpy (data + 32, va_arg (ap, const char *), 16);
+#if GCC_VERSION == 8001
+       DIAGNOSTIC_PUSH;
+       /* GCC 8.1 warns about 80 equals destination size with
+          -Wstringop-truncation:
+          https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
+        */
+       DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
+#endif
        strncpy (data + 48, va_arg (ap, const char *), 80);
+#if GCC_VERSION == 8001
+       DIAGNOSTIC_POP;
+#endif
        va_end (ap);
        return elfcore_write_note (abfd, buf, bufsiz,
                                   "CORE", note_type, data, sizeof (data));
@@ -3792,11 +3803,6 @@ ppc_elf_add_symbol_hook (bfd *abfd,
       *valp = sym->st_size;
     }
 
-  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
-      && (abfd->flags & DYNAMIC) == 0
-      && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
-    elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
-
   return TRUE;
 }
 \f
@@ -4709,12 +4715,13 @@ ppc_elf_check_relocs (bfd *abfd,
 \f
 /* Warn for conflicting Tag_GNU_Power_ABI_FP attributes between IBFD
    and OBFD, and merge non-conflicting ones.  */
-void
+bfd_boolean
 _bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
 {
   bfd *obfd = info->output_bfd;
   obj_attribute *in_attr, *in_attrs;
   obj_attribute *out_attr, *out_attrs;
+  bfd_boolean ret = TRUE;
 
   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
   out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
@@ -4726,32 +4733,48 @@ _bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
     {
       int in_fp = in_attr->i & 3;
       int out_fp = out_attr->i & 3;
+      static bfd *last_fp, *last_ld;
 
       if (in_fp == 0)
        ;
       else if (out_fp == 0)
        {
-         out_attr->type = 1;
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
          out_attr->i ^= in_fp;
+         last_fp = ibfd;
        }
       else if (out_fp != 2 && in_fp == 2)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses hard float, %pB uses soft float"), obfd, ibfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses hard float, %pB uses soft float"),
+            last_fp, ibfd);
+         ret = FALSE;
+       }
       else if (out_fp == 2 && in_fp != 2)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses hard float, %pB uses soft float"), ibfd, obfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses hard float, %pB uses soft float"),
+            ibfd, last_fp);
+         ret = FALSE;
+       }
       else if (out_fp == 1 && in_fp == 3)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses double-precision hard float, "
-            "%pB uses single-precision hard float"), obfd, ibfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses double-precision hard float, "
+              "%pB uses single-precision hard float"), last_fp, ibfd);
+         ret = FALSE;
+       }
       else if (out_fp == 3 && in_fp == 1)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses double-precision hard float, "
-            "%pB uses single-precision hard float"), ibfd, obfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses double-precision hard float, "
+              "%pB uses single-precision hard float"), ibfd, last_fp);
+         ret = FALSE;
+       }
 
       in_fp = in_attr->i & 0xc;
       out_fp = out_attr->i & 0xc;
@@ -4759,30 +4782,50 @@ _bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
        ;
       else if (out_fp == 0)
        {
-         out_attr->type = 1;
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
          out_attr->i ^= in_fp;
+         last_ld = ibfd;
        }
       else if (out_fp != 2 * 4 && in_fp == 2 * 4)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses 64-bit long double, "
-            "%pB uses 128-bit long double"), ibfd, obfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses 64-bit long double, "
+              "%pB uses 128-bit long double"), ibfd, last_ld);
+         ret = FALSE;
+       }
       else if (in_fp != 2 * 4 && out_fp == 2 * 4)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses 64-bit long double, "
-            "%pB uses 128-bit long double"), obfd, ibfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses 64-bit long double, "
+              "%pB uses 128-bit long double"), last_ld, ibfd);
+         ret = FALSE;
+       }
       else if (out_fp == 1 * 4 && in_fp == 3 * 4)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses IBM long double, "
-            "%pB uses IEEE long double"), ibfd, obfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses IBM long double, "
+              "%pB uses IEEE long double"), last_ld, ibfd);
+         ret = FALSE;
+       }
       else if (out_fp == 3 * 4 && in_fp == 1 * 4)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses IBM long double, "
-            "%pB uses IEEE long double"), obfd, ibfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses IBM long double, "
+              "%pB uses IEEE long double"), ibfd, last_ld);
+         ret = FALSE;
+       }
     }
+
+  if (!ret)
+    {
+      out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
+      bfd_set_error (bfd_error_bad_value);
+    }
+  return ret;
 }
 
 /* Merge object attributes from IBFD into OBFD.  Warn if
@@ -4793,8 +4836,10 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
   bfd *obfd;
   obj_attribute *in_attr, *in_attrs;
   obj_attribute *out_attr, *out_attrs;
+  bfd_boolean ret;
 
-  _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
+  if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
+    return FALSE;
 
   obfd = info->output_bfd;
   in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
@@ -4804,17 +4849,20 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
      merge non-conflicting ones.  */
   in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
   out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
+  ret = TRUE;
   if (in_attr->i != out_attr->i)
     {
       int in_vec = in_attr->i & 3;
       int out_vec = out_attr->i & 3;
+      static bfd *last_vec;
 
       if (in_vec == 0)
        ;
       else if (out_vec == 0)
        {
-         out_attr->type = 1;
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
          out_attr->i = in_vec;
+         last_vec = ibfd;
        }
       /* For now, allow generic to transition to AltiVec or SPE
         without a warning.  If GCC marked files with their stack
@@ -4825,19 +4873,28 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
        ;
       else if (out_vec == 1)
        {
-         out_attr->type = 1;
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
          out_attr->i = in_vec;
+         last_vec = ibfd;
        }
       else if (out_vec < in_vec)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
-          obfd, ibfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
+            last_vec, ibfd);
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
+         ret = FALSE;
+       }
       else if (out_vec > in_vec)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
-          ibfd, obfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
+            ibfd, last_vec);
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
+         ret = FALSE;
+       }
     }
 
   /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
@@ -4848,30 +4905,43 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
     {
       int in_struct = in_attr->i & 3;
       int out_struct = out_attr->i & 3;
+      static bfd *last_struct;
 
       if (in_struct == 0 || in_struct == 3)
        ;
       else if (out_struct == 0)
        {
-         out_attr->type = 1;
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
          out_attr->i = in_struct;
+         last_struct = ibfd;
        }
       else if (out_struct < in_struct)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses r3/r4 for small structure returns, "
-            "%pB uses memory"), obfd, ibfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses r3/r4 for small structure returns, "
+              "%pB uses memory"), last_struct, ibfd);
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
+         ret = FALSE;
+       }
       else if (out_struct > in_struct)
-       _bfd_error_handler
-         /* xgettext:c-format */
-         (_("warning: %pB uses r3/r4 for small structure returns, "
-            "%pB uses memory"), ibfd, obfd);
+       {
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%pB uses r3/r4 for small structure returns, "
+              "%pB uses memory"), ibfd, last_struct);
+         out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
+         ret = FALSE;
+       }
+    }
+  if (!ret)
+    {
+      bfd_set_error (bfd_error_bad_value);
+      return FALSE;
     }
 
   /* Merge Tag_compatibility attributes and any common GNU ones.  */
-  _bfd_elf_merge_object_attributes (ibfd, info);
-
-  return TRUE;
+  return _bfd_elf_merge_object_attributes (ibfd, info);
 }
 
 /* Merge backend specific data from an object file to the output
@@ -5899,9 +5969,9 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
              && !readonly_dynrelocs (h))
            {
              h->pointer_equality_needed = 0;
-             /* If we haven't seen a branch reloc then we don't need
-                a plt entry.  */
-             if (!h->needs_plt)
+             /* If we haven't seen a branch reloc and the symbol
+                isn't an ifunc then we don't need a plt entry.  */
+             if (!h->needs_plt && h->type != STT_GNU_IFUNC)
                h->plt.plist = NULL;
            }
          else if (!bfd_link_pic (info))
@@ -11390,8 +11460,8 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
 #define ELF_TARGET_ID          PPC32_ELF_DATA
 #define ELF_MACHINE_CODE       EM_PPC
 #define ELF_MAXPAGESIZE                0x10000
-#define ELF_COMMONPAGESIZE     0x10000
-#define ELF_MINPAGESIZE                0x1000
+#define ELF_COMMONPAGESIZE     0x1000
+#define ELF_RELROPAGESIZE      ELF_MAXPAGESIZE
 #define elf_info_to_howto      ppc_elf_info_to_howto
 
 #ifdef  EM_CYGNUS_POWERPC