ABataev added inline comments. ================ Comment at: lib/CodeGen/CGStmtOpenMP.cpp:230-238 @@ -229,6 +229,11 @@ if (CopiedVars.insert(VD->getCanonicalDecl()).second) { - // Get the address of the master variable. - auto *MasterAddr = VD->isStaticLocal() - ? CGM.getStaticLocalDeclAddress(VD) - : CGM.GetAddrOfGlobal(VD); + + // Get the address of the master variable. It is passed from the master + // as field in the captured declaration. + auto *FD = CapturedStmtInfo->lookup(VD); + assert( FD && "Copyin master value should be available in some field!"); + QualType TagType = getContext().getTagDeclType(FD->getParent()); + LValue LV = MakeNaturalAlignAddrLValue(CapturedStmtInfo->getContextValue(), TagType); + auto *MasterAddr = EmitLValueForField(LV, FD).getAddress(); + // Get the address of the threadprivate variable. ---------------- DeclRefExpr DRE(const_cast<VarDecl *>(VD), CapturedStmtInfo->lookup(VD) != nullptr, (*IRef)->getType(), VK_LValue, (*IRef)->getExprLoc()); auto *MasterAddr = EmitLValue(&DRE).getAddress();
================ Comment at: lib/Sema/SemaOpenMP.cpp:160-667 @@ -159,4 +159,8 @@ + /// \brief Check if the specified variable is a 'copyin' variable for current + /// region. + bool isCopyinVariable(VarDecl *D); + /// \brief Adds explicit data sharing attribute to the specified declaration. void addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A); @@ -412,6 +416,12 @@ return Stack.back().LCVSet.count(D) > 0; } +bool DSAStackTy::isCopyinVariable(VarDecl *D){ + assert(Stack.size() > 1 && "Data-sharing attributes stack is empty"); + D = D->getCanonicalDecl(); + DSAInfo I = Stack.back().SharingMap.lookup(D); + return I.Attributes == OMPC_copyin; +} void DSAStackTy::addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A) { D = D->getCanonicalDecl(); if (A == OMPC_threadprivate) { @@ -653,4 +663,6 @@ assert(LangOpts.OpenMP && "OpenMP is not allowed"); VD = VD->getCanonicalDecl(); if (DSAStack->getCurrentDirective() != OMPD_unknown) { + if (DSAStack->isCopyinVariable(VD) && !DSAStack->isClauseParsingMode()) + return true; if (DSAStack->isLoopControlVariable(VD) || ---------------- I'd better write a new function isOpenMPPrivateOrCopyin() function and used it instead of isOpenMPPrivate() in Sema::IsOpenMPCapturedVar(). Besides, note, that copyin variables must be captured only if TLS mode is on, if we're using runtime calls we don't need to capture threadprivates. http://reviews.llvm.org/D11395 _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits