cygming.h (DWARF_FRAME_REGISTERS): Adjust comment.
authorKai Tietz <ktietz@redhat.com>
Fri, 25 Mar 2011 16:10:56 +0000 (17:10 +0100)
committerKai Tietz <ktietz@gcc.gnu.org>
Fri, 25 Mar 2011 16:10:56 +0000 (17:10 +0100)
2011-03-25  Kai Tietz  <ktietz@redhat.com>

* config/i386/cygming.h (DWARF_FRAME_REGISTERS): Adjust comment.
(STACK_BOUNDARY): Check for bit-ness in case of MS_ABI.
* config/i386/i386.c (ix86_conditional_register_usage): Adjust
comment and use macro TARGET_64BIT_MS_ABI instead.
(ix86_keep_aggregate_return_pointer): Optimize for 64-bit case
and change default behavior for 32-bit MS_ABI.
(ix86_reg_parm_stack_space): Check additionally for bit-ness.
(ix86_function_type_abi): Allow check for ms_abi/sysv_abi for
32-bit, too.
(ix86_cfun_abi): Likewise.
(ix86_maybe_switch_abi): Adjust comment.
(init_cumulative_args): Check for bit-ness in MS_ABI case.
(ix86_gimplify_va_arg): Check just for not TARGET_64BIT_MS_ABI
instead of checking for SYSV_ABI.
(ix86_nsaved_sseregs): Likewise.
(ix86_compute_frame_layout): Set only for 64-bit MS_ABI alignment
to 16 bytes.
(ix86_expand_call): Use TARGET_64BIT_MS_ABI macro.
* config/i386.h (TARGET_32BIT_MS_ABI): New macro.
(ACCUMULATE_OUTGOING_ARGS): Check explicit for 64-bit MS_ABI.
(OUTGOING_REG_PARM_STACK_SPACE): Likewise.
* config/mingw32.h (DEFAULT_ABI): Change default always to MS_ABI.

From-SVN: r171459

gcc/ChangeLog
gcc/config/i386/cygming.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/mingw32.h

index 2001e374e800864ec2bb726bb303cbc7084cc270..827a662890593ab3e4bfee19d65072b6f091378b 100644 (file)
@@ -1,3 +1,28 @@
+2011-03-25  Kai Tietz  <ktietz@redhat.com>
+
+       * config/i386/cygming.h (DWARF_FRAME_REGISTERS): Adjust comment.
+       (STACK_BOUNDARY): Check for bit-ness in case of MS_ABI.
+       * config/i386/i386.c (ix86_conditional_register_usage): Adjust
+       comment and use macro TARGET_64BIT_MS_ABI instead.
+       (ix86_keep_aggregate_return_pointer): Optimize for 64-bit case
+       and change default behavior for 32-bit MS_ABI.
+       (ix86_reg_parm_stack_space): Check additionally for bit-ness.
+       (ix86_function_type_abi): Allow check for ms_abi/sysv_abi for
+       32-bit, too.
+       (ix86_cfun_abi): Likewise.
+       (ix86_maybe_switch_abi): Adjust comment.
+       (init_cumulative_args): Check for bit-ness in MS_ABI case.
+       (ix86_gimplify_va_arg): Check just for not TARGET_64BIT_MS_ABI
+       instead of checking for SYSV_ABI.
+       (ix86_nsaved_sseregs): Likewise.
+       (ix86_compute_frame_layout): Set only for 64-bit MS_ABI alignment
+       to 16 bytes.
+       (ix86_expand_call): Use TARGET_64BIT_MS_ABI macro.
+       * config/i386.h (TARGET_32BIT_MS_ABI): New macro.
+       (ACCUMULATE_OUTGOING_ARGS): Check explicit for 64-bit MS_ABI.
+       (OUTGOING_REG_PARM_STACK_SPACE): Likewise.
+       * config/mingw32.h (DEFAULT_ABI): Change default always to MS_ABI.
+
 2011-03-25  Richard Guenther  <rguenther@suse.de>
 
        * tree-flow.h (verify_stmts): Rename to verify_gimple_in_cfg.
index 6a6278a8a9f5b6fedb028c82a744fe8050bc2548..db266b8716389d6d2f8a0e92be8fe9ac7b6a9b84 100644 (file)
@@ -84,7 +84,7 @@ along with GCC; see the file COPYING3.  If not see
   (TARGET_64BIT ? dbx64_register_map[(n)]              \
                : svr4_dbx_register_map[(n)])
 
-/* The MS_ABI changes the set of call-used registers.  */
+/* The 64-bit MS_ABI changes the set of call-used registers.  */
 #undef DWARF_FRAME_REGISTERS
 #define DWARF_FRAME_REGISTERS (TARGET_64BIT ? 33 : 17)
 
@@ -262,7 +262,7 @@ do {                                                \
 #define CHECK_STACK_LIMIT 4000
 
 #undef STACK_BOUNDARY
-#define STACK_BOUNDARY (ix86_abi == MS_ABI ? 128 : BITS_PER_WORD)
+#define STACK_BOUNDARY (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD)
 
 /* By default, target has a 80387, uses IEEE compatible arithmetic,
    returns float values in the 387 and needs stack probes.
index 415cefddf77a19289ecd798283aa48642edb7b93..4e8ca698a4470da0adb831154baa30dce57ffe5d 100644 (file)
@@ -4347,8 +4347,8 @@ ix86_conditional_register_usage (void)
   if (j != INVALID_REGNUM)
     fixed_regs[j] = call_used_regs[j] = 1;
 
-  /* The MS_ABI changes the set of call-used registers.  */
-  if (TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
+  /* The 64-bit MS_ABI changes the set of call-used registers.  */
+  if (TARGET_64BIT_MS_ABI)
     {
       call_used_regs[SI_REG] = 0;
       call_used_regs[DI_REG] = 0;
@@ -5607,11 +5607,18 @@ ix86_keep_aggregate_return_pointer (tree fntype)
 {
   tree attr;
 
-  attr = lookup_attribute ("callee_pop_aggregate_return",
-                          TYPE_ATTRIBUTES (fntype));
-  if (attr)
-    return (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))) == 0);
+  if (!TARGET_64BIT)
+    {
+      attr = lookup_attribute ("callee_pop_aggregate_return",
+                              TYPE_ATTRIBUTES (fntype));
+      if (attr)
+       return (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))) == 0);
 
+      /* For 32-bit MS-ABI the default is to keep aggregate
+         return pointer.  */
+      if (ix86_function_type_abi (fntype) == MS_ABI)
+       return true;
+    }
   return KEEP_AGGREGATE_RETURN_POINTER != 0;
 }
 
@@ -5748,7 +5755,7 @@ ix86_reg_parm_stack_space (const_tree fndecl)
     call_abi = ix86_function_abi (fndecl);
   else
     call_abi = ix86_function_type_abi (fndecl);
-  if (call_abi == MS_ABI)
+  if (TARGET_64BIT && call_abi == MS_ABI)
     return 32;
   return 0;
 }
@@ -5758,7 +5765,7 @@ ix86_reg_parm_stack_space (const_tree fndecl)
 enum calling_abi
 ix86_function_type_abi (const_tree fntype)
 {
-  if (TARGET_64BIT && fntype != NULL)
+  if (fntype != NULL)
     {
       enum calling_abi abi = ix86_abi;
       if (abi == SYSV_ABI)
@@ -5800,7 +5807,7 @@ ix86_function_abi (const_tree fndecl)
 enum calling_abi
 ix86_cfun_abi (void)
 {
-  if (! cfun || ! TARGET_64BIT)
+  if (! cfun)
     return ix86_abi;
   return cfun->machine->call_abi;
 }
@@ -5863,9 +5870,9 @@ ix86_call_abi_override (const_tree fndecl)
     cfun->machine->call_abi = ix86_function_type_abi (TREE_TYPE (fndecl));
 }
 
-/* MS and SYSV ABI have different set of call used registers.  Avoid expensive
-   re-initialization of init_regs each time we switch function context since
-   this is needed only during RTL expansion.  */
+/* 64-bit MS and SYSV ABI have different set of call used registers.  Avoid
+   expensive re-initialization of init_regs each time we switch function context
+   since this is needed only during RTL expansion.  */
 static void
 ix86_maybe_switch_abi (void)
 {
@@ -5931,7 +5938,7 @@ init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
 
   /* Set up the number of registers to use for passing arguments.  */
 
-  if (cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
+  if (TARGET_64BIT && cum->call_abi == MS_ABI && !ACCUMULATE_OUTGOING_ARGS)
     sorry ("ms_abi attribute requires -maccumulate-outgoing-args "
           "or subtarget optimization implying it");
   cum->nregs = ix86_regparm;
@@ -8179,7 +8186,7 @@ ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
     case V4DFmode:
     case V4DImode:
       /* Unnamed 256bit vector mode parameters are passed on stack.  */
-      if (ix86_cfun_abi () == SYSV_ABI)
+      if (!TARGET_64BIT_MS_ABI)
        {
          container = NULL;
          break;
@@ -9095,7 +9102,7 @@ ix86_nsaved_sseregs (void)
   int nregs = 0;
   int regno;
 
-  if (ix86_cfun_abi () != MS_ABI)
+  if (!TARGET_64BIT_MS_ABI)
     return 0;
   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
     if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true))
@@ -9207,9 +9214,9 @@ ix86_compute_frame_layout (struct ix86_frame *frame)
   stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
   preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
 
-  /* MS ABI seem to require stack alignment to be always 16 except for function
-     prologues and leaf.  */
-  if ((ix86_cfun_abi () == MS_ABI && preferred_alignment < 16)
+  /* 64-bit MS ABI seem to require stack alignment to be always 16 except for
+     function prologues and leaf.  */
+  if ((TARGET_64BIT_MS_ABI && preferred_alignment < 16)
       && (!current_function_is_leaf || cfun->calls_alloca != 0
           || ix86_current_function_calls_tls_descriptor))
     {
@@ -21877,8 +21884,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
       pop = gen_rtx_SET (VOIDmode, stack_pointer_rtx, pop);
       call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, call, pop));
     }
-  if (TARGET_64BIT
-      && ix86_cfun_abi () == MS_ABI
+  if (TARGET_64BIT_MS_ABI
       && (!callarg2 || INTVAL (callarg2) != -2))
     {
       /* We need to represent that SI and DI registers are clobbered
index f14a95d6dd5c60ea259b6a639936de5c66965a1c..12edeba97f7ba29c507bc51e2aa9c9b891bec18b 100644 (file)
@@ -497,6 +497,9 @@ extern tree x86_mfence;
 /* For the Windows 64-bit ABI.  */
 #define TARGET_64BIT_MS_ABI (TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
 
+/* For the Windows 32-bit ABI.  */
+#define TARGET_32BIT_MS_ABI (!TARGET_64BIT && ix86_cfun_abi () == MS_ABI)
+
 /* This is re-defined by cygming.h.  */
 #define TARGET_SEH 0
 
@@ -1439,12 +1442,12 @@ enum reg_class
    No space will be pushed onto the stack for each call; instead, the
    function prologue should increase the stack frame size by this amount.  
    
-   MS ABI seem to require 16 byte alignment everywhere except for function
-   prologue and apilogue.  This is not possible without
+   64-bit MS ABI seem to require 16 byte alignment everywhere except for
+   function prologue and apilogue.  This is not possible without
    ACCUMULATE_OUTGOING_ARGS.  */
 
 #define ACCUMULATE_OUTGOING_ARGS \
-  (TARGET_ACCUMULATE_OUTGOING_ARGS || ix86_cfun_abi () == MS_ABI)
+  (TARGET_ACCUMULATE_OUTGOING_ARGS || TARGET_64BIT_MS_ABI)
 
 /* If defined, a C expression whose value is nonzero when we want to use PUSH
    instructions to pass outgoing arguments.  */
@@ -1470,7 +1473,7 @@ enum reg_class
 #define REG_PARM_STACK_SPACE(FNDECL) ix86_reg_parm_stack_space (FNDECL)
 
 #define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) \
-  (ix86_function_type_abi (FNTYPE) == MS_ABI)
+  (TARGET_64BIT && ix86_function_type_abi (FNTYPE) == MS_ABI)
 
 /* Define how to find the value returned by a library function
    assuming the value has mode MODE.  */
index 4f8a63a35006c07f015f7c7032354df0666edb75..d92a3e4c9e535915744a3dac252ac1b8877101a6 100644 (file)
@@ -26,6 +26,9 @@ along with GCC; see the file COPYING3.  If not see
 #define TARGET_VERSION fprintf (stderr," (x86 MinGW)");
 #endif
 
+#undef DEFAULT_ABI
+#define DEFAULT_ABI MS_ABI
+
 /* See i386/crtdll.h for an alternative definition. _INTEGRAL_MAX_BITS
    is for compatibility with native compiler.  */
 #define EXTRA_OS_CPP_BUILTINS()                                        \