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

Joseph Huber via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 4 08:00:03 PDT 2022


jhuber6 added a comment.

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) { // Probably called by __tgt_unregister_lib_v2
    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.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D124525/new/

https://reviews.llvm.org/D124525



More information about the cfe-commits mailing list