From 25662751d1b0c026bfd9790deb5c1c7cd1d2c8f9 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 8 Oct 2015 17:31:36 +0000 Subject: [PATCH] nvptx.h (struct machine_function): Add comment. * 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 | 7 +++++++ gcc/config/nvptx/nvptx.c | 33 ++++++++++++++------------------- gcc/config/nvptx/nvptx.h | 2 +- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b22f928415c..b2e4f6a37ee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-10-08 Nathan Sidwell + + * 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 * builtins.c (fold_builtin_sqrt, fold_builtin_cbrt): Delete. diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index e9177dcea17..57830c33f37 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -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;"; diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h index 60a922af93f..7ba39148982 100644 --- a/gcc/config/nvptx/nvptx.h +++ b/gcc/config/nvptx/nvptx.h @@ -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 -- 2.30.2