nvptx.h (struct machine_function): Add comment.
authorNathan Sidwell <nathan@acm.org>
Thu, 8 Oct 2015 17:31:36 +0000 (17:31 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 8 Oct 2015 17:31:36 +0000 (17:31 +0000)
* config/nvptx/nvptx.h (struct machine_function): Add comment.
* config/nvptx/nvptx.c (nvptx_declare_function_name): Functions
may return pointer as well as in memory.
(nvptx_output_return): Likewise.

From-SVN: r228618

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/config/nvptx/nvptx.h

index b22f928415ca24da2d3d27f58962b7ad3815c48f..b2e4f6a37eef59a5da3290f16d64df943dbac4cd 100644 (file)
@@ -1,3 +1,10 @@
+2015-10-08  Nathan Sidwell  <nathan@acm.org>
+
+       * config/nvptx/nvptx.h (struct machine_function): Add comment.
+       * config/nvptx/nvptx.c (nvptx_declare_function_name): Functions
+       may return pointer as well as in memory.
+       (nvptx_output_return): Likewise.
+
 2015-10-08  Richard Sandiford  <richard.sandiford@arm.com>
 
        * builtins.c (fold_builtin_sqrt, fold_builtin_cbrt): Delete.
index e9177dcea17d6d3e86b4a228f6fb3eb3c5159e06..57830c33f372bce472d04a3b9020ed2945b650b2 100644 (file)
@@ -531,13 +531,8 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
   nvptx_write_function_decl (s, name, decl);
   fprintf (file, "%s", s.str().c_str());
 
-  bool return_in_mem = false;
-  if (TYPE_MODE (result_type) != VOIDmode)
-    {
-      machine_mode mode = TYPE_MODE (result_type);
-      if (!RETURN_IN_REG_P (mode))
-       return_in_mem = true;
-    }
+  bool return_in_mem = (TYPE_MODE (result_type) != VOIDmode
+                       && !RETURN_IN_REG_P (TYPE_MODE (result_type)));
 
   fprintf (file, "\n{\n");
 
@@ -547,9 +542,13 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
                       false, return_in_mem);
   if (return_in_mem)
     fprintf (file, "\t.reg.u%d %%ar1;\n", GET_MODE_BITSIZE (Pmode));
-  else if (TYPE_MODE (result_type) != VOIDmode)
+
+  /* C++11 ABI causes us to return a reference to the passed in
+     pointer for return_in_mem.  */
+  if (cfun->machine->ret_reg_mode != VOIDmode)
     {
-      machine_mode mode = arg_promotion (TYPE_MODE (result_type));
+      machine_mode mode = arg_promotion
+       ((machine_mode)cfun->machine->ret_reg_mode);
       fprintf (file, "\t.reg%s %%retval;\n",
               nvptx_ptx_type_from_mode (mode, false));
     }
@@ -635,17 +634,13 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
 const char *
 nvptx_output_return (void)
 {
-  tree fntype = TREE_TYPE (current_function_decl);
-  tree result_type = TREE_TYPE (fntype);
-  if (TYPE_MODE (result_type) != VOIDmode)
+  machine_mode mode = (machine_mode)cfun->machine->ret_reg_mode;
+
+  if (mode != VOIDmode)
     {
-      machine_mode mode = TYPE_MODE (result_type);
-      if (RETURN_IN_REG_P (mode))
-       {
-         mode = arg_promotion (mode);
-         fprintf (asm_out_file, "\tst.param%s\t[%%out_retval], %%retval;\n",
-                  nvptx_ptx_type_from_mode (mode, false));
-       }
+      mode = arg_promotion (mode);
+      fprintf (asm_out_file, "\tst.param%s\t[%%out_retval], %%retval;\n",
+              nvptx_ptx_type_from_mode (mode, false));
     }
 
   return "ret;";
index 60a922af93fec96dae016783b3aff025f88b5f00..7ba39148982a760717765cf8b74ae16f688ba8cc 100644 (file)
@@ -228,7 +228,7 @@ struct GTY(()) machine_function
   bool has_call_with_varargs;
   bool has_call_with_sc;
   HOST_WIDE_INT outgoing_stdarg_size;
-  int ret_reg_mode;
+  int ret_reg_mode; /* machine_mode not defined yet. */
   int punning_buffer_size;
 };
 #endif