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
