]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - binutils/readelf.c
MI: Fix printing of frame architecture with Python frame filters enabled
[thirdparty/binutils-gdb.git] / binutils / readelf.c
index a936ff375876408d70005ea6fb69060895bd8120..d5fef92a7f53f959b8ce14bcb6cac9dcecc46c00 100644 (file)
@@ -11088,11 +11088,16 @@ get_ia64_symbol_other (Filedata * filedata, unsigned int other)
 static const char *
 get_ppc64_symbol_other (unsigned int other)
 {
-  if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
+  if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
+    return NULL;
+
+  other >>= STO_PPC64_LOCAL_BIT;
+  if (other <= 6)
     {
       static char buf[32];
-      snprintf (buf, sizeof buf, _("<localentry>: %d"),
-               PPC64_LOCAL_ENTRY_OFFSET (other));
+      if (other >= 2)
+       other = ppc64_decode_local_entry (other);
+      snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
       return buf;
     }
   return NULL;
@@ -11295,6 +11300,7 @@ get_symbol_version_string (Filedata *                   filedata,
   unsigned char data[2];
   unsigned short vers_data;
   unsigned long offset;
+  unsigned short max_vd_ndx;
 
   if (!is_dynsym
       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
@@ -11312,6 +11318,8 @@ get_symbol_version_string (Filedata *                   filedata,
   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
     return NULL;
 
+  max_vd_ndx = 0;
+
   /* Usually we'd only see verdef for defined symbols, and verneed for
      undefined symbols.  However, symbols defined by the linker in
      .dynbss for variables copied from a shared library in order to
@@ -11354,6 +11362,9 @@ get_symbol_version_string (Filedata *                   filedata,
              ivd.vd_flags = BYTE_GET (evd.vd_flags);
            }
 
+         if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
+           max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
+
          off += ivd.vd_next;
        }
       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
@@ -11445,6 +11456,9 @@ get_symbol_version_string (Filedata *                   filedata,
          return (ivna.vna_name < strtab_size
                  ? strtab + ivna.vna_name : _("<corrupt>"));
        }
+      else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
+              && (vers_data & VERSYM_VERSION) > max_vd_ndx)
+       return _("<corrupt>");
     }
   return NULL;
 }
@@ -16941,6 +16955,79 @@ get_gnu_elf_note_type (unsigned e_type)
     }
 }
 
+static void
+decode_x86_compat_isa (unsigned int bitmask)
+{
+  while (bitmask)
+    {
+      unsigned int bit = bitmask & (- bitmask);
+
+      bitmask &= ~ bit;
+      switch (bit)
+       {
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
+         printf ("i486");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
+         printf ("586");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
+         printf ("686");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
+         printf ("SSE");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
+         printf ("SSE2");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
+         printf ("SSE3");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
+         printf ("SSSE3");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
+         printf ("SSE4_1");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
+         printf ("SSE4_2");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
+         printf ("AVX");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
+         printf ("AVX2");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
+         printf ("AVX512F");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
+         printf ("AVX512CD");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
+         printf ("AVX512ER");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
+         printf ("AVX512PF");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
+         printf ("AVX512VL");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
+         printf ("AVX512DQ");
+         break;
+       case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
+         printf ("AVX512BW");
+         break;
+       default:
+         printf (_("<unknown: %x>"), bit);
+         break;
+       }
+      if (bitmask)
+       printf (", ");
+    }
+}
+
 static void
 decode_x86_isa (unsigned int bitmask)
 {
@@ -16951,25 +17038,81 @@ decode_x86_isa (unsigned int bitmask)
       bitmask &= ~ bit;
       switch (bit)
        {
-       case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
-       case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
-       case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
-       case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
-       case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
-       case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
-       case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
-       case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
-       case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
-       case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
-       default: printf (_("<unknown: %x>"), bit); break;
+       case GNU_PROPERTY_X86_ISA_1_CMOV:
+         printf ("CMOV");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_SSE:
+         printf ("SSE");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_SSE2:
+         printf ("SSE2");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_SSE3:
+         printf ("SSE3");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_SSSE3:
+         printf ("SSSE3");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_SSE4_1:
+         printf ("SSE4_1");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_SSE4_2:
+         printf ("SSE4_2");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX:
+         printf ("AVX");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX2:
+         printf ("AVX2");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_FMA:
+         printf ("FMA");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512F:
+         printf ("AVX512F");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512CD:
+         printf ("AVX512CD");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512ER:
+         printf ("AVX512ER");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512PF:
+         printf ("AVX512PF");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512VL:
+         printf ("AVX512VL");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
+         printf ("AVX512DQ");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512BW:
+         printf ("AVX512BW");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
+         printf ("AVX512_4FMAPS");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
+         printf ("AVX512_4VNNIW");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
+         printf ("AVX512_BITALG");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
+         printf ("AVX512_IFMA");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
+         printf ("AVX512_VBMI");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
+         printf ("AVX512_VBMI2");
+         break;
+       case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
+         printf ("AVX512_VNNI");
+         break;
+       default:
+         printf (_("<unknown: %x>"), bit);
+         break;
        }
       if (bitmask)
        printf (", ");
@@ -16977,7 +17120,7 @@ decode_x86_isa (unsigned int bitmask)
 }
 
 static void
-decode_x86_feature (unsigned int type, unsigned int bitmask)
+decode_x86_feature_1 (unsigned int bitmask)
 {
   while (bitmask)
     {
@@ -16987,26 +17130,59 @@ decode_x86_feature (unsigned int type, unsigned int bitmask)
       switch (bit)
        {
        case GNU_PROPERTY_X86_FEATURE_1_IBT:
-         switch (type)
-           {
-           case GNU_PROPERTY_X86_FEATURE_1_AND:
-             printf ("IBT");
-             break;
-           default:
-             /* This should never happen.  */
-             abort ();
-           }
+         printf ("IBT");
          break;
        case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
-         switch (type)
-           {
-           case GNU_PROPERTY_X86_FEATURE_1_AND:
-             printf ("SHSTK");
-             break;
-           default:
-             /* This should never happen.  */
-             abort ();
-           }
+         printf ("SHSTK");
+         break;
+       default:
+         printf (_("<unknown: %x>"), bit);
+         break;
+       }
+      if (bitmask)
+       printf (", ");
+    }
+}
+
+static void
+decode_x86_feature_2 (unsigned int bitmask)
+{
+  while (bitmask)
+    {
+      unsigned int bit = bitmask & (- bitmask);
+
+      bitmask &= ~ bit;
+      switch (bit)
+       {
+       case GNU_PROPERTY_X86_FEATURE_2_X86:
+         printf ("x86");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_X87:
+         printf ("x87");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_MMX:
+         printf ("MMX");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_XMM:
+         printf ("XMM");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_YMM:
+         printf ("YMM");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_ZMM:
+         printf ("ZMM");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_FXSR:
+         printf ("FXSR");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
+         printf ("XSAVE");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
+         printf ("XSAVEOPT");
+         break;
+       case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
+         printf ("XSAVEC");
          break;
        default:
          printf (_("<unknown: %x>"), bit);
@@ -17062,30 +17238,99 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
              || filedata->file_header.e_machine == EM_IAMCU
              || filedata->file_header.e_machine == EM_386)
            {
+             unsigned int bitmask;
+
+             if (datasz == 4)
+               {
+                 bitmask = byte_get (ptr, 4);
+                 if (filedata->file_header.e_type == ET_EXEC
+                     || filedata->file_header.e_type == ET_DYN)
+                   {
+                     if ((bitmask & GNU_PROPERTY_X86_UINT32_VALID))
+                       bitmask &= ~GNU_PROPERTY_X86_UINT32_VALID;
+                     else
+                       printf ("Invalid ");
+                   }
+               }
+             else
+               bitmask = 0;
+
              switch (type)
                {
                case GNU_PROPERTY_X86_ISA_1_USED:
-                 printf ("x86 ISA used: ");
                  if (datasz != 4)
-                   printf (_("<corrupt length: %#x> "), datasz);
+                   printf (_("x86 ISA used: <corrupt length: %#x> "),
+                           datasz);
                  else
-                   decode_x86_isa (byte_get (ptr, 4));
+                   {
+                     printf ("x86 ISA used: ");
+                     decode_x86_isa (bitmask);
+                   }
                  goto next;
 
                case GNU_PROPERTY_X86_ISA_1_NEEDED:
-                 printf ("x86 ISA needed: ");
                  if (datasz != 4)
-                   printf (_("<corrupt length: %#x> "), datasz);
+                   printf (_("x86 ISA needed: <corrupt length: %#x> "),
+                           datasz);
                  else
-                   decode_x86_isa (byte_get (ptr, 4));
+                   {
+                     printf ("x86 ISA needed: ");
+                     decode_x86_isa (bitmask);
+                   }
                  goto next;
 
                case GNU_PROPERTY_X86_FEATURE_1_AND:
-                 printf ("x86 feature: ");
                  if (datasz != 4)
-                   printf (_("<corrupt length: %#x> "), datasz);
+                   printf (_("x86 feature: <corrupt length: %#x> "),
+                           datasz);
                  else
-                   decode_x86_feature (type, byte_get (ptr, 4));
+                   {
+                     printf ("x86 feature: ");
+                     decode_x86_feature_1 (bitmask);
+                   }
+                 goto next;
+
+               case GNU_PROPERTY_X86_FEATURE_2_USED:
+                 if (datasz != 4)
+                   printf (_("x86 feature used: <corrupt length: %#x> "),
+                           datasz);
+                 else
+                   {
+                     printf ("x86 feature used: ");
+                     decode_x86_feature_2 (bitmask);
+                   }
+                 goto next;
+
+               case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
+                 if (datasz != 4)
+                   printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
+                 else
+                   {
+                     printf ("x86 feature needed: ");
+                     decode_x86_feature_2 (bitmask);
+                   }
+                 goto next;
+
+               case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
+                 if (datasz != 4)
+                   printf (_("x86 ISA used: <corrupt length: %#x> "),
+                           datasz);
+                 else
+                   {
+                     printf ("x86 ISA used: ");
+                     decode_x86_compat_isa (bitmask);
+                   }
+                 goto next;
+
+               case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
+                 if (datasz != 4)
+                   printf (_("x86 ISA needed: <corrupt length: %#x> "),
+                           datasz);
+                 else
+                   {
+                     printf ("x86 ISA needed: ");
+                     decode_x86_compat_isa (bitmask);
+                   }
                  goto next;
 
                default: