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