From e2dcc2218c64ae1b6a774f52bd3aec87a6902b58 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Fri, 4 Mar 2022 12:07:57 -0500 Subject: [PATCH] [Libomptarget] Work around bug in initialization of libomptarget Libomptarget uses some shared variables to track certain internal stated in the runtime. This causes problems when we have code that contains no OpenMP kernels. These variables are normally initialized upon kernel entry, but if there are no kernels we will see no initialization. Currently we load the runtime into each source file when not running in LTO mode, so these variables will be erroneously considered undefined or dead and removed, causing miscompiles. This patch temporarily works around the most obvious case, but others still exhibit this problem. We will need to fix this more soundly later. Fixes #54208. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D121007 --- openmp/libomptarget/DeviceRTL/src/Mapping.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openmp/libomptarget/DeviceRTL/src/Mapping.cpp b/openmp/libomptarget/DeviceRTL/src/Mapping.cpp index 23615cb..21104be 100644 --- a/openmp/libomptarget/DeviceRTL/src/Mapping.cpp +++ b/openmp/libomptarget/DeviceRTL/src/Mapping.cpp @@ -258,7 +258,10 @@ uint32_t mapping::getNumberOfProcessorElements() { /// Execution mode /// ///{ -static int SHARED(IsSPMDMode); + +// TODO: This is a workaround for initialization coming from kernels outside of +// the TU. We will need to solve this more correctly in the future. +int __attribute__((used, retain, weak)) SHARED(IsSPMDMode); void mapping::init(bool IsSPMD) { if (mapping::isInitialThreadInLevel0(IsSPMD)) -- 2.7.4