[llvm] [OFFLOAD][L0] Return symbol size in getGlobalMetadataFromDevice (PR #201352)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 3 06:11:27 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-offload

Author: Alex Duran (adurang)

<details>
<summary>Changes</summary>

Return not just the address but also the size of the symbols in getGlobalMetadataFromDevice.
Fixes olGetSymbolInfoSizeGlobalTest.SuccessSize unitt test failure with L0 plugin.

---
Full diff: https://github.com/llvm/llvm-project/pull/201352.diff


3 Files Affected:

- (modified) offload/plugins-nextgen/level_zero/include/L0Program.h (+4-2) 
- (modified) offload/plugins-nextgen/level_zero/src/L0Program.cpp (+22-18) 
- (modified) offload/unittests/OffloadAPI/symbol/olGetSymbolInfo.cpp (-2) 


``````````diff
diff --git a/offload/plugins-nextgen/level_zero/include/L0Program.h b/offload/plugins-nextgen/level_zero/include/L0Program.h
index 2658ab10ca5c1..037464b31fc17 100644
--- a/offload/plugins-nextgen/level_zero/include/L0Program.h
+++ b/offload/plugins-nextgen/level_zero/include/L0Program.h
@@ -105,8 +105,10 @@ class L0ProgramTy : public DeviceImageTy {
   /// specified global variable name.
   Error writeGlobalVariable(const char *Name, size_t Size, const void *HostPtr);
 
-  /// Looks up a device global symbol with the given \p Name in the device.
-  Expected<void *> getSymbolDeviceAddr(const char *Name) const;
+  /// Looks up a device global symbol with the given \p Name in the device and
+  /// returns its address and size in \p Addr and \p SizePtr respectively.
+  Error getSymbolMetadata(const char *Name, void **AddrPtr,
+                          size_t *SizePtr) const;
 
   /// Returns the handle of a module that contains a given Kernel name.
   ze_module_handle_t findModuleFromKernelName(const char *KernelName) const {
diff --git a/offload/plugins-nextgen/level_zero/src/L0Program.cpp b/offload/plugins-nextgen/level_zero/src/L0Program.cpp
index 7390a95b3a040..f9089799ef9e9 100644
--- a/offload/plugins-nextgen/level_zero/src/L0Program.cpp
+++ b/offload/plugins-nextgen/level_zero/src/L0Program.cpp
@@ -29,14 +29,17 @@ Error L0GlobalHandlerTy::getGlobalMetadataFromDevice(GenericDeviceTy &Device,
                                                      DeviceImageTy &Image,
                                                      GlobalTy &DeviceGlobal) {
   const char *GlobalName = DeviceGlobal.getName().data();
+  size_t SymbolSize = 0;
+  void *SymbolAddr = nullptr;
 
   L0ProgramTy &Program = L0ProgramTy::makeL0Program(Image);
-  auto AddrOrErr = Program.getSymbolDeviceAddr(GlobalName);
-  if (!AddrOrErr)
-    return AddrOrErr.takeError();
+  if (auto Err =
+          Program.getSymbolMetadata(GlobalName, &SymbolAddr, &SymbolSize))
+    return Err;
 
   // Save the pointer to the symbol allowing nullptr.
-  DeviceGlobal.setPtr(*AddrOrErr);
+  DeviceGlobal.setPtr(SymbolAddr);
+  DeviceGlobal.setSize(SymbolSize);
 
   return Plugin::success();
 }
@@ -537,27 +540,28 @@ Expected<std::unique_ptr<MemoryBuffer>> L0ProgramBuilderTy::getELF() {
       /*BufferName=*/"L0Program ELF");
 }
 
-Expected<void *> L0ProgramTy::getSymbolDeviceAddr(const char *CName) const {
-  ODBG(OLDT_Module) << "Looking up OpenMP global variable '" << CName << "'.";
-
-  if (!GlobalModule || !CName)
+Error L0ProgramTy::getSymbolMetadata(const char *Name, void **AddrPtr,
+                                     size_t *SizePtr) const {
+  if (!Name)
     return Plugin::error(ErrorCode::INVALID_ARGUMENT,
                          "Invalid arguments to getSymbolDeviceAddr");
 
-  size_t SizeDummy = 0;
-  void *DevicePtr = nullptr;
+  size_t SymbolSize = 0;
+  void *SymbolAddr = nullptr;
   ze_result_t RC;
   for (auto Module : Modules) {
-    CALL_ZE(RC, zeModuleGetGlobalPointer, Module, CName, &SizeDummy,
-            &DevicePtr);
-    if (RC == ZE_RESULT_SUCCESS && DevicePtr)
-      return DevicePtr;
-    CALL_ZE(RC, zeModuleGetFunctionPointer, Module, CName, &DevicePtr);
-    if (RC == ZE_RESULT_SUCCESS && DevicePtr)
-      return DevicePtr;
+    CALL_ZE(RC, zeModuleGetGlobalPointer, Module, Name, &SymbolSize,
+            &SymbolAddr);
+    if (RC == ZE_RESULT_SUCCESS && SymbolAddr) {
+      if (AddrPtr)
+        *AddrPtr = SymbolAddr;
+      if (SizePtr)
+        *SizePtr = SymbolSize;
+      return Plugin::success();
+    }
   }
   return Plugin::error(ErrorCode::NOT_FOUND, "symbol '%s' not found on device",
-                       CName);
+                       Name);
 }
 
 Error L0ProgramTy::readGlobalVariable(const char *Name, size_t Size,
diff --git a/offload/unittests/OffloadAPI/symbol/olGetSymbolInfo.cpp b/offload/unittests/OffloadAPI/symbol/olGetSymbolInfo.cpp
index f77197018e572..ed8f4716974cd 100644
--- a/offload/unittests/OffloadAPI/symbol/olGetSymbolInfo.cpp
+++ b/offload/unittests/OffloadAPI/symbol/olGetSymbolInfo.cpp
@@ -52,8 +52,6 @@ TEST_P(olGetSymbolInfoKernelTest, InvalidSize) {
 }
 
 TEST_P(olGetSymbolInfoGlobalTest, SuccessSize) {
-  SKIP_KNOWN_FAILURE(LevelZero{"unsupported feature"});
-
   size_t RetrievedSize = 0;
   ASSERT_SUCCESS(olGetSymbolInfo(Global, OL_SYMBOL_INFO_GLOBAL_VARIABLE_SIZE,
                                  sizeof(RetrievedSize), &RetrievedSize));

``````````

</details>


https://github.com/llvm/llvm-project/pull/201352


More information about the llvm-commits mailing list