[PATCH] [C++11] Support for capturing of variable length arrays in lambda expression.
Richard Smith
richard at metafoo.co.uk
Tue Jul 22 00:42:37 PDT 2014
On Tue, Jul 22, 2014 at 12:30 AM, Bataev, Alexey <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>> 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
>>
>>
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140722/e1bc68fb/attachment.html>
More information about the cfe-commits
mailing list