[PATCH] [C++11] Support for capturing of variable length arrays in lambda expression.

Bataev, Alexey a.bataev at hotmail.com
Tue Jul 22 00:30:20 PDT 2014


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.

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>> 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>>>
>         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>>>__>
>
>                 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