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
This commit is contained in:
parent
541a9b104b
commit
72b1108c3e
3 changed files with 40 additions and 27 deletions
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue