diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -3171,52 +3171,8 @@ return; } - llvm::NamedMDNode *MD = ME.get()->getNamedMetadata("omp_offload.info"); - if (!MD) - return; - - for (llvm::MDNode *MN : MD->operands()) { - auto &&GetMDInt = [MN](unsigned Idx) { - auto *V = cast(MN->getOperand(Idx)); - return cast(V->getValue())->getZExtValue(); - }; - - auto &&GetMDString = [MN](unsigned Idx) { - auto *V = cast(MN->getOperand(Idx)); - return V->getString(); - }; - - switch (GetMDInt(0)) { - default: - llvm_unreachable("Unexpected metadata!"); - break; - case llvm::OffloadEntriesInfoManager::OffloadEntryInfo:: - OffloadingEntryInfoTargetRegion: { - assert(CGM.getLangOpts().OpenMPIsDevice && "Initialization of entries is " - "only required for the " - "device code generation."); - llvm::TargetRegionEntryInfo EntryInfo(/*ParentName=*/GetMDString(3), - /*DeviceID=*/GetMDInt(1), - /*FileID=*/GetMDInt(2), - /*Line=*/GetMDInt(4)); - OffloadEntriesInfoManager.initializeTargetRegionEntryInfo( - EntryInfo, /*Order=*/GetMDInt(5)); - break; - } - case llvm::OffloadEntriesInfoManager::OffloadEntryInfo:: - OffloadingEntryInfoDeviceGlobalVar: - assert(CGM.getLangOpts().OpenMPIsDevice && "Initialization of entries is " - "only required for the " - "device code generation."); - OffloadEntriesInfoManager.initializeDeviceGlobalVarEntryInfo( - /*MangledName=*/GetMDString(1), - static_cast< - llvm::OffloadEntriesInfoManager::OMPTargetGlobalVarEntryKind>( - /*Flags=*/GetMDInt(2)), - /*Order=*/GetMDInt(3)); - break; - } - } + OMPBuilder.loadOffloadInfoMetadata(*ME.get(), OffloadEntriesInfoManager, + CGM.getLangOpts().OpenMPIsDevice); } void CGOpenMPRuntime::emitKmpRoutineEntryT(QualType KmpInt32Ty) { diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -1681,6 +1681,21 @@ BasicBlock *PreInsertBefore, BasicBlock *PostInsertBefore, const Twine &Name = {}); + + const std::string ompOffloadInfoName = "omp_offload.info"; + + /// Loads all the offload entries information from the host IR + /// metadata. + /// + /// \param M Module to load Metadata info from. Module passed maybe + /// loaded from bitcode file, i.e, different from OpenMPIRBuilder::M module. + /// \param OffloadEntriesInfoManager Initialize Offload Entry information. + /// \param isDevice Flag to check if code is generated only for OpenMP + /// target device. + void + loadOffloadInfoMetadata(Module &M, + OffloadEntriesInfoManager &OffloadEntriesInfoManager, + bool isDevice); }; /// Data structure to contain the information needed to uniquely identify diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -4705,6 +4705,61 @@ getTargetRegionEntryFnName(Name, ParentName, DeviceID, FileID, Line); } +/// Loads all the offload entries information from the host IR +/// metadata. +void OpenMPIRBuilder::loadOffloadInfoMetadata( + Module &M, OffloadEntriesInfoManager &OffloadEntriesInfoManager, + bool isDevice) { + // If we are in target mode, load the metadata from the host IR. This code has + // to match the metadaata creation in createOffloadEntriesAndInfoMetadata(). + + NamedMDNode *MD = M.getNamedMetadata("omp_offload.info"); + if (!MD) + return; + + for (MDNode *MN : MD->operands()) { + auto &&GetMDInt = [MN](unsigned Idx) { + auto *V = cast(MN->getOperand(Idx)); + return cast(V->getValue())->getZExtValue(); + }; + + auto &&GetMDString = [MN](unsigned Idx) { + auto *V = cast(MN->getOperand(Idx)); + return V->getString(); + }; + + switch (GetMDInt(0)) { + default: + llvm_unreachable("Unexpected metadata!"); + break; + case OffloadEntriesInfoManager::OffloadEntryInfo:: + OffloadingEntryInfoTargetRegion: { + assert(isDevice && "Initialization of entries is " + "only required for the " + "device code generation."); + TargetRegionEntryInfo EntryInfo(/*ParentName=*/GetMDString(3), + /*DeviceID=*/GetMDInt(1), + /*FileID=*/GetMDInt(2), + /*Line=*/GetMDInt(4)); + OffloadEntriesInfoManager.initializeTargetRegionEntryInfo( + EntryInfo, /*Order=*/GetMDInt(5)); + break; + } + case OffloadEntriesInfoManager::OffloadEntryInfo:: + OffloadingEntryInfoDeviceGlobalVar: + assert(isDevice && "Initialization of entries is " + "only required for the " + "device code generation."); + OffloadEntriesInfoManager.initializeDeviceGlobalVarEntryInfo( + /*MangledName=*/GetMDString(1), + static_cast( + /*Flags=*/GetMDInt(2)), + /*Order=*/GetMDInt(3)); + break; + } + } +} + bool OffloadEntriesInfoManager::empty() const { return OffloadEntriesTargetRegion.empty() && OffloadEntriesDeviceGlobalVar.empty();