Merge branch 'master' into merge-job
[deliverable/binutils-gdb.git] / binutils / readelf.c
index 0853c1f0a14f01a7ac9a8212249a4ffc91215d11..0ca8aabe7e843281c86fd172b23987453a5d89c2 100644 (file)
@@ -1,5 +1,6 @@
 /* readelf.c -- display contents of an ELF format file
-   Copyright (C) 1998-2019 Free Software Foundation, Inc.
+   Copyright (C) 1998-2020 Free Software Foundation, Inc.
+   Copyright (C) 2019-2020 Advanced Micro Devices, Inc. All rights reserved.
 
    Originally developed by Eric Youngdale <eric@andante.jic.com>
    Modifications by Nick Clifton <nickc@redhat.com>
@@ -92,6 +93,7 @@
 
 #include "elf/aarch64.h"
 #include "elf/alpha.h"
+#include "elf/amdgcn.h"
 #include "elf/arc.h"
 #include "elf/arm.h"
 #include "elf/avr.h"
 #include "elf/xgate.h"
 #include "elf/xstormy16.h"
 #include "elf/xtensa.h"
+#include "elf/z80.h"
 
 #include "getopt.h"
 #include "libiberty.h"
@@ -1586,6 +1589,14 @@ dump_relocations (Filedata *          filedata,
          else
            rtype = elf_nfp_reloc_type (type);
          break;
+
+       case EM_Z80:
+         rtype = elf_z80_reloc_type (type);
+         break;
+
+       case EM_AMDGPU:
+         rtype = elf_amdgcn_reloc_type (type);
+         break;
        }
 
       if (rtype == NULL)
@@ -3248,6 +3259,27 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
            }
          break;
 
+       case EM_AMDGPU:
+         switch (e_flags & EF_AMDGPU_MACH)
+           {
+           case EF_AMDGPU_MACH_AMDGCN_GFX801 : strcat (buf, ", gfx801"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX802 : strcat (buf, ", gfx802"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX803 : strcat (buf, ", gfx803"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX810 : strcat (buf, ", gfx810"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX900 : strcat (buf, ", gfx900"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX902 : strcat (buf, ", gfx902"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX904 : strcat (buf, ", gfx904"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX906 : strcat (buf, ", gfx906"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX908 : strcat (buf, ", gfx908"); break;
+           case EF_AMDGPU_MACH_AMDGCN_GFX909 : strcat (buf, ", gfx909"); break;
+           default: strcat (buf, _(", <unknown AMDGPU gpu type>")); break;
+           }
+
+         if (e_flags & ~ EF_AMDGPU_MACH)
+           sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
+                    e_flags & ~ EF_AMDGPU_MACH);
+         break;
+
        case EM_CYGNUS_MEP:
          switch (e_flags & EF_MEP_CPU_MASK)
            {
@@ -3751,6 +3783,21 @@ get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
 
          if (e_flags & ~ EF_MSP430_MACH)
            strcat (buf, _(": unknown extra flag bits also present"));
+         break;
+
+       case EM_Z80:
+         switch (e_flags & EF_Z80_MACH_MSK)
+           {
+           case EF_Z80_MACH_Z80: strcat (buf, ", Z80"); break;
+           case EF_Z80_MACH_Z180: strcat (buf, ", Z180"); break;
+           case EF_Z80_MACH_R800: strcat (buf, ", R800"); break;
+           case EF_Z80_MACH_EZ80_Z80: strcat (buf, ", EZ80"); break;
+           case EF_Z80_MACH_EZ80_ADL: strcat (buf, ", EZ80, ADL"); break;
+           case EF_Z80_MACH_GBZ80: strcat (buf, ", GBZ80"); break;
+           default:
+             strcat (buf, _(", unknown")); break;
+           }
+         break;
        }
     }
 
@@ -3785,6 +3832,15 @@ get_osabi_name (Filedata * filedata, unsigned int osabi)
       if (osabi >= 64)
        switch (filedata->file_header.e_machine)
          {
+         case EM_AMDGPU:
+           switch (osabi)
+             {
+             case ELFOSABI_AMDGPU_HSA: return "AMD HSA Runtime";
+             default:
+               break;
+             }
+           break;
+
          case EM_ARM:
            switch (osabi)
              {
@@ -12722,6 +12778,8 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_XTENSA_OLD:
     case EM_XTENSA:
       return reloc_type == 1; /* R_XTENSA_32.  */
+    case EM_Z80:
+      return reloc_type == 6; /* R_Z80_32.  */
     default:
       {
        static unsigned int prev_warn = 0;
@@ -12904,6 +12962,8 @@ is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
       return reloc_type == 4; /* R_MN10200_24.  */
     case EM_FT32:
       return reloc_type == 5; /* R_FT32_20.  */
+    case EM_Z80:
+      return reloc_type == 5; /* R_Z80_24. */
     default:
       return FALSE;
     }
@@ -12975,6 +13035,8 @@ is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
       return reloc_type == 2; /* R_XC16C_ABS_16.  */
     case EM_XGATE:
       return reloc_type == 3; /* R_XGATE_16.  */
+    case EM_Z80:
+      return reloc_type == 4; /* R_Z80_16.  */
     default:
       return FALSE;
     }
@@ -12990,6 +13052,8 @@ is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
     {
     case EM_RISCV:
       return reloc_type == 54; /* R_RISCV_SET8.  */
+    case EM_Z80:
+      return reloc_type == 1;  /* R_Z80_8.  */
     default:
       return FALSE;
     }
@@ -13197,6 +13261,7 @@ is_none_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_TI_C6000:/* R_C6000_NONE.  */
     case EM_X86_64:  /* R_X86_64_NONE.  */
     case EM_XC16X:
+    case EM_Z80:     /* R_Z80_NONE. */
     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
       return reloc_type == 0;
 
@@ -17600,6 +17665,82 @@ decode_x86_isa (unsigned int bitmask)
     }
 }
 
+static const char *
+get_amd_elf_note_type (unsigned e_type)
+{
+  static char buff[64];
+
+  switch (e_type)
+    {
+    case NT_AMDGPU_HSA_CODE_OBJECT_VERSION:
+      return _("NT_AMDGPU_HSA_CODE_OBJECT_VERSION (code object version)");
+    case NT_AMDGPU_HSA_HSAIL:
+      return _("NT_AMDGPU_HSA_HSAIL (hsail)");
+    case NT_AMDGPU_HSA_ISA:
+      return _("NT_AMDGPU_HSA_ISA (ISA name)");
+    case NT_AMDGPU_HSA_PRODUCER:
+      return _("NT_AMDGPU_HSA_PRODUCER (producer name)");
+    case NT_AMDGPU_HSA_PRODUCER_OPTIONS:
+      return _("NT_AMDGPU_HSA_PRODUCER_OPTIONS (producer options");
+    case NT_AMDGPU_HSA_EXTENSION:
+      return _("NT_AMDGPU_HSA_EXTENSION (extension)");
+    case NT_AMDGPU_HSA_METADATA:
+      return _("NT_AMDGPU_HSA_METADATA (code object metadata)");
+    case NT_AMDGPU_ISA:
+      return _("NT_AMDGPU_ISA");
+    case NT_AMDGPU_PAL_METADATA:
+      return _("NT_AMDGPU_PAL_METADATA (code object metadata)");
+    case NT_AMDGPU_METADATA:
+      return _("NT_AMDGPU_METADATA (code object metadata)");
+    default:
+      break;
+    }
+
+  snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
+  return buff;
+}
+
+static int
+print_amd_note (Elf_Internal_Note *pnote)
+{
+  switch (pnote->type)
+    {
+    case NT_AMDGPU_HSA_CODE_OBJECT_VERSION:
+      {
+        unsigned int major, minor;
+
+        major = byte_get ((unsigned char*) pnote->descdata, 4);
+        minor = byte_get ((unsigned char*) pnote->descdata + 4, 4);
+
+        printf (_("    Version: %d.%d\n"), major, minor);
+      }
+      break;
+
+    case NT_AMDGPU_HSA_ISA:
+      {
+        unsigned long i, vendorsz;
+        unsigned int major, minor, stepping;
+
+        vendorsz = byte_get ((unsigned char*) pnote->descdata, 2);
+        major = byte_get ((unsigned char*) pnote->descdata + 4, 4);
+        minor = byte_get ((unsigned char*) pnote->descdata + 8, 4);
+        stepping = byte_get ((unsigned char*) pnote->descdata + 12, 4);
+
+        printf (_("    Vendor: "));
+        for (i = 16; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
+          printf ("%c", pnote->descdata[i]);
+        printf (_(", Architecture: "));
+        for (i = 16 + vendorsz; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
+          printf ("%c", pnote->descdata[i]);
+
+        printf (_(", Version: %d.%d.%d"), major, minor, stepping);
+        printf ("\n");
+      }
+      break;
+    }
+  return 1;
+}
+
 static void
 decode_x86_feature_1 (unsigned int bitmask)
 {
@@ -19047,6 +19188,11 @@ process_note (Elf_Internal_Note *  pnote,
     /* GNU-specific object file notes.  */
     nt = get_gnu_elf_note_type (pnote->type);
 
+  else if (const_strneq (pnote->namedata, "AMD")
+           || const_strneq (pnote->namedata, "AMDGPU"))
+    /* AMD-specific object file notes.  */
+    nt = get_amd_elf_note_type (pnote->type);
+
   else if (const_strneq (pnote->namedata, "FreeBSD"))
     /* FreeBSD-specific core file notes.  */
     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
@@ -19102,6 +19248,9 @@ process_note (Elf_Internal_Note *  pnote,
     return print_ia64_vms_note (pnote);
   else if (const_strneq (pnote->namedata, "GNU"))
     return print_gnu_note (filedata, pnote);
+  else if (const_strneq (pnote->namedata, "AMD")
+           || const_strneq (pnote->namedata, "AMDGPU"))
+    return print_amd_note (pnote);
   else if (const_strneq (pnote->namedata, "stapsdt"))
     return print_stapsdt_note (pnote);
   else if (const_strneq (pnote->namedata, "CORE"))
This page took 0.031136 seconds and 4 git commands to generate.