From 5dcf8b1a879730d13d812c22c1d75644943ec4b6 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 (cherry picked from commit e2dcc2218c64ae1b6a774f52bd3aec87a6902b58) --- 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 7f9f837ae98e4..f08eceac2d647 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))