arc: Don't generate dynamic relocation for non SEC_ALLOC sections
[deliverable/binutils-gdb.git] / opcodes / ppc-dis.c
index 9334be21382c290db82ed3a1aa4011eec4a46931..162f770697514b8180555a25cb9bb2ebe5a65cb5 100644 (file)
@@ -1,5 +1,5 @@
 /* ppc-dis.c -- Disassemble PowerPC instructions
 /* ppc-dis.c -- Disassemble PowerPC instructions
-   Copyright (C) 1994-2019 Free Software Foundation, Inc.
+   Copyright (C) 1994-2020 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support
 
    This file is part of the GNU opcodes library.
    Written by Ian Lance Taylor, Cygnus Support
 
    This file is part of the GNU opcodes library.
@@ -40,7 +40,7 @@ struct dis_private
 {
   /* Stash the result of parsing disassembler_options here.  */
   ppc_cpu_t dialect;
 {
   /* Stash the result of parsing disassembler_options here.  */
   ppc_cpu_t dialect;
-} private;
+};
 
 #define POWERPC_DIALECT(INFO) \
   (((struct dis_private *) ((INFO)->private_data))->dialect)
 
 #define POWERPC_DIALECT(INFO) \
   (((struct dis_private *) ((INFO)->private_data))->dialect)
@@ -185,10 +185,15 @@ struct ppc_mopt ppc_opts[] = {
                | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
                | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
     0 },
                | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
                | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
     0 },
+  { "power10", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
+               | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
+               | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
+               | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
+    0 },
   { "future",  (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
                | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
                | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
   { "future",  (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
                | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
                | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
-               | PPC_OPCODE_POWERXX | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
+               | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
     0 },
   { "ppc",     PPC_OPCODE_PPC,
     0 },
     0 },
   { "ppc",     PPC_OPCODE_PPC,
     0 },
@@ -259,7 +264,8 @@ get_powerpc_dialect (struct disassemble_info *info)
 {
   ppc_cpu_t dialect = 0;
 
 {
   ppc_cpu_t dialect = 0;
 
-  dialect = POWERPC_DIALECT (info);
+  if (info->private_data)
+    dialect = POWERPC_DIALECT (info);
 
   /* Disassemble according to the section headers flags for VLE-mode.  */
   if (dialect & PPC_OPCODE_VLE
 
   /* Disassemble according to the section headers flags for VLE-mode.  */
   if (dialect & PPC_OPCODE_VLE
@@ -308,7 +314,7 @@ powerpc_init_dialect (struct disassemble_info *info)
   struct dis_private *priv = calloc (sizeof (*priv), 1);
 
   if (priv == NULL)
   struct dis_private *priv = calloc (sizeof (*priv), 1);
 
   if (priv == NULL)
-    priv = &private;
+    return;
 
   switch (info->mach)
     {
 
   switch (info->mach)
     {
@@ -353,7 +359,7 @@ powerpc_init_dialect (struct disassemble_info *info)
       break;
     default:
       if (info->arch == bfd_arch_powerpc)
       break;
     default:
       if (info->arch == bfd_arch_powerpc)
-       dialect = ppc_parse_cpu (dialect, &sticky, "power9") | PPC_OPCODE_ANY;
+       dialect = ppc_parse_cpu (dialect, &sticky, "power10") | PPC_OPCODE_ANY;
       else
        dialect = ppc_parse_cpu (dialect, &sticky, "pwr");
       break;
       else
        dialect = ppc_parse_cpu (dialect, &sticky, "pwr");
       break;
@@ -382,7 +388,7 @@ powerpc_init_dialect (struct disassemble_info *info)
 #define PPC_OPCD_SEGS (1 + PPC_OP (-1))
 static unsigned short powerpc_opcd_indices[PPC_OPCD_SEGS + 1];
 #define PREFIX_OPCD_SEGS (1 + PPC_PREFIX_SEG (-1))
 #define PPC_OPCD_SEGS (1 + PPC_OP (-1))
 static unsigned short powerpc_opcd_indices[PPC_OPCD_SEGS + 1];
 #define PREFIX_OPCD_SEGS (1 + PPC_PREFIX_SEG (-1))
-static unsigned short prefix_opcd_indices[PPC_OPCD_SEGS+1];
+static unsigned short prefix_opcd_indices[PREFIX_OPCD_SEGS + 1];
 #define VLE_OPCD_SEGS (1 + VLE_OP_TO_SEG (VLE_OP (-1, 0xffff)))
 static unsigned short vle_opcd_indices[VLE_OPCD_SEGS + 1];
 #define SPE2_OPCD_SEGS (1 + SPE2_XOP_TO_SEG (SPE2_XOP (-1)))
 #define VLE_OPCD_SEGS (1 + VLE_OP_TO_SEG (VLE_OP (-1, 0xffff)))
 static unsigned short vle_opcd_indices[VLE_OPCD_SEGS + 1];
 #define SPE2_OPCD_SEGS (1 + SPE2_XOP_TO_SEG (SPE2_XOP (-1)))
@@ -749,8 +755,9 @@ print_insn_powerpc (bfd_vma memaddr,
   if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0)
     {
       /* Clear buffer so unused bytes will not have garbage in them.  */
   if (status != 0 && (dialect & PPC_OPCODE_VLE) != 0)
     {
       /* Clear buffer so unused bytes will not have garbage in them.  */
-      buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0;
+      buffer[2] = buffer[3] = 0;
       status = (*info->read_memory_func) (memaddr, buffer, 2, info);
       status = (*info->read_memory_func) (memaddr, buffer, 2, info);
+      insn_length = 2;
     }
 
   if (status != 0)
     }
 
   if (status != 0)
@@ -766,7 +773,7 @@ print_insn_powerpc (bfd_vma memaddr,
 
   /* Get the major opcode of the insn.  */
   opcode = NULL;
 
   /* Get the major opcode of the insn.  */
   opcode = NULL;
-  if ((dialect & PPC_OPCODE_POWERXX) != 0
+  if ((dialect & PPC_OPCODE_POWER10) != 0
       && PPC_OP (insn) == 0x1)
     {
       uint64_t temp_insn, suffix;
       && PPC_OP (insn) == 0x1)
     {
       uint64_t temp_insn, suffix;
@@ -800,12 +807,15 @@ print_insn_powerpc (bfd_vma memaddr,
          insn_length = 2;
        }
     }
          insn_length = 2;
        }
     }
-  if (opcode == NULL && (dialect & PPC_OPCODE_SPE2) != 0)
-    opcode = lookup_spe2 (insn);
-  if (opcode == NULL)
-    opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY);
-  if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
-    opcode = lookup_powerpc (insn, dialect);
+  if (opcode == NULL && insn_length == 4)
+    {
+      if ((dialect & PPC_OPCODE_SPE2) != 0)
+       opcode = lookup_spe2 (insn);
+      if (opcode == NULL)
+       opcode = lookup_powerpc (insn, dialect & ~PPC_OPCODE_ANY);
+      if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
+       opcode = lookup_powerpc (insn, dialect);
+    }
 
   if (opcode != NULL)
     {
 
   if (opcode != NULL)
     {
@@ -823,16 +833,16 @@ print_insn_powerpc (bfd_vma memaddr,
        need_paren
       } op_separator;
       bfd_boolean skip_optional;
        need_paren
       } op_separator;
       bfd_boolean skip_optional;
-      int spaces;
+      int blanks;
 
       (*info->fprintf_func) (info->stream, "%s", opcode->name);
       /* gdb fprintf_func doesn't return count printed.  */
 
       (*info->fprintf_func) (info->stream, "%s", opcode->name);
       /* gdb fprintf_func doesn't return count printed.  */
-      spaces = 8 - strlen (opcode->name);
-      if (spaces <= 0)
-       spaces = 1;
+      blanks = 8 - strlen (opcode->name);
+      if (blanks <= 0)
+       blanks = 1;
 
       /* Now extract and print the operands.  */
 
       /* Now extract and print the operands.  */
-      op_separator = spaces;
+      op_separator = blanks;
       skip_optional = FALSE;
       for (opindex = opcode->operands; *opindex != 0; opindex++)
        {
       skip_optional = FALSE;
       for (opindex = opcode->operands; *opindex != 0; opindex++)
        {
@@ -871,6 +881,8 @@ print_insn_powerpc (bfd_vma memaddr,
            (*info->fprintf_func) (info->stream, "v%" PRId64, value);
          else if ((operand->flags & PPC_OPERAND_VSR) != 0)
            (*info->fprintf_func) (info->stream, "vs%" PRId64, value);
            (*info->fprintf_func) (info->stream, "v%" PRId64, value);
          else if ((operand->flags & PPC_OPERAND_VSR) != 0)
            (*info->fprintf_func) (info->stream, "vs%" PRId64, value);
+         else if ((operand->flags & PPC_OPERAND_ACC) != 0)
+           (*info->fprintf_func) (info->stream, "a%" PRId64, value);
          else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0)
            (*info->print_address_func) (memaddr + value, info);
          else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
          else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0)
            (*info->print_address_func) (memaddr + value, info);
          else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
@@ -917,9 +929,13 @@ print_insn_powerpc (bfd_vma memaddr,
     }
 
   /* We could not find a match.  */
     }
 
   /* We could not find a match.  */
-  (*info->fprintf_func) (info->stream, ".long 0x%" PRIx64, insn);
-
-  return 4;
+  if (insn_length == 4)
+    (*info->fprintf_func) (info->stream, ".long 0x%x",
+                          (unsigned int) insn);
+  else
+    (*info->fprintf_func) (info->stream, ".word 0x%x",
+                          (unsigned int) insn >> 16);
+  return insn_length;
 }
 
 const disasm_options_and_args_t *
 }
 
 const disasm_options_and_args_t *
This page took 0.040312 seconds and 4 git commands to generate.