> Index: libgomp/libgomp.map > =================================================================== > --- libgomp/libgomp.map (revision 226039) > +++ libgomp/libgomp.map (working copy) > @@ -234,6 +234,12 @@ GOMP_4.0.1 { > GOMP_offload_unregister; > } GOMP_4.0; > > +GOMP_4.0.2 { > + global: > + GOMP_offload_register_ver; > + GOMP_offload_unregister_ver; > +} GOMP_4.0.1; > +
This will hopefully be just GOMP_4.1 instead in the end, but it can change when gomp-4_1-branch is merged to trunk, we don't guarantee ABI stability at this point. > @@ -642,7 +643,8 @@ gomp_update (struct gomp_device_descr *d > emitting variable and functions in the same order. */ > > static void > -gomp_load_image_to_device (struct gomp_device_descr *devicep, > +gomp_load_image_to_device (unsigned version, > + struct gomp_device_descr *devicep, I'd prefer version to go after devicep argument rather than before. > const void *host_table, const void *target_data, > bool is_register_lock) > { > @@ -658,16 +660,28 @@ gomp_load_image_to_device (struct gomp_d > > /* Load image to device and get target addresses for the image. */ > struct addr_pair *target_table = NULL; > - int i, num_target_entries > - = devicep->load_image_func (devicep->target_id, target_data, > - &target_table); > + int i, num_target_entries; > + > + if (devicep->version_func) > + num_target_entries > + = devicep->load_image.ver_func (version, devicep->target_id, > + target_data, &target_table); > + else if (GOMP_VERSION_DEV (version)) > + gomp_fatal ("Plugin too old for offload data (0 < %u)", > + GOMP_VERSION_DEV (version)); > + else > + num_target_entries > + = devicep->load_image.unver_func (devicep->target_id, > + target_data, &target_table); And really don't have ver_func vs. unver_func, just a single callback that will take the version argument too (again, if possible after target_id). > static void > -gomp_unload_image_from_device (struct gomp_device_descr *devicep, > +gomp_unload_image_from_device (unsigned version, > + struct gomp_device_descr *devicep, > const void *host_table, const void *target_data) > { > void **host_func_table = ((void ***) host_table)[0]; Likewise. > @@ -756,8 +771,12 @@ gomp_unload_image_from_device (struct go > k.host_end = k.host_start + 1; > node = splay_tree_lookup (&devicep->mem_map, &k); > } > - > - devicep->unload_image_func (devicep->target_id, target_data); > + > + if (devicep->version_func) > + devicep->unload_image.ver_func (version, > + devicep->target_id, target_data); > + else > + devicep->unload_image.unver_func (devicep->target_id, target_data); And here too. > @@ -815,13 +841,20 @@ GOMP_offload_register (const void *host_ > gomp_mutex_unlock (®ister_lock); > } > > +void > +GOMP_offload_register (const void *host_table, int target_type, > + const void *target_data) > +{ > + GOMP_offload_register_ver (0, host_table, target_type, target_data); > +} This is ok. > @@ -862,8 +903,9 @@ gomp_init_device (struct gomp_device_des > { > struct offload_image_descr *image = &offload_images[i]; > if (image->type == devicep->type) > - gomp_load_image_to_device (devicep, image->host_table, > - image->target_data, false); > + gomp_load_image_to_device (image->version, devicep, > + image->host_table, image->target_data, > + false); > } > > devicep->is_initialized = true; > @@ -881,7 +923,8 @@ gomp_unload_device (struct gomp_device_d > { > struct offload_image_descr *image = &offload_images[i]; > if (image->type == devicep->type) > - gomp_unload_image_from_device (devicep, image->host_table, > + gomp_unload_image_from_device (image->version, devicep, > + image->host_table, > image->target_data); Again, please swap the first two arguments. > + > + if (DLSYM_OPT (version, version)) I'd prefer requiring version always (i.e. DLSYM (version); plus the v != GOMP_VERSION checking). Jakub