[PATCH] [C++11] Support for capturing of variable length arrays in lambda expression.
Bataev, Alexey
a.bataev at hotmail.com
Tue Jul 22 01:05:35 PDT 2014
Ok, I'll do.
Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team
22 Июль 2014 г. 11:42:37, Richard Smith писал:
> On Tue, Jul 22, 2014 at 12:30 AM, Bataev, Alexey <a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>> wrote:
>
> Yes, we can do this. I wanted to do like this, but I thought it
> won't be accepted as a kind of a hack again. We're passing Type*
> as Expr*. I tried to avoid such reinterpret castings. But if this
> solution is acceptable, I'll rework the patch in a few minutes.
>
>
> Please change InitializerOrBitWidth to store a void* rather than
> casting the Type* to an Expr*. Other than that, I think this kind of
> approach is fine.
>
> Best regards,
> Alexey Bataev
> =============
> Software Engineer
> Intel Compiler Team
>
> 22 Июль 2014 г. 10:58:11, Richard Smith писал:
>
> On Mon, Jul 21, 2014 at 10:58 PM, Bataev, Alexey
> <a.bataev at hotmail.com <mailto:a.bataev at hotmail.com>
> <mailto:a.bataev at hotmail.com <mailto:a.bataev at hotmail.com>>>
> wrote:
>
> Richard, yes, I understood that. We have troubles in
> CodeGen in
> this case. Yes, I can call getSizeExpr() for
> VariableArrayType, by
> it is impossible to get llvm::Value* for the expression
> returned
> by getSizeExpr() in lambda operator().
>
>
> You can do this in exactly the same way you do it in your current
> patch; see attached patch for example.
>
> This value is calculated in parent function for lambda
> expr and we
> have to pass it somehow to lambda. Passing
> VariableArrayType* does
> not allow us to get an access to this value.
> We must not recalculate the value of expression from
> getSizeExpr(), we must use the value, calculated in parent
> function. That's why it is not enough just to pass
> VariableArrayType*, also we need to pass llvm::Value* for
> getSizeExpr(), calculated in parent function.
>
>
> Best regards,
> Alexey Bataev
> =============
> Software Engineer
> Intel Compiler Team
>
> 22 Июль 2014 г. 9:41:43, Richard Smith писал:
>
> On Mon, Jul 21, 2014 at 10:14 PM, Bataev, Alexey
> <a.bataev at hotmail.com <mailto:a.bataev at hotmail.com>
> <mailto:a.bataev at hotmail.com <mailto:a.bataev at hotmail.com>>
> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>>>__>
> wrote:
>
> Richard, I don't think this is possible. If we storing
> VariableLengthArray* on FieldDecl, then in Lambda
> operator
> we can
> access VariableLengthArray->______getSizeExpr().
> But! We
>
> won't be able
>
> to get the llvm::Value* for this
> VariableLengthArray->______getSizeExpr(),
> calculated in another
>
>
> function. We should pass this llvm::Value* as a
> member of
> RecordDecl for LambdaExpr! Here is a scheme:
>
> foo() {
> int vla[n+m];
> ....
> some_lambda {vla....;}
> ....
> }
>
> What we have in CodeGen for this example:
> CodeGenFunction(foo), llvm::DenseMap<const Expr*,
> llvm::Value*>
> VLASizeMap[n+m]=value; VLASizeMap stores
> pre-calculated
> size of
> each VLA.
> {
> FD->field_for_m+n_expr = (int [n+m]*)0;
> CodeGenFunction CGF(some_lambda.operator(), FD);
> }
>
> CodeGenFunction(some_lambda.______operator()),
>
> llvm::DenseMap<const
>
> Expr*, llvm::Value*> VLASizeMap[n+m]=????? -
> llvm::Value* for
> 'n+m' is not captured here, we don't have an access to
> 'value',
> calculated in CodeGenFunction(foo) for expression
> 'n+m'.
>
> To solve this problem we can try to capture 2 fields
> instead - one
> for VariableLengthArray*, and another one for
> llvm::Value*
> calculated for
> VariableLengthArray->______getSizeExpr().
>
>
>
>
> I'm sorry, I still think we're miscommunicating. What I'm
> suggesting
> is a mechanical transformation: store the
> VariableArrayType*
> on the
> FieldDecl, and then when you need the size expression
> that you're
> currently storing there, call getSizeExpr() on the type.
>
> Best regards,
> Alexey Bataev
> =============
> Software Engineer
> Intel Compiler Team
>
> 22 Июль 2014 г. 8:57:54, Richard Smith писал:
>
> On Mon, Jul 21, 2014 at 5:43 AM, Alexey Bataev
> <a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>>
> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>>>
> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>
> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>
> <mailto:a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>>>__>__>
>
>
> wrote:
>
> Updated version after last review.
> Unfortunately,
> I don't
> think it
> is possible to pass captured expression as a
> VariableLengthArray
> *. I have to capture expr of
> VariableLengthArray * and
> then cast
> it to SizeExpr->getType() type to make lambda
> capture this
> type,
> not VariableLengthArray *. I have to pass
> actual
> value of
> SizeExpr
> to the Lambda in this field, because it is
> defined
> only in
> calling
> function and in Lambda it can be received
> only in
> one of
> captured
> fields.
>
>
> I don't understand what you're saying. What I'm
> suggesting is
> storing
> the VariableLengthArray* in the
> InitializerOrBitWidth
> field on
> FieldDecl, instead of storing the array bound
> there.
>
> http://reviews.llvm.org/D4368
>
> Files:
> include/clang/AST/Decl.h
> include/clang/AST/______LambdaCapture.h
>
> include/clang/Basic/______DiagnosticSemaKinds.td
>
>
> lib/AST/Decl.cpp
> lib/AST/Expr.cpp
> lib/AST/ExprCXX.cpp
> lib/AST/StmtPrinter.cpp
> lib/AST/StmtProfile.cpp
> lib/CodeGen/CGDebugInfo.cpp
> lib/CodeGen/CGExprCXX.cpp
> lib/CodeGen/CodeGenFunction.______cpp
> lib/Sema/SemaDecl.cpp
> lib/Sema/SemaExpr.cpp
> lib/Sema/TreeTransform.h
>
> test/CodeGenCXX/instantiate-______typeof-vla.cpp
>
> test/SemaTemplate/instantiate-______typeof.cpp
> tools/libclang/IndexBody.cpp
>
>
>
>
>
More information about the cfe-commits
mailing list