@@ -37,20 +37,33 @@ using namespace llvm::object;
3737// / Common abstraction for globals that live on the host and device.
3838// / It simply encapsulates the symbol name, symbol size, and symbol address
3939// / (which might be host or device depending on the context).
40+ // / Both size and address may be absent, and can be populated with
41+ // getGlobalMetadataFromDevice/Image.
4042class GlobalTy {
4143 // NOTE: Maybe we can have a pointer to the offload entry name instead of
4244 // holding a private copy of the name as a std::string.
4345 std::string Name;
44- uint32_t Size;
45- void *Ptr;
46+ std::optional< uint32_t > Size;
47+ std::optional< void *> Ptr;
4648
4749public:
48- GlobalTy (const std::string &Name, uint32_t Size, void *Ptr = nullptr )
50+ GlobalTy (const std::string &Name) : Name(Name) {}
51+ GlobalTy (const std::string &Name, uint32_t Size) : Name(Name), Size(Size) {}
52+ GlobalTy (const std::string &Name, uint32_t Size, void *Ptr)
4953 : Name(Name), Size(Size), Ptr(Ptr) {}
5054
5155 const std::string &getName () const { return Name; }
52- uint32_t getSize () const { return Size; }
53- void *getPtr () const { return Ptr; }
56+ uint32_t getSize () const {
57+ assert (hasSize () && " Size not initialised" );
58+ return *Size;
59+ }
60+ void *getPtr () const {
61+ assert (hasPtr () && " Ptr not initialised" );
62+ return *Ptr;
63+ }
64+
65+ bool hasSize () const { return Size.has_value (); }
66+ bool hasPtr () const { return Ptr.has_value (); }
5467
5568 void setSize (int32_t S) { Size = S; }
5669 void setPtr (void *P) { Ptr = P; }
@@ -139,8 +152,11 @@ class GenericGlobalHandlerTy {
139152 bool isSymbolInImage (GenericDeviceTy &Device, DeviceImageTy &Image,
140153 StringRef SymName);
141154
142- // / Get the address and size of a global in the image. Address and size are
143- // / return in \p ImageGlobal, the global name is passed in \p ImageGlobal.
155+ // / Get the address and size of a global in the image. Address is
156+ // / returned in \p ImageGlobal and the global name is passed in \p
157+ // / ImageGlobal. If no size is present in \p ImageGlobal, then the size of the
158+ // / global will be stored there. If it is present, it will be validated
159+ // / against the real size of the global.
144160 Error getGlobalMetadataFromImage (GenericDeviceTy &Device,
145161 DeviceImageTy &Image, GlobalTy &ImageGlobal);
146162
@@ -149,9 +165,11 @@ class GenericGlobalHandlerTy {
149165 Error readGlobalFromImage (GenericDeviceTy &Device, DeviceImageTy &Image,
150166 const GlobalTy &HostGlobal);
151167
152- // / Get the address and size of a global from the device. Address is return in
153- // / \p DeviceGlobal, the global name and expected size are passed in
154- // / \p DeviceGlobal.
168+ // / Get the address and size of a global from the device. Address is
169+ // / returned in \p ImageGlobal and the global name is passed in \p
170+ // / ImageGlobal. If no size is present in \p ImageGlobal, then the size of the
171+ // / global will be stored there. If it is present, it will be validated
172+ // / against the real size of the global.
155173 virtual Error getGlobalMetadataFromDevice (GenericDeviceTy &Device,
156174 DeviceImageTy &Image,
157175 GlobalTy &DeviceGlobal) = 0;
0 commit comments