[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions

Alexey Bataev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 25 06:37:42 PDT 2023


ABataev added inline comments.


================
Comment at: clang/lib/Sema/SemaDecl.cpp:14467-14468
+      // directive and has static storage duration.
+      if (D && D->hasAttr<OMPDeclareTargetDeclAttr>() && isa<VarDecl>(D)) {
+        if ((cast<VarDecl>(D))->hasGlobalStorage())
+          ActOnOpenMPImplicitDeclareTarget(D);
----------------
if (auto *VD = dyn_cast_or_null<VarDecl>(D); LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() && VD->hasGlobalStorage())


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23091
+/// Adds OMPDeclareTargetDeclAttr to the referenced variables.
+void *AddOMPDeclareTargetDeclAttr(const DeclRefExpr *DeclRef, Decl *TargetDecl, 
+                                  SmallVector<Decl *, 100> &DeclVector) {
----------------
static void addOMP...


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23092
+void *AddOMPDeclareTargetDeclAttr(const DeclRefExpr *DeclRef, Decl *TargetDecl, 
+                                  SmallVector<Decl *, 100> &DeclVector) {
+  Decl *DeclVar = nullptr;
----------------
SmallVectorImpl<Decl *> &DeclVector


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23093-23100
+  Decl *DeclVar = nullptr;
+  if (DeclRef) {
+    DeclVar = (Decl *)DeclRef->getDecl();
+    if (isa<VarDecl>(DeclVar)) { 
+      DeclVar->addAttr(TargetDecl->getAttr<OMPDeclareTargetDeclAttr>());
+      DeclVector.push_back(DeclVar);
+    }
----------------
if (!DeclRef)
  return;
if (auto *VD = dyn_cast_or_null<VarDecl>(DeclRef->getDecl()) {
  DeclVar->addAttr(TargetDecl->getAttr<OMPDeclareTargetDeclAttr>());
  DeclVector.push_back(DeclVar);
}


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23103-23114
+void RecursiveExprReader(Expr *Ex, Decl *TargetDecl, 
+                         SmallVector<Decl *, 100> &DeclVector) {
+  for (Expr::child_iterator it = Ex->child_begin(); it != Ex->child_end(); 
+       ++it) {
+    if (const DeclRefExpr *refExpr = dyn_cast<DeclRefExpr>(*it)) {
+      AddOMPDeclareTargetDeclAttr(refExpr, TargetDecl, DeclVector);
+    } else if (isa<Expr>(*it))
----------------
Use StmtVisitor to implement this correctly.


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23120
+void Sema::ActOnOpenMPImplicitDeclareTarget(Decl *TargetDecl) {
+  SmallVector<Decl *, 100> DeclVector;
+  DeclVector.push_back(TargetDecl);
----------------
100 is to much, use either default value `SmallVector<Decl *> DeclVector;` or smaller value (4 should be enough)


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23122
+  DeclVector.push_back(TargetDecl);
+  while (DeclVector.size() != 0) {
+    Decl *D = DeclVector[DeclVector.size() - 1];
----------------
while (!DeclVector.empty())


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23123-23124
+  while (DeclVector.size() != 0) {
+    Decl *D = DeclVector[DeclVector.size() - 1];
+    DeclVector.pop_back();
+    if (isa<VarDecl>(D) && D->hasAttr<OMPDeclareTargetDeclAttr>()) {
----------------
Decl *D = DeclVector.pop_back_val();


================
Comment at: clang/lib/Sema/SemaOpenMP.cpp:23125-23126
+    DeclVector.pop_back();
+    if (isa<VarDecl>(D) && D->hasAttr<OMPDeclareTargetDeclAttr>()) {
+      VarDecl *TargetVarDecl = cast<VarDecl>(D);
+      if (TargetVarDecl->hasInit() && TargetVarDecl->hasGlobalStorage()) {
----------------
Use dyn_cast instead of isa/cast


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

https://reviews.llvm.org/D146418



More information about the cfe-commits mailing list