/* Darwin support for GDB, the GNU debugger.
- Copyright 1997-2002, 2005, 2008-2012 Free Software Foundation, Inc.
+ Copyright (C) 1997-2022 Free Software Foundation, Inc.
Contributed by Apple Computer, Inc.
#include "inferior.h"
#include "gdbcore.h"
#include "target.h"
-#include "floatformat.h"
#include "symtab.h"
#include "regcache.h"
-#include "libbfd.h"
#include "objfiles.h"
#include "i387-tdep.h"
#include "i386-tdep.h"
#include "osabi.h"
#include "ui-out.h"
-#include "symtab.h"
-#include "frame.h"
-#include "gdb_assert.h"
#include "i386-darwin-tdep.h"
#include "solib.h"
#include "solib-darwin.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
+#include <algorithm>
/* Offsets into the struct i386_thread_state where we'll find the saved regs.
From <mach/i386/thread_status.h> and i386-tdep.h. */
return i386_sigtramp_p (this_frame);
}
-/* Check wether TYPE is a 128-bit vector (__m128, __m128d or __m128i). */
+/* Check whether TYPE is a 128-bit vector (__m128, __m128d or __m128i). */
static int
i386_m128_p (struct type *type)
{
- return (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)
- && TYPE_LENGTH (type) == 16);
+ return (type->code () == TYPE_CODE_ARRAY && type->is_vector ()
+ && TYPE_LENGTH (type) == 16);
}
/* Return the alignment for TYPE when passed as an argument. */
type = check_typedef (type);
/* According to Mac OS X ABI document (passing arguments):
6. The caller places 64-bit vectors (__m64) on the parameter area,
- aligned to 8-byte boundaries.
+ aligned to 8-byte boundaries.
7. [...] The caller aligns 128-bit vectors in the parameter area to
- 16-byte boundaries. */
- if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type))
+ 16-byte boundaries. */
+ if (type->code () == TYPE_CODE_ARRAY && type->is_vector ())
return TYPE_LENGTH (type);
/* 4. The caller places all the fields of structures (or unions) with no
- vector elements in the parameter area. These structures are 4-byte
- aligned.
+ vector elements in the parameter area. These structures are 4-byte
+ aligned.
5. The caller places structures with vector elements on the stack,
- 16-byte aligned. */
- if (TYPE_CODE (type) == TYPE_CODE_STRUCT
- || TYPE_CODE (type) == TYPE_CODE_UNION)
+ 16-byte aligned. */
+ if (type->code () == TYPE_CODE_STRUCT
+ || type->code () == TYPE_CODE_UNION)
{
int i;
int res = 4;
- for (i = 0; i < TYPE_NFIELDS (type); i++)
- res = max (res,
- i386_darwin_arg_type_alignment (TYPE_FIELD_TYPE (type, i)));
+ for (i = 0; i < type->num_fields (); i++)
+ {
+ int align
+ = i386_darwin_arg_type_alignment (type->field (i).type ());
+
+ res = std::max (res, align);
+ }
return res;
}
/* 2. The caller aligns nonvector arguments to 4-byte boundaries. */
i386_darwin_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
struct regcache *regcache, CORE_ADDR bp_addr,
int nargs, struct value **args, CORE_ADDR sp,
- int struct_return, CORE_ADDR struct_addr)
+ function_call_return_method return_method,
+ CORE_ADDR struct_addr)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int args_space = 0;
int num_m128 = 0;
- if (struct_return)
+ if (return_method == return_method_struct)
{
if (write_pass)
{
store_unsigned_integer (buf, 4, byte_order, struct_addr);
write_memory (sp, buf, 4);
}
- args_space += 4;
+ args_space += 4;
}
for (i = 0; i < nargs; i++)
{
- struct type *arg_type = value_enclosing_type (args[i]);
-
- if (i386_m128_p (arg_type) && num_m128 < 4)
- {
- if (write_pass)
- {
- const gdb_byte *val = value_contents_all (args[i]);
- regcache_raw_write
- (regcache, I387_MM0_REGNUM(tdep) + num_m128, val);
- }
- num_m128++;
- }
- else
- {
- int len = TYPE_LENGTH (arg_type);
- int align = i386_darwin_arg_type_alignment (arg_type);
-
- args_space = align_up (args_space, align);
- if (write_pass)
- write_memory (sp + args_space,
- value_contents_all (args[i]), len);
-
- /* The System V ABI says that:
-
- "An argument's size is increased, if necessary, to make it a
- multiple of [32-bit] words. This may require tail padding,
- depending on the size of the argument."
-
- This makes sure the stack stays word-aligned. */
- args_space += align_up (len, 4);
- }
- }
+ struct type *arg_type = value_enclosing_type (args[i]);
+
+ if (i386_m128_p (arg_type) && num_m128 < 4)
+ {
+ if (write_pass)
+ {
+ const gdb_byte *val = value_contents_all (args[i]);
+ regcache->raw_write (I387_MM0_REGNUM(tdep) + num_m128, val);
+ }
+ num_m128++;
+ }
+ else
+ {
+ args_space = align_up (args_space,
+ i386_darwin_arg_type_alignment (arg_type));
+ if (write_pass)
+ write_memory (sp + args_space,
+ value_contents_all (args[i]),
+ TYPE_LENGTH (arg_type));
+
+ /* The System V ABI says that:
+
+ "An argument's size is increased, if necessary, to make it a
+ multiple of [32-bit] words. This may require tail padding,
+ depending on the size of the argument."
+
+ This makes sure the stack stays word-aligned. */
+ args_space += align_up (TYPE_LENGTH (arg_type), 4);
+ }
+ }
/* Darwin i386 ABI:
1. The caller ensures that the stack is 16-byte aligned at the point
/* Finally, update the stack pointer... */
store_unsigned_integer (buf, 4, byte_order, sp);
- regcache_cooked_write (regcache, I386_ESP_REGNUM, buf);
+ regcache->cooked_write (I386_ESP_REGNUM, buf);
/* ...and fake a frame pointer. */
- regcache_cooked_write (regcache, I386_EBP_REGNUM, buf);
+ regcache->cooked_write (I386_EBP_REGNUM, buf);
/* MarkK wrote: This "+ 8" is all over the place:
(i386_frame_this_id, i386_sigtramp_frame_this_id,
return GDB_OSABI_UNKNOWN;
}
-/* -Wmissing-prototypes */
-extern initialize_file_ftype _initialize_i386_darwin_tdep;
-
+void _initialize_i386_darwin_tdep ();
void
-_initialize_i386_darwin_tdep (void)
+_initialize_i386_darwin_tdep ()
{
gdbarch_register_osabi_sniffer (bfd_arch_unknown, bfd_target_mach_o_flavour,
- i386_mach_o_osabi_sniffer);
+ i386_mach_o_osabi_sniffer);
gdbarch_register_osabi (bfd_arch_i386, bfd_mach_i386_i386,
GDB_OSABI_DARWIN, i386_darwin_init_abi);