r340181 - [OPENMP][BLOCKS]Fix PR38923: reference to a global variable is captured

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 21 15:42:27 PDT 2018


Merged to 7.0 in r340352.

On Mon, Aug 20, 2018 at 9:00 AM, Alexey Bataev via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: abataev
> Date: Mon Aug 20 09:00:22 2018
> New Revision: 340181
>
> URL: http://llvm.org/viewvc/llvm-project?rev=340181&view=rev
> Log:
> [OPENMP][BLOCKS]Fix PR38923: reference to a global variable is captured
> by a block.
>
> Added checks for capturing of the variable in the block when trying to
> emit correct address for the variable with the reference type. This
> extra check allows correctly identify the variables that are not
> captured in the block context.
>
> Added:
>     cfe/trunk/test/CodeGenCXX/block-byref.cpp
> Modified:
>     cfe/trunk/lib/CodeGen/CGExpr.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=340181&r1=340180&r2=340181&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Aug 20 09:00:22 2018
> @@ -2437,6 +2437,7 @@ LValue CodeGenFunction::EmitDeclRefLValu
>      // A DeclRefExpr for a reference initialized by a constant expression can
>      // appear without being odr-used. Directly emit the constant initializer.
>      const Expr *Init = VD->getAnyInitializer(VD);
> +    const auto *BD = dyn_cast_or_null<BlockDecl>(CurCodeDecl);
>      if (Init && !isa<ParmVarDecl>(VD) && VD->getType()->isReferenceType() &&
>          VD->isUsableInConstantExpressions(getContext()) &&
>          VD->checkInitIsICE() &&
> @@ -2446,7 +2447,7 @@ LValue CodeGenFunction::EmitDeclRefLValu
>              (LocalDeclMap.count(VD->getCanonicalDecl()) ||
>               CapturedStmtInfo->lookup(VD->getCanonicalDecl()))) ||
>             LambdaCaptureFields.lookup(VD->getCanonicalDecl()) ||
> -           isa<BlockDecl>(CurCodeDecl)))) {
> +           (BD && BD->capturesVariable(VD))))) {
>        llvm::Constant *Val =
>          ConstantEmitter(*this).emitAbstract(E->getLocation(),
>                                              *VD->evaluateValue(),
>
> Added: cfe/trunk/test/CodeGenCXX/block-byref.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/block-byref.cpp?rev=340181&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/block-byref.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/block-byref.cpp Mon Aug 20 09:00:22 2018
> @@ -0,0 +1,15 @@
> +// RUN: %clang_cc1 %s -fblocks -triple x86_64-apple-darwin -std=c++11 -emit-llvm -o - | FileCheck %s
> +// REQUIRES: x86-registered-target
> +
> +// CHECK: @b = global i32 0,
> +
> +// CHECK: define {{.*}}void @{{.*}}test{{.*}}_block_invoke(
> +// CHECK: store i32 2, i32* @b,
> +// CHECK: ret void
> +
> +int b;
> +
> +void test() {
> +  int &a = b;
> +  ^{ a = 2; };
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list