diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -674,7 +674,8 @@ registerDeviceGlobalVarEntryInfo(StringRef VarName, llvm::Constant *Addr, CharUnits VarSize, OMPTargetGlobalVarEntryKind Flags, - llvm::GlobalValue::LinkageTypes Linkage); + llvm::GlobalValue::LinkageTypes Linkage, + bool IsDeclareTargetDeclaration = false); /// Checks if the variable with the given name has been registered already. bool hasDeviceGlobalVarEntryInfo(StringRef VarName) const { return OffloadEntriesDeviceGlobalVar.count(VarName) > 0; 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 @@ -3015,8 +3015,13 @@ registerDeviceGlobalVarEntryInfo(StringRef VarName, llvm::Constant *Addr, CharUnits VarSize, OMPTargetGlobalVarEntryKind Flags, - llvm::GlobalValue::LinkageTypes Linkage) { + llvm::GlobalValue::LinkageTypes Linkage, + bool IsDeclareTargetDeclaration) { if (CGM.getLangOpts().OpenMPIsDevice) { + // A global variable might be not in the map if it is declared in declare + // target and device compilation is invoked without host IR. + if (IsDeclareTargetDeclaration && !hasDeviceGlobalVarEntryInfo(VarName)) + initializeDeviceGlobalVarEntryInfo(VarName, Flags, OffloadingEntriesNum); auto &Entry = OffloadEntriesDeviceGlobalVar[VarName]; assert(Entry.isValid() && Entry.getFlags() == Flags && "Entry not initialized!"); @@ -10514,7 +10519,7 @@ } OffloadEntriesInfoManager.registerDeviceGlobalVarEntryInfo( - VarName, Addr, VarSize, Flags, Linkage); + VarName, Addr, VarSize, Flags, Linkage, static_cast(Res)); } bool CGOpenMPRuntime::emitTargetGlobal(GlobalDecl GD) {