[flang-commits] [flang] [Flang] Handle the source information (scopes) for some OpenMP constructs (PR #109097)

Thirumalai Shaktivel via flang-commits flang-commits at lists.llvm.org
Mon Oct 21 00:04:44 PDT 2024


https://github.com/Thirumalai-Shaktivel updated https://github.com/llvm/llvm-project/pull/109097

>From 09df4ed1d775615e0b58d3dbbe498ae9dcd052ff Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Wed, 18 Sep 2024 07:49:42 +0000
Subject: [PATCH 1/3] [Flang][Parser] Set source information for the atomic
 constructs

This patch adds the source information to all the atomic nodes
in the openmp parser. When the construct starts at the line 1,
the construct source information is used as the program source.
This fixes llvm#85593, which used to crash when accessing the
source of the construct.
---
 flang/lib/Parser/openmp-parsers.cpp | 33 ++++++++++++++++-------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 8634c522cf343a..52c7529369dfb5 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -657,33 +657,36 @@ TYPE_PARSER(construct<OmpEndAtomic>(startOmpLine >> "END ATOMIC"_tok))
 
 // OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] READ [MEMORY-ORDER-CLAUSE-LIST]
 TYPE_PARSER("ATOMIC" >>
-    construct<OmpAtomicRead>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
-        verbatim("READ"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
-        statement(assignmentStmt), maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
+    sourced(construct<OmpAtomicRead>(
+        Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("READ"_tok),
+        Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
+        maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
 
 // OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] CAPTURE [MEMORY-ORDER-CLAUSE-LIST]
 TYPE_PARSER("ATOMIC" >>
-    construct<OmpAtomicCapture>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
-        verbatim("CAPTURE"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
-        statement(assignmentStmt), statement(assignmentStmt),
-        Parser<OmpEndAtomic>{} / endOmpLine))
+    sourced(construct<OmpAtomicCapture>(
+        Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("CAPTURE"_tok),
+        Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
+        statement(assignmentStmt), Parser<OmpEndAtomic>{} / endOmpLine)))
 
 // OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] UPDATE [MEMORY-ORDER-CLAUSE-LIST]
 TYPE_PARSER("ATOMIC" >>
-    construct<OmpAtomicUpdate>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
-        verbatim("UPDATE"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
-        statement(assignmentStmt), maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
+    sourced(construct<OmpAtomicUpdate>(
+        Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("UPDATE"_tok),
+        Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
+        maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
 
 // OMP ATOMIC [atomic-clause-list]
-TYPE_PARSER(construct<OmpAtomic>(verbatim("ATOMIC"_tok),
+TYPE_PARSER(sourced(construct<OmpAtomic>(verbatim("ATOMIC"_tok),
     Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
-    maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
+    maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
 
 // OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] WRITE [MEMORY-ORDER-CLAUSE-LIST]
 TYPE_PARSER("ATOMIC" >>
-    construct<OmpAtomicWrite>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
-        verbatim("WRITE"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
-        statement(assignmentStmt), maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
+    sourced(construct<OmpAtomicWrite>(
+        Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("WRITE"_tok),
+        Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
+        maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
 
 // Atomic Construct
 TYPE_PARSER(construct<OpenMPAtomicConstruct>(Parser<OmpAtomicRead>{}) ||

>From 7e0e7f39453e3793e892baa3e8728ba30df2415c Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Wed, 18 Sep 2024 07:50:03 +0000
Subject: [PATCH 2/3] [Flang][Semantics] Add source range to the threadprivate,
  and Atomic constructs

This patch fixes llvm#82943, which used to crash when the
threadprivate directive appears as the first directive
without the program statement.

Fix: Adding a source range from the current statement to
the threadprivate and atomic will take care of the crash.

See: https://reviews.llvm.org/D153634 for more details
---
 flang/lib/Semantics/resolve-names.cpp | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 2fa5b75e073b63..030dbc5ea0f02f 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1530,6 +1530,23 @@ class OmpVisitor : public virtual DeclarationVisitor {
   void Post(const parser::OpenMPDeclarativeAllocate &) {
     SkipImplicitTyping(false);
   }
+  bool Pre(const parser::OpenMPDeclarativeConstruct &x) {
+    AddOmpSourceRange(x.source);
+    return true;
+  }
+  void Post(const parser::OpenMPDeclarativeConstruct &) {
+    messageHandler().set_currStmtSource(std::nullopt);
+  }
+  bool Pre(const parser::OpenMPAtomicConstruct &x) {
+    return common::visit(common::visitors{[&](const auto &u) -> bool {
+      AddOmpSourceRange(u.source);
+      return true;
+    }},
+        x.u);
+  }
+  void Post(const parser::OpenMPAtomicConstruct &) {
+    messageHandler().set_currStmtSource(std::nullopt);
+  }
 };
 
 bool OmpVisitor::NeedsScope(const parser::OpenMPBlockConstruct &x) {

>From 983ac742232d71aefaf1753368d44f58b64568c1 Mon Sep 17 00:00:00 2001
From: Thirumalai-Shaktivel <thirumalaishaktivel at gmail.com>
Date: Wed, 18 Sep 2024 07:50:16 +0000
Subject: [PATCH 3/3] [Test] Add tests

---
 flang/test/Semantics/OpenMP/atomic06-empty.f90        | 6 ++++++
 flang/test/Semantics/OpenMP/declare-simd-empty.f90    | 6 ++++++
 flang/test/Semantics/OpenMP/threadprivate08-empty.f90 | 5 +++++
 3 files changed, 17 insertions(+)
 create mode 100644 flang/test/Semantics/OpenMP/atomic06-empty.f90
 create mode 100644 flang/test/Semantics/OpenMP/declare-simd-empty.f90
 create mode 100644 flang/test/Semantics/OpenMP/threadprivate08-empty.f90

diff --git a/flang/test/Semantics/OpenMP/atomic06-empty.f90 b/flang/test/Semantics/OpenMP/atomic06-empty.f90
new file mode 100644
index 00000000000000..226e8d1bb91a5b
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/atomic06-empty.f90
@@ -0,0 +1,6 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! Test the source code starting with omp syntax
+
+!$omp atomic write
+i = 123
+end
diff --git a/flang/test/Semantics/OpenMP/declare-simd-empty.f90 b/flang/test/Semantics/OpenMP/declare-simd-empty.f90
new file mode 100644
index 00000000000000..b61fb53730a23d
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/declare-simd-empty.f90
@@ -0,0 +1,6 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! Test the source code starting with omp syntax
+
+!$omp declare simd
+integer :: x
+end
diff --git a/flang/test/Semantics/OpenMP/threadprivate08-empty.f90 b/flang/test/Semantics/OpenMP/threadprivate08-empty.f90
new file mode 100644
index 00000000000000..38a855dceb8366
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/threadprivate08-empty.f90
@@ -0,0 +1,5 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! Test the source code starting with omp syntax
+
+!$omp threadprivate(a)
+end



More information about the flang-commits mailing list