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

Bataev, Alexey a.bataev at hotmail.com
Mon Jul 21 22:58:02 PDT 2014


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(). 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>> 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>>>
>         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