Bernd,
this patch changes the offload target data type from an array of void *, to a
struct, which is somewhat easier to deal with than remembering numeric indices
and type casts.
This is step 1 in reworking the launch API.
ok?
nathan
2015-07-13 Nathan Sidwell <nat...@acm.org>
gcc/
* config/nvptx/mkoffload.c (process): Constify mapping variables.
Define target data struct and initialize it.
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.
Index: gcc/config/nvptx/mkoffload.c
===================================================================
--- gcc/config/nvptx/mkoffload.c (revision 225703)
+++ gcc/config/nvptx/mkoffload.c (working copy)
@@ -267,22 +267,30 @@ process (FILE *in, FILE *out)
}
fprintf (out, "\";\n\n");
- unsigned int nvars = 0, nfuncs = 0;
-
- fprintf (out, "static const char *var_mappings[] = {\n");
- for (id_map *id = var_ids; id; id = id->next, nvars++)
+ fprintf (out, "static const char *const var_mappings[] = {\n");
+ for (id_map *id = var_ids; id; id = id->next)
fprintf (out, "\t\"%s\"%s\n", id->ptx_name, id->next ? "," : "");
fprintf (out, "};\n\n");
- fprintf (out, "static const char *func_mappings[] = {\n");
- for (id_map *id = func_ids; id; id = id->next, nfuncs++)
+ fprintf (out, "static const char *const func_mappings[] = {\n");
+ for (id_map *id = func_ids; id; id = id->next)
fprintf (out, "\t\"%s\"%s\n", id->ptx_name, id->next ? "," : "");
fprintf (out, "};\n\n");
- fprintf (out, "static const void *target_data[] = {\n");
- fprintf (out, " ptx_code, (void *)(__UINTPTR_TYPE__)sizeof (ptx_code),\n");
- fprintf (out, " (void *) %u, var_mappings, (void *) %u, func_mappings\n",
- nvars, nfuncs);
- fprintf (out, "};\n\n");
+ fprintf (out,
+ "static struct nvptx_tdata {\n"
+ " const char *ptx_src;\n"
+ " __SIZE_TYPE__ ptx_len;\n"
+ " const char *const *var_names;\n"
+ " __SIZE_TYPE__ var_num;\n"
+ " const char *const *fn_names;\n"
+ " __SIZE_TYPE__ fn_num;\n"
+ "} target_data = {\n"
+ " ptx_code, sizeof (ptx_code),\n"
+ " var_mappings,"
+ " sizeof (var_mappings) / sizeof (var_mappings[0]),\n"
+ " func_mappings,"
+ " sizeof (func_mappings) / sizeof (func_mappings[0])\n"
+ "};\n\n");
fprintf (out, "#ifdef __cplusplus\n");
fprintf (out, "extern \"C\" {\n");
Index: libgomp/plugin/plugin-nvptx.c
===================================================================
--- libgomp/plugin/plugin-nvptx.c (revision 225703)
+++ libgomp/plugin/plugin-nvptx.c (working copy)
@@ -798,7 +798,7 @@ nvptx_get_num_devices (void)
static void
-link_ptx (CUmodule *module, char *ptx_code, size_t length)
+link_ptx (CUmodule *module, char const *ptx_code, size_t length)
{
CUjit_option opts[7];
void *optvals[7];
@@ -843,7 +843,9 @@ link_ptx (CUmodule *module, char *ptx_co
while (off < length)
{
int l = strlen (ptx_code + off);
- r = cuLinkAddData (linkstate, CU_JIT_INPUT_PTX, ptx_code + off, l + 1,
+ /* cuLinkAddData's 'data' argument erroneously omits the const
+ qualifier. */
+ r = cuLinkAddData (linkstate, CU_JIT_INPUT_PTX, (char*)ptx_code + off, l + 1,
0, 0, 0, 0);
if (r != CUDA_SUCCESS)
{
@@ -1580,23 +1582,35 @@ GOMP_OFFLOAD_fini_device (int n)
pthread_mutex_unlock (&ptx_dev_lock);
}
+typedef struct nvptx_tdata
+{
+ const char *ptx_src;
+ size_t ptx_len;
+
+ 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], (size_t) img_header[1]);
+ link_ptx (&module, img_header->ptx_src, img_header->ptx_len);
pthread_mutex_lock (&ptx_image_lock);
new_image = GOMP_PLUGIN_malloc (sizeof (struct ptx_image_data));
@@ -1606,23 +1620,15 @@ GOMP_OFFLOAD_load_image (int ord, void *
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] -> size of ptx code
- img_header[2] -> number of variables
- img_header[3] -> array of variable names (pointers to strings)
- img_header[4] -> number of kernels
- img_header[5] -> array of kernel names (pointers to strings)
-
- The array of kernel names and the functions addresses form a
- one-to-one correspondence. */
-
- var_entries = (uintptr_t) img_header[2];
- var_names = (char **) img_header[3];
- fn_entries = (uintptr_t) img_header[4];
- fn_names = (char **) img_header[5];
+
+ /* 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 = 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));