[llvm] [offload][omp] link libomptarget against liboffload (PR #221730)

Alex Duran via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 7 06:48:48 PDT 2026


https://github.com/adurang created https://github.com/llvm/llvm-project/pull/221730

<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>

>From aabcb0de10d5acb9c755493789ee9bf4afe7c541 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 7 Sep 2026 02:42:07 -0700
Subject: [PATCH] [offload][omp] link libomptarget against liboffload

---
 format-changes.sh                      | 41 ++++++++++++++++++
 offload/liboffload/exports             | 58 ++++++++++++++++++++++++++
 offload/liboffload/src/OffloadImpl.cpp | 12 ++++--
 offload/libomptarget/CMakeLists.txt    | 10 ++---
 offload/libomptarget/exports           |  6 +++
 offload/libomptarget/interface.cpp     |  3 ++
 6 files changed, 122 insertions(+), 8 deletions(-)
 create mode 100755 format-changes.sh

diff --git a/format-changes.sh b/format-changes.sh
new file mode 100755
index 0000000000000..d9dbfcdf6b8c9
--- /dev/null
+++ b/format-changes.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+#
+# Helper script to format changed files with clang-format
+#
+
+CLANG_FORMAT="../build-release/bin/clang-format"
+
+if [ ! -x "$CLANG_FORMAT" ]; then
+    CLANG_FORMAT=$(which clang-format 2>/dev/null)
+    if [ -z "$CLANG_FORMAT" ]; then
+        echo "Error: clang-format not found"
+        exit 1
+    fi
+fi
+
+echo "Using clang-format: $CLANG_FORMAT"
+
+# Get the base branch (default to main)
+BASE_BRANCH="${1:-main}"
+
+# Get list of modified C/C++ files
+FILES=$(git diff --name-only --diff-filter=ACM "$BASE_BRANCH"...HEAD | \
+        grep -E '\.(c|cpp|cc|cxx|h|hpp|hxx)$' | \
+        grep -E '^(clang|llvm|mlir|offload|compiler-rt|lld|flang)/')
+
+if [ -z "$FILES" ]; then
+    echo "No C/C++ files to format"
+    exit 0
+fi
+
+echo "Formatting files:"
+for file in $FILES; do
+    if [ -f "$file" ]; then
+        echo "  - $file"
+        "$CLANG_FORMAT" -i "$file"
+    fi
+done
+
+echo ""
+echo "Done! Files have been formatted."
+echo "Review the changes with: git diff"
diff --git a/offload/liboffload/exports b/offload/liboffload/exports
index 168341aa7d938..5487e16168681 100644
--- a/offload/liboffload/exports
+++ b/offload/liboffload/exports
@@ -1,6 +1,64 @@
 VERS1.0 {
 global:
   ol*;
+  # Symbols currently used by libomptarget. They should be removed from here as
+  # they become replaced by calls to the liboffload API.
+  # No new symbols should be added here.
+  extern "C++" {
+    error::OffloadError::ID;
+    "error::OffloadErrCategory()";
+    "llvm::omp::target::RPCServerTy::registerCallback(unsigned int (*)(void*, unsigned int))";
+    "llvm::omp::target::plugin::GenericDeviceTy::dataFill(void*, void const*, long, long, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::async_barrier(omp_interop_val_t*)";
+    "llvm::omp::target::plugin::GenericPluginTy::create_event(int, void**)";
+    "llvm::omp::target::plugin::GenericPluginTy::create_interop(int, int, interop_spec_t*)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_alloc(int, long, void*, int)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_delete(int, void*, int)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_exchange(int, void*, int, void*, long)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_exchange_async(int, void*, int, void*, long, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_fence(int, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_lock(int, void*, long, void**)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_notify_mapped(int, void*, long)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_notify_unmapped(int, void*)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_retrieve_async(int, void*, void*, long, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_submit(int, void*, void*, long)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_submit_async(int, void*, void*, long, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::data_unlock(int, void*)";
+    "llvm::omp::target::plugin::GenericPluginTy::destroy_event(int, void*)";
+    "llvm::omp::target::plugin::GenericPluginTy::flush_queue(omp_interop_val_t*)";
+    "llvm::omp::target::plugin::GenericPluginTy::get_function(__tgt_device_binary, char const*, void**)";
+    "llvm::omp::target::plugin::GenericPluginTy::get_global(__tgt_device_binary, unsigned long, char const*, void**)";
+    "llvm::omp::target::plugin::GenericPluginTy::init()";
+    "llvm::omp::target::plugin::GenericPluginTy::deinit()";
+    "llvm::omp::target::plugin::GenericPluginTy::init_device(int)";
+    "llvm::omp::target::plugin::GenericPluginTy::initialize_record_replay(int, long, void*, bool, bool, bool, bool, char const*, char const*)";
+    "llvm::omp::target::plugin::GenericPluginTy::isDeviceCompatible(int, llvm::StringRef)";
+    "llvm::omp::target::plugin::GenericPluginTy::isPluginCompatible(llvm::StringRef)";
+    "llvm::omp::target::plugin::GenericPluginTy::is_accessible_ptr(int, void const*, unsigned long)";
+    "llvm::omp::target::plugin::GenericPluginTy::is_data_exchangable(int, int)";
+    "llvm::omp::target::plugin::GenericPluginTy::is_device_initialized(int) const";
+    "llvm::omp::target::plugin::GenericPluginTy::is_initialized() const";
+    "llvm::omp::target::plugin::GenericPluginTy::launch_kernel(int, void*, llvm::omp::target::plugin::KernelLaunchArgsTy&, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::load_binary(int, __tgt_device_image*, __tgt_device_binary*)";
+    "llvm::omp::target::plugin::GenericPluginTy::number_of_devices()";
+    "llvm::omp::target::plugin::GenericPluginTy::obtain_device_info(int)";
+    "llvm::omp::target::plugin::GenericPluginTy::print_device_info(int)";
+    "llvm::omp::target::plugin::GenericPluginTy::query_async(int, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::record_event(int, void*, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::release_interop(int, omp_interop_val_t*)";
+    "llvm::omp::target::plugin::GenericPluginTy::set_device_identifier(int, int)";
+    "llvm::omp::target::plugin::GenericPluginTy::sync_barrier(omp_interop_val_t*)";
+    "llvm::omp::target::plugin::GenericPluginTy::sync_event(int, void*)";
+    "llvm::omp::target::plugin::GenericPluginTy::synchronize(int, __tgt_async_info*)";
+    "llvm::omp::target::plugin::GenericPluginTy::use_auto_zero_copy(int)";
+    "llvm::omp::target::plugin::GenericPluginTy::wait_event(int, void*, __tgt_async_info*)";
+    llvm::omp::target::ompt::Initialized;
+    llvm::omp::target::ompt::lookupCallbackByCode;
+    llvm::omp::target::ompt::lookupCallbackByName;
+    createPlugin_*;
+    # Temporary helpers to help transition of libomptarget to liboffload.
+    __ol_tgt_setInfoFlag;
+  };
 local:
   *;
 };
diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp
index 11c07483b38aa..c2cf3db3bacbc 100644
--- a/offload/liboffload/src/OffloadImpl.cpp
+++ b/offload/liboffload/src/OffloadImpl.cpp
@@ -29,9 +29,9 @@
 #ifdef OMPT_SUPPORT
 namespace llvm::omp::target {
 namespace ompt {
-bool Initialized = false;
-ompt_get_callback_t lookupCallbackByCode = nullptr;
-ompt_function_lookup_t lookupCallbackByName = nullptr;
+LLVM_ATTRIBUTE_WEAK bool Initialized = false;
+LLVM_ATTRIBUTE_WEAK ompt_get_callback_t lookupCallbackByCode = nullptr;
+LLVM_ATTRIBUTE_WEAK ompt_function_lookup_t lookupCallbackByName = nullptr;
 } // namespace ompt
 } // namespace llvm::omp::target
 #endif
@@ -1479,5 +1479,11 @@ Error olQueryQueue_impl(ol_queue_handle_t Queue, bool *IsQueueWorkCompleted) {
   return Error::success();
 }
 
+// Temporary helpers to help transition of libomptarget to liboffload
+extern "C" void __ol_tgt_setInfoFlag(uint32_t NewInfoLevel) {
+  std::atomic<uint32_t> &InfoLevel = getInfoLevelInternal();
+  InfoLevel.store(NewInfoLevel);
+}
+
 } // namespace offload
 } // namespace llvm
diff --git a/offload/libomptarget/CMakeLists.txt b/offload/libomptarget/CMakeLists.txt
index 403b3e5dad269..d0b24c4ff4e65 100644
--- a/offload/libomptarget/CMakeLists.txt
+++ b/offload/libomptarget/CMakeLists.txt
@@ -28,8 +28,12 @@ else()
   llvm_map_components_to_libnames(llvm_libs FrontendOpenMP Support Object)
 endif()
 target_link_libraries(omptarget PRIVATE omp ${llvm_libs})
+target_link_libraries(omptarget PRIVATE LLVMOffload)
 target_include_directories(omptarget PRIVATE
-  ${LIBOMPTARGET_INCLUDE_DIR} ${LIBOMPTARGET_BINARY_INCLUDE_DIR}
+  ${LIBOMPTARGET_INCLUDE_DIR}
+  ${LIBOMPTARGET_BINARY_INCLUDE_DIR}
+  ${CMAKE_CURRENT_SOURCE_DIR}/../plugins-nextgen/common/include
+  ${CMAKE_CURRENT_BINARY_DIR}/../plugins-nextgen/common/include
 )
 
 if(LLVM_HAVE_LINK_VERSION_SCRIPT)
@@ -42,10 +46,6 @@ target_compile_definitions(omptarget PRIVATE
   DEBUG_PREFIX="omptarget"
 )
 
-foreach(plugin IN LISTS LIBOMPTARGET_PLUGINS_TO_BUILD)
-  target_link_libraries(omptarget PRIVATE omptarget.rtl.${plugin})
-endforeach()
-
 target_compile_options(omptarget PRIVATE ${offload_compile_flags})
 target_link_options(omptarget PRIVATE ${offload_link_flags})
 
diff --git a/offload/libomptarget/exports b/offload/libomptarget/exports
index 1831c43cc5f29..6aaddc64cf508 100644
--- a/offload/libomptarget/exports
+++ b/offload/libomptarget/exports
@@ -83,6 +83,12 @@ VERS1.0 {
     __llvmPushCallConfiguration;
     __llvmPopCallConfiguration;
     llvmLaunchKernel;
+    # OMPT symbols that currently need to be seen by liboffload.
+    extern "C++" {
+      llvm::omp::target::ompt::Initialized;
+      llvm::omp::target::ompt::lookupCallbackByCode;
+      llvm::omp::target::ompt::lookupCallbackByName;
+    };
   local:
     *;
 };
diff --git a/offload/libomptarget/interface.cpp b/offload/libomptarget/interface.cpp
index 5d7d948711b99..5b5cc310b1b31 100644
--- a/offload/libomptarget/interface.cpp
+++ b/offload/libomptarget/interface.cpp
@@ -585,10 +585,13 @@ EXTERN void __tgt_push_mapper_component(void *RtMapperHandle, void *Base,
       MapComponentInfoTy(Base, Begin, Size, Type, Name));
 }
 
+extern "C" void __ol_tgt_setInfoFlag(uint32_t NewInfoLevel);
 EXTERN void __tgt_set_info_flag(uint32_t NewInfoLevel) {
   assert(PM && "Runtime not initialized");
   std::atomic<uint32_t> &InfoLevel = getInfoLevelInternal();
   InfoLevel.store(NewInfoLevel);
+  // Notify the liboffload runtime about the new info level.
+  __ol_tgt_setInfoFlag(NewInfoLevel);
 }
 
 EXTERN int __tgt_print_device_info(int64_t DeviceId) {



More information about the llvm-commits mailing list