[NDS32] No need to take padding into consideration in Andes ABI2 because we can...
authorChung-Ju Wu <jasonwucj@gmail.com>
Wed, 3 Sep 2014 10:19:39 +0000 (10:19 +0000)
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>
Wed, 3 Sep 2014 10:19:39 +0000 (10:19 +0000)
[NDS32] No need to take padding into consideration in Andes ABI2 because
        we can pass arguments in registers for variadic function.

  -- By default GCC uses must_pass_in_stack_var_size_or_pad for TARGET_MUST_PASS_IN_STACK.
     For Andes ABI2, the data layout in memory will be incorrect when calling variadic function
     under big-endian configuration.

* config/nds32/nds32.c (nds32_must_pass_in_stack): New implementation
for TARGET_MUST_PASS_IN_STACK.

From-SVN: r214869

gcc/ChangeLog
gcc/config/nds32/nds32.c

index 2ea7792588a5301c5b11e614c77e79524fc47fb6..cfec7b4c32f8ac96ca7740da143f67a032d1985d 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-03  Chung-Ju Wu  <jasonwucj@gmail.com>
+
+       * config/nds32/nds32.c (nds32_must_pass_in_stack): New implementation
+       for TARGET_MUST_PASS_IN_STACK.
+
 2014-09-03  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32.c (nds32_arg_partial_bytes): New implementation
index fdd4fd4151ba64db3a73cec6511116f5ab784ab9..062e803e4a5cd7fd895d7dfb356a8e5dd429dab0 100644 (file)
@@ -1352,6 +1352,19 @@ nds32_function_arg (cumulative_args_t ca, enum machine_mode mode,
   return NULL_RTX;
 }
 
+static bool
+nds32_must_pass_in_stack (enum machine_mode mode, const_tree type)
+{
+  /* Return true if a type must be passed in memory.
+     If it is NOT using hard float abi, small aggregates can be
+     passed in a register even we are calling a variadic function.
+     So there is no need to take padding into consideration.  */
+  if (TARGET_HARD_FLOAT)
+    return must_pass_in_stack_var_size_or_pad (mode, type);
+  else
+    return must_pass_in_stack_var_size (mode, type);
+}
+
 static int
 nds32_arg_partial_bytes (cumulative_args_t ca, enum machine_mode mode,
                         tree type, bool named ATTRIBUTE_UNUSED)
@@ -3498,6 +3511,9 @@ nds32_target_alignment (rtx label)
 #undef TARGET_FUNCTION_ARG
 #define TARGET_FUNCTION_ARG nds32_function_arg
 
+#undef TARGET_MUST_PASS_IN_STACK
+#define TARGET_MUST_PASS_IN_STACK nds32_must_pass_in_stack
+
 #undef TARGET_ARG_PARTIAL_BYTES
 #define TARGET_ARG_PARTIAL_BYTES nds32_arg_partial_bytes