[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