gdb/s390: Correct recording of "store on condition" insns
[deliverable/binutils-gdb.git] / gdb / s390-tdep.c
index 463c0a0bd73ff28654facf9c3849f9e034db2fd0..247adcd6e2749901bc6ca4e436f330452df78470 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for s390.
 
-   Copyright (C) 2001-2019 Free Software Foundation, Inc.
+   Copyright (C) 2001-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -21,7 +21,7 @@
 
 #include "arch-utils.h"
 #include "ax-gdb.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
 #include "elf/s390.h"
 #include "elf-bfd.h"
 #include "frame-base.h"
@@ -63,7 +63,7 @@ s390_type_align (gdbarch *gdbarch, struct type *t)
 
   if (TYPE_LENGTH (t) > 8)
     {
-      switch (TYPE_CODE (t))
+      switch (t->code ())
        {
        case TYPE_CODE_INT:
        case TYPE_CODE_RANGE:
@@ -75,7 +75,7 @@ s390_type_align (gdbarch *gdbarch, struct type *t)
          return 8;
 
        case TYPE_CODE_ARRAY:
-         if (TYPE_VECTOR (t))
+         if (t->is_vector ())
            return 8;
          break;
        }
@@ -425,7 +425,7 @@ typedef buf_displaced_step_closure s390_displaced_step_closure;
 
 /* Implementation of gdbarch_displaced_step_copy_insn.  */
 
-static struct displaced_step_closure *
+static displaced_step_closure_up
 s390_displaced_step_copy_insn (struct gdbarch *gdbarch,
                               CORE_ADDR from, CORE_ADDR to,
                               struct regcache *regs)
@@ -454,13 +454,8 @@ s390_displaced_step_copy_insn (struct gdbarch *gdbarch,
        {
          /* Let the core fall back to stepping over the breakpoint
             in-line.  */
-         if (debug_displaced)
-           {
-             fprintf_unfiltered (gdb_stdlog,
-                                 "displaced: can't displaced step "
-                                 "RIL instruction: offset %s out of range\n",
-                                 plongest (offset));
-           }
+         displaced_debug_printf ("can't displaced step RIL instruction: offset "
+                                 "%s out of range", plongest (offset));
 
          return NULL;
        }
@@ -470,14 +465,12 @@ s390_displaced_step_copy_insn (struct gdbarch *gdbarch,
 
   write_memory (to, buf, len);
 
-  if (debug_displaced)
-    {
-      fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
-                         paddress (gdbarch, from), paddress (gdbarch, to));
-      displaced_step_dump_bytes (gdb_stdlog, buf, len);
-    }
+  displaced_debug_printf ("copy %s->%s: %s",
+                         paddress (gdbarch, from), paddress (gdbarch, to),
+                         displaced_step_dump_bytes (buf, len).c_str ());
 
-  return closure.release ();
+  /* This is a work around for a problem with g++ 4.8.  */
+  return displaced_step_closure_up (closure.release ());
 }
 
 /* Fix up the state of registers and memory after having single-stepped
@@ -510,21 +503,20 @@ s390_displaced_step_fixup (struct gdbarch *gdbarch,
       amode &= 0x80000000;
     }
 
-  if (debug_displaced)
-    fprintf_unfiltered (gdb_stdlog,
-                       "displaced: (s390) fixup (%s, %s) pc %s len %d amode 0x%x\n",
-                       paddress (gdbarch, from), paddress (gdbarch, to),
-                       paddress (gdbarch, pc), insnlen, (int) amode);
+  displaced_debug_printf ("(s390) fixup (%s, %s) pc %s len %d amode 0x%x",
+                         paddress (gdbarch, from), paddress (gdbarch, to),
+                         paddress (gdbarch, pc), insnlen, (int) amode);
 
   /* Handle absolute branch and save instructions.  */
-  if (is_rr (insn, op_basr, &r1, &r2)
+  int op_basr_p = is_rr (insn, op_basr, &r1, &r2);
+  if (op_basr_p
       || is_rx (insn, op_bas, &r1, &d2, &x2, &b2))
     {
       /* Recompute saved return address in R1.  */
       regcache_cooked_write_unsigned (regs, S390_R0_REGNUM + r1,
                                      amode | (from + insnlen));
       /* Update PC iff the instruction doesn't actually branch.  */
-      if (insn[0] == op_basr && r2 == 0)
+      if (op_basr_p && r2 == 0)
        regcache_write_pc (regs, from + insnlen);
     }
 
@@ -576,19 +568,16 @@ s390_displaced_step_fixup (struct gdbarch *gdbarch,
   else
     regcache_write_pc (regs, pc - to + from);
 
-  if (debug_displaced)
-    fprintf_unfiltered (gdb_stdlog,
-                       "displaced: (s390) pc is now %s\n",
-                       paddress (gdbarch, regcache_read_pc (regs)));
+  displaced_debug_printf ("(s390) pc is now %s",
+                         paddress (gdbarch, regcache_read_pc (regs)));
 }
 
 /* Implement displaced_step_hw_singlestep gdbarch method.  */
 
-static int
-s390_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
-                                  struct displaced_step_closure *closure)
+static bool
+s390_displaced_step_hw_singlestep (struct gdbarch *gdbarch)
 {
-  return 1;
+  return true;
 }
 
 /* Prologue analysis.  */
@@ -1581,7 +1570,7 @@ s390_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
 /* Implement addr_class_type_flags gdbarch method.
    Only used for ABI_LINUX_ZSERIES.  */
 
-static int
+static type_instance_flags
 s390_address_class_type_flags (int byte_size, int dwarf2_addr_class)
 {
   if (byte_size == 4)
@@ -1594,7 +1583,8 @@ s390_address_class_type_flags (int byte_size, int dwarf2_addr_class)
    Only used for ABI_LINUX_ZSERIES.  */
 
 static const char *
-s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
+s390_address_class_type_flags_to_name (struct gdbarch *gdbarch,
+                                      type_instance_flags type_flags)
 {
   if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1)
     return "mode32";
@@ -1605,18 +1595,18 @@ s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
 /* Implement addr_class_name_to_type_flags gdbarch method.
    Only used for ABI_LINUX_ZSERIES.  */
 
-static int
+static bool
 s390_address_class_name_to_type_flags (struct gdbarch *gdbarch,
                                       const char *name,
-                                      int *type_flags_ptr)
+                                      type_instance_flags *type_flags_ptr)
 {
   if (strcmp (name, "mode32") == 0)
     {
       *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
-      return 1;
+      return true;
     }
   else
-    return 0;
+    return false;
 }
 
 /* Inferior function calls.  */
@@ -1637,11 +1627,26 @@ s390_address_class_name_to_type_flags (struct gdbarch *gdbarch,
 static struct type *
 s390_effective_inner_type (struct type *type, unsigned int min_size)
 {
-  while (TYPE_CODE (type) == TYPE_CODE_STRUCT
-        && TYPE_NFIELDS (type) == 1)
+  while (type->code () == TYPE_CODE_STRUCT)
     {
-      struct type *inner = check_typedef (TYPE_FIELD_TYPE (type, 0));
+      struct type *inner = NULL;
 
+      /* Find a non-static field, if any.  Unless there's exactly one,
+        abort the unwrapping.  */
+      for (int i = 0; i < type->num_fields (); i++)
+       {
+         struct field f = type->field (i);
+
+         if (field_is_static (&f))
+           continue;
+         if (inner != NULL)
+           return type;
+         inner = f.type ();
+       }
+
+      if (inner == NULL)
+       break;
+      inner = check_typedef (inner);
       if (TYPE_LENGTH (inner) < min_size)
        break;
       type = inner;
@@ -1665,8 +1670,8 @@ s390_function_arg_float (struct type *type)
      or double.  */
   type = s390_effective_inner_type (type, 0);
 
-  return (TYPE_CODE (type) == TYPE_CODE_FLT
-         || TYPE_CODE (type) == TYPE_CODE_DECFLOAT);
+  return (type->code () == TYPE_CODE_FLT
+         || type->code () == TYPE_CODE_DECFLOAT);
 }
 
 /* Return non-zero if TYPE should be passed like a vector.  */
@@ -1680,7 +1685,7 @@ s390_function_arg_vector (struct type *type)
   /* Structs containing just a vector are passed like a vector.  */
   type = s390_effective_inner_type (type, TYPE_LENGTH (type));
 
-  return TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type);
+  return type->code () == TYPE_CODE_ARRAY && type->is_vector ();
 }
 
 /* Determine whether N is a power of two.  */
@@ -1698,7 +1703,7 @@ is_power_of_two (unsigned int n)
 static int
 s390_function_arg_integer (struct type *type)
 {
-  enum type_code code = TYPE_CODE (type);
+  enum type_code code = type->code ();
 
   if (TYPE_LENGTH (type) > 8)
     return 0;
@@ -1801,7 +1806,7 @@ s390_handle_arg (struct s390_arg_state *as, struct value *arg,
          /* Place value in least significant bits of the register or
             memory word and sign- or zero-extend to full word size.
             This also applies to a struct or union.  */
-         val = TYPE_UNSIGNED (type)
+         val = type->is_unsigned ()
            ? extract_unsigned_integer (value_contents (arg),
                                        length, byte_order)
            : extract_signed_integer (value_contents (arg),
@@ -1905,7 +1910,7 @@ s390_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   CORE_ADDR param_area_start, new_sp;
   struct type *ftype = check_typedef (value_type (function));
 
-  if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
+  if (ftype->code () == TYPE_CODE_PTR)
     ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
 
   arg_prep.copy = sp;
@@ -1922,7 +1927,7 @@ s390_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
      and arg_state.argp with the size of the parameter area.  */
   for (i = 0; i < nargs; i++)
     s390_handle_arg (&arg_state, args[i], tdep, word_size, byte_order,
-                    TYPE_VARARGS (ftype) && i >= TYPE_NFIELDS (ftype));
+                    ftype->has_varargs () && i >= ftype->num_fields ());
 
   param_area_start = align_down (arg_state.copy - arg_state.argp, 8);
 
@@ -1949,7 +1954,7 @@ s390_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   /* Write all parameters.  */
   for (i = 0; i < nargs; i++)
     s390_handle_arg (&arg_state, args[i], tdep, word_size, byte_order,
-                    TYPE_VARARGS (ftype) && i >= TYPE_NFIELDS (ftype));
+                    ftype->has_varargs () && i >= ftype->num_fields ());
 
   /* Store return PSWA.  In 31-bit mode, keep addressing mode bit.  */
   if (word_size == 4)
@@ -2005,7 +2010,7 @@ s390_register_return_value (struct gdbarch *gdbarch, struct type *type,
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int word_size = gdbarch_ptr_bit (gdbarch) / 8;
   int length = TYPE_LENGTH (type);
-  int code = TYPE_CODE (type);
+  int code = type->code ();
 
   if (code == TYPE_CODE_FLT || code == TYPE_CODE_DECFLOAT)
     {
@@ -2029,7 +2034,7 @@ s390_register_return_value (struct gdbarch *gdbarch, struct type *type,
       if (out != NULL)
        regcache->cooked_read_part (S390_R2_REGNUM, word_size - length, length,
                                    out);
-      else if (TYPE_UNSIGNED (type))
+      else if (type->is_unsigned ())
        regcache_cooked_write_unsigned
          (regcache, S390_R2_REGNUM,
           extract_unsigned_integer (in, length, byte_order));
@@ -2067,7 +2072,7 @@ s390_return_value (struct gdbarch *gdbarch, struct value *function,
 
   type = check_typedef (type);
 
-  switch (TYPE_CODE (type))
+  switch (type->code ())
     {
     case TYPE_CODE_STRUCT:
     case TYPE_CODE_UNION:
@@ -2076,7 +2081,7 @@ s390_return_value (struct gdbarch *gdbarch, struct value *function,
       break;
     case TYPE_CODE_ARRAY:
       rvc = (gdbarch_tdep (gdbarch)->vector_abi == S390_VECTOR_ABI_128
-            && TYPE_LENGTH (type) <= 16 && TYPE_VECTOR (type))
+            && TYPE_LENGTH (type) <= 16 && type->is_vector ())
        ? RETURN_VALUE_REGISTER_CONVENTION
        : RETURN_VALUE_STRUCT_CONVENTION;
       break;
@@ -2101,7 +2106,7 @@ s390_return_value (struct gdbarch *gdbarch, struct value *function,
 
 /* Frame unwinding.  */
 
-/* Implmement the stack_frame_destroyed_p gdbarch method.  */
+/* Implement the stack_frame_destroyed_p gdbarch method.  */
 
 static int
 s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
@@ -4134,6 +4139,7 @@ ex:
        case 0xb998: /* ALCR - add logical with carry */
        case 0xb999: /* SLBR - subtract logical with borrow */
        case 0xb9f4: /* NRK - and */
+       case 0xb9f5: /* NCRK - and with complement */
        case 0xb9f6: /* ORK - or */
        case 0xb9f7: /* XRK - xor */
        case 0xb9f8: /* ARK - add */
@@ -4166,20 +4172,32 @@ ex:
        case 0xb919: /* SGFR - subtract */
        case 0xb91a: /* ALGFR - add logical */
        case 0xb91b: /* SLGFR - subtract logical */
+       case 0xb964: /* NNGRK - and 64 bit */
+       case 0xb965: /* OCGRK - or with complement 64 bit */
+       case 0xb966: /* NOGRK - or 64 bit */
+       case 0xb967: /* NXGRK - not exclusive or 64 bit */
+       case 0xb974: /* NNRK - and 32 bit */
+       case 0xb975: /* OCRK - or with complement 32 bit */
+       case 0xb976: /* NORK - or 32 bit */
+       case 0xb977: /* NXRK - not exclusive or 32 bit */
        case 0xb980: /* NGR - and */
        case 0xb981: /* OGR - or */
        case 0xb982: /* XGR - xor */
        case 0xb988: /* ALCGR - add logical with carry */
        case 0xb989: /* SLBGR - subtract logical with borrow */
+       case 0xb9c0: /* SELFHR - select high */
        case 0xb9e1: /* POPCNT - population count */
        case 0xb9e4: /* NGRK - and */
+       case 0xb9e5: /* NCGRK - and with complement */
        case 0xb9e6: /* OGRK - or */
        case 0xb9e7: /* XGRK - xor */
        case 0xb9e8: /* AGRK - add */
        case 0xb9e9: /* SGRK - subtract */
        case 0xb9ea: /* ALGRK - add logical */
+       case 0xb9e3: /* SELGR - select 64 bit */
        case 0xb9eb: /* SLGRK - subtract logical */
        case 0xb9ed: /* MSGRKC - multiply single 64x64 -> 64 */
+       case 0xb9f0: /* SELR - select 32 bit */
        case 0xb9fd: /* MSRKC - multiply single 32x32 -> 32 */
          /* 64-bit gpr destination + flags */
          if (s390_record_gpr_g (gdbarch, regcache, inib[6]))
@@ -4555,7 +4573,13 @@ ex:
            return -1;
          break;
 
-       /* 0xb932-0xb93b undefined */
+       /* 0xb932-0xb937 undefined */
+
+       /* 0xb938 unsupported: SORTL - sort lists */
+       /* 0xb939 unsupported: DFLTCC - deflate conversion call */
+       /* 0xb93a unsupported: KDSA - compute dig. signature auth. */
+
+       /* 0xb93b undefined */
 
        case 0xb93c: /* PPNO - perform pseudorandom number operation [partial] */
          regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp);
@@ -5277,7 +5301,7 @@ ex:
        case 0xe383: /* MSGC - multiply single 64x64mem -> 64 */
        case 0xe398: /* ALC - add logical with carry */
        case 0xe399: /* SLB - subtract logical with borrow */
-       case 0xe727: /* LCBB - load count to block bounduary */
+       case 0xe727: /* LCBB - load count to block boundary */
        case 0xeb81: /* ICMY - insert characters under mask */
        case 0xebdc: /* SRAK - shift left single */
        case 0xebdd: /* SLAK - shift left single */
@@ -5346,7 +5370,6 @@ ex:
        case 0xe325: /* NTSTG - nontransactional store */
        case 0xe326: /* CVDY - convert to decimal */
        case 0xe32f: /* STRVG - store reversed */
-       case 0xebe3: /* STOCG - store on condition */
        case 0xed67: /* STDY - store */
          oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
          if (record_full_arch_list_add_mem (oaddr, 8))
@@ -5375,8 +5398,6 @@ ex:
        case 0xe33e: /* STRV - store reversed */
        case 0xe350: /* STY - store */
        case 0xe3cb: /* STFH - store high */
-       case 0xebe1: /* STOCFH - store high on condition */
-       case 0xebf3: /* STOC - store on condition */
        case 0xed66: /* STEY - store */
          oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], ibyte[4]);
          if (record_full_arch_list_add_mem (oaddr, 4))
@@ -5485,6 +5506,13 @@ ex:
        /* 0xe3ce undefined */
        /* 0xe3d0-0xe3ff undefined */
 
+       case 0xe601: /* VLEBRH - vector load byte reversed element */
+       case 0xe602: /* VLEBRG - vector load byte reversed element */
+       case 0xe603: /* VLEBRF - vector load byte reversed element */
+       case 0xe604: /* VLLEBRZ - vector load byte rev. el. and zero */
+       case 0xe605: /* VLBRREP - vector load byte rev. el. and replicate */
+       case 0xe606: /* VLBR - vector load byte reversed elements */
+       case 0xe607: /* VLER - vector load elements reversed */
        case 0xe634: /* VPKZ - vector pack zoned */
        case 0xe635: /* VLRL - vector load rightmost with immed. length */
        case 0xe637: /* VLRLR - vector load rightmost with length */
@@ -5496,7 +5524,7 @@ ex:
        case 0xe704: /* VLLEZ - vector load logical element and zero */
        case 0xe705: /* VLREP - vector load and replicate */
        case 0xe706: /* VL - vector load */
-       case 0xe707: /* VLBB - vector load to block bounduary */
+       case 0xe707: /* VLBB - vector load to block boundary */
        case 0xe712: /* VGEG - vector gather element */
        case 0xe713: /* VGEF - vector gather element */
        case 0xe722: /* VLVG - vector load vr element from gr */
@@ -5547,6 +5575,9 @@ ex:
        case 0xe77f: /* VSRAB - vector shift right arithmetic by byte */
        case 0xe784: /* VPDI - vector permute doubleword immediate */
        case 0xe785: /* VBPERM - vector bit permute */
+       case 0xe786: /* VSLD - vector shift left double by bit */
+       case 0xe787: /* VSRD - vector shift right double by bit */
+       case 0xe78b: /* VSTRS - vector string search */
        case 0xe78c: /* VPERM - vector permute */
        case 0xe78d: /* VSEL - vector select */
        case 0xe78e: /* VFMS - vector fp multiply and subtract */
@@ -5575,10 +5606,10 @@ ex:
        case 0xe7bc: /* VGFMA - vector Galois field multiply sum and accumulate */
        case 0xe7bd: /* VSBCBI - vector subtract with borrow compute borrow indication */
        case 0xe7bf: /* VSBI - vector subtract with borrow indication */
-       case 0xe7c0: /* VCLGD - vector convert to logical 64-bit */
-       case 0xe7c1: /* VCDLG - vector convert from logical 64-bit */
-       case 0xe7c2: /* VCGD - vector convert to fixed 64-bit */
-       case 0xe7c3: /* VCDG - vector convert from fixed 64-bit */
+       case 0xe7c0: /* VCLFP - vector fp convert to logical */
+       case 0xe7c1: /* VCFPL - vector fp convert from logical */
+       case 0xe7c2: /* VCSFP - vector fp convert to fixed */
+       case 0xe7c3: /* VCFPS - vector fp convert from fixed */
        case 0xe7c4: /* VLDE/VFLL - vector fp load lengthened */
        case 0xe7c5: /* VLED/VFLR - vector fp load rounded */
        case 0xe7c7: /* VFI - vector load fp integer */
@@ -5629,6 +5660,7 @@ ex:
            return -1;
          break;
 
+       case 0xe609: /* VSTEBRH - vector store byte reversed element */
        case 0xe709: /* VSTEH - vector store element */
          oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
          if (record_full_arch_list_add_mem (oaddr, 2))
@@ -5637,6 +5669,7 @@ ex:
            return -1;
          break;
 
+       case 0xe60a: /* VSTEBRG - vector store byte reversed element */
        case 0xe70a: /* VSTEG - vector store element */
          oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
          if (record_full_arch_list_add_mem (oaddr, 8))
@@ -5645,6 +5678,7 @@ ex:
            return -1;
          break;
 
+       case 0xe60b: /* VSTEBRF - vector store byte reversed element */
        case 0xe70b: /* VSTEF - vector store element */
          oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
          if (record_full_arch_list_add_mem (oaddr, 4))
@@ -5655,6 +5689,8 @@ ex:
 
        /* 0xe70c-0xe70d undefined */
 
+       case 0xe60e: /* VSTBR - vector store byte reversed elements */
+       case 0xe60f: /* VSTER - vector store elements reversed */
        case 0xe70e: /* VST - vector store */
          oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0);
          if (record_full_arch_list_add_mem (oaddr, 16))
@@ -6074,6 +6110,20 @@ ex:
 
        /* 0xeb9c-0xebbf undefined */
        /* 0xebc1-0xebdb undefined */
+
+       case 0xebe1: /* STOCFH - store high on condition */
+       case 0xebf3: /* STOC - store on condition */
+         oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
+         if (record_full_arch_list_add_mem (oaddr, 4))
+           return -1;
+         break;
+
+       case 0xebe3: /* STOCG - store on condition */
+         oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ibyte[4]);
+         if (record_full_arch_list_add_mem (oaddr, 8))
+           return -1;
+         break;
+
        /* 0xebe5 undefined */
        /* 0xebe9 undefined */
        /* 0xebeb-0xebf1 undefined */
@@ -6189,7 +6239,7 @@ ex:
            return -1;
          break;
 
-       /* 0xed42-0xed47 undefind */
+       /* 0xed42-0xed47 undefined */
 
        case 0xed48: /* SLXT - shift significand left */
        case 0xed49: /* SRXT - shift significand right */
@@ -6204,10 +6254,10 @@ ex:
            return -1;
          break;
 
-       /* 0xed4a-0xed4f undefind */
-       /* 0xed52-0xed53 undefind */
-       /* 0xed56-0xed57 undefind */
-       /* 0xed5a-0xed63 undefind */
+       /* 0xed4a-0xed4f undefined */
+       /* 0xed52-0xed53 undefined */
+       /* 0xed56-0xed57 undefined */
+       /* 0xed5a-0xed63 undefined */
        /* 0xed68-0xeda7 undefined */
 
        case 0xeda8: /* CZDT - convert to zoned */
@@ -6234,7 +6284,16 @@ ex:
       /* SSE/SIL-format instruction */
       switch (insn[0])
        {
-       /* 0xe500-0xe543 undefined, privileged, or unsupported */
+       /* 0xe500-0xe509 undefined, privileged, or unsupported */
+
+       case 0xe50a: /* MVCRL - move right to left */
+         regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp);
+         oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
+         if (record_full_arch_list_add_mem (oaddr, (tmp & 0xff) + 1))
+           return -1;
+         break;
+
+       /* 0xe50b-0xe543 undefined, privileged, or unsupported */
 
        case 0xe544: /* MVHHI - move */
          oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0);
@@ -6721,10 +6780,10 @@ UNKNOWN_OP:
 /* Implement gdbarch_gcc_target_options.  GCC does not know "-m32" or
    "-mcmodel=large".  */
 
-static char *
+static std::string
 s390_gcc_target_options (struct gdbarch *gdbarch)
 {
-  return xstrdup (gdbarch_ptr_bit (gdbarch) == 64 ? "-m64" : "-m31");
+  return gdbarch_ptr_bit (gdbarch) == 64 ? "-m64" : "-m31";
 }
 
 /* Implement gdbarch_gnu_triplet_regexp.  Target triplets are "s390-*"
@@ -6961,8 +7020,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   struct gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
   struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
-  struct tdesc_arch_data *tdesc_data = tdesc_data_alloc ();
-  info.tdesc_data = tdesc_data;
+  tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
+  info.tdesc_data = tdesc_data.get ();
 
   set_gdbarch_believe_pcc_promotion (gdbarch, 0);
   set_gdbarch_char_signed (gdbarch, 0);
@@ -7088,9 +7147,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->tdesc = tdesc;
 
   /* Check any target description for validity.  */
-  if (!s390_tdesc_valid (tdep, tdesc_data))
+  if (!s390_tdesc_valid (tdep, tdesc_data.get ()))
     {
-      tdesc_data_cleanup (tdesc_data);
       xfree (tdep);
       gdbarch_free (gdbarch);
       return NULL;
@@ -7121,13 +7179,12 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       if (tmp->vector_abi != tdep->vector_abi)
        continue;
 
-      tdesc_data_cleanup (tdesc_data);
       xfree (tdep);
       gdbarch_free (gdbarch);
       return arches->gdbarch;
     }
 
-  tdesc_use_registers (gdbarch, tdep->tdesc, tdesc_data);
+  tdesc_use_registers (gdbarch, tdep->tdesc, std::move (tdesc_data));
   set_gdbarch_register_name (gdbarch, s390_register_name);
 
   /* Assign pseudo register numbers.  */
@@ -7157,8 +7214,9 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   return gdbarch;
 }
 
+void _initialize_s390_tdep ();
 void
-_initialize_s390_tdep (void)
+_initialize_s390_tdep ()
 {
   /* Hook us into the gdbarch mechanism.  */
   register_gdbarch_init (bfd_arch_s390, s390_gdbarch_init);
This page took 0.058352 seconds and 4 git commands to generate.