[testsuite] Unbuffer the output in gdb.base/multi-forks.c
[deliverable/binutils-gdb.git] / gdb / aarch64-tdep.c
index 8ce0eaadb627baae6604e2bb9da03e98aaa2c3e7..c7da618e0ceaf19ca94dc199cc987c1d502ac892 100644 (file)
@@ -1,6 +1,6 @@
 /* Common target dependent code for GDB on AArch64 systems.
 
-   Copyright (C) 2009-2015 Free Software Foundation, Inc.
+   Copyright (C) 2009-2016 Free Software Foundation, Inc.
    Contributed by ARM Ltd.
 
    This file is part of GDB.
@@ -855,7 +855,8 @@ aarch64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
 
 typedef struct
 {
-  /* Value to pass on stack.  */
+  /* Value to pass on stack.  It can be NULL if this item is for stack
+     padding.  */
   const gdb_byte *data;
 
   /* Size in bytes of value to pass on stack.  */
@@ -921,11 +922,12 @@ aarch64_type_align (struct type *t)
     }
 }
 
-/* Return 1 if *TY is a homogeneous floating-point aggregate as
-   defined in the AAPCS64 ABI document; otherwise return 0.  */
+/* Return 1 if *TY is a homogeneous floating-point aggregate or
+   homogeneous short-vector aggregate as defined in the AAPCS64 ABI
+   document; otherwise return 0.  */
 
 static int
-is_hfa (struct type *ty)
+is_hfa_or_hva (struct type *ty)
 {
   switch (TYPE_CODE (ty))
     {
@@ -936,7 +938,10 @@ is_hfa (struct type *ty)
        if (TYPE_VECTOR (ty))
          return 0;
 
-       if (TYPE_CODE (target_ty) == TYPE_CODE_FLT && TYPE_LENGTH (ty) <= 4)
+       if (TYPE_LENGTH (ty) <= 4 /* HFA or HVA has at most 4 members.  */
+           && (TYPE_CODE (target_ty) == TYPE_CODE_FLT /* HFA */
+               || (TYPE_CODE (target_ty) == TYPE_CODE_ARRAY /* HVA */
+                   && TYPE_VECTOR (target_ty))))
          return 1;
        break;
       }
@@ -944,12 +949,15 @@ is_hfa (struct type *ty)
     case TYPE_CODE_UNION:
     case TYPE_CODE_STRUCT:
       {
+       /* HFA or HVA has at most four members.  */
        if (TYPE_NFIELDS (ty) > 0 && TYPE_NFIELDS (ty) <= 4)
          {
            struct type *member0_type;
 
            member0_type = check_typedef (TYPE_FIELD_TYPE (ty, 0));
-           if (TYPE_CODE (member0_type) == TYPE_CODE_FLT)
+           if (TYPE_CODE (member0_type) == TYPE_CODE_FLT
+               || (TYPE_CODE (member0_type) == TYPE_CODE_ARRAY
+                   && TYPE_VECTOR (member0_type)))
              {
                int i;
 
@@ -1117,7 +1125,7 @@ pass_on_stack (struct aarch64_call_info *info, struct type *type,
       int pad = align - (info->nsaa & (align - 1));
 
       item.len = pad;
-      item.data = buf;
+      item.data = NULL;
 
       VEC_safe_push (stack_item_t, info->si, &item);
       info->nsaa += pad;
@@ -1304,7 +1312,7 @@ aarch64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
        case TYPE_CODE_STRUCT:
        case TYPE_CODE_ARRAY:
        case TYPE_CODE_UNION:
-         if (is_hfa (arg_type))
+         if (is_hfa_or_hva (arg_type))
            {
              int elements = TYPE_NFIELDS (arg_type);
 
@@ -1375,7 +1383,8 @@ aarch64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       stack_item_t *si = VEC_last (stack_item_t, info.si);
 
       sp -= si->len;
-      write_memory (sp, si->data, si->len);
+      if (si->data != NULL)
+       write_memory (sp, si->data, si->len);
       VEC_pop (stack_item_t, info.si);
     }
 
@@ -1640,7 +1649,7 @@ aarch64_extract_return_value (struct type *type, struct regcache *regs,
       memcpy (valbuf, buf, len);
       valbuf += len;
     }
-  else if (is_hfa (type))
+  else if (is_hfa_or_hva (type))
     {
       int elements = TYPE_NFIELDS (type);
       struct type *member_type = check_typedef (TYPE_FIELD_TYPE (type, 0));
@@ -1654,7 +1663,7 @@ aarch64_extract_return_value (struct type *type, struct regcache *regs,
 
          if (aarch64_debug)
            {
-             debug_printf ("read HFA return value element %d from %s\n",
+             debug_printf ("read HFA or HVA return value element %d from %s\n",
                            i + 1,
                            gdbarch_register_name (gdbarch, regno));
            }
@@ -1705,14 +1714,10 @@ aarch64_return_in_memory (struct gdbarch *gdbarch, struct type *type)
 
   type = check_typedef (type);
 
-  /* In the AArch64 ABI, "integer" like aggregate types are returned
-     in registers.  For an aggregate type to be integer like, its size
-     must be less than or equal to 4 * X_REGISTER_SIZE.  */
-
-  if (is_hfa (type))
+  if (is_hfa_or_hva (type))
     {
-      /* PCS B.5 If the argument is a Named HFA, then the argument is
-         used unmodified.  */
+      /* v0-v7 are used to return values and one register is allocated
+        for one member.  However, HFA or HVA has at most four members.  */
       return 0;
     }
 
@@ -1778,7 +1783,7 @@ aarch64_store_return_value (struct type *type, struct regcache *regs,
            }
        }
     }
-  else if (is_hfa (type))
+  else if (is_hfa_or_hva (type))
     {
       int elements = TYPE_NFIELDS (type);
       struct type *member_type = check_typedef (TYPE_FIELD_TYPE (type, 0));
@@ -1792,7 +1797,7 @@ aarch64_store_return_value (struct type *type, struct regcache *regs,
 
          if (aarch64_debug)
            {
-             debug_printf ("write HFA return value element %d to %s\n",
+             debug_printf ("write HFA or HVA return value element %d to %s\n",
                            i + 1,
                            gdbarch_register_name (gdbarch, regno));
            }
This page took 0.031822 seconds and 4 git commands to generate.