https://github.com/sandeepkosuri updated https://github.com/llvm/llvm-project/pull/83223
>From cbf1b4409e379309ae3d942b3dbec0964b9ee0d1 Mon Sep 17 00:00:00 2001 From: Sandeep Kosuri <ksand...@hpe.com> Date: Tue, 27 Feb 2024 23:19:41 -0600 Subject: [PATCH 1/3] [OpenMP] Parse and Sema support for declare target in local scope --- .../clang/Basic/DiagnosticSemaKinds.td | 3 +++ clang/lib/Parse/ParseOpenMP.cpp | 23 ++++++++++++++++++- clang/lib/Sema/SemaOpenMP.cpp | 9 ++++++++ .../test/OpenMP/declare_target_ast_print.cpp | 19 +++++++++++++++ clang/test/OpenMP/declare_target_messages.cpp | 9 ++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index a7f2858477bee6..faa7d1872ae3f1 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11326,6 +11326,9 @@ def err_omp_device_type_mismatch : Error< def err_omp_wrong_device_function_call : Error< "function with 'device_type(%0)' is not available on %select{device|host}1">; def note_omp_marked_device_type_here : Note<"marked as 'device_type(%0)' here">; +def warn_omp_declare_target_has_local_vars : Warning< + "local variable '%0' ignored in 'declare target' directive; ">, + InGroup<OpenMPTarget>; def warn_omp_declare_target_after_first_use : Warning< "declaration marked as declare target after first use, it may lead to incorrect results">, InGroup<OpenMPTarget>; diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index bfc31f2653c237..814126e321d3bc 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -2984,8 +2984,29 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective( OMPDirectiveScope.Exit(); break; } + case OMPD_declare_target: { + SourceLocation DTLoc = ConsumeAnyToken(); + bool HasClauses = Tok.isNot(tok::annot_pragma_openmp_end); + Sema::DeclareTargetContextInfo DTCI(DKind, DTLoc); + if (HasClauses) + ParseOMPDeclareTargetClauses(DTCI); + bool HasImplicitMappings = + !HasClauses || (DTCI.ExplicitlyMapped.empty() && DTCI.Indirect); + + if (HasImplicitMappings) { + Diag(Tok, diag::err_omp_unexpected_directive) + << 1 << getOpenMPDirectiveName(DKind); + SkipUntil(tok::annot_pragma_openmp_end); + break; + } + + // Skip the last annot_pragma_openmp_end. + ConsumeAnyToken(); + + Actions.ActOnFinishedOpenMPDeclareTargetContext(DTCI); + break; + } case OMPD_declare_simd: - case OMPD_declare_target: case OMPD_begin_declare_target: case OMPD_end_declare_target: case OMPD_requires: diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 7f75cfc5b54f35..0cd8ff065a3419 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -23352,6 +23352,15 @@ void Sema::ActOnOpenMPDeclareTargetName(NamedDecl *ND, SourceLocation Loc, isa<FunctionTemplateDecl>(ND)) && "Expected variable, function or function template."); + if (auto *VD = dyn_cast<VarDecl>(ND)) { + // Only global variables can be marked as declare target. + if (!VD->isFileVarDecl() && !VD->isStaticLocal() && + !VD->isStaticDataMember()) { + Diag(Loc, diag::warn_omp_declare_target_has_local_vars) + << VD->getNameAsString(); + return; + } + } // Diagnose marking after use as it may lead to incorrect diagnosis and // codegen. if (LangOpts.OpenMP >= 50 && diff --git a/clang/test/OpenMP/declare_target_ast_print.cpp b/clang/test/OpenMP/declare_target_ast_print.cpp index 40c5dd299abd96..43cccf763e97c3 100644 --- a/clang/test/OpenMP/declare_target_ast_print.cpp +++ b/clang/test/OpenMP/declare_target_ast_print.cpp @@ -360,6 +360,17 @@ int inner_link; // CHECK-NEXT: int inner_link; // CHECK-NEXT: #pragma omp end declare target +void foo2() { return ;} +// CHECK: #pragma omp declare target +// CHECK-NEXT: void foo2() { +// CHECK-NEXT: return; +// CHECK-NEXT: } + +int x; +// CHECK: #pragma omp declare target link +// CHECK-NEXT: int x; +// CHECK-NEXT: #pragma omp end declare target + int main (int argc, char **argv) { foo(); foo_c(); @@ -367,6 +378,14 @@ int main (int argc, char **argv) { test1(); baz<float>(); baz<int>(); + +#if _OPENMP == 202111 +#pragma omp declare target enter(foo2) +#else +#pragma omp declare target to (foo2) +#endif + + #pragma omp declare target link(x) return (0); } diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index cf034aca7c9136..39616bc47b2ccb 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -182,11 +182,20 @@ struct S { #pragma omp end declare target }; +void foo3() { + return; +} + +int *y; +int **w = &y; int main (int argc, char **argv) { + int a = 2; #pragma omp declare target // expected-error {{unexpected OpenMP directive '#pragma omp declare target'}} int v; #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}} foo(v); +#pragma omp declare target to(foo3) link(w) // omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} +#pragma omp declare target to(a) //omp45-warning {{local variable 'a' ignored in 'declare target' directive}} omp5-warning {{local variable 'a' ignored in 'declare target' directive}} omp51-warning {{local variable 'a' ignored in 'declare target' directive}} omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} return (0); } >From 96ed07b306ac2c105e5fa90978c51796123c1289 Mon Sep 17 00:00:00 2001 From: Sandeep Kosuri <ksand...@hpe.com> Date: Sun, 3 Mar 2024 02:34:36 -0600 Subject: [PATCH 2/3] Emitting error instead of warning --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 5 ++--- clang/lib/Sema/SemaOpenMP.cpp | 2 +- clang/test/OpenMP/declare_target_messages.cpp | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index faa7d1872ae3f1..17eeeefab0d01c 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11326,9 +11326,8 @@ def err_omp_device_type_mismatch : Error< def err_omp_wrong_device_function_call : Error< "function with 'device_type(%0)' is not available on %select{device|host}1">; def note_omp_marked_device_type_here : Note<"marked as 'device_type(%0)' here">; -def warn_omp_declare_target_has_local_vars : Warning< - "local variable '%0' ignored in 'declare target' directive; ">, - InGroup<OpenMPTarget>; +def err_omp_declare_target_has_local_vars : Error< + "local variable '%0' ignored in 'declare target' directive; ">; def warn_omp_declare_target_after_first_use : Warning< "declaration marked as declare target after first use, it may lead to incorrect results">, InGroup<OpenMPTarget>; diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 0cd8ff065a3419..f592532e2e03eb 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -23356,7 +23356,7 @@ void Sema::ActOnOpenMPDeclareTargetName(NamedDecl *ND, SourceLocation Loc, // Only global variables can be marked as declare target. if (!VD->isFileVarDecl() && !VD->isStaticLocal() && !VD->isStaticDataMember()) { - Diag(Loc, diag::warn_omp_declare_target_has_local_vars) + Diag(Loc, diag::err_omp_declare_target_has_local_vars) << VD->getNameAsString(); return; } diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index 39616bc47b2ccb..4bafc0dcc37b49 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -195,7 +195,7 @@ int main (int argc, char **argv) { #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}} foo(v); #pragma omp declare target to(foo3) link(w) // omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} -#pragma omp declare target to(a) //omp45-warning {{local variable 'a' ignored in 'declare target' directive}} omp5-warning {{local variable 'a' ignored in 'declare target' directive}} omp51-warning {{local variable 'a' ignored in 'declare target' directive}} omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} +#pragma omp declare target to(a) //omp45-error {{local variable 'a' ignored in 'declare target' directive}} omp5-error {{local variable 'a' ignored in 'declare target' directive}} omp51-error {{local variable 'a' ignored in 'declare target' directive}} omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} return (0); } >From f999138b465dea463a8491deb883193c993f4cf4 Mon Sep 17 00:00:00 2001 From: Sandeep Kosuri <ksand...@hpe.com> Date: Tue, 5 Mar 2024 23:31:36 -0600 Subject: [PATCH 3/3] Fixed the diagnostic --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/test/OpenMP/declare_target_messages.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 17eeeefab0d01c..3c44b2a55890d3 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11327,7 +11327,7 @@ def err_omp_wrong_device_function_call : Error< "function with 'device_type(%0)' is not available on %select{device|host}1">; def note_omp_marked_device_type_here : Note<"marked as 'device_type(%0)' here">; def err_omp_declare_target_has_local_vars : Error< - "local variable '%0' ignored in 'declare target' directive; ">; + "local variable '%0' should not be used in 'declare target' directive; ">; def warn_omp_declare_target_after_first_use : Warning< "declaration marked as declare target after first use, it may lead to incorrect results">, InGroup<OpenMPTarget>; diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index 4bafc0dcc37b49..de831f8575ee5f 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -195,7 +195,7 @@ int main (int argc, char **argv) { #pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}} foo(v); #pragma omp declare target to(foo3) link(w) // omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} -#pragma omp declare target to(a) //omp45-error {{local variable 'a' ignored in 'declare target' directive}} omp5-error {{local variable 'a' ignored in 'declare target' directive}} omp51-error {{local variable 'a' ignored in 'declare target' directive}} omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} +#pragma omp declare target to(a) //omp45-error {{local variable 'a' should not be used in 'declare target' directive}} omp5-error {{local variable 'a' should not be used in 'declare target' directive}} omp51-error {{local variable 'a' should not be used in 'declare target' directive}} omp52-error {{unexpected 'to' clause, use 'enter' instead}} omp52-error {{expected at least one 'enter', 'link' or 'indirect' clause}} return (0); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits