lildmh marked 11 inline comments as done.
lildmh added a comment.

Hi Alexey,

Thanks a lot for the review! For 3 places I have doubt. Please see the comments 
inline. I tried to fix the rest of your comments.



================
Comment at: lib/AST/DeclOpenMP.cpp:164
+  if (NumClauses) {
+    Clauses = (OMPClause **)C.Allocate(sizeof(OMPClause *) * NumClauses);
+    setClauses(CL);
----------------
ABataev wrote:
> No, bad idea. Use tail allocation for the clauses. Check the implementation 
> of `OMPRequiresDecl`
I think it is possible to use TrailingObjects for clause storage when the 
number of clauses are known before creating the directive (e.g., for 
OMPRequiresDecl and OMPExecutableDirective). 

The reason that I had to create OMPDeclareMapperDecl before parsing map 
clauses, is the mapper variable (AA in the example below) needs to be declared 
within OMPDeclareMapperDecl, because the following map clauses will use it.

```
#pragma omp declare mapper(struct S AA) map(AA.field1)
```

A possible way to get around this is to count the number of map clauses before 
hand. But this solution is not trivial since the normal method for parsing map 
clauses cannot be used (e.g., it does not know AA when parsing map(AA.field1)). 
A customized and complex (because it needs to handle all possible situations) 
parsing method needs to be created, just for counting clause number. I think 
it's not worthy to do this compared with allocating map clause space later.

I checked the code for OMPDeclareReductionDecl that you wrote. It also has to 
be created before parsing the combiner and initializer. It does not have a 
variable number of clauses though.

Any suggestions?


================
Comment at: lib/Sema/SemaTemplateInstantiateDecl.cpp:2868
+TemplateDeclInstantiator::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D) {
+  assert(!D->getType()->isDependentType() &&
+         !D->getType()->isInstantiationDependentType() &&
----------------
ABataev wrote:
> Why?
Thanks! I was wrong about this. Has fixed it in the new patch. Please check


================
Comment at: lib/Serialization/ASTReader.cpp:12304
   for (unsigned i = 0; i != NumVars; ++i)
-    Vars.push_back(Record.readSubExpr());
+    Vars.push_back(Record.readExpr());
   C->setVarRefs(Vars);
----------------
ABataev wrote:
> Restore original
I found using readSubExpr does not work with declare mapper. The reasons are as 
follows:

readSubExpr will call ASTReader::ReadSubExpr, which will call ReadSubStmt. 
ReadSubStmt only works with Stmt.

Before, this is correct because map clauses only come with 
OMPExecutableDirective, which is a Stmt.

Now, map clauses can come with OMPDeclareMapperDecl, which is a Decl. 
ReadSubStmt does not work with Decl. Instead, readExpr will call 
ASTReader::ReadExpr. ASTReader::ReadExpr calls ReadSubStmt if it is a Stmt, and 
it calls ReadStmtFromStream if it is a Decl. The map clause information is 
indeed in the stream for OMPDeclareMapperDecl. So I use readExpr instead.

This modification should not affect the behavior of map clause serialization 
for existing directives that are Stmts, since they will both call ReadSubStmt 
in the end. The regression test confirms that.

Any suggestions?


================
Comment at: lib/Serialization/ASTReader.cpp:12328
   for (unsigned i = 0; i < TotalComponents; ++i) {
-    Expr *AssociatedExpr = Record.readSubExpr();
+    Expr *AssociatedExpr = Record.readExpr();
     auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
----------------
ABataev wrote:
> Restore original
The same as above.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56326/new/

https://reviews.llvm.org/D56326



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to