+#define OUTPUT_REG(val, num) phex_nz ((val), \
+ TYPE_LENGTH (gdbarch_register_type (regcache->arch (), (num))))
+
+/* Record a memory area of length LEN pointed to by register
+ REGNUM. */
+
+static int
+record_mem_at_reg (struct regcache *regcache, int regnum, int len)
+{
+ ULONGEST addr;
+
+ regcache_raw_read_unsigned (regcache, regnum, &addr);
+ return record_full_arch_list_add_mem ((CORE_ADDR) addr, len);
+}
+
+static int
+record_linux_sockaddr (struct regcache *regcache,
+ struct linux_record_tdep *tdep, ULONGEST addr,
+ ULONGEST len)
+{
+ gdb_byte *a;
+ int addrlen;
+ struct gdbarch *gdbarch = regcache->arch ();
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+
+ if (!addr)
+ return 0;
+
+ a = (gdb_byte *) alloca (tdep->size_int);
+
+ if (record_full_arch_list_add_mem ((CORE_ADDR) len, tdep->size_int))
+ return -1;
+
+ /* Get the addrlen. */
+ if (target_read_memory ((CORE_ADDR) len, a, tdep->size_int))
+ {
+ if (record_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading "
+ "memory at addr = 0x%s len = %d.\n",
+ phex_nz (len, tdep->size_pointer),
+ tdep->size_int);
+ return -1;
+ }
+ addrlen = (int) extract_unsigned_integer (a, tdep->size_int, byte_order);
+ if (addrlen <= 0 || addrlen > tdep->size_sockaddr)
+ addrlen = tdep->size_sockaddr;
+
+ if (record_full_arch_list_add_mem ((CORE_ADDR) addr, addrlen))
+ return -1;
+
+ return 0;
+}
+
+static int
+record_linux_msghdr (struct regcache *regcache,
+ struct linux_record_tdep *tdep, ULONGEST addr)
+{
+ gdb_byte *a;
+ struct gdbarch *gdbarch = regcache->arch ();
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+ CORE_ADDR tmpaddr;
+ int tmpint;
+
+ if (!addr)
+ return 0;
+
+ if (record_full_arch_list_add_mem ((CORE_ADDR) addr, tdep->size_msghdr))
+ return -1;
+
+ a = (gdb_byte *) alloca (tdep->size_msghdr);
+ if (target_read_memory ((CORE_ADDR) addr, a, tdep->size_msghdr))
+ {
+ if (record_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading "
+ "memory at addr = 0x%s "
+ "len = %d.\n",
+ phex_nz (addr, tdep->size_pointer),
+ tdep->size_msghdr);
+ return -1;
+ }
+
+ /* msg_name msg_namelen */
+ addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+ a += tdep->size_pointer;
+ if (record_full_arch_list_add_mem
+ ((CORE_ADDR) addr,
+ (int) extract_unsigned_integer (a,
+ tdep->size_int,
+ byte_order)))
+ return -1;
+ /* We have read an int, but skip size_pointer bytes to account for alignment
+ of the next field on 64-bit targets. */
+ a += tdep->size_pointer;
+
+ /* msg_iov msg_iovlen */
+ addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+ a += tdep->size_pointer;
+ if (addr)
+ {
+ ULONGEST i;
+ ULONGEST len = extract_unsigned_integer (a, tdep->size_size_t,
+ byte_order);
+ gdb_byte *iov = (gdb_byte *) alloca (tdep->size_iovec);
+
+ for (i = 0; i < len; i++)
+ {
+ if (target_read_memory ((CORE_ADDR) addr, iov, tdep->size_iovec))
+ {
+ if (record_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error "
+ "reading memory at "
+ "addr = 0x%s "
+ "len = %d.\n",
+ phex_nz (addr,tdep->size_pointer),
+ tdep->size_iovec);
+ return -1;
+ }
+ tmpaddr = (CORE_ADDR) extract_unsigned_integer (iov,
+ tdep->size_pointer,
+ byte_order);
+ tmpint = (int) extract_unsigned_integer (iov + tdep->size_pointer,
+ tdep->size_size_t,
+ byte_order);
+ if (record_full_arch_list_add_mem (tmpaddr, tmpint))
+ return -1;
+ addr += tdep->size_iovec;
+ }
+ }
+ a += tdep->size_size_t;
+
+ /* msg_control msg_controllen */
+ addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
+ a += tdep->size_pointer;
+ tmpint = (int) extract_unsigned_integer (a, tdep->size_size_t, byte_order);
+ if (record_full_arch_list_add_mem ((CORE_ADDR) addr, tmpint))
+ return -1;
+
+ return 0;
+}
+