From f9d1cd4ccf1189749a4231dda622a47d77b7725f Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 16 Jul 2015 17:17:31 +0000 Subject: libgomp/ * plugin/plugin-nvptx.c (link_ptx): Constify string argument. Workaround driver library const error. (struct nvptx_tdata, nvptx_tdata_t): New. (GOMP_OFFLOAD_load_image): Use struct for target_data's real type. gcc/ * config/nvptx/mkoffload.c (process): Constify mapping variables. Define target data struct and initialize it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@225897 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgomp/plugin/plugin-nvptx.c | 46 ++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'libgomp/plugin') diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c index b67d3015ca5..cfb143bc068 100644 --- a/libgomp/plugin/plugin-nvptx.c +++ b/libgomp/plugin/plugin-nvptx.c @@ -804,7 +804,7 @@ nvptx_get_num_devices (void) static void -link_ptx (CUmodule *module, char *ptx_code) +link_ptx (CUmodule *module, const char *ptx_code) { CUjit_option opts[7]; void *optvals[7]; @@ -874,7 +874,8 @@ link_ptx (CUmodule *module, char *ptx_code) cuda_error (r)); } - r = cuLinkAddData (linkstate, CU_JIT_INPUT_PTX, ptx_code, + /* cuLinkAddData's 'data' argument erroneously omits the const qualifier. */ + r = cuLinkAddData (linkstate, CU_JIT_INPUT_PTX, (char *)ptx_code, strlen (ptx_code) + 1, 0, 0, 0, 0); if (r != CUDA_SUCCESS) { @@ -1618,23 +1619,36 @@ GOMP_OFFLOAD_fini_device (int n) pthread_mutex_unlock (&ptx_dev_lock); } +/* Data emitted by mkoffload. */ + +typedef struct nvptx_tdata +{ + const char *ptx_src; + + const char *const *var_names; + size_t var_num; + + const char *const *fn_names; + size_t fn_num; +} nvptx_tdata_t; + int GOMP_OFFLOAD_load_image (int ord, void *target_data, struct addr_pair **target_table) { CUmodule module; - char **fn_names, **var_names; + const char *const *fn_names, *const *var_names; unsigned int fn_entries, var_entries, i, j; CUresult r; struct targ_fn_descriptor *targ_fns; - void **img_header = (void **) target_data; + nvptx_tdata_t const *img_header = (nvptx_tdata_t const *) target_data; struct ptx_image_data *new_image; GOMP_OFFLOAD_init_device (ord); nvptx_attach_host_thread_to_device (ord); - link_ptx (&module, img_header[0]); + link_ptx (&module, img_header->ptx_src); pthread_mutex_lock (&ptx_image_lock); new_image = GOMP_PLUGIN_malloc (sizeof (struct ptx_image_data)); @@ -1644,22 +1658,14 @@ GOMP_OFFLOAD_load_image (int ord, void *target_data, ptx_images = new_image; pthread_mutex_unlock (&ptx_image_lock); - /* The mkoffload utility emits a table of pointers/integers at the start of - each offload image: - - img_header[0] -> ptx code - img_header[1] -> number of variables - img_header[2] -> array of variable names (pointers to strings) - img_header[3] -> number of kernels - img_header[4] -> array of kernel names (pointers to strings) - - The array of kernel names and the functions addresses form a - one-to-one correspondence. */ + /* The mkoffload utility emits a struct of pointers/integers at the + start of each offload image. The array of kernel names and the + functions addresses form a one-to-one correspondence. */ - var_entries = (uintptr_t) img_header[1]; - var_names = (char **) img_header[2]; - fn_entries = (uintptr_t) img_header[3]; - fn_names = (char **) img_header[4]; + var_entries = img_header->var_num; + var_names = img_header->var_names; + fn_entries = img_header->fn_num; + fn_names = img_header->fn_names; *target_table = GOMP_PLUGIN_malloc (sizeof (struct addr_pair) * (fn_entries + var_entries)); -- cgit v1.2.1