Disable warning message about a program header with no associated sections when that...
[deliverable/binutils-gdb.git] / opcodes / mips-dis.c
index 609e0ba489d6ba0b366fe14a861aefb6399a5268..bb9912e4626d7bcebbeab329cf1afc32ee5d6e0c 100644 (file)
@@ -1,5 +1,5 @@
 /* Print mips instructions for GDB, the GNU debugger, or for objdump.
-   Copyright (C) 1989-2016 Free Software Foundation, Inc.
+   Copyright (C) 1989-2017 Free Software Foundation, Inc.
    Contributed by Nobuyuki Hikichi(hikichi@sra.co.jp).
 
    This file is part of the GNU opcodes library.
@@ -658,7 +658,7 @@ const struct mips_arch_choice mips_arch_choices[] =
 
   /* This entry, mips16, is here only for ISA/processor selection; do
      not print its name.  */
-  { "",                1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3, 0,
+  { "",                1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS64, 0,
     mips_cp0_names_numeric, NULL, 0, mips_cp1_names_numeric,
     mips_hwr_names_numeric },
 };
@@ -847,11 +847,12 @@ set_default_mips_dis_options (struct disassemble_info *info)
       Elf_Internal_Ehdr *header = elf_elfheader (abfd);
       Elf_Internal_ABIFlags_v0 *abiflags = NULL;
 
-      /* We won't ever get here if !BFD64, because we won't then have
-        a MIPS/ELF BFD, however we need to guard against a link error
-        in a `--enable-targets=...' configuration with a 32-bit host,
-        where the MIPS target is a secondary.  */
-#ifdef BFD64
+      /* We won't ever get here if !HAVE_BFD_MIPS_ELF_GET_ABIFLAGS,
+        because we won't then have a MIPS/ELF BFD, however we need
+        to guard against a link error in a `--enable-targets=...'
+        configuration with a 32-bit host where the MIPS target is
+        a secondary, or with MIPS/ECOFF configurations.  */
+#ifdef HAVE_BFD_MIPS_ELF_GET_ABIFLAGS
       abiflags = bfd_mips_elf_get_abiflags (abfd);
 #endif
       /* If an ELF "newabi" binary, use the n32/(n)64 GPR names.  */
@@ -1822,6 +1823,7 @@ print_mips16_insn_arg (struct disassemble_info *info,
   const fprintf_ftype infprintf = info->fprintf_func;
   void *is = info->stream;
   const struct mips_operand *operand, *ext_operand;
+  unsigned short ext_size;
   unsigned int uval;
   bfd_vma baseaddr;
 
@@ -1926,29 +1928,26 @@ print_mips16_insn_arg (struct disassemble_info *info,
          info->data_size = 1 << int_op->shift;
        }
 
-      if (operand->size == 26)
-       uval = ((extend & 0x1f) << 21) | ((extend & 0x3e0) << 11) | insn;
-      else
+      ext_size = 0;
+      if (use_extend)
        {
-         /* Calculate the full field value.  */
-         uval = mips_extract_operand (operand, (extend << 16) | insn);
-         if (use_extend)
+         ext_operand = decode_mips16_operand (type, TRUE);
+         if (ext_operand != operand)
            {
-             ext_operand = decode_mips16_operand (type, TRUE);
-             if (ext_operand != operand)
-               {
-                 operand = ext_operand;
-                 if (operand->size == 16)
-                   uval = (((extend & 0x1f) << 11) | (extend & 0x7e0)
-                           | (uval & 0x1f));
-                 else if (operand->size == 15)
-                   uval |= ((extend & 0xf) << 11) | (extend & 0x7f0);
-                 else
-                   uval = ((((extend >> 6) & 0x1f) | (extend & 0x20))
-                           & ((1U << operand->size) - 1));
-               }
+             ext_size = ext_operand->size;
+             operand = ext_operand;
            }
        }
+      if (operand->size == 26)
+       uval = ((extend & 0x1f) << 21) | ((extend & 0x3e0) << 11) | insn;
+      else if (ext_size == 16)
+       uval = ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
+      else if (ext_size == 15)
+       uval = ((extend & 0xf) << 11) | (extend & 0x7f0) | (insn & 0xf);
+      else if (ext_size == 6)
+       uval = ((extend >> 6) & 0x1f) | (extend & 0x20);
+      else
+       uval = mips_extract_operand (operand, (extend << 16) | insn);
 
       baseaddr = memaddr + 2;
       if (operand->type == OP_PCREL)
@@ -2106,6 +2105,9 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
     {
       enum match_kind match;
 
+      if (!opcode_is_member (op, mips_isa, mips_ase, mips_processor))
+       continue;
+
       if (op->pinfo == INSN_MACRO
          || (no_aliases && (op->pinfo2 & INSN2_ALIAS)))
        match = MATCH_NONE;
@@ -2125,6 +2127,7 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
        }
       else if ((first & 0xf800) == 0xf000
               && have_second
+              && !(op->pinfo2 & INSN2_SHORT_ONLY)
               && (second & op->mask) == op->match)
        match = MATCH_FULL;
       else
This page took 0.024521 seconds and 4 git commands to generate.