+2017-05-04  Alan Hayward  <alan.hayward@arm.com>
+
+       * frame.c (get_frame_register_bytes): Unwind using value.
+       (put_frame_register_bytes): Likewise.
+
 2017-03-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * auto-load.c (auto_load_section_scripts): Check SEC_HAS_CONTENTS.
 
        }
       else
        {
-         gdb_byte buf[MAX_REGISTER_SIZE];
-         enum lval_type lval;
-         CORE_ADDR addr;
-         int realnum;
+         struct value *value = frame_unwind_register_value (frame->next,
+                                                            regnum);
+         gdb_assert (value != NULL);
+         *optimizedp = value_optimized_out (value);
+         *unavailablep = !value_entirely_available (value);
 
-         frame_register (frame, regnum, optimizedp, unavailablep,
-                         &lval, &addr, &realnum, buf);
          if (*optimizedp || *unavailablep)
-           return 0;
-         memcpy (myaddr, buf + offset, curr_len);
+           {
+             release_value (value);
+             value_free (value);
+             return 0;
+           }
+         memcpy (myaddr, value_contents_all (value) + offset, curr_len);
+         release_value (value);
+         value_free (value);
        }
 
       myaddr += curr_len;
        }
       else
        {
-         gdb_byte buf[MAX_REGISTER_SIZE];
-
-         deprecated_frame_register_read (frame, regnum, buf);
-         memcpy (buf + offset, myaddr, curr_len);
-         put_frame_register (frame, regnum, buf);
+         struct value *value = frame_unwind_register_value (frame->next,
+                                                            regnum);
+         gdb_assert (value != NULL);
+
+         memcpy ((char *) value_contents_writeable (value) + offset, myaddr,
+                 curr_len);
+         put_frame_register (frame, regnum, value_contents_raw (value));
+         release_value (value);
+         value_free (value);
        }
 
       myaddr += curr_len;