Skip to content

Commit 05d6648

Browse files
committed
[Offload] Allow querying the size of globals
The `GlobalTy` helper has been extended to make both the Size and Ptr be optional. Now `getGlobalMetadataFromDevice`/`Image` is able to write the size of the global to the struct, instead of just verifying it.
1 parent 92fbfc2 commit 05d6648

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

offload/plugins-nextgen/amdgpu/src/rtl.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3089,15 +3089,16 @@ struct AMDGPUGlobalHandlerTy final : public GenericGlobalHandlerTy {
30893089
}
30903090

30913091
// Check the size of the symbol.
3092-
if (SymbolSize != DeviceGlobal.getSize())
3092+
if (DeviceGlobal.hasSize() && SymbolSize != DeviceGlobal.getSize())
30933093
return Plugin::error(
30943094
ErrorCode::INVALID_BINARY,
30953095
"failed to load global '%s' due to size mismatch (%zu != %zu)",
30963096
DeviceGlobal.getName().data(), SymbolSize,
30973097
(size_t)DeviceGlobal.getSize());
30983098

3099-
// Store the symbol address on the device global metadata.
3099+
// Store the symbol address and size on the device global metadata.
31003100
DeviceGlobal.setPtr(reinterpret_cast<void *>(SymbolAddr));
3101+
DeviceGlobal.setSize(SymbolSize);
31013102

31023103
return Plugin::success();
31033104
}

offload/plugins-nextgen/common/include/GlobalHandler.h

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
4042
class 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

4749
public:
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;

offload/plugins-nextgen/cuda/src/rtl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1355,13 +1355,15 @@ class CUDAGlobalHandlerTy final : public GenericGlobalHandlerTy {
13551355
GlobalName))
13561356
return Err;
13571357

1358-
if (CUSize != DeviceGlobal.getSize())
1358+
if (DeviceGlobal.hasSize() && CUSize != DeviceGlobal.getSize())
13591359
return Plugin::error(
13601360
ErrorCode::INVALID_BINARY,
13611361
"failed to load global '%s' due to size mismatch (%zu != %zu)",
13621362
GlobalName, CUSize, (size_t)DeviceGlobal.getSize());
13631363

13641364
DeviceGlobal.setPtr(reinterpret_cast<void *>(CUPtr));
1365+
DeviceGlobal.setSize(CUSize);
1366+
13651367
return Plugin::success();
13661368
}
13671369
};

0 commit comments

Comments
 (0)