[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 7 04:38:16 PDT 2024
https://github.com/Thirumalai-Shaktivel updated https://github.com/llvm/llvm-project/pull/109097
>From aedf9d90e86fb1df3078ec69f8bdafec8ade1533 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 52789d6e5f0f6b..04f78aa614005e 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -566,33 +566,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 92e91b3eaa5d0a420c7425c408f9086e586e65b7 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 b99f308e1c7fab..fd31553fff59ae 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1505,6 +1505,23 @@ class OmpVisitor : public virtual DeclarationVisitor {
void Post(const parser::OmpEndCriticalDirective &) {
messageHandler().set_currStmtSource(std::nullopt);
}
+ 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 0903cbca4ea589671512e0a287eb301fb2b3df22 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