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

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 <[email protected]
<mailto:[email protected]>> 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



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to