[PATCH] D12134: Improve debug info for implicitly captured vars in lambdas
Bataev, Alexey via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 25 08:44:17 PDT 2015
Debug info points to the real place where it is captured, while
diagnostics points to the first use of implicitly captured variable.
Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team
25.08.2015 18:22, David Blaikie пишет:
>
>
> On Tue, Aug 25, 2015 at 8:18 AM, Bataev, Alexey <a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>> wrote:
>
> I though about this. I think it will be more convenient for user
> to see the diagnostic on the first use of the variable rather than
> on '=' or '&' symbol.
>
>
> Why the difference between the diagnostic & the debug info, then?
>
>
> Best regards,
> Alexey Bataev
> =============
> Software Engineer
> Intel Compiler Team
>
> 25.08.2015 18 <tel:25.08.2015%2018>:07, David Blaikie пишет:
>
>
>
> On Tue, Aug 18, 2015 at 9:05 PM, Alexey Bataev via cfe-commits
> <cfe-commits at lists.llvm.org
> <mailto:cfe-commits at lists.llvm.org>
> <mailto:cfe-commits at lists.llvm.org
> <mailto:cfe-commits at lists.llvm.org>>> wrote:
>
> ABataev created this revision.
> ABataev added reviewers: echristo, rjmccall, rsmith.
> ABataev added a subscriber: cfe-commits.
>
> When variables are implicitly captured in lambdas, debug info
> generated for captured variables points to location where
> they are
> used first. This patch makes debug info to point to capture
> default location.
>
>
> Not sure if this is the right tradeoff, or if it is, perhaps
> we should reconsider how our diagnostics work too?
>
> Currently if you, say, capture a variable by value and that
> variable doesn't have an accessible copy ctor, the diagnostic
> points to the first use. Should we change that too?
>
>
> http://reviews.llvm.org/D12134
>
> Files:
> lib/Sema/SemaLambda.cpp
> test/CodeGenCXX/debug-lambda-expressions.cpp
>
> Index: lib/Sema/SemaLambda.cpp
> ===================================================================
> --- lib/Sema/SemaLambda.cpp
> +++ lib/Sema/SemaLambda.cpp
> @@ -1377,10 +1377,10 @@
> }
>
> static ExprResult performLambdaVarCaptureInitialization(
> - Sema &S, LambdaScopeInfo::Capture &Capture,
> - FieldDecl *Field,
> + Sema &S, LambdaScopeInfo::Capture &Capture, FieldDecl
> *Field,
> SmallVectorImpl<VarDecl *> &ArrayIndexVars,
> - SmallVectorImpl<unsigned> &ArrayIndexStarts) {
> + SmallVectorImpl<unsigned> &ArrayIndexStarts, bool
> ImplicitCapture,
> + SourceLocation CaptureDefaultLoc) {
> assert(Capture.isVariableCapture() && "not a variable
> capture");
>
> auto *Var = Capture.getVariable();
> @@ -1399,7 +1399,10 @@
> // An entity captured by a lambda-expression is
> odr-used (3.2) in
> // the scope containing the lambda-expression.
> ExprResult RefResult = S.BuildDeclarationNameExpr(
> - CXXScopeSpec(), DeclarationNameInfo(Var->getDeclName(),
> Loc), Var);
> + CXXScopeSpec(),
> + DeclarationNameInfo(Var->getDeclName(),
> + ImplicitCapture ?
> CaptureDefaultLoc : Loc),
> + Var);
> if (RefResult.isInvalid())
> return ExprError();
> Expr *Ref = RefResult.get();
> @@ -1561,7 +1564,8 @@
> Expr *Init = From.getInitExpr();
> if (!Init) {
> auto InitResult =
> performLambdaVarCaptureInitialization(
> - *this, From, *CurField, ArrayIndexVars,
> ArrayIndexStarts);
> + *this, From, *CurField, ArrayIndexVars,
> ArrayIndexStarts,
> + CaptureDefault != LCD_None, CaptureDefaultLoc);
> if (InitResult.isInvalid())
> return ExprError();
> Init = InitResult.get();
> Index: test/CodeGenCXX/debug-lambda-expressions.cpp
> ===================================================================
> --- test/CodeGenCXX/debug-lambda-expressions.cpp
> +++ test/CodeGenCXX/debug-lambda-expressions.cpp
> @@ -14,6 +14,19 @@
> struct D { D(); D(const D&); int x; };
> int d(int x) { D y[10]; return [x,y] { return y[x].x; }(); }
>
> +// CHECK-LABEL: foo
> +int foo(int x) {
> +// CHECK: [[X:%.+]] = alloca i32,
> +// CHECK: call void @llvm.dbg.declare(
> +// CHECK: [[X_REF:%.+]] = getelementptr inbounds %{{.+}},
> %{{.+}}* %{{.+}}, i32 0, i32 0, !dbg ![[DBG_FOO:[0-9]+]]
> +// CHECK: [[X_VAL:%.+]] = load i32, i32* [[X]], align 4, !dbg
> ![[DBG_FOO]]
> +// CHECK: store i32 [[X_VAL]], i32* [[X_REF]], align 4, !dbg
> ![[DBG_FOO]]
> +// CHECK: call i32 @{{.+}}, !dbg ![[DBG_FOO]]
> + return [=] {
> + return x;
> + }();
> +}
> +
> // Randomness for file. -- 6
> // CHECK: [[FILE:.*]] = !DIFile(filename:
> "{{.*}}debug-lambda-expressions.cpp",
>
> @@ -100,3 +113,5 @@
> // CHECK-SAME: line: [[VAR_LINE]],
> // CHECK-SAME: elements:
> ![[VAR_ARGS:[0-9]+]]
> // CHECK: ![[VAR_ARGS]] = !{!{{[0-9]+}}}
> +
> +// CHECK: [[DBG_FOO:![0-9]+]] = !DILocation(line: 25,
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
> <mailto:cfe-commits at lists.llvm.org
> <mailto:cfe-commits at lists.llvm.org>>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
>
More information about the cfe-commits
mailing list