[Openmp-commits] [PATCH] D124525: [OpenMP][ClangLinkerWrapper] Extending linker wrapper to embed metadata for multi-arch fat binaries

Saiyedul Islam via Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Fri May 6 03:33:55 PDT 2022

saiislam added a comment.

In D124525#3491170 <https://reviews.llvm.org/D124525#3491170>, @jhuber6 wrote:

> I'm suggesting instead we define a new `__tgt_device_image` and a new `__tgt_register_lib` function to support this. This new `__tgt_device_image` will simply contain a pointer to an optional information struct.
>   struct __tgt_device_image_v2 {
>     void* 	ImageStart;
>     void* 	ImageEnd;
>     __tgt_offload_entry* 	EntriesBegin;
>     __tgt_offload_entry* 	EntriesEnd;
>     __tgt_image_into*  ImageInfo;
>   };
> This new struct breaks the ABI with the old `__tgt_device_image` because these are put into an array and we change the size, but we should be able to provide backwards compatibility by copying from the old format to the new format and creating a new array. We can detect the new vs. old ABI by expecting that existing applications will call the `__tgt_register_image` function. We will create a new `__tgt_register_image_v2` function for example that all new programs will call. In `libomptarget` we then change `__tgt_register_image` to do the necessary translation.
>   struct __tgt_bin_desc {                                                                                                                                                                  
>     int32_t NumDeviceImages;           // Number of device types supported                                                                                                                   
>     __tgt_device_image *DeviceImages;  // Array of device images (1 per dev. type)                                                        
>     __tgt_offload_entry *HostEntriesBegin; // Begin of table with all host entries                                                           
>     __tgt_offload_entry *HostEntriesEnd;   // End of table (non inclusive)                                                                                                           
>   };
>   EXTERN void __tgt_register_lib(__tgt_bin_desc *desc) {
>     __tgt_device_image_v2 *new_image = alloc_new_version(desc);
>     desc->DeviceImages = new_Image;
>     __tgt_register_lib_v2(desc);
>   }
>   EXTERN void __tgt_unregister_lib(__tgt_bin_desc *desc) {
>     __tgt_unregister_lib_v2(desc);
>     dealloc(desc->DeviceImages);
>   }
> Now the rest of `libomptarget` solely uses the new format, and we check if information is available by seeing that the `ImageInfo` field is non-null.

Thanks for the input. I am going to try it.

  rG LLVM Github Monorepo



More information about the Openmp-commits mailing list