diff options
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 35122265f7c..f0abf5acfe4 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -2210,6 +2210,22 @@ static LValue EmitThreadPrivateVarDeclLValue( return CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl); } +static Address emitDeclTargetLinkVarDeclLValue(CodeGenFunction &CGF, + const VarDecl *VD, QualType T) { + for (const auto *D : VD->redecls()) { + if (!VD->hasAttrs()) + continue; + if (const auto *Attr = D->getAttr<OMPDeclareTargetDeclAttr>()) + if (Attr->getMapType() == OMPDeclareTargetDeclAttr::MT_Link) { + QualType PtrTy = CGF.getContext().getPointerType(VD->getType()); + Address Addr = + CGF.CGM.getOpenMPRuntime().getAddrOfDeclareTargetLink(CGF, VD); + return CGF.EmitLoadOfPointer(Addr, PtrTy->castAs<PointerType>()); + } + } + return Address::invalid(); +} + Address CodeGenFunction::EmitLoadOfReference(LValue RefLVal, LValueBaseInfo *PointeeBaseInfo, @@ -2259,6 +2275,13 @@ static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF, if (VD->getTLSKind() == VarDecl::TLS_Dynamic && CGF.CGM.getCXXABI().usesThreadWrapperFunction()) return CGF.CGM.getCXXABI().EmitThreadLocalVarDeclLValue(CGF, VD, T); + // Check if the variable is marked as declare target with link clause in + // device codegen. + if (CGF.getLangOpts().OpenMPIsDevice) { + Address Addr = emitDeclTargetLinkVarDeclLValue(CGF, VD, T); + if (Addr.isValid()) + return CGF.MakeAddrLValue(Addr, T, AlignmentSource::Decl); + } llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD); llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType()); |