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 @@ -2941,16 +2941,12 @@ // If we are emitting code for a target, the entry is already initialized, // only has to be registered. if (CGM.getLangOpts().OpenMPIsDevice) { - if (!hasTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum)) { - unsigned DiagID = CGM.getDiags().getCustomDiagID( - DiagnosticsEngine::Error, - "Unable to find target region on line '%0' in the device code."); - CGM.getDiags().Report(DiagID) << LineNum; - return; - } + // This could happen if the device compilation is invoked standalone. + if (!hasTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum)) + initializeTargetRegionEntryInfo(DeviceID, FileID, ParentName, LineNum, + OffloadingEntriesNum); auto &Entry = OffloadEntriesTargetRegion[DeviceID][FileID][ParentName][LineNum]; - assert(Entry.isValid() && "Entry not initialized!"); Entry.setAddress(Addr); Entry.setID(ID); Entry.setFlags(Flags); @@ -3017,9 +3013,10 @@ OMPTargetGlobalVarEntryKind Flags, llvm::GlobalValue::LinkageTypes Linkage) { if (CGM.getLangOpts().OpenMPIsDevice) { + // This could happen if the device compilation is invoked standalone. + if (!hasDeviceGlobalVarEntryInfo(VarName)) + initializeDeviceGlobalVarEntryInfo(VarName, Flags, OffloadingEntriesNum); auto &Entry = OffloadEntriesDeviceGlobalVar[VarName]; - assert(Entry.isValid() && Entry.getFlags() == Flags && - "Entry not initialized!"); assert((!Entry.getAddress() || Entry.getAddress() == Addr) && "Resetting with the new address."); if (Entry.getAddress() && hasDeviceGlobalVarEntryInfo(VarName)) { diff --git a/clang/test/OpenMP/declare_target_device_only_compilation.cpp b/clang/test/OpenMP/declare_target_device_only_compilation.cpp new file mode 100644 --- /dev/null +++ b/clang/test/OpenMP/declare_target_device_only_compilation.cpp @@ -0,0 +1,15 @@ +//==========================================================================/// +// RUN: %clang -S -target powerpc64le-ibm-linux-gnu -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -S -target i386-pc-linux-gnu -fopenmp -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -S -target x86_64-unknown-linux-gnu -fopenmp -fopenmp-targets=x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s +// expected-no-diagnostics + +#pragma omp declare target +#pragma omp begin declare variant match(device={kind(nohost)}) +int G1; +#pragma omp end declare variant +#pragma omp end declare target + +// CHECK: @[[G:.+]] = hidden {{.*}}global i32 0, align 4 +// CHECK: !omp_offload.info = !{!0} +// CHECK: !0 = !{i32 1, !"[[G]]", i32 0, i32 0}