https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/146779
>From ab3f0cc9d240f12e07be452effa75b5c7d010d9b Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Wed, 2 Jul 2025 11:25:00 -0500 Subject: [PATCH 1/2] [clang][OpenMP] Use DirectiveNameParser to parse directive names This simplifies the parsing code in clang quite a bit. --- clang/lib/Parse/ParseOpenMP.cpp | 181 ++++---------------------------- 1 file changed, 19 insertions(+), 162 deletions(-) diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index f694ae1d0d112..c0a17d0e9537d 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -25,6 +25,7 @@ #include "clang/Sema/SemaOpenMP.h" #include "llvm/ADT/SmallBitVector.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/Frontend/OpenMP/DirectiveNameParser.h" #include "llvm/Frontend/OpenMP/OMPAssume.h" #include "llvm/Frontend/OpenMP/OMPContext.h" #include <optional> @@ -37,48 +38,6 @@ using namespace llvm::omp; //===----------------------------------------------------------------------===// namespace { -enum OpenMPDirectiveKindEx { - OMPD_cancellation = llvm::omp::Directive_enumSize + 1, - OMPD_data, - OMPD_declare, - OMPD_end, - OMPD_end_declare, - OMPD_enter, - OMPD_exit, - OMPD_point, - OMPD_reduction, - OMPD_target_enter, - OMPD_target_exit, - OMPD_update, - OMPD_distribute_parallel, - OMPD_teams_distribute_parallel, - OMPD_target_teams_distribute_parallel, - OMPD_mapper, - OMPD_variant, - OMPD_begin, - OMPD_begin_declare, -}; - -// Helper to unify the enum class OpenMPDirectiveKind with its extension -// the OpenMPDirectiveKindEx enum which allows to use them together as if they -// are unsigned values. -struct OpenMPDirectiveKindExWrapper { - OpenMPDirectiveKindExWrapper(unsigned Value) : Value(Value) {} - OpenMPDirectiveKindExWrapper(OpenMPDirectiveKind DK) : Value(unsigned(DK)) {} - bool operator==(OpenMPDirectiveKindExWrapper V) const { - return Value == V.Value; - } - bool operator!=(OpenMPDirectiveKindExWrapper V) const { - return Value != V.Value; - } - bool operator==(OpenMPDirectiveKind V) const { return Value == unsigned(V); } - bool operator!=(OpenMPDirectiveKind V) const { return Value != unsigned(V); } - bool operator<(OpenMPDirectiveKind V) const { return Value < unsigned(V); } - operator unsigned() const { return Value; } - operator OpenMPDirectiveKind() const { return OpenMPDirectiveKind(Value); } - unsigned Value; -}; - class DeclDirectiveListParserHelper final { SmallVector<Expr *, 4> Identifiers; Parser *P; @@ -97,130 +56,32 @@ class DeclDirectiveListParserHelper final { }; } // namespace -// Map token string to extended OMP token kind that are -// OpenMPDirectiveKind + OpenMPDirectiveKindEx. -static unsigned getOpenMPDirectiveKindEx(StringRef S) { - OpenMPDirectiveKindExWrapper DKind = getOpenMPDirectiveKind(S); - if (DKind != OMPD_unknown) - return DKind; - - return llvm::StringSwitch<OpenMPDirectiveKindExWrapper>(S) - .Case("cancellation", OMPD_cancellation) - .Case("data", OMPD_data) - .Case("declare", OMPD_declare) - .Case("end", OMPD_end) - .Case("enter", OMPD_enter) - .Case("exit", OMPD_exit) - .Case("point", OMPD_point) - .Case("reduction", OMPD_reduction) - .Case("update", OMPD_update) - .Case("mapper", OMPD_mapper) - .Case("variant", OMPD_variant) - .Case("begin", OMPD_begin) - .Default(OMPD_unknown); -} +static OpenMPDirectiveKind parseOpenMPDirectiveKind(Parser &P) { + static const DirectiveNameParser DNP; + + const DirectiveNameParser::State *S = DNP.initial(); -static OpenMPDirectiveKindExWrapper parseOpenMPDirectiveKind(Parser &P) { - // Array of foldings: F[i][0] F[i][1] ===> F[i][2]. - // E.g.: OMPD_for OMPD_simd ===> OMPD_for_simd - // TODO: add other combined directives in topological order. - static const OpenMPDirectiveKindExWrapper F[][3] = { - {OMPD_begin, OMPD_declare, OMPD_begin_declare}, - {OMPD_begin, OMPD_assumes, OMPD_begin_assumes}, - {OMPD_end, OMPD_declare, OMPD_end_declare}, - {OMPD_end, OMPD_assumes, OMPD_end_assumes}, - {OMPD_cancellation, OMPD_point, OMPD_cancellation_point}, - {OMPD_declare, OMPD_reduction, OMPD_declare_reduction}, - {OMPD_declare, OMPD_mapper, OMPD_declare_mapper}, - {OMPD_declare, OMPD_simd, OMPD_declare_simd}, - {OMPD_declare, OMPD_target, OMPD_declare_target}, - {OMPD_declare, OMPD_variant, OMPD_declare_variant}, - {OMPD_begin_declare, OMPD_target, OMPD_begin_declare_target}, - {OMPD_begin_declare, OMPD_variant, OMPD_begin_declare_variant}, - {OMPD_end_declare, OMPD_variant, OMPD_end_declare_variant}, - {OMPD_distribute, OMPD_parallel, OMPD_distribute_parallel}, - {OMPD_distribute_parallel, OMPD_for, OMPD_distribute_parallel_for}, - {OMPD_distribute_parallel_for, OMPD_simd, - OMPD_distribute_parallel_for_simd}, - {OMPD_distribute, OMPD_simd, OMPD_distribute_simd}, - {OMPD_end_declare, OMPD_target, OMPD_end_declare_target}, - {OMPD_target, OMPD_data, OMPD_target_data}, - {OMPD_target, OMPD_enter, OMPD_target_enter}, - {OMPD_target, OMPD_exit, OMPD_target_exit}, - {OMPD_target, OMPD_update, OMPD_target_update}, - {OMPD_target_enter, OMPD_data, OMPD_target_enter_data}, - {OMPD_target_exit, OMPD_data, OMPD_target_exit_data}, - {OMPD_for, OMPD_simd, OMPD_for_simd}, - {OMPD_parallel, OMPD_for, OMPD_parallel_for}, - {OMPD_parallel_for, OMPD_simd, OMPD_parallel_for_simd}, - {OMPD_parallel, OMPD_loop, OMPD_parallel_loop}, - {OMPD_parallel, OMPD_sections, OMPD_parallel_sections}, - {OMPD_taskloop, OMPD_simd, OMPD_taskloop_simd}, - {OMPD_target, OMPD_parallel, OMPD_target_parallel}, - {OMPD_target, OMPD_simd, OMPD_target_simd}, - {OMPD_target_parallel, OMPD_loop, OMPD_target_parallel_loop}, - {OMPD_target_parallel, OMPD_for, OMPD_target_parallel_for}, - {OMPD_target_parallel_for, OMPD_simd, OMPD_target_parallel_for_simd}, - {OMPD_teams, OMPD_distribute, OMPD_teams_distribute}, - {OMPD_teams_distribute, OMPD_simd, OMPD_teams_distribute_simd}, - {OMPD_teams_distribute, OMPD_parallel, OMPD_teams_distribute_parallel}, - {OMPD_teams_distribute_parallel, OMPD_for, - OMPD_teams_distribute_parallel_for}, - {OMPD_teams_distribute_parallel_for, OMPD_simd, - OMPD_teams_distribute_parallel_for_simd}, - {OMPD_teams, OMPD_loop, OMPD_teams_loop}, - {OMPD_target, OMPD_teams, OMPD_target_teams}, - {OMPD_target_teams, OMPD_distribute, OMPD_target_teams_distribute}, - {OMPD_target_teams, OMPD_loop, OMPD_target_teams_loop}, - {OMPD_target_teams_distribute, OMPD_parallel, - OMPD_target_teams_distribute_parallel}, - {OMPD_target_teams_distribute, OMPD_simd, - OMPD_target_teams_distribute_simd}, - {OMPD_target_teams_distribute_parallel, OMPD_for, - OMPD_target_teams_distribute_parallel_for}, - {OMPD_target_teams_distribute_parallel_for, OMPD_simd, - OMPD_target_teams_distribute_parallel_for_simd}, - {OMPD_master, OMPD_taskloop, OMPD_master_taskloop}, - {OMPD_masked, OMPD_taskloop, OMPD_masked_taskloop}, - {OMPD_master_taskloop, OMPD_simd, OMPD_master_taskloop_simd}, - {OMPD_masked_taskloop, OMPD_simd, OMPD_masked_taskloop_simd}, - {OMPD_parallel, OMPD_master, OMPD_parallel_master}, - {OMPD_parallel, OMPD_masked, OMPD_parallel_masked}, - {OMPD_parallel_master, OMPD_taskloop, OMPD_parallel_master_taskloop}, - {OMPD_parallel_masked, OMPD_taskloop, OMPD_parallel_masked_taskloop}, - {OMPD_parallel_master_taskloop, OMPD_simd, - OMPD_parallel_master_taskloop_simd}, - {OMPD_parallel_masked_taskloop, OMPD_simd, - OMPD_parallel_masked_taskloop_simd}}; - enum { CancellationPoint = 0, DeclareReduction = 1, TargetData = 2 }; Token Tok = P.getCurToken(); - OpenMPDirectiveKindExWrapper DKind = - Tok.isAnnotation() - ? static_cast<unsigned>(OMPD_unknown) - : getOpenMPDirectiveKindEx(P.getPreprocessor().getSpelling(Tok)); - if (DKind == OMPD_unknown) + if (Tok.isAnnotation()) return OMPD_unknown; - for (const auto &I : F) { - if (DKind != I[0]) - continue; + S = DNP.apply(S, P.getPreprocessor().getSpelling(Tok)); + if (S == nullptr) + return OMPD_unknown; + while (!Tok.isAnnotation()) { + OpenMPDirectiveKind DKind = S->Value; Tok = P.getPreprocessor().LookAhead(0); - OpenMPDirectiveKindExWrapper SDKind = - Tok.isAnnotation() - ? static_cast<unsigned>(OMPD_unknown) - : getOpenMPDirectiveKindEx(P.getPreprocessor().getSpelling(Tok)); - if (SDKind == OMPD_unknown) - continue; - - if (SDKind == I[1]) { + if (!Tok.isAnnotation()) { + S = DNP.apply(S, P.getPreprocessor().getSpelling(Tok)); + if (S == nullptr) + return DKind; P.ConsumeToken(); - DKind = I[2]; } } - return unsigned(DKind) < llvm::omp::Directive_enumSize - ? static_cast<OpenMPDirectiveKind>(DKind) - : OMPD_unknown; + + assert(S && "Should have exited early"); + return S->Value; } static DeclarationName parseOpenMPReductionId(Parser &P) { @@ -2629,10 +2490,6 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective( Diag(Tok, diag::err_omp_unknown_directive); return StmtError(); } - if (!(getDirectiveLanguages(DKind) & SourceLanguage::C)) { - // Treat directives that are not allowed in C/C++ as unknown. - DKind = OMPD_unknown; - } StmtResult Directive = StmtError(); @@ -4014,7 +3871,7 @@ OMPClause *Parser::ParseOpenMPSingleExprWithArgClause(OpenMPDirectiveKind DKind, KLoc.push_back(Tok.getLocation()); TentativeParsingAction TPA(*this); auto DK = parseOpenMPDirectiveKind(*this); - Arg.push_back(DK); + Arg.push_back(static_cast<unsigned>(DK)); if (DK != OMPD_unknown) { ConsumeToken(); if (Tok.is(tok::colon) && getLangOpts().OpenMP > 40) { >From ca31af4bbb783cbecab3d4c7af3c2f240e435fc1 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Thu, 3 Jul 2025 11:16:03 -0500 Subject: [PATCH 2/2] Use consume instead ofof apply --- clang/lib/Parse/ParseOpenMP.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index c0a17d0e9537d..c3c6149d9de1a 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -65,7 +65,7 @@ static OpenMPDirectiveKind parseOpenMPDirectiveKind(Parser &P) { if (Tok.isAnnotation()) return OMPD_unknown; - S = DNP.apply(S, P.getPreprocessor().getSpelling(Tok)); + S = DNP.consume(S, P.getPreprocessor().getSpelling(Tok)); if (S == nullptr) return OMPD_unknown; @@ -73,7 +73,7 @@ static OpenMPDirectiveKind parseOpenMPDirectiveKind(Parser &P) { OpenMPDirectiveKind DKind = S->Value; Tok = P.getPreprocessor().LookAhead(0); if (!Tok.isAnnotation()) { - S = DNP.apply(S, P.getPreprocessor().getSpelling(Tok)); + S = DNP.consume(S, P.getPreprocessor().getSpelling(Tok)); if (S == nullptr) return DKind; P.ConsumeToken(); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits