From 72b1108c3e698b2699331ce18c46ac03b050191f Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 13 May 2016 15:51:24 +0000 Subject: [PATCH] nvptx.c (nvptx_mangle_decl_assembler_name): New. * config/nvptx/nvptx.c (nvptx_mangle_decl_assembler_name): New. (nvptx_name_replacement): Delete. (write_fn_proto, write_fn_proto_from_insn, nvptx_output_call_insn): Remove nvptx_name_replacement call. (TARGET_MANGLE_DECL_ASSEMBLER_NAME): Override. * langhooks.c (add_builtin_funcction_common): Call targetm.mangle_decl_assembler_name. From-SVN: r236212 --- gcc/ChangeLog | 8 ++++++ gcc/config/nvptx/nvptx.c | 57 +++++++++++++++++++++------------------- gcc/langhooks.c | 2 ++ 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 005b7010f5b..b4110a78336 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2016-05-13 Nathan Sidwell + * config/nvptx/nvptx.c (nvptx_mangle_decl_assembler_name): New. + (nvptx_name_replacement): Delete. + (write_fn_proto, write_fn_proto_from_insn, + nvptx_output_call_insn): Remove nvptx_name_replacement call. + (TARGET_MANGLE_DECL_ASSEMBLER_NAME): Override. + * langhooks.c (add_builtin_funcction_common): Call + targetm.mangle_decl_assembler_name. + * config/nvptx/nvptx.c (write_fn_proto): Handle BUILT_IN_ATOMIC_COMPARE_EXCHANGE_n oddity. diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 1631dae8fd9..85f85bb6404 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -211,6 +211,31 @@ nvptx_ptx_type_from_mode (machine_mode mode, bool promote) } } +/* Return an identifier node for DECL. Usually thee default mangled + name ID is useable. Some names cannot be used directly, so prefix + them with __nvptx_. */ + +static tree +nvptx_mangle_decl_assembler_name (tree ARG_UNUSED (decl), tree id) +{ + static const char *const bad_names[] = + {"call", "malloc", "free", "realloc", 0}; + int ix; + const char *name = IDENTIFIER_POINTER (id); + + for (ix = 0; bad_names[ix]; ix++) + if (!strcmp (bad_names[ix], name)) + { + char *new_name = XALLOCAVEC (char, + strlen (name) + sizeof ("__nvptx_")); + sprintf (new_name, "__nvptx_%s", name); + id = get_identifier (new_name); + break; + } + + return id; +} + /* Encode the PTX data area that DECL (which might not actually be a _DECL) should reside in. */ @@ -256,24 +281,6 @@ section_for_decl (const_tree decl) return section_for_sym (XEXP (DECL_RTL (CONST_CAST (tree, decl)), 0)); } -/* Check NAME for special function names and redirect them by returning a - replacement. This applies to malloc, free and realloc, for which we - want to use libgcc wrappers, and call, which triggers a bug in ptxas. */ - -static const char * -nvptx_name_replacement (const char *name) -{ - if (strcmp (name, "call") == 0) - return "__nvptx_call"; - if (strcmp (name, "malloc") == 0) - return "__nvptx_malloc"; - if (strcmp (name, "free") == 0) - return "__nvptx_free"; - if (strcmp (name, "realloc") == 0) - return "__nvptx_realloc"; - return name; -} - /* If MODE should be treated as two registers of an inner mode, return that inner mode. Otherwise return VOIDmode. */ @@ -731,13 +738,8 @@ write_fn_proto (std::stringstream &s, bool is_defn, if (is_defn) /* Emit a declaration. The PTX assembler gets upset without it. */ name = write_fn_proto (s, false, name, decl); - else - { - /* Avoid repeating the name replacement. */ - name = nvptx_name_replacement (name); - if (name[0] == '*') - name++; - } + else if (name[0] == '*') + name++; write_fn_marker (s, is_defn, TREE_PUBLIC (decl), name); @@ -841,7 +843,6 @@ write_fn_proto_from_insn (std::stringstream &s, const char *name, } else { - name = nvptx_name_replacement (name); write_fn_marker (s, false, true, name); s << "\t.extern .func "; } @@ -1859,7 +1860,6 @@ nvptx_output_call_insn (rtx_insn *insn, rtx result, rtx callee) if (decl) { const char *name = get_fnname_from_decl (decl); - name = nvptx_name_replacement (name); assemble_name (asm_out_file, name); } else @@ -4887,6 +4887,9 @@ nvptx_goacc_reduction (gcall *call) #undef TARGET_NO_REGISTER_ALLOCATION #define TARGET_NO_REGISTER_ALLOCATION true +#undef TARGET_MANGLE_DECL_ASSEMBLER_NAME +#define TARGET_MANGLE_DECL_ASSEMBLER_NAME nvptx_mangle_decl_assembler_name + #undef TARGET_ENCODE_SECTION_INFO #define TARGET_ENCODE_SECTION_INFO nvptx_encode_section_info #undef TARGET_RECORD_OFFLOAD_SYMBOL diff --git a/gcc/langhooks.c b/gcc/langhooks.c index 644463138a9..3256a9d10cc 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -561,6 +561,8 @@ add_builtin_function_common (const char *name, if (library_name) { tree libname = get_identifier (library_name); + + libname = targetm.mangle_decl_assembler_name (decl, libname); SET_DECL_ASSEMBLER_NAME (decl, libname); } -- 2.30.2