nvptx.c (nvptx_mangle_decl_assembler_name): New.
authorNathan Sidwell <nathan@acm.org>
Fri, 13 May 2016 15:51:24 +0000 (15:51 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 13 May 2016 15:51:24 +0000 (15:51 +0000)
* 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
gcc/config/nvptx/nvptx.c
gcc/langhooks.c

index 005b7010f5b528d937f46adad631bb72618c2a5d..b4110a78336e323e317b5886a35a085d5d84ed6f 100644 (file)
@@ -1,5 +1,13 @@
 2016-05-13  Nathan Sidwell  <nathan@acm.org>
 
+       * 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.
 
index 1631dae8fd9788594c08918b00f925c607cef660..85f85bb6404dfe0bc0fe4f8565d1f5249e9ccb53 100644 (file)
@@ -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
index 644463138a923046d9df3641910fbf84204107b5..3256a9d10cc18d44f153b23c63b46635772e878e 100644 (file)
@@ -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);
     }