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

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to