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