mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-22 11:41:07 +08:00
GCN: libgomp+mkoffload.cc: Prepare for reverse offload fn lookup
Add support to GCN for reverse lookup of function name to prepare for 'omp target device(ancestor:1)'. gcc/ChangeLog: * config/gcn/mkoffload.cc (process_asm): Create .offload_func_table, similar to pre-existing .offload_var_table. libgomp/ChangeLog: * plugin/plugin-gcn.c (GOMP_OFFLOAD_load_image): Read .offload_func_table to populate rev_fn_table when requested.
This commit is contained in:
parent
0fcc0cf9dc
commit
dfd75bf7e9
@ -553,6 +553,7 @@ process_asm (FILE *in, FILE *out, FILE *cfile)
|
||||
char *funcname;
|
||||
if (sscanf (buf, "\t.8byte\t%ms\n", &funcname))
|
||||
{
|
||||
fputs (buf, out);
|
||||
obstack_ptr_grow (&fns_os, funcname);
|
||||
fn_count++;
|
||||
continue;
|
||||
@ -577,7 +578,15 @@ process_asm (FILE *in, FILE *out, FILE *cfile)
|
||||
out);
|
||||
}
|
||||
else if (sscanf (buf, " .section .gnu.offload_funcs%c", &dummy) > 0)
|
||||
state = IN_FUNCS;
|
||||
{
|
||||
state = IN_FUNCS;
|
||||
/* Likewise for .gnu.offload_vars; used for reverse offload. */
|
||||
fputs (buf, out);
|
||||
fputs ("\t.global .offload_func_table\n"
|
||||
"\t.type .offload_func_table, @object\n"
|
||||
".offload_func_table:\n",
|
||||
out);
|
||||
}
|
||||
else if (sscanf (buf, " .amdgpu_metadata%c", &dummy) > 0)
|
||||
{
|
||||
state = IN_METADATA;
|
||||
|
@ -3353,7 +3353,7 @@ GOMP_OFFLOAD_init_device (int n)
|
||||
int
|
||||
GOMP_OFFLOAD_load_image (int ord, unsigned version, const void *target_data,
|
||||
struct addr_pair **target_table,
|
||||
uint64_t **rev_fn_table __attribute__((unused)))
|
||||
uint64_t **rev_fn_table)
|
||||
{
|
||||
if (GOMP_VERSION_DEV (version) != GOMP_VERSION_GCN)
|
||||
{
|
||||
@ -3525,6 +3525,30 @@ GOMP_OFFLOAD_load_image (int ord, unsigned version, const void *target_data,
|
||||
if (module->fini_array_func)
|
||||
kernel_count--;
|
||||
|
||||
if (rev_fn_table != NULL && kernel_count == 0)
|
||||
*rev_fn_table = NULL;
|
||||
else if (rev_fn_table != NULL)
|
||||
{
|
||||
hsa_status_t status;
|
||||
hsa_executable_symbol_t var_symbol;
|
||||
status = hsa_fns.hsa_executable_get_symbol_fn (agent->executable, NULL,
|
||||
".offload_func_table",
|
||||
agent->id, 0, &var_symbol);
|
||||
if (status != HSA_STATUS_SUCCESS)
|
||||
hsa_fatal ("Could not find symbol for variable in the code object",
|
||||
status);
|
||||
uint64_t fn_table_addr;
|
||||
status = hsa_fns.hsa_executable_symbol_get_info_fn
|
||||
(var_symbol, HSA_EXECUTABLE_SYMBOL_INFO_VARIABLE_ADDRESS,
|
||||
&fn_table_addr);
|
||||
if (status != HSA_STATUS_SUCCESS)
|
||||
hsa_fatal ("Could not extract a variable from its symbol", status);
|
||||
*rev_fn_table = GOMP_PLUGIN_malloc (kernel_count * sizeof (uint64_t));
|
||||
GOMP_OFFLOAD_dev2host (agent->device_id, *rev_fn_table,
|
||||
(void*) fn_table_addr,
|
||||
kernel_count * sizeof (uint64_t));
|
||||
}
|
||||
|
||||
return kernel_count + var_count + other_count;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user