r340082 - test commit: add a comment
Author: mikerice Date: Fri Aug 17 14:16:21 2018 New Revision: 340082 URL: http://llvm.org/viewvc/llvm-project?rev=340082&view=rev Log: test commit: add a comment Modified: cfe/trunk/test/PCH/pch-through3c.cpp Modified: cfe/trunk/test/PCH/pch-through3c.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/pch-through3c.cpp?rev=340082&r1=340081&r2=340082&view=diff == --- cfe/trunk/test/PCH/pch-through3c.cpp (original) +++ cfe/trunk/test/PCH/pch-through3c.cpp Fri Aug 17 14:16:21 2018 @@ -2,6 +2,7 @@ // RUN: -include Inputs/pch-through3c.h \ // RUN: -pch-through-header=Inputs/pch-through3c.h -o %t.3c %s +// Checks that no warnings appear for this successful use. // RUN: %clang_cc1 -verify -I %S -include-pch %t.3c \ // RUN: -include Inputs/pch-through3c.h \ // RUN: -pch-through-header=Inputs/pch-through3c.h \ ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r340934 - [OPENMP] Create non-const ident_t objects.
Author: mikerice Date: Wed Aug 29 08:45:11 2018 New Revision: 340934 URL: http://llvm.org/viewvc/llvm-project?rev=340934&view=rev Log: [OPENMP] Create non-const ident_t objects. Currently ident_t objects are created const when debug info is not enabled, but the libittnotify libray in the OpenMP runtime writes to the reserved_2 field (See __kmp_itt_region_forking in openmp/runtime/src/kmp_itt.inl). Now create ident_t objects non-const. Differential Revision: https://reviews.llvm.org/D51331 Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp cfe/trunk/test/OpenMP/distribute_codegen.cpp cfe/trunk/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp cfe/trunk/test/OpenMP/distribute_parallel_for_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp cfe/trunk/test/OpenMP/distribute_parallel_for_simd_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/distribute_simd_codegen.cpp cfe/trunk/test/OpenMP/for_codegen.cpp cfe/trunk/test/OpenMP/for_firstprivate_codegen.cpp cfe/trunk/test/OpenMP/for_lastprivate_codegen.cpp cfe/trunk/test/OpenMP/for_linear_codegen.cpp cfe/trunk/test/OpenMP/for_reduction_codegen.cpp cfe/trunk/test/OpenMP/for_reduction_codegen_UDR.cpp cfe/trunk/test/OpenMP/ordered_codegen.cpp cfe/trunk/test/OpenMP/parallel_codegen.cpp cfe/trunk/test/OpenMP/parallel_copyin_codegen.cpp cfe/trunk/test/OpenMP/parallel_for_codegen.cpp cfe/trunk/test/OpenMP/parallel_num_threads_codegen.cpp cfe/trunk/test/OpenMP/parallel_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/parallel_reduction_codegen.cpp cfe/trunk/test/OpenMP/sections_codegen.cpp cfe/trunk/test/OpenMP/sections_firstprivate_codegen.cpp cfe/trunk/test/OpenMP/sections_lastprivate_codegen.cpp cfe/trunk/test/OpenMP/sections_reduction_codegen.cpp cfe/trunk/test/OpenMP/single_codegen.cpp cfe/trunk/test/OpenMP/single_firstprivate_codegen.cpp cfe/trunk/test/OpenMP/target_parallel_codegen.cpp cfe/trunk/test/OpenMP/target_parallel_for_codegen.cpp cfe/trunk/test/OpenMP/target_parallel_for_simd_codegen.cpp cfe/trunk/test/OpenMP/target_parallel_if_codegen.cpp cfe/trunk/test/OpenMP/target_parallel_num_threads_codegen.cpp cfe/trunk/test/OpenMP/target_teams_codegen.cpp cfe/trunk/test/OpenMP/target_teams_distribute_codegen.cpp cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_simd_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/target_teams_distribute_simd_codegen.cpp cfe/trunk/test/OpenMP/target_teams_num_teams_codegen.cpp cfe/trunk/test/OpenMP/target_teams_thread_limit_codegen.cpp cfe/trunk/test/OpenMP/teams_codegen.cpp cfe/trunk/test/OpenMP/teams_distribute_parallel_for_num_threads_codegen.cpp cfe/trunk/test/OpenMP/teams_distribute_parallel_for_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/teams_distribute_parallel_for_simd_num_threads_codegen.cpp cfe/trunk/test/OpenMP/teams_distribute_parallel_for_simd_proc_bind_codegen.cpp cfe/trunk/test/OpenMP/threadprivate_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=340934&r1=340933&r2=340934&view=diff == --- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original) +++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Wed Aug 29 08:45:11 2018 @@ -1437,17 +1437,17 @@ static void buildStructValue(ConstantStr template static llvm::GlobalVariable * -createConstantGlobalStruct(CodeGenModule &CGM, QualType Ty, - ArrayRef Data, const Twine &Name, - As &&... Args) { +createGlobalStruct(CodeGenModule &CGM, QualType Ty, bool IsConstant, + ArrayRef Data, const Twine &Name, + As &&... Args) { const auto *RD = cast(Ty->getAsTagDecl()); const CGRecordLayout &RL = CGM.getTypes().getCGRecordLayout(RD); ConstantInitBuilder CIBuilder(CGM); ConstantStructBuilder Fields = CIBuilder.beginStruct(RL.getLLVMType()); buildStructValue(Fields, CGM, RD, RL, Data); return Fields.finishAndCreateGlobal( - Name, CGM.getContext().getAlignOfGlobalVarInChars(Ty), - /*isConstant=*/true, std::forward(Args)...); + Name, CGM.getContext().getAlignOfGlobalVarInChars(Ty), IsConstant, + std::forward(Args)...); } template @@ -1482,8 +1482,9 @@ Address CGOpenMPRuntime::getOrCreateDefa llvm::ConstantInt::getNullValue(CGM.Int32Ty), llvm::ConstantInt::getNullValue(CGM.Int32Ty), DefaultOpenMPPSource}; -llvm::GlobalValue *DefaultOpenMPLocation = createConstantGlobalStruct( -CGM, IdentQTy, Data, "", llvm::GlobalValue::PrivateLinkage); +llvm::GlobalValue *DefaultOpenMPLo
r341963 - [clang-cl, PCH] Support for /Yc and /Yu without filename and #pragma hdrstop
Author: mikerice Date: Tue Sep 11 10:10:44 2018 New Revision: 341963 URL: http://llvm.org/viewvc/llvm-project?rev=341963&view=rev Log: [clang-cl, PCH] Support for /Yc and /Yu without filename and #pragma hdrstop With clang-cl, when the user specifies /Yc or /Yu without a filename the compiler uses a #pragma hdrstop in the main source file to determine the end of the PCH. If a header is specified with /Yc or /Yu #pragma hdrstop has no effect. The optional #pragma hdrstop filename argument is not yet supported. Differential Revision: https://reviews.llvm.org/D51391 Added: cfe/trunk/test/PCH/Inputs/pch-hdrstop-use.cpp cfe/trunk/test/PCH/Inputs/pch-no-hdrstop-use.cpp cfe/trunk/test/PCH/pch-hdrstop-err.cpp cfe/trunk/test/PCH/pch-hdrstop-warn.cpp cfe/trunk/test/PCH/pch-hdrstop.cpp cfe/trunk/test/PCH/pch-no-hdrstop.cpp Modified: cfe/trunk/docs/ReleaseNotes.rst cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td cfe/trunk/include/clang/Driver/CC1Options.td cfe/trunk/include/clang/Lex/Preprocessor.h cfe/trunk/include/clang/Lex/PreprocessorOptions.h cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/lib/Driver/ToolChains/Clang.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/lib/Lex/PPDirectives.cpp cfe/trunk/lib/Lex/Pragma.cpp cfe/trunk/lib/Lex/Preprocessor.cpp cfe/trunk/lib/Parse/ParseAST.cpp cfe/trunk/test/Driver/cl-pch.cpp Modified: cfe/trunk/docs/ReleaseNotes.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=341963&r1=341962&r2=341963&view=diff == --- cfe/trunk/docs/ReleaseNotes.rst (original) +++ cfe/trunk/docs/ReleaseNotes.rst Tue Sep 11 10:10:44 2018 @@ -87,6 +87,11 @@ Attribute Changes in Clang Windows Support --- +- clang-cl now supports the use of the precompiled header options /Yc and /Yu + without the filename argument. When these options are used without the + filename, a `#pragma hdrstop` inside the source marks the end of the + precompiled code. + - ... Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=341963&r1=341962&r2=341963&view=diff == --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Tue Sep 11 10:10:44 2018 @@ -151,9 +151,6 @@ def warn_drv_unknown_argument_clang_cl_w "unknown argument ignored in clang-cl '%0' (did you mean '%1'?)">, InGroup; -def warn_drv_ycyu_no_arg_clang_cl : Warning< - "support for '%0' without a filename not implemented yet; flag ignored">, - InGroup; def warn_drv_ycyu_different_arg_clang_cl : Warning< "support for '/Yc' and '/Yu' with different filenames not implemented yet; flags ignored">, InGroup; Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=341963&r1=341962&r2=341963&view=diff == --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Tue Sep 11 10:10:44 2018 @@ -412,9 +412,16 @@ def err_pp_through_header_not_found : Er def err_pp_through_header_not_seen : Error< "#include of '%0' not seen while attempting to " "%select{create|use}1 precompiled header">, DefaultFatal; +def err_pp_pragma_hdrstop_not_seen : Error< + "#pragma hdrstop not seen while attempting to use precompiled header">, + DefaultFatal; def warn_pp_macro_def_mismatch_with_pch : Warning< "definition of macro %0 does not match definition in precompiled header">, InGroup; +def warn_pp_hdrstop_filename_ignored : Warning< + "#pragma hdrstop filename not supported, " + "/Fp can be used to specify precompiled header filename">, + InGroup; def err_pp_file_not_found_not_fatal : Error< "'%0' file not found with include; use \"quotes\" instead">; def err_pp_error_opening_file : Error< Modified: cfe/trunk/include/clang/Driver/CC1Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=341963&r1=341962&r2=341963&view=diff == --- cfe/trunk/include/clang/Driver/CC1Options.td (original) +++ cfe/trunk/include/clang/Driver/CC1Options.td Tue Sep 11 10:10:44 2018 @@ -604,6 +604,10 @@ def foverride_record_layout_EQ : Joined< def pch_through_header_EQ : Joined<["-"], "pch-through-header=">, HelpText<"Stop PCH generation after including this file. When using a PCH, " "skip tokens until after this file is included.">; +def pch_through_hdrstop_create : Flag
r359506 - When skipping code at the start of a file during PCH use, Preprocessor::Lex
Author: mikerice Date: Mon Apr 29 14:21:17 2019 New Revision: 359506 URL: http://llvm.org/viewvc/llvm-project?rev=359506&view=rev Log: When skipping code at the start of a file during PCH use, Preprocessor::Lex is not used since it consumes all preprocessor directives until it returns a real token. Using the specific Lexer (i.e. CurLexer->Lex) makes it possible to stop skipping after an #include or #pragma hdrstop. Previously the skipping code was only handling CurLexer, now all will be handled correctly. Fixes: llvm.org/PR41585 Differential Revision: https://reviews.llvm.org/D61217 Added: cfe/trunk/test/PCH/Inputs/pch-through-macro.h (with props) cfe/trunk/test/PCH/pch-through4.cpp (with props) cfe/trunk/test/PCH/pch-through4a.cpp (with props) Modified: cfe/trunk/lib/Lex/Preprocessor.cpp Modified: cfe/trunk/lib/Lex/Preprocessor.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=359506&r1=359505&r2=359506&view=diff == --- cfe/trunk/lib/Lex/Preprocessor.cpp (original) +++ cfe/trunk/lib/Lex/Preprocessor.cpp Mon Apr 29 14:21:17 2019 @@ -625,8 +625,23 @@ void Preprocessor::SkipTokensWhileUsingP bool UsingPragmaHdrStop = SkippingUntilPragmaHdrStop; Token Tok; while (true) { -bool InPredefines = (CurLexer->getFileID() == getPredefinesFileID()); -CurLexer->Lex(Tok); +bool InPredefines = +(CurLexer && CurLexer->getFileID() == getPredefinesFileID()); +switch (CurLexerKind) { +case CLK_Lexer: + CurLexer->Lex(Tok); + break; +case CLK_TokenLexer: + CurTokenLexer->Lex(Tok); + break; +case CLK_CachingLexer: + bool IsNewToken; + CachingLex(Tok, IsNewToken); + break; +case CLK_LexAfterModuleImport: + LexAfterModuleImport(Tok); + break; +} if (Tok.is(tok::eof) && !InPredefines) { ReachedMainFileEOF = true; break; Added: cfe/trunk/test/PCH/Inputs/pch-through-macro.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/Inputs/pch-through-macro.h?rev=359506&view=auto == --- cfe/trunk/test/PCH/Inputs/pch-through-macro.h (added) +++ cfe/trunk/test/PCH/Inputs/pch-through-macro.h Mon Apr 29 14:21:17 2019 @@ -0,0 +1,3 @@ +#pragma once +#define Source(x,y) +#define InOut(size) Source(InOut, (size)) Propchange: cfe/trunk/test/PCH/Inputs/pch-through-macro.h -- svn:eol-style = native Propchange: cfe/trunk/test/PCH/Inputs/pch-through-macro.h -- svn:keywords = Author Date Id Rev URL Propchange: cfe/trunk/test/PCH/Inputs/pch-through-macro.h -- svn:mime-type = text/plain Added: cfe/trunk/test/PCH/pch-through4.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/pch-through4.cpp?rev=359506&view=auto == --- cfe/trunk/test/PCH/pch-through4.cpp (added) +++ cfe/trunk/test/PCH/pch-through4.cpp Mon Apr 29 14:21:17 2019 @@ -0,0 +1,12 @@ +// expected-no-diagnostics +// Create PCH with #pragma hdrstop processing. +// RUN: %clang_cc1 -verify -I %S -emit-pch -pch-through-hdrstop-create \ +// RUN: -fms-extensions -o %t.pch -x c++-header %s + +// Create the PCH object +// RUN: %clang_cc1 -verify -I %S -emit-obj -include-pch %t.pch \ +// RUN: -pch-through-hdrstop-create -fms-extensions -o %t.obj -x c++ %s + +#pragma once +#include "Inputs/pch-through-macro.h" +void f(InOut(a) char *b, unsigned long a); Propchange: cfe/trunk/test/PCH/pch-through4.cpp -- svn:eol-style = native Propchange: cfe/trunk/test/PCH/pch-through4.cpp -- svn:keywords = Author Date Id Rev URL Propchange: cfe/trunk/test/PCH/pch-through4.cpp -- svn:mime-type = text/plain Added: cfe/trunk/test/PCH/pch-through4a.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/pch-through4a.cpp?rev=359506&view=auto == --- cfe/trunk/test/PCH/pch-through4a.cpp (added) +++ cfe/trunk/test/PCH/pch-through4a.cpp Mon Apr 29 14:21:17 2019 @@ -0,0 +1,16 @@ +// expected-no-diagnostics +// Create PCH with a through header. +// RUN: %clang_cc1 -verify -I %S -emit-pch \ +// RUN: -pch-through-header=Inputs/pch-through1.h \ +// RUN: -fms-extensions -o %t.pch -x c++-header %s + +// Create the PCH object +// RUN: %clang_cc1 -verify -I %S -emit-obj -include-pch %t.pch \ +// RUN: -pch-through-header=Inputs/pch-through1.h \ +// R
r360271 - Include corecrt.h in stddef.h and vcruntime.h in stdarg.h to improve MS
Author: mikerice Date: Wed May 8 10:15:21 2019 New Revision: 360271 URL: http://llvm.org/viewvc/llvm-project?rev=360271&view=rev Log: Include corecrt.h in stddef.h and vcruntime.h in stdarg.h to improve MS compatibility. This allows some applications developed with MSVC to compile with clang without any extra changes. Fixes: llvm.org/PR40789 Differential Revision: https://reviews.llvm.org/D61646 Added: cfe/trunk/test/Headers/Inputs/ms-crt/ cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h (with props) cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h (with props) cfe/trunk/test/Headers/ms-additional-includes.cpp (with props) Modified: cfe/trunk/lib/Headers/stdarg.h cfe/trunk/lib/Headers/stddef.h cfe/trunk/test/Headers/c11.c cfe/trunk/test/Headers/ms-null-ms-header-vs-stddef.cpp Modified: cfe/trunk/lib/Headers/stdarg.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/stdarg.h?rev=360271&r1=360270&r2=360271&view=diff == --- cfe/trunk/lib/Headers/stdarg.h (original) +++ cfe/trunk/lib/Headers/stdarg.h Wed May 8 10:15:21 2019 @@ -10,6 +10,11 @@ #ifndef __STDARG_H #define __STDARG_H +#if defined(_MSC_VER) +/* Include otherwise unneeded header for MSVC compatibility. */ +#include +#endif + #ifndef _VA_LIST typedef __builtin_va_list va_list; #define _VA_LIST Modified: cfe/trunk/lib/Headers/stddef.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/stddef.h?rev=360271&r1=360270&r2=360271&view=diff == --- cfe/trunk/lib/Headers/stddef.h (original) +++ cfe/trunk/lib/Headers/stddef.h Wed May 8 10:15:21 2019 @@ -18,6 +18,12 @@ #if !__has_feature(modules) #define __STDDEF_H #endif + +#if defined(_MSC_VER) +/* Include otherwise unneeded header for MSVC compatibility. */ +#include +#endif + #define __need_ptrdiff_t #define __need_size_t #define __need_wchar_t Added: cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h?rev=360271&view=auto == --- cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h (added) +++ cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h Wed May 8 10:15:21 2019 @@ -0,0 +1 @@ +#pragma once Propchange: cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h -- svn:eol-style = native Propchange: cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h -- svn:keywords = Author Date Id Rev URL Propchange: cfe/trunk/test/Headers/Inputs/ms-crt/corecrt.h -- svn:mime-type = text/plain Added: cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h?rev=360271&view=auto == --- cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h (added) +++ cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h Wed May 8 10:15:21 2019 @@ -0,0 +1 @@ +#pragma once Propchange: cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h -- svn:eol-style = native Propchange: cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h -- svn:keywords = Author Date Id Rev URL Propchange: cfe/trunk/test/Headers/Inputs/ms-crt/vcruntime.h -- svn:mime-type = text/plain Modified: cfe/trunk/test/Headers/c11.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/c11.c?rev=360271&r1=360270&r2=360271&view=diff == --- cfe/trunk/test/Headers/c11.c (original) +++ cfe/trunk/test/Headers/c11.c Wed May 8 10:15:21 2019 @@ -2,7 +2,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -fmodules -fmodules-cache-path=%t %s -D__STDC_WANT_LIB_EXT1__=1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s -// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -triple i686-pc-win32 -fms-compatibility-version=17.00 %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -triple i686-pc-win32 \ +// RUN: -fms-compatibility-version=17.00 -isystem %S/Inputs/ms-crt %s noreturn int f(); // expected-error 1+{{}} Added: cfe/trunk/test/Headers/ms-additional-includes.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/ms-additional-includes.cpp?rev=360271&view=auto
r342666 - [OPENMP] Fix spelling of getLoopCounter (NFC)
Author: mikerice Date: Thu Sep 20 10:19:41 2018 New Revision: 342666 URL: http://llvm.org/viewvc/llvm-project?rev=342666&view=rev Log: [OPENMP] Fix spelling of getLoopCounter (NFC) Modified: cfe/trunk/include/clang/AST/OpenMPClause.h cfe/trunk/lib/AST/OpenMPClause.cpp cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp cfe/trunk/lib/Serialization/ASTWriter.cpp Modified: cfe/trunk/include/clang/AST/OpenMPClause.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/OpenMPClause.h?rev=342666&r1=342665&r2=342666&view=diff == --- cfe/trunk/include/clang/AST/OpenMPClause.h (original) +++ cfe/trunk/include/clang/AST/OpenMPClause.h Thu Sep 20 10:19:41 2018 @@ -990,8 +990,8 @@ public: /// Set loop counter for the specified loop. void setLoopCounter(unsigned NumLoop, Expr *Counter); /// Get loops counter for the specified loop. - Expr *getLoopCunter(unsigned NumLoop); - const Expr *getLoopCunter(unsigned NumLoop) const; + Expr *getLoopCounter(unsigned NumLoop); + const Expr *getLoopCounter(unsigned NumLoop) const; child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); } Modified: cfe/trunk/lib/AST/OpenMPClause.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/OpenMPClause.cpp?rev=342666&r1=342665&r2=342666&view=diff == --- cfe/trunk/lib/AST/OpenMPClause.cpp (original) +++ cfe/trunk/lib/AST/OpenMPClause.cpp Thu Sep 20 10:19:41 2018 @@ -222,12 +222,12 @@ void OMPOrderedClause::setLoopCounter(un getTrailingObjects()[NumberOfLoops + NumLoop] = Counter; } -Expr *OMPOrderedClause::getLoopCunter(unsigned NumLoop) { +Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) { assert(NumLoop < NumberOfLoops && "out of loops number."); return getTrailingObjects()[NumberOfLoops + NumLoop]; } -const Expr *OMPOrderedClause::getLoopCunter(unsigned NumLoop) const { +const Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) const { assert(NumLoop < NumberOfLoops && "out of loops number."); return getTrailingObjects()[NumberOfLoops + NumLoop]; } Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=342666&r1=342665&r2=342666&view=diff == --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original) +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Thu Sep 20 10:19:41 2018 @@ -1516,7 +1516,7 @@ void CodeGenFunction::EmitOMPPrivateLoop for (unsigned I = S.getCollapsedNumber(), E = C->getLoopNumIterations().size(); I < E; ++I) { - const auto *DRE = cast(C->getLoopCunter(I)); + const auto *DRE = cast(C->getLoopCounter(I)); const auto *VD = cast(DRE->getDecl()); // Override only those variables that are really emitted already. if (LocalDeclMap.count(VD)) { @@ -4966,7 +4966,7 @@ void CodeGenFunction::EmitSimpleOMPExecu E = C->getLoopNumIterations().size(); I < E; ++I) { if (const auto *VD = dyn_cast( -cast(C->getLoopCunter(I))->getDecl())) { +cast(C->getLoopCounter(I))->getDecl())) { // Emit only those that were not explicitly referenced in clauses. if (!CGF.LocalDeclMap.count(VD)) CGF.EmitVarDecl(*VD); Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=342666&r1=342665&r2=342666&view=diff == --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Sep 20 10:19:41 2018 @@ -6555,7 +6555,7 @@ void OMPClauseWriter::VisitOMPOrderedCla for (Expr *NumIter : C->getLoopNumIterations()) Record.AddStmt(NumIter); for (unsigned I = 0, E = C->getLoopNumIterations().size(); I getLoopCunter(I)); +Record.AddStmt(C->getLoopCounter(I)); Record.AddSourceLocation(C->getLParenLoc()); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r366336 - [OPENMP]Fix crash in LoopCounterRefChecker when MemberExpr is not Var or Field
Author: mikerice Date: Wed Jul 17 08:18:45 2019 New Revision: 366336 URL: http://llvm.org/viewvc/llvm-project?rev=366336&view=rev Log: [OPENMP]Fix crash in LoopCounterRefChecker when MemberExpr is not Var or Field checkDecl is only valid for VarDecls or FieldDecls, since getCanonicalDecl expects only these. Prevent other Decl kinds (such as CXXMethodDecls and EnumConstantDecls) from entering and asserting. Differential Revision: https://reviews.llvm.org/D64842 Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/for_loop_messages.cpp Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=366336&r1=366335&r2=366336&view=diff == --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed Jul 17 08:18:45 2019 @@ -4992,7 +4992,8 @@ public: bool VisitMemberExpr(const MemberExpr *E) { if (isa(E->getBase()->IgnoreParens())) { const ValueDecl *VD = E->getMemberDecl(); - return checkDecl(E, VD); + if (isa(VD) || isa(VD)) +return checkDecl(E, VD); } return false; } Modified: cfe/trunk/test/OpenMP/for_loop_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_loop_messages.cpp?rev=366336&r1=366335&r2=366336&view=diff == --- cfe/trunk/test/OpenMP/for_loop_messages.cpp (original) +++ cfe/trunk/test/OpenMP/for_loop_messages.cpp Wed Jul 17 08:18:45 2019 @@ -626,6 +626,8 @@ template class TC { int ii, iii, kk; public: + enum { myconstant = 42 }; + int ub(); int dotest_lt(IT begin, IT end) { #pragma omp parallel // expected-error@+3 3 {{the loop initializer expression depends on the current loop control variable}} @@ -634,6 +636,12 @@ public: for (ii = ii * 10 + 25; ii < ii / ii - 23; ii += 1) ; +// Check that member function calls and enum constants in the condition is +// handled. +#pragma omp for + for (ii = 0; ii < ub() + this->myconstant; ii += 1) // expected-no-error +; + #pragma omp parallel // expected-error@+4 2 {{expected loop invariant expression or ' * ii + ' kind of expression}} // expected-error@+3 {{expected loop invariant expression or ' * TC::ii + ' kind of expression}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[libc] [clang] [clang-tools-extra] [libcxx] [flang] [llvm] [compiler-rt] [C23] Complete support for WG14 N2508 (PR #71398)
@@ -32,8 +32,8 @@ T tmain(T argc) { } switch (argc) { #pragma omp error // expected-error {{ERROR}} - case 1: -#pragma omp error // expected-error {{ERROR}} + case 1: // FIXME: error without 'at execution' is not a stand-alone directive and so this should be accepted. mikerice1969 wrote: I would remove this FIXME. I think we want 'error' to be diagnosed. The original meaning of stand-alone was directives that did not has associated user statements. This was before utility/informational directives existed. I think the intention is we only allow executable statements with associated user statements here, not declarative, utility, etc. https://github.com/llvm/llvm-project/pull/71398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP] Add a missing 'const' (NFC) (PR #71596)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/71596 None >From 41f147c79a0a32fa541e7fb99cb2053b8f4b7ea2 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Tue, 7 Nov 2023 14:51:55 -0800 Subject: [PATCH] [OpenMP] Add a missing 'const' (NFC) --- clang/include/clang/AST/StmtOpenMP.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h index 2725747e051e728..62164339153573c 100644 --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -994,7 +994,7 @@ class OMPLoopTransformationDirective : public OMPLoopBasedDirective { unsigned getNumAssociatedLoops() const { return getLoopsNumber(); } /// Return the number of loops generated by this loop transformation. - unsigned getNumGeneratedLoops() { return NumGeneratedLoops; } + unsigned getNumGeneratedLoops() const { return NumGeneratedLoops; } /// Get the de-sugared statements after the loop transformation. /// ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP] Add a missing 'const' (NFC) (PR #71596)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/71596 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC] Remove unneeded nullptr checks after cast<> (PR #74674)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/74674 Since VD is assigned from a cast it cannot be a nullptr or it would have asserted. Remove the subsequent checks to clear up any misunderstanding. >From 6b3b456534c21a74f12ac022ee99365dd3831dec Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Wed, 6 Dec 2023 14:30:09 -0800 Subject: [PATCH] [NFC] Remove unneeded nullptr checks after cast<> Since VD is assigned from a cast it cannot be a nullptr or it would have asserted. Remove the subsequent checks to clear up any misunderstanding. --- clang/lib/CodeGen/CodeGenModule.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6a20723bf2bca..b931a81bc0087 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -6439,7 +6439,7 @@ ConstantAddress CodeGenModule::GetAddrOfGlobalTemporary( VD, E->getManglingNumber(), Out); APValue *Value = nullptr; - if (E->getStorageDuration() == SD_Static && VD && VD->evaluateValue()) { + if (E->getStorageDuration() == SD_Static && VD->evaluateValue()) { // If the initializer of the extending declaration is a constant // initializer, we should have a cached constant initializer for this // temporary. Note that this might have a different value from the value @@ -6454,8 +6454,7 @@ ConstantAddress CodeGenModule::GetAddrOfGlobalTemporary( !EvalResult.hasSideEffects()) Value = &EvalResult.Val; - LangAS AddrSpace = - VD ? GetGlobalVarAddressSpace(VD) : MaterializedType.getAddressSpace(); + LangAS AddrSpace = GetGlobalVarAddressSpace(VD); std::optional emitter; llvm::Constant *InitialValue = nullptr; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC] Remove unneeded nullptr checks after cast<> (PR #74674)
@@ -6454,8 +6454,7 @@ ConstantAddress CodeGenModule::GetAddrOfGlobalTemporary( !EvalResult.hasSideEffects()) Value = &EvalResult.Val; - LangAS AddrSpace = - VD ? GetGlobalVarAddressSpace(VD) : MaterializedType.getAddressSpace(); mikerice1969 wrote: @yxsamliu, you may have added this back in cbf647cc3a712. Do you know when/if the AddrSpace should be set from MaterializedType since it seems VD is always non-null here. https://github.com/llvm/llvm-project/pull/74674 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC] Remove unneeded nullptr checks after cast<> (PR #74674)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/74674 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [CodeGen] Implement post-opt linking option for builtin bitocdes (PR #69371)
@@ -48,428 +49,365 @@ #include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Transforms/IPO/Internalize.h" +#include "llvm/Transforms/Utils/Cloning.h" -#include #include using namespace clang; using namespace llvm; #define DEBUG_TYPE "codegenaction" namespace clang { - class BackendConsumer; - class ClangDiagnosticHandler final : public DiagnosticHandler { - public: -ClangDiagnosticHandler(const CodeGenOptions &CGOpts, BackendConsumer *BCon) -: CodeGenOpts(CGOpts), BackendCon(BCon) {} +class BackendConsumer; +class ClangDiagnosticHandler final : public DiagnosticHandler { +public: + ClangDiagnosticHandler(const CodeGenOptions &CGOpts, BackendConsumer *BCon) + : CodeGenOpts(CGOpts), BackendCon(BCon) {} -bool handleDiagnostics(const DiagnosticInfo &DI) override; + bool handleDiagnostics(const DiagnosticInfo &DI) override; -bool isAnalysisRemarkEnabled(StringRef PassName) const override { - return CodeGenOpts.OptimizationRemarkAnalysis.patternMatches(PassName); -} -bool isMissedOptRemarkEnabled(StringRef PassName) const override { - return CodeGenOpts.OptimizationRemarkMissed.patternMatches(PassName); -} -bool isPassedOptRemarkEnabled(StringRef PassName) const override { - return CodeGenOpts.OptimizationRemark.patternMatches(PassName); -} + bool isAnalysisRemarkEnabled(StringRef PassName) const override { +return CodeGenOpts.OptimizationRemarkAnalysis.patternMatches(PassName); + } + bool isMissedOptRemarkEnabled(StringRef PassName) const override { +return CodeGenOpts.OptimizationRemarkMissed.patternMatches(PassName); + } + bool isPassedOptRemarkEnabled(StringRef PassName) const override { +return CodeGenOpts.OptimizationRemark.patternMatches(PassName); + } -bool isAnyRemarkEnabled() const override { - return CodeGenOpts.OptimizationRemarkAnalysis.hasValidPattern() || - CodeGenOpts.OptimizationRemarkMissed.hasValidPattern() || - CodeGenOpts.OptimizationRemark.hasValidPattern(); -} + bool isAnyRemarkEnabled() const override { +return CodeGenOpts.OptimizationRemarkAnalysis.hasValidPattern() || + CodeGenOpts.OptimizationRemarkMissed.hasValidPattern() || + CodeGenOpts.OptimizationRemark.hasValidPattern(); + } - private: -const CodeGenOptions &CodeGenOpts; -BackendConsumer *BackendCon; - }; +private: + const CodeGenOptions &CodeGenOpts; + BackendConsumer *BackendCon; +}; + +static void reportOptRecordError(Error E, DiagnosticsEngine &Diags, + const CodeGenOptions &CodeGenOpts) { + handleAllErrors( + std::move(E), +[&](const LLVMRemarkSetupFileError &E) { +Diags.Report(diag::err_cannot_open_file) +<< CodeGenOpts.OptRecordFile << E.message(); + }, +[&](const LLVMRemarkSetupPatternError &E) { +Diags.Report(diag::err_drv_optimization_remark_pattern) +<< E.message() << CodeGenOpts.OptRecordPasses; + }, +[&](const LLVMRemarkSetupFormatError &E) { +Diags.Report(diag::err_drv_optimization_remark_format) +<< CodeGenOpts.OptRecordFormat; + }); +} - static void reportOptRecordError(Error E, DiagnosticsEngine &Diags, - const CodeGenOptions &CodeGenOpts) { -handleAllErrors( -std::move(E), - [&](const LLVMRemarkSetupFileError &E) { - Diags.Report(diag::err_cannot_open_file) - << CodeGenOpts.OptRecordFile << E.message(); -}, - [&](const LLVMRemarkSetupPatternError &E) { - Diags.Report(diag::err_drv_optimization_remark_pattern) - << E.message() << CodeGenOpts.OptRecordPasses; -}, - [&](const LLVMRemarkSetupFormatError &E) { - Diags.Report(diag::err_drv_optimization_remark_format) - << CodeGenOpts.OptRecordFormat; -}); -} +BackendConsumer::BackendConsumer(BackendAction Action, DiagnosticsEngine &Diags, + IntrusiveRefCntPtr VFS, + const HeaderSearchOptions &HeaderSearchOpts, + const PreprocessorOptions &PPOpts, + const CodeGenOptions &CodeGenOpts, + const TargetOptions &TargetOpts, + const LangOptions &LangOpts, + const std::string &InFile, + SmallVector LinkModules, + std::unique_ptr OS, + LLVMContext &C, + CoverageSourceInfo *CoverageInfo) + : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts), + CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts), + AsmOutStream(std::move(OS)), Context(nullptr), FS(VFS), + LLVMIRGeneration("irgen", "LLVM
[clang] [CodeGen] Add conditional to module cloning in bitcode linking (PR #72478)
https://github.com/mikerice1969 approved this pull request. LGTM. It fixes the performance problems we were seeing. Thanks! https://github.com/llvm/llvm-project/pull/72478 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang-tools-extra] [llvm] [compiler-rt] [flang] [clang] Add support for new loop attribute [[clang::code_align()]] (PR #70762)
@@ -359,16 +359,34 @@ static Attr *handleCodeAlignAttr(Sema &S, Stmt *St, const ParsedAttr &A) { static void CheckForDuplicateCodeAlignAttrs(Sema &S, const SmallVectorImpl &Attrs) { - const Attr *A = nullptr; - for (const auto *I : Attrs) { -if (isa(I)) { - if (A) { -S.Diag(I->getLocation(), diag::err_loop_attr_duplication) << A; -S.Diag(A->getLocation(), diag::note_previous_attribute); - } - A = I; +const auto *FirstItr = + std::find_if(Attrs.begin(), Attrs.end(), [](const Attr *A) { + return isa(A); + }); + +const Attr *FirstItrAttr = mikerice1969 wrote: Don't think we need FirstItrAttr or NextItrAttr. Couldn't you use (*FirstItr) and (*NextItr) for those? https://github.com/llvm/llvm-project/pull/70762 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[llvm] [clang] Replace getAs with castAs, dyn_cast with cast (NFC) (PR #72600)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/72600 Make the code clear that nullptrs are not expected. >From da715ea17cd3a23894826eac8cc8f7cd880b5e02 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Thu, 16 Nov 2023 18:30:47 -0800 Subject: [PATCH] Replace getAs with castAs, dyn_cast with cast (NFC) Make the code clear that nullptrs are not expected. --- clang/lib/AST/ASTContext.cpp | 4 ++-- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 4f54791b4c1e5ce..1c893d008cb49f3 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4014,8 +4014,8 @@ QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts, assert(vecType->isBuiltinType() || (vecType->isBitIntType() && // Only support _BitInt elements with byte-sized power of 2 NumBits. - llvm::isPowerOf2_32(vecType->getAs()->getNumBits()) && - vecType->getAs()->getNumBits() >= 8)); + llvm::isPowerOf2_32(vecType->castAs()->getNumBits()) && + vecType->castAs()->getNumBits() >= 8)); // Check if we've already instantiated a vector of this type. llvm::FoldingSetNodeID ID; diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index ad6b0188390d88f..d04645e89f92843 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -4402,7 +4402,7 @@ static void updateNVPTXMetadata(Function &Kernel, StringRef Name, int32_t Value, // Update the "maxntidx" metadata for NVIDIA, or add it. MDNode *ExistingOp = getNVPTXMDNode(Kernel, Name); if (ExistingOp) { -auto *OldVal = dyn_cast(ExistingOp->getOperand(2)); +auto *OldVal = cast(ExistingOp->getOperand(2)); int32_t OldLimit = cast(OldVal->getValue())->getZExtValue(); ExistingOp->replaceOperandWith( 2, ConstantAsMetadata::get(ConstantInt::get( @@ -4441,7 +4441,7 @@ OpenMPIRBuilder::readThreadBoundsForKernel(const Triple &T, Function &Kernel) { } if (MDNode *ExistingOp = getNVPTXMDNode(Kernel, "maxntidx")) { -auto *OldVal = dyn_cast(ExistingOp->getOperand(2)); +auto *OldVal = cast(ExistingOp->getOperand(2)); int32_t UB = cast(OldVal->getValue())->getZExtValue(); return {0, ThreadLimit ? std::min(ThreadLimit, UB) : UB}; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] Replace getAs with castAs, dyn_cast with cast (NFC) (PR #72600)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/72600 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[compiler-rt] [flang] [clang-tools-extra] [llvm] [clang] [libc] [libcxx] [C23] Complete support for WG14 N2508 (PR #71398)
https://github.com/mikerice1969 approved this pull request. LGTM. Thanks! https://github.com/llvm/llvm-project/pull/71398 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Remove malformed brief commands in comments (NFC) (PR #70746)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/70746 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] f82ec55 - [OpenMP] Initial parsing/sema for the 'omp target parallel loop' construct
Author: Mike Rice Date: 2022-03-24T09:19:00-07:00 New Revision: f82ec5532b2f303732e547226816d7a668db3050 URL: https://github.com/llvm/llvm-project/commit/f82ec5532b2f303732e547226816d7a668db3050 DIFF: https://github.com/llvm/llvm-project/commit/f82ec5532b2f303732e547226816d7a668db3050.diff LOG: [OpenMP] Initial parsing/sema for the 'omp target parallel loop' construct Adds basic parsing/sema/serialization support for the #pragma omp target parallel loop directive. Differential Revision: https://reviews.llvm.org/D122359 Added: clang/test/OpenMP/target_parallel_generic_loop_ast_print.cpp clang/test/OpenMP/target_parallel_generic_loop_messages.cpp Modified: clang/include/clang-c/Index.h clang/include/clang/AST/RecursiveASTVisitor.h clang/include/clang/AST/StmtOpenMP.h clang/include/clang/Basic/StmtNodes.td clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTBitCodes.h clang/lib/AST/StmtOpenMP.cpp clang/lib/AST/StmtPrinter.cpp clang/lib/AST/StmtProfile.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/CodeGen/CGStmt.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaExceptionSpec.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp clang/test/Analysis/cfg-openmp.cpp clang/tools/libclang/CIndex.cpp clang/tools/libclang/CXCursor.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 4783744359eec..f28601c37d8ef 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -2612,7 +2612,11 @@ enum CXCursorKind { */ CXCursor_OMPParallelGenericLoopDirective = 298, - CXCursor_LastStmt = CXCursor_OMPParallelGenericLoopDirective, + /** OpenMP target parallel loop directive. + */ + CXCursor_OMPTargetParallelGenericLoopDirective = 299, + + CXCursor_LastStmt = CXCursor_OMPTargetParallelGenericLoopDirective, /** * Cursor that represents the translation unit itself. diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index ceb874598aded..5aed81d6c72ac 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -3082,6 +3082,9 @@ DEF_TRAVERSE_STMT(OMPTargetTeamsGenericLoopDirective, DEF_TRAVERSE_STMT(OMPParallelGenericLoopDirective, { TRY_TO(TraverseOMPExecutableDirective(S)); }) + +DEF_TRAVERSE_STMT(OMPTargetParallelGenericLoopDirective, + { TRY_TO(TraverseOMPExecutableDirective(S)); }) // OpenMP clauses. template bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) { diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h index 9178b47a0b5f4..28b3567b36556 100644 --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -1529,6 +1529,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { T->getStmtClass() == OMPTeamsGenericLoopDirectiveClass || T->getStmtClass() == OMPTargetTeamsGenericLoopDirectiveClass || T->getStmtClass() == OMPParallelGenericLoopDirectiveClass || + T->getStmtClass() == OMPTargetParallelGenericLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopSimdDirectiveClass || T->getStmtClass() == OMPDistributeDirectiveClass || @@ -5767,6 +5768,71 @@ class OMPParallelGenericLoopDirective final : public OMPLoopDirective { return T->getStmtClass() == OMPParallelGenericLoopDirectiveClass; } }; + +/// This represents '#pragma omp target parallel loop' directive. +/// +/// \code +/// #pragma omp target parallel loop private(a,b) order(concurrent) +/// \endcode +/// In this example directive '#pragma omp target parallel loop' has +/// clauses 'private' with the variables 'a' and 'b', and order(concurrent). +/// +class OMPTargetParallelGenericLoopDirective final : public OMPLoopDirective { + friend class ASTStmtReader; + friend class OMPExecutableDirective; + /// Build directive with the given start and end location. + /// + /// \param StartLoc Starting location of the directive kind. + /// \param EndLoc Ending location of the directive. + /// \param CollapsedNum Number of collapsed nested loops. + /// + OMPTargetParallelGenericLoopDirective(SourceLocation StartLoc, +SourceLocation EndLoc, +unsigned CollapsedNum) + : OMPLoopDirective(OMPTargetParallelGenericLoopDirectiveClass, + llvm::omp::OMPD_target_parallel_loop, StartLoc, EndLoc,
[clang] 79f661e - [OpenMP] Initial parsing/sema for the 'omp teams loop' construct
Author: Mike Rice Date: 2022-03-16T14:39:18-07:00 New Revision: 79f661edc13d389437b83d42f0af04b0615b920e URL: https://github.com/llvm/llvm-project/commit/79f661edc13d389437b83d42f0af04b0615b920e DIFF: https://github.com/llvm/llvm-project/commit/79f661edc13d389437b83d42f0af04b0615b920e.diff LOG: [OpenMP] Initial parsing/sema for the 'omp teams loop' construct Adds basic parsing/sema/serialization support for the #pragma omp teams loop directive. Differential Revision: https://reviews.llvm.org/D121713 Added: clang/test/OpenMP/teams_generic_loop_ast_print.cpp clang/test/OpenMP/teams_generic_loop_messages.cpp Modified: clang/include/clang-c/Index.h clang/include/clang/AST/RecursiveASTVisitor.h clang/include/clang/AST/StmtOpenMP.h clang/include/clang/Basic/DiagnosticSemaKinds.td clang/include/clang/Basic/StmtNodes.td clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTBitCodes.h clang/lib/AST/StmtOpenMP.cpp clang/lib/AST/StmtPrinter.cpp clang/lib/AST/StmtProfile.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/CodeGen/CGStmt.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaExceptionSpec.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp clang/test/Analysis/cfg-openmp.cpp clang/tools/libclang/CIndex.cpp clang/tools/libclang/CXCursor.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index c6967e5f85609..4f4bf8fe14ea0 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -2600,7 +2600,11 @@ enum CXCursorKind { */ CXCursor_OMPGenericLoopDirective = 295, - CXCursor_LastStmt = CXCursor_OMPGenericLoopDirective, + /** OpenMP teams loop directive. + */ + CXCursor_OMPTeamsGenericLoopDirective = 296, + + CXCursor_LastStmt = CXCursor_OMPTeamsGenericLoopDirective, /** * Cursor that represents the translation unit itself. diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 0995aa62d267e..ef2fb6cbe03ee 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -3074,6 +3074,9 @@ DEF_TRAVERSE_STMT(OMPMaskedDirective, DEF_TRAVERSE_STMT(OMPGenericLoopDirective, { TRY_TO(TraverseOMPExecutableDirective(S)); }) +DEF_TRAVERSE_STMT(OMPTeamsGenericLoopDirective, + { TRY_TO(TraverseOMPExecutableDirective(S)); }) + // OpenMP clauses. template bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) { diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h index 1702cafaf462f..74c8d6d980c1e 100644 --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -1526,6 +1526,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { T->getStmtClass() == OMPMasterTaskLoopDirectiveClass || T->getStmtClass() == OMPMasterTaskLoopSimdDirectiveClass || T->getStmtClass() == OMPGenericLoopDirectiveClass || + T->getStmtClass() == OMPTeamsGenericLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopSimdDirectiveClass || T->getStmtClass() == OMPDistributeDirectiveClass || @@ -5569,6 +5570,71 @@ class OMPGenericLoopDirective final : public OMPLoopDirective { } }; +/// This represents '#pragma omp teams loop' directive. +/// +/// \code +/// #pragma omp teams loop private(a,b) order(concurrent) +/// \endcode +/// In this example directive '#pragma omp teams loop' has +/// clauses 'private' with the variables 'a' and 'b', and order(concurrent). +/// +class OMPTeamsGenericLoopDirective final : public OMPLoopDirective { + friend class ASTStmtReader; + friend class OMPExecutableDirective; + /// Build directive with the given start and end location. + /// + /// \param StartLoc Starting location of the directive kind. + /// \param EndLoc Ending location of the directive. + /// \param CollapsedNum Number of collapsed nested loops. + /// + OMPTeamsGenericLoopDirective(SourceLocation StartLoc, SourceLocation EndLoc, + unsigned CollapsedNum) + : OMPLoopDirective(OMPTeamsGenericLoopDirectiveClass, + llvm::omp::OMPD_teams_loop, StartLoc, EndLoc, + CollapsedNum) {} + + /// Build an empty directive. + /// + /// \param CollapsedNum Number of collapsed nested loops. + /// + explicit OMPTeamsGenericLoopDirective(unsigned CollapsedNum) + : OMPLoopDirective(OMPTeamsGenericLoopDirectiveClass, +
[clang] 6bd8dc9 - [OpenMP] Initial parsing/sema for the 'omp target teams loop' construct
Author: Mike Rice Date: 2022-03-18T13:48:32-07:00 New Revision: 6bd8dc91b89d0b130d8c03174b7b3b0d1cf3b331 URL: https://github.com/llvm/llvm-project/commit/6bd8dc91b89d0b130d8c03174b7b3b0d1cf3b331 DIFF: https://github.com/llvm/llvm-project/commit/6bd8dc91b89d0b130d8c03174b7b3b0d1cf3b331.diff LOG: [OpenMP] Initial parsing/sema for the 'omp target teams loop' construct Adds basic parsing/sema/serialization support for the #pragma omp target teams loop directive. Differential Revision: https://reviews.llvm.org/D122028 Added: clang/test/OpenMP/target_teams_generic_loop_ast_print.cpp clang/test/OpenMP/target_teams_generic_loop_messages.cpp Modified: clang/include/clang-c/Index.h clang/include/clang/AST/RecursiveASTVisitor.h clang/include/clang/AST/StmtOpenMP.h clang/include/clang/Basic/StmtNodes.td clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTBitCodes.h clang/lib/AST/StmtOpenMP.cpp clang/lib/AST/StmtPrinter.cpp clang/lib/AST/StmtProfile.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/CodeGen/CGStmt.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaExceptionSpec.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp clang/test/Analysis/cfg-openmp.cpp clang/tools/libclang/CIndex.cpp clang/tools/libclang/CXCursor.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 4f4bf8fe14ea0..23ecac4895bd9 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -2604,7 +2604,11 @@ enum CXCursorKind { */ CXCursor_OMPTeamsGenericLoopDirective = 296, - CXCursor_LastStmt = CXCursor_OMPTeamsGenericLoopDirective, + /** OpenMP target teams loop directive. + */ + CXCursor_OMPTargetTeamsGenericLoopDirective = 297, + + CXCursor_LastStmt = CXCursor_OMPTargetTeamsGenericLoopDirective, /** * Cursor that represents the translation unit itself. diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index ef2fb6cbe03ee..b614b6a8bebe0 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -3077,6 +3077,9 @@ DEF_TRAVERSE_STMT(OMPGenericLoopDirective, DEF_TRAVERSE_STMT(OMPTeamsGenericLoopDirective, { TRY_TO(TraverseOMPExecutableDirective(S)); }) +DEF_TRAVERSE_STMT(OMPTargetTeamsGenericLoopDirective, + { TRY_TO(TraverseOMPExecutableDirective(S)); }) + // OpenMP clauses. template bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) { diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h index 74c8d6d980c1e..82d9a69035abd 100644 --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -1527,6 +1527,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { T->getStmtClass() == OMPMasterTaskLoopSimdDirectiveClass || T->getStmtClass() == OMPGenericLoopDirectiveClass || T->getStmtClass() == OMPTeamsGenericLoopDirectiveClass || + T->getStmtClass() == OMPTargetTeamsGenericLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopSimdDirectiveClass || T->getStmtClass() == OMPDistributeDirectiveClass || @@ -5635,6 +5636,71 @@ class OMPTeamsGenericLoopDirective final : public OMPLoopDirective { } }; +/// This represents '#pragma omp target teams loop' directive. +/// +/// \code +/// #pragma omp target teams loop private(a,b) order(concurrent) +/// \endcode +/// In this example directive '#pragma omp target teams loop' has +/// clauses 'private' with the variables 'a' and 'b', and order(concurrent). +/// +class OMPTargetTeamsGenericLoopDirective final : public OMPLoopDirective { + friend class ASTStmtReader; + friend class OMPExecutableDirective; + /// Build directive with the given start and end location. + /// + /// \param StartLoc Starting location of the directive kind. + /// \param EndLoc Ending location of the directive. + /// \param CollapsedNum Number of collapsed nested loops. + /// + OMPTargetTeamsGenericLoopDirective(SourceLocation StartLoc, + SourceLocation EndLoc, + unsigned CollapsedNum) + : OMPLoopDirective(OMPTargetTeamsGenericLoopDirectiveClass, + llvm::omp::OMPD_target_teams_loop, StartLoc, EndLoc, + CollapsedNum) {} + + /// Build an empty directive. + /// + /// \param CollapsedNum Number of collapsed nested loops. + /// + expl
[clang] 2cedaee - [OpenMP] Initial parsing/sema for the 'omp parallel loop' construct
Author: Mike Rice Date: 2022-03-22T13:55:47-07:00 New Revision: 2cedaee6f7387b39f7a534883050d66fd78e15a4 URL: https://github.com/llvm/llvm-project/commit/2cedaee6f7387b39f7a534883050d66fd78e15a4 DIFF: https://github.com/llvm/llvm-project/commit/2cedaee6f7387b39f7a534883050d66fd78e15a4.diff LOG: [OpenMP] Initial parsing/sema for the 'omp parallel loop' construct Adds basic parsing/sema/serialization support for the #pragma omp parallel loop directive. Differential Revision: https://reviews.llvm.org/D122247 Added: clang/test/OpenMP/parallel_generic_loop_ast_print.cpp clang/test/OpenMP/parallel_generic_loop_messages.cpp Modified: clang/include/clang-c/Index.h clang/include/clang/AST/RecursiveASTVisitor.h clang/include/clang/AST/StmtOpenMP.h clang/include/clang/Basic/StmtNodes.td clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTBitCodes.h clang/lib/AST/StmtOpenMP.cpp clang/lib/AST/StmtPrinter.cpp clang/lib/AST/StmtProfile.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/CodeGen/CGStmt.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaExceptionSpec.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp clang/test/Analysis/cfg-openmp.cpp clang/tools/libclang/CIndex.cpp clang/tools/libclang/CXCursor.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 23ecac4895bd9..4783744359eec 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -2608,7 +2608,11 @@ enum CXCursorKind { */ CXCursor_OMPTargetTeamsGenericLoopDirective = 297, - CXCursor_LastStmt = CXCursor_OMPTargetTeamsGenericLoopDirective, + /** OpenMP parallel loop directive. + */ + CXCursor_OMPParallelGenericLoopDirective = 298, + + CXCursor_LastStmt = CXCursor_OMPParallelGenericLoopDirective, /** * Cursor that represents the translation unit itself. diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index b614b6a8bebe0..ceb874598aded 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -3080,6 +3080,8 @@ DEF_TRAVERSE_STMT(OMPTeamsGenericLoopDirective, DEF_TRAVERSE_STMT(OMPTargetTeamsGenericLoopDirective, { TRY_TO(TraverseOMPExecutableDirective(S)); }) +DEF_TRAVERSE_STMT(OMPParallelGenericLoopDirective, + { TRY_TO(TraverseOMPExecutableDirective(S)); }) // OpenMP clauses. template bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) { diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h index 82d9a69035abd..9178b47a0b5f4 100644 --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -1528,6 +1528,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { T->getStmtClass() == OMPGenericLoopDirectiveClass || T->getStmtClass() == OMPTeamsGenericLoopDirectiveClass || T->getStmtClass() == OMPTargetTeamsGenericLoopDirectiveClass || + T->getStmtClass() == OMPParallelGenericLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopDirectiveClass || T->getStmtClass() == OMPParallelMasterTaskLoopSimdDirectiveClass || T->getStmtClass() == OMPDistributeDirectiveClass || @@ -5701,6 +5702,71 @@ class OMPTargetTeamsGenericLoopDirective final : public OMPLoopDirective { return T->getStmtClass() == OMPTargetTeamsGenericLoopDirectiveClass; } }; + +/// This represents '#pragma omp parallel loop' directive. +/// +/// \code +/// #pragma omp parallel loop private(a,b) order(concurrent) +/// \endcode +/// In this example directive '#pragma omp parallel loop' has +/// clauses 'private' with the variables 'a' and 'b', and order(concurrent). +/// +class OMPParallelGenericLoopDirective final : public OMPLoopDirective { + friend class ASTStmtReader; + friend class OMPExecutableDirective; + /// Build directive with the given start and end location. + /// + /// \param StartLoc Starting location of the directive kind. + /// \param EndLoc Ending location of the directive. + /// \param CollapsedNum Number of collapsed nested loops. + /// + OMPParallelGenericLoopDirective(SourceLocation StartLoc, + SourceLocation EndLoc, unsigned CollapsedNum) + : OMPLoopDirective(OMPParallelGenericLoopDirectiveClass, + llvm::omp::OMPD_parallel_loop, StartLoc, EndLoc, + CollapsedNum) {} + + /// Build an empty directive. + /// + /// \param CollapsedNum Number of collapsed nested loops. + /
[clang] 83a407d - [OpenMP]Fix parsing of OpenMP directive nested in a metadirective
Author: Mike Rice Date: 2022-02-14T16:15:20-08:00 New Revision: 83a407d176f84c53633a2ef259642ff184e0613f URL: https://github.com/llvm/llvm-project/commit/83a407d176f84c53633a2ef259642ff184e0613f DIFF: https://github.com/llvm/llvm-project/commit/83a407d176f84c53633a2ef259642ff184e0613f.diff LOG: [OpenMP]Fix parsing of OpenMP directive nested in a metadirective Differential Revision: https://reviews.llvm.org/D119761 Added: Modified: clang/include/clang/Parse/Parser.h clang/lib/Parse/ParseOpenMP.cpp clang/test/OpenMP/metadirective_ast_print.c Removed: diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index 8c37ac721aed4..981800a7e2356 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -3291,8 +3291,10 @@ class Parser : public CodeCompletionHandler { /// Parses declarative or executable directive. /// /// \param StmtCtx The context in which we're parsing the directive. - StmtResult - ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx); + /// \param ReadDirectiveWithinMetadirective true if directive is within a + /// metadirective and therefore ends on the closing paren. + StmtResult ParseOpenMPDeclarativeOrExecutableDirective( + ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective = false); /// Parses clause of kind \a CKind for directive of a kind \a Kind. /// /// \param DKind Kind of current directive. diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 4910e6ce9ba96..56960624c0bfd 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -2451,9 +2451,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl( /// for simd' | 'target teams distribute simd' | 'masked' {clause} /// annot_pragma_openmp_end /// -StmtResult -Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx) { - static bool ReadDirectiveWithinMetadirective = false; +StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective( +ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) { if (!ReadDirectiveWithinMetadirective) assert(Tok.isOneOf(tok::annot_pragma_openmp, tok::annot_attr_openmp) && "Not an OpenMP directive!"); @@ -2615,9 +2614,9 @@ Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx) { } // Parse Directive - ReadDirectiveWithinMetadirective = true; - Directive = ParseOpenMPDeclarativeOrExecutableDirective(StmtCtx); - ReadDirectiveWithinMetadirective = false; + Directive = ParseOpenMPDeclarativeOrExecutableDirective( + StmtCtx, + /*ReadDirectiveWithinMetadirective=*/true); break; } break; diff --git a/clang/test/OpenMP/metadirective_ast_print.c b/clang/test/OpenMP/metadirective_ast_print.c index 582de7c606da5..fbd7e2291330f 100644 --- a/clang/test/OpenMP/metadirective_ast_print.c +++ b/clang/test/OpenMP/metadirective_ast_print.c @@ -47,6 +47,16 @@ void foo(void) { : parallel) default(parallel for) for (int i = 0; i < 100; i++) ; + +// Test metadirective with nested OpenMP directive. + int array[16]; + #pragma omp metadirective when(user = {condition(1)} \ + : parallel for) + for (int i = 0; i < 16; i++) { +#pragma omp simd +for (int j = 0; j < 16; j++) + array[i] = i; + } } // CHECK: void bar(); @@ -69,5 +79,9 @@ void foo(void) { // CHECK-NEXT: for (int i = 0; i < 100; i++) // CHECK: #pragma omp parallel // CHECK-NEXT: for (int i = 0; i < 100; i++) +// CHECK: #pragma omp parallel for +// CHECK-NEXT: for (int i = 0; i < 16; i++) { +// CHECK-NEXT: #pragma omp simd +// CHECK-NEXT: for (int j = 0; j < 16; j++) #endif ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 383f3a4 - [OpenMP] Diagnose bad 'omp declare variant' that references itself.
Author: Mike Rice Date: 2022-02-17T10:36:28-08:00 New Revision: 383f3a467c92499956ed804eb2bd69ad8576615b URL: https://github.com/llvm/llvm-project/commit/383f3a467c92499956ed804eb2bd69ad8576615b DIFF: https://github.com/llvm/llvm-project/commit/383f3a467c92499956ed804eb2bd69ad8576615b.diff LOG: [OpenMP] Diagnose bad 'omp declare variant' that references itself. When an a variant is specified that is the same as the base function the compiler will end up crashing in CodeGen. Give an error instead. Differential Revision: https://reviews.llvm.org/D119979 Added: Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_variant_messages.c Removed: diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index e7c204fef2a09..8af1bed7b67f1 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10830,6 +10830,8 @@ def err_omp_interop_type_not_found : Error< def err_omp_declare_variant_incompat_types : Error< "variant in '#pragma omp declare variant' with type %0 is incompatible with" " type %1%select{| with appended arguments}2">; +def err_omp_declare_variant_same_base_function : Error< + "variant in '#pragma omp declare variant' is the same as the base function">; def warn_omp_declare_variant_marked_as_declare_variant : Warning< "variant function in '#pragma omp declare variant' is itself marked as '#pragma omp declare variant'" >, InGroup; diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 79823fcf148b7..64647f59fcb5f 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -7171,6 +7171,13 @@ Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, return None; } + if (FD->getCanonicalDecl() == NewFD->getCanonicalDecl()) { +Diag(VariantRef->getExprLoc(), + diag::err_omp_declare_variant_same_base_function) +<< VariantRef->getSourceRange(); +return None; + } + // Check if function types are compatible in C. if (!LangOpts.CPlusPlus) { QualType NewType = diff --git a/clang/test/OpenMP/declare_variant_messages.c b/clang/test/OpenMP/declare_variant_messages.c index 66ead8909ad8f..a049285cdb01c 100644 --- a/clang/test/OpenMP/declare_variant_messages.c +++ b/clang/test/OpenMP/declare_variant_messages.c @@ -113,6 +113,15 @@ int bar(void) { return after_use(); } +// expected-error@+1 {{variant in '#pragma omp declare variant' is the same as the base function}} +#pragma omp declare variant (self) \ + match(construct={dispatch}, device={arch(arm)}) +void self(int n); + +void self_test(int n, int d_no) { + #pragma omp dispatch device(d_no) nowait + self(n); +} #pragma omp declare variant(after_use_variant) match(xxx={}) // expected-warning {{'xxx' is not a valid context set in a `declare variant`; set ignored}} expected-warning {{'#pragma omp declare variant' cannot be applied for function after first usage; the original function might be used}} expected-note {{context set options are: 'construct' 'device' 'implementation' 'user'}} expected-note {{the ignored set spans until here}} int after_use(void); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 37471cf - [clang][OpenMP] Local variable alignment incorrect with align clause
Author: David Pagan Date: 2022-05-03T13:10:01-07:00 New Revision: 37471cf2c3fd02fac0b0dc6e513cfe6098f37764 URL: https://github.com/llvm/llvm-project/commit/37471cf2c3fd02fac0b0dc6e513cfe6098f37764 DIFF: https://github.com/llvm/llvm-project/commit/37471cf2c3fd02fac0b0dc6e513cfe6098f37764.diff LOG: [clang][OpenMP] Local variable alignment incorrect with align clause If alignment specified with align clause is less than natural alignment for list item type, the alignment should be set to the natural alignment. See OMP5.1 specification, page 185, lines 7-10 Differential Revision: https://reviews.llvm.org/D124676 Added: Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/test/OpenMP/align_clause_codegen.cpp Removed: diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 391245e3b54bb..aa8aa7d0bd5f8 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -12153,6 +12153,27 @@ static llvm::Value *getAllocatorVal(CodeGenFunction &CGF, return AllocVal; } +/// Given the allocate directive list item type and align clause value, +/// return appropriate alignment. +static llvm::Value *getAlignmentValue(CodeGenFunction &CGF, QualType ListItemTy, + const Expr *Alignment) { + if (!Alignment) +return nullptr; + + unsigned UserAlign = + Alignment->EvaluateKnownConstInt(CGF.getContext()).getExtValue(); + CharUnits NaturalAlign = CGF.CGM.getNaturalTypeAlignment(ListItemTy); + + // OpenMP5.1 pg 185 lines 7-10 + // Each item in the align modifier list must be aligned to the maximum + // of the specified alignment and the type's natural alignment. + // + // If no alignment specified then use the natural alignment. + return llvm::ConstantInt::get( + CGF.CGM.SizeTy, + std::max(UserAlign, NaturalAlign.getQuantity())); +} + Address CGOpenMPRuntime::getAddressOfLocalVariable(CodeGenFunction &CGF, const VarDecl *VD) { if (!VD) @@ -12191,11 +12212,8 @@ Address CGOpenMPRuntime::getAddressOfLocalVariable(CodeGenFunction &CGF, const auto *AA = CVD->getAttr(); const Expr *Allocator = AA->getAllocator(); llvm::Value *AllocVal = getAllocatorVal(CGF, Allocator); -llvm::Value *Alignment = -AA->getAlignment() -? CGF.Builder.CreateIntCast(CGF.EmitScalarExpr(AA->getAlignment()), -CGM.SizeTy, /*isSigned=*/false) -: nullptr; +llvm::Value *Alignment = getAlignmentValue( +CGF, VD->getType().getNonReferenceType(), AA->getAlignment()); SmallVector Args; Args.push_back(ThreadID); if (Alignment) diff --git a/clang/test/OpenMP/align_clause_codegen.cpp b/clang/test/OpenMP/align_clause_codegen.cpp index 5ced4652aba10..b8c31d1ca9b66 100644 --- a/clang/test/OpenMP/align_clause_codegen.cpp +++ b/clang/test/OpenMP/align_clause_codegen.cpp @@ -85,9 +85,9 @@ int template_test() { // CHECK-32-NEXT: entry: // CHECK-32-NEXT:[[MYALLOC:%.*]] = alloca i32, align 4 // CHECK-32-NEXT:[[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) -// CHECK-32-NEXT:[[DOTFOO0__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 1, i32 20, i8* null) +// CHECK-32-NEXT:[[DOTFOO0__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 20, i8* null) // CHECK-32-NEXT:[[DOTFOO0__ADDR:%.*]] = bitcast i8* [[DOTFOO0__VOID_ADDR]] to [5 x i32]* -// CHECK-32-NEXT:[[DOTFOO1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 2, i32 40, i8* inttoptr (i32 7 to i8*)) +// CHECK-32-NEXT:[[DOTFOO1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 40, i8* inttoptr (i32 7 to i8*)) // CHECK-32-NEXT:[[DOTFOO1__ADDR:%.*]] = bitcast i8* [[DOTFOO1__VOID_ADDR]] to [10 x i32]* // CHECK-32-NEXT:[[DOTFOO2__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 80, i8* inttoptr (i32 6 to i8*)) // CHECK-32-NEXT:[[DOTFOO2__ADDR:%.*]] = bitcast i8* [[DOTFOO2__VOID_ADDR]] to [20 x i32]* @@ -114,15 +114,15 @@ int template_test() { // CHECK-32-NEXT:call void @__kmpc_free(i32 [[TMP0]], i8* [[TMP2]], i8* inttoptr (i32 8 to i8*)) // CHECK-32-NEXT:[[TMP3:%.*]] = load i32, i32* [[MYALLOC]], align 4 // CHECK-32-NEXT:[[CONV:%.*]] = inttoptr i32 [[TMP3]] to i8* -// CHECK-32-NEXT:[[DOTBAR1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 2, i32 4, i8* [[CONV]]) +// CHECK-32-NEXT:[[DOTBAR1__VOID_ADDR:%.*]] = call i8* @__kmpc_aligned_alloc(i32 [[TMP0]], i32 4, i32 4, i8* [[CONV]]) // CHECK-32-NEXT:[[DOTBAR1__ADDR:%.*]] = bitcast i8* [[DOTBAR1__VOID_ADDR]] to i32* // CHECK-32-NEXT:[[TMP4:%.*]] = load i32, i32* [[MYALLOC]], align 4 // CHECK-32-NEXT:
[clang] 1a02519 - [OpenMP] Add mangling support for linear modifiers (ref,uval,val)
Author: Mike Rice Date: 2022-05-10T09:56:55-07:00 New Revision: 1a02519bc504a12a12ba875db29c9e5901ed9bef URL: https://github.com/llvm/llvm-project/commit/1a02519bc504a12a12ba875db29c9e5901ed9bef DIFF: https://github.com/llvm/llvm-project/commit/1a02519bc504a12a12ba875db29c9e5901ed9bef.diff LOG: [OpenMP] Add mangling support for linear modifiers (ref,uval,val) Add mangling for linear parameters specified with ref, uval, and val for 'omp declare simd' vector functions. Add missing stride for linear this parameters. Differential Revision: https://reviews.llvm.org/D125269 Added: Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/test/OpenMP/declare_simd_codegen.cpp Removed: diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index aa8aa7d0bd5f8..d938bda157f9d 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -11404,13 +11404,21 @@ void CGOpenMPRuntime::emitTargetDataStandAloneCall( namespace { /// Kind of parameter in a function with 'declare simd' directive. - enum ParamKindTy { LinearWithVarStride, Linear, Uniform, Vector }; - /// Attribute set of the parameter. - struct ParamAttrTy { -ParamKindTy Kind = Vector; -llvm::APSInt StrideOrArg; -llvm::APSInt Alignment; - }; +enum ParamKindTy { + LinearWithVarStride, + Linear, + LinearRef, + LinearUVal, + LinearVal, + Uniform, + Vector, +}; +/// Attribute set of the parameter. +struct ParamAttrTy { + ParamKindTy Kind = Vector; + llvm::APSInt StrideOrArg; + llvm::APSInt Alignment; +}; } // namespace static unsigned evaluateCDTSize(const FunctionDecl *FD, @@ -11465,6 +11473,51 @@ static unsigned evaluateCDTSize(const FunctionDecl *FD, return C.getTypeSize(CDT); } +/// Mangle the parameter part of the vector function name according to +/// their OpenMP classification. The mangling function is defined in +/// section 4.5 of the AAVFABI(2021Q1). +static std::string mangleVectorParameters(ArrayRef ParamAttrs) { + SmallString<256> Buffer; + llvm::raw_svector_ostream Out(Buffer); + for (const auto &ParamAttr : ParamAttrs) { +switch (ParamAttr.Kind) { +case LinearWithVarStride: + Out << "ls" << ParamAttr.StrideOrArg; + break; +case Linear: + Out << 'l'; + break; +case LinearRef: + Out << 'R'; + break; +case LinearUVal: + Out << 'U'; + break; +case LinearVal: + Out << 'L'; + break; +case Uniform: + Out << 'u'; + break; +case Vector: + Out << 'v'; + break; +} +if (ParamAttr.Kind == Linear || ParamAttr.Kind == LinearRef || +ParamAttr.Kind == LinearUVal || ParamAttr.Kind == LinearVal) { + // Don't print the step value if it is not present or if it is + // equal to 1. + if (ParamAttr.StrideOrArg != 1) +Out << ParamAttr.StrideOrArg; +} + +if (!!ParamAttr.Alignment) + Out << 'a' << ParamAttr.Alignment; + } + + return std::string(Out.str()); +} + static void emitX86DeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn, const llvm::APSInt &VLENVal, @@ -11513,26 +11566,7 @@ emitX86DeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn, } else { Out << VLENVal; } - for (const ParamAttrTy &ParamAttr : ParamAttrs) { -switch (ParamAttr.Kind){ -case LinearWithVarStride: - Out << 's' << ParamAttr.StrideOrArg; - break; -case Linear: - Out << 'l'; - if (ParamAttr.StrideOrArg != 1) -Out << ParamAttr.StrideOrArg; - break; -case Uniform: - Out << 'u'; - break; -case Vector: - Out << 'v'; - break; -} -if (!!ParamAttr.Alignment) - Out << 'a' << ParamAttr.Alignment; - } + Out << mangleVectorParameters(ParamAttrs); Out << '_' << Fn->getName(); Fn->addFnAttr(Out.str()); } @@ -11645,39 +11679,6 @@ getNDSWDS(const FunctionDecl *FD, ArrayRef ParamAttrs) { OutputBecomesInput); } -/// Mangle the parameter part of the vector function name according to -/// their OpenMP classification. The mangling function is defined in -/// section 3.5 of the AAVFABI. -static std::string mangleVectorParameters(ArrayRef ParamAttrs) { - SmallString<256> Buffer; - llvm::raw_svector_ostream Out(Buffer); - for (const auto &ParamAttr : ParamAttrs) { -switch (ParamAttr.Kind) { -case LinearWithVarStride: - Out << "ls" << ParamAttr.StrideOrArg; - break; -case Linear: - Out << 'l'; - // Don't print the step value if it is not present or if it is - // equal to 1. - if (ParamAttr.StrideOrArg != 1) -Out << ParamAttr.StrideOrArg; - break; -case Uniform: - Out << 'u'; - break;
[clang] 0dbaef6 - [OpenMP] Fix mangling for linear modifiers with variable stride
Author: Mike Rice Date: 2022-05-10T14:12:44-07:00 New Revision: 0dbaef61b56f0ef0ab0cf38ea92ffc1f35bee3ff URL: https://github.com/llvm/llvm-project/commit/0dbaef61b56f0ef0ab0cf38ea92ffc1f35bee3ff DIFF: https://github.com/llvm/llvm-project/commit/0dbaef61b56f0ef0ab0cf38ea92ffc1f35bee3ff.diff LOG: [OpenMP] Fix mangling for linear modifiers with variable stride This adds support for variable stride with the val, uval, and ref linear modifiers. Previously only the no modifer type ls was supported. val -> Ls uval -> Us ref -> Rs Differential Revision: https://reviews.llvm.org/D125330 Added: Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/test/OpenMP/declare_simd_codegen.cpp Removed: diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index d938bda157f9d..52f6ca4cfb3d0 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -11405,7 +11405,6 @@ void CGOpenMPRuntime::emitTargetDataStandAloneCall( namespace { /// Kind of parameter in a function with 'declare simd' directive. enum ParamKindTy { - LinearWithVarStride, Linear, LinearRef, LinearUVal, @@ -11418,6 +11417,7 @@ struct ParamAttrTy { ParamKindTy Kind = Vector; llvm::APSInt StrideOrArg; llvm::APSInt Alignment; + bool HasVarStride = false; }; } // namespace @@ -11481,9 +11481,6 @@ static std::string mangleVectorParameters(ArrayRef ParamAttrs) { llvm::raw_svector_ostream Out(Buffer); for (const auto &ParamAttr : ParamAttrs) { switch (ParamAttr.Kind) { -case LinearWithVarStride: - Out << "ls" << ParamAttr.StrideOrArg; - break; case Linear: Out << 'l'; break; @@ -11503,8 +11500,10 @@ static std::string mangleVectorParameters(ArrayRef ParamAttrs) { Out << 'v'; break; } -if (ParamAttr.Kind == Linear || ParamAttr.Kind == LinearRef || -ParamAttr.Kind == LinearUVal || ParamAttr.Kind == LinearVal) { +if (ParamAttr.HasVarStride) + Out << "s" << ParamAttr.StrideOrArg; +else if (ParamAttr.Kind == Linear || ParamAttr.Kind == LinearRef || + ParamAttr.Kind == LinearUVal || ParamAttr.Kind == LinearVal) { // Don't print the step value if it is not present or if it is // equal to 1. if (ParamAttr.StrideOrArg != 1) @@ -11579,11 +11578,7 @@ emitX86DeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn, // available at // https://developer.arm.com/products/software-development-tools/hpc/arm-compiler-for-hpc/vector-function-abi. -/// Maps To Vector (MTV), as defined in 3.1.1 of the AAVFABI. -/// -/// TODO: Need to implement the behavior for reference marked with a -/// var or no linear modifiers (1.b in the section). For this, we -/// need to extend ParamKindTy to support the linear modifiers. +/// Maps To Vector (MTV), as defined in 4.1.1 of the AAVFABI (2021Q1). static bool getAArch64MTV(QualType QT, ParamKindTy Kind) { QT = QT.getCanonicalType(); @@ -11593,12 +11588,11 @@ static bool getAArch64MTV(QualType QT, ParamKindTy Kind) { if (Kind == ParamKindTy::Uniform) return false; - if (Kind == ParamKindTy::Linear) + if (Kind == ParamKindTy::LinearUVal || ParamKindTy::LinearRef) return false; - // TODO: Handle linear references with modifiers - - if (Kind == ParamKindTy::LinearWithVarStride) + if ((Kind == ParamKindTy::Linear || Kind == ParamKindTy::LinearVal) && + !QT->isReferenceType()) return false; return true; @@ -11949,7 +11943,7 @@ void CGOpenMPRuntime::emitDeclareSimdFunction(const FunctionDecl *FD, cast((*SI)->IgnoreParenImpCasts())) { if (const auto *StridePVD = dyn_cast(DRE->getDecl())) { -ParamAttr.Kind = LinearWithVarStride; +ParamAttr.HasVarStride = true; auto It = ParamPositions.find(StridePVD->getCanonicalDecl()); assert(It != ParamPositions.end() && "Function parameter not found"); @@ -11963,7 +11957,8 @@ void CGOpenMPRuntime::emitDeclareSimdFunction(const FunctionDecl *FD, // If we are using a linear clause on a pointer, we need to // rescale the value of linear_step with the byte size of the // pointee type. -if (ParamAttr.Kind == Linear || ParamAttr.Kind == LinearRef) +if (!ParamAttr.HasVarStride && +(ParamAttr.Kind == Linear || ParamAttr.Kind == LinearRef)) ParamAttr.StrideOrArg = ParamAttr.StrideOrArg * PtrRescalingFactor; ++SI; ++MI; diff --git a/clang/test/OpenMP/declare_simd_codegen.cpp b/clang/test/OpenMP/declare_simd_codegen.cpp index 5a5df239f870a..fa0be2acc192f 100644 --- a/clang/test/OpenMP/declare_simd_codegen.cpp +++ b/clang/test/OpenMP/declare_simd_codegen.cpp @@ -144,6 +144,17 @@ double Four(int& a, i
[clang] 772b0c4 - [OpenMP] Fix mangling for linear parameters with negative stride
Author: Mike Rice Date: 2022-05-11T14:02:09-07:00 New Revision: 772b0c44a4296a34cbc072c2a7cf294410d07a1a URL: https://github.com/llvm/llvm-project/commit/772b0c44a4296a34cbc072c2a7cf294410d07a1a DIFF: https://github.com/llvm/llvm-project/commit/772b0c44a4296a34cbc072c2a7cf294410d07a1a.diff LOG: [OpenMP] Fix mangling for linear parameters with negative stride The 'n' character is used in place of '-' in the mangled name. Differential Revision: https://reviews.llvm.org/D125406 Added: Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/test/OpenMP/declare_simd_codegen.cpp Removed: diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 52f6ca4cfb3d0..f197c331e6cfc 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -11506,7 +11506,9 @@ static std::string mangleVectorParameters(ArrayRef ParamAttrs) { ParamAttr.Kind == LinearUVal || ParamAttr.Kind == LinearVal) { // Don't print the step value if it is not present or if it is // equal to 1. - if (ParamAttr.StrideOrArg != 1) + if (ParamAttr.StrideOrArg < 0) +Out << 'n' << -ParamAttr.StrideOrArg; + else if (ParamAttr.StrideOrArg != 1) Out << ParamAttr.StrideOrArg; } diff --git a/clang/test/OpenMP/declare_simd_codegen.cpp b/clang/test/OpenMP/declare_simd_codegen.cpp index fa0be2acc192f..573dbdbfd69e9 100644 --- a/clang/test/OpenMP/declare_simd_codegen.cpp +++ b/clang/test/OpenMP/declare_simd_codegen.cpp @@ -155,6 +155,14 @@ double Five(int a, short &b, short &c, short &d, short &e, short &f, short &g, return a + int(b); } +// Test negative strides +#pragma omp declare simd simdlen(4) linear(a:-2) linear(b:-8) \ +linear(uval(c):-4) linear(ref(d):-16) \ +linear(e:-1) linear(f:-1) linear(g:0) +double Six(int a, float *b, int &c, int *&d, char e, char *f, short g) { + return a + int(*b) + c + *d + e + *f + g; +} + // CHECK-DAG: define {{.+}}@_Z5add_1Pf( // CHECK-DAG: define {{.+}}@_Z1hIiEvPT_S1_S1_S1_( // CHECK-DAG: define {{.+}}@_Z1hIfEvPT_S1_S1_S1_( @@ -178,6 +186,7 @@ double Five(int a, short &b, short &c, short &d, short &e, short &f, short &g, // CHECK-DAG: define {{.+}}@_Z5ThreeRiS_ // CHECK-DAG: define {{.+}}@_Z4FourRiS_ // CHECK-DAG: define {{.+}}@_Z4FiveiRsS_S_S_S_S_S_S_ +// CHECK-DAG: define {{.+}}@_Z3SixiPfRiRPicPcs // CHECK-DAG: "_ZGVbM4l32__Z5add_1Pf" // CHECK-DAG: "_ZGVbN4l32__Z5add_1Pf" @@ -399,6 +408,8 @@ double Five(int a, short &b, short &c, short &d, short &e, short &f, short &g, // CHECK-DAG: "_ZGVbN4R8R4__Z4FourRiS_" // CHECK-DAG: "_ZGVbM4uL2Ls0L4Ls0U8Us0R32Rs0__Z4FiveiRsS_S_S_S_S_S_S_" // CHECK-DAG: "_ZGVbN4uL2Ls0L4Ls0U8Us0R32Rs0__Z4FiveiRsS_S_S_S_S_S_S_" +// CHECK-DAG: "_ZGVbM4ln2ln32Un4Rn128ln1ln1l0__Z3SixiPfRiRPicPcs" +// CHECK-DAG: "_ZGVbN4ln2ln32Un4Rn128ln1ln1l0__Z3SixiPfRiRPicPcs" // CHECK-NOT: "_ZGV{{.+}}__Z1fRA_i ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 0d67c8a - [OpenMP] Fix declare simd use on in-class member template function
Author: Mike Rice Date: 2022-05-13T08:24:55-07:00 New Revision: 0d67c8a51d61cb0fac91f265a424767f072c7d5c URL: https://github.com/llvm/llvm-project/commit/0d67c8a51d61cb0fac91f265a424767f072c7d5c DIFF: https://github.com/llvm/llvm-project/commit/0d67c8a51d61cb0fac91f265a424767f072c7d5c.diff LOG: [OpenMP] Fix declare simd use on in-class member template function Return the Decl when parsing the template member declaration so the 'omp declare simd' pragma can be applied to it. Previously a nullptr was returned causing an error applying the pragma. Fixes #52700. Differential Revision: https://reviews.llvm.org/D125493 Added: Modified: clang/lib/Parse/ParseTemplate.cpp clang/test/OpenMP/declare_simd_codegen.cpp clang/test/OpenMP/declare_simd_messages.cpp Removed: diff --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp index 5687882251a05..e66329e3bfc7e 100644 --- a/clang/lib/Parse/ParseTemplate.cpp +++ b/clang/lib/Parse/ParseTemplate.cpp @@ -200,9 +200,12 @@ Decl *Parser::ParseSingleDeclarationAfterTemplate( if (Context == DeclaratorContext::Member) { // We are parsing a member template. -ParseCXXClassMemberDeclaration(AS, AccessAttrs, TemplateInfo, - &DiagsFromTParams); -return nullptr; +DeclGroupPtrTy D = ParseCXXClassMemberDeclaration( +AS, AccessAttrs, TemplateInfo, &DiagsFromTParams); + +if (!D || !D.get().isSingleDecl()) + return nullptr; +return D.get().getSingleDecl(); } ParsedAttributes prefixAttrs(AttrFactory); diff --git a/clang/test/OpenMP/declare_simd_codegen.cpp b/clang/test/OpenMP/declare_simd_codegen.cpp index 573dbdbfd69e9..d7bd798798294 100644 --- a/clang/test/OpenMP/declare_simd_codegen.cpp +++ b/clang/test/OpenMP/declare_simd_codegen.cpp @@ -97,6 +97,28 @@ void f(int (&g)[]) { foo(c, p); } +struct A { + #pragma omp declare simd linear(a:X) + template + T infunc(T a) { return a * 2; } + + template + U outfunc(U *a); +}; + +#pragma omp declare simd linear(a:Y) +template +U A::outfunc(U *a) { return *a * 2; } + +void test_member_template() +{ + struct A a; + int i = 32; + float f = 1.0; + int t = a.infunc<8, int>(i); + float u = a.outfunc<4, float>(&f); +} + #pragma omp declare simd #pragma omp declare simd notinbranch aligned(a : 32) int bar(VV v, float *a) { return 0; } @@ -173,6 +195,8 @@ double Six(int a, float *b, int &c, int *&d, char e, char *f, short g) { // CHECK-DAG: define {{.+}}@_ZN3TVVILi16EfE6taddpfEPfRS1_( // CHECK-DAG: define {{.+}}@_ZN3TVVILi16EfE4taddEi( // CHECK-DAG: define {{.+}}@_Z3fooILi64EEvRAT__iRPf( +// CHECK-DAG: define {{.+}}@_ZN1A6infuncILi8EiEET0_S1_ +// CHECK-DAG: define {{.+}}@_ZN1A7outfuncILi4EfEET0_PS1_ // CHECK-DAG: define {{.+}}@_Z3bar2VVPf( // CHECK-DAG: define {{.+}}@_Z3baz2VVPi( // CHECK-DAG: define {{.+}}@_Z3bay2VVRPd( @@ -310,6 +334,24 @@ double Six(int a, float *b, int &c, int *&d, char e, char *f, short g) { // CHECK-DAG: "_ZGVeM64va128U64__Z3fooILi64EEvRAT__iRPf" // CHECK-DAG: "_ZGVeN64va128U64__Z3fooILi64EEvRAT__iRPf" +// CHECK-DAG: "_ZGVbM4vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVbN4vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVcM8vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVcN8vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVdM8vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVdN8vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVeM16vl8__ZN1A6infuncILi8EiEET0_S1_" +// CHECK-DAG: "_ZGVeN16vl8__ZN1A6infuncILi8EiEET0_S1_" + +// CHECK-DAG: "_ZGVbM4vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVbN4vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVcM8vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVcN8vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVdM8vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVdN8vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVeM16vl16__ZN1A7outfuncILi4EfEET0_PS1_" +// CHECK-DAG: "_ZGVeN16vl16__ZN1A7outfuncILi4EfEET0_PS1_" + // CHECK-DAG: "_ZGVbM4vv__Z3bar2VVPf" // CHECK-DAG: "_ZGVbN4vv__Z3bar2VVPf" // CHECK-DAG: "_ZGVcM8vv__Z3bar2VVPf" diff --git a/clang/test/OpenMP/declare_simd_messages.cpp b/clang/test/OpenMP/declare_simd_messages.cpp index a3188de8bd64f..60515965ce3d0 100644 --- a/clang/test/OpenMP/declare_simd_messages.cpp +++ b/clang/test/OpenMP/declare_simd_messages.cpp @@ -32,6 +32,13 @@ int main(); #pragma init_seg(compiler) int main(); +struct A { +// expected-error@+1 {{function declaration is expected after 'declare simd' directive}} + #pragma omp declare simd + template + T infunc1(T a), infunc2(T a); +}; + // expected-error@+1 {{single declaration is expected after 'declare simd' directive}} #pragma omp declare simd // expected-note@+1 {{declared here}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://l
[clang] 9ba9371 - [OpenMP] Add parsing/sema support for omp_all_memory reserved locator
Author: Mike Rice Date: 2022-05-24T10:28:59-07:00 New Revision: 9ba937112fa6d4076e4a98b587a334786b6c0d9c URL: https://github.com/llvm/llvm-project/commit/9ba937112fa6d4076e4a98b587a334786b6c0d9c DIFF: https://github.com/llvm/llvm-project/commit/9ba937112fa6d4076e4a98b587a334786b6c0d9c.diff LOG: [OpenMP] Add parsing/sema support for omp_all_memory reserved locator Adds support for the reserved locator 'omp_all_memory' for use in depend clauses with 'out' or 'inout' dependence-types. Differential Revision: https://reviews.llvm.org/D125828 Added: Modified: clang/include/clang/AST/OpenMPClause.h clang/include/clang/Basic/DiagnosticParseKinds.td clang/include/clang/Basic/OpenMPKinds.def clang/include/clang/Parse/Parser.h clang/include/clang/Sema/Sema.h clang/lib/AST/OpenMPClause.cpp clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp clang/test/OpenMP/task_ast_print.cpp clang/test/OpenMP/task_depend_messages.cpp Removed: diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index 3103f61d4248d..a745df1143468 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -4746,14 +4746,24 @@ class OMPDependClause final friend OMPVarListClause; friend TrailingObjects; - /// Dependency type (one of in, out, inout). - OpenMPDependClauseKind DepKind = OMPC_DEPEND_unknown; +public: + struct DependDataTy final { +/// Dependency type (one of in, out, inout). +OpenMPDependClauseKind DepKind = OMPC_DEPEND_unknown; - /// Dependency type location. - SourceLocation DepLoc; +/// Dependency type location. +SourceLocation DepLoc; - /// Colon location. - SourceLocation ColonLoc; +/// Colon location. +SourceLocation ColonLoc; + +/// Location of 'omp_all_memory'. +SourceLocation OmpAllMemoryLoc; + }; + +private: + /// Dependency type and source locations. + DependDataTy Data; /// Number of loops, associated with the depend clause. unsigned NumLoops = 0; @@ -4784,13 +4794,16 @@ class OMPDependClause final NumLoops(NumLoops) {} /// Set dependency kind. - void setDependencyKind(OpenMPDependClauseKind K) { DepKind = K; } + void setDependencyKind(OpenMPDependClauseKind K) { Data.DepKind = K; } /// Set dependency kind and its location. - void setDependencyLoc(SourceLocation Loc) { DepLoc = Loc; } + void setDependencyLoc(SourceLocation Loc) { Data.DepLoc = Loc; } /// Set colon location. - void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; } + void setColonLoc(SourceLocation Loc) { Data.ColonLoc = Loc; } + + /// Set the 'omp_all_memory' location. + void setOmpAllMemoryLoc(SourceLocation Loc) { Data.OmpAllMemoryLoc = Loc; } /// Sets optional dependency modifier. void setModifier(Expr *DepModifier); @@ -4802,18 +4815,15 @@ class OMPDependClause final /// \param StartLoc Starting location of the clause. /// \param LParenLoc Location of '('. /// \param EndLoc Ending location of the clause. - /// \param DepKind Dependency type. - /// \param DepLoc Location of the dependency type. - /// \param ColonLoc Colon location. + /// \param Data Dependency type and source locations. /// \param VL List of references to the variables. /// \param NumLoops Number of loops that is associated with this depend /// clause. static OMPDependClause *Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc, - SourceLocation EndLoc, Expr *DepModifier, - OpenMPDependClauseKind DepKind, - SourceLocation DepLoc, SourceLocation ColonLoc, - ArrayRef VL, unsigned NumLoops); + SourceLocation EndLoc, DependDataTy Data, + Expr *DepModifier, ArrayRef VL, + unsigned NumLoops); /// Creates an empty clause with \a N variables. /// @@ -4825,7 +4835,16 @@ class OMPDependClause final unsigned NumLoops); /// Get dependency type. - OpenMPDependClauseKind getDependencyKind() const { return DepKind; } + OpenMPDependClauseKind getDependencyKind() const { return Data.DepKind; } + + /// Get dependency type location. + SourceLocation getDependencyLoc() const { return Data.DepLoc; } + + /// Get colon location. + SourceLocation getColonLoc() const { return Data.ColonLoc; } + + /// Get 'omp_all_memory' location. + SourceLocation getOmpAllMemoryLoc() const { return Data.OmpAllMemoryLoc; } /// Return optional depend modifier. Expr *getMo
[clang-tools-extra] [clang-tidy][NFC] Remove unnecessary nullptr check on cast subexpr (PR #85473)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/85473 The value of SubExpr is not null since getSubExpr would assert in that case. Remove the nullptr check. This avoids confusion since SubExpr is used without check later in the function. >From 56c3ca2e2cfac7b6c9b9029d14151fd80d705c2c Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Fri, 15 Mar 2024 13:37:32 -0700 Subject: [PATCH] [clang-tidy][NFC] Remove unnecessary nullptr check on cast subexpr The value of SubExpr is not null since getSubExpr would assert in that case. Remove the nullptr check. This avoids confusion since SubExpr is used without check later in the function. --- .../clang-tidy/readability/ImplicitBoolConversionCheck.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp index 4f02950e7794cb..74152c6034510b 100644 --- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp @@ -81,8 +81,7 @@ void fixGenericExprCastToBool(DiagnosticBuilder &Diag, const Expr *SubExpr = Cast->getSubExpr(); - bool NeedInnerParens = - SubExpr != nullptr && utils::fixit::areParensNeededForStatement(*SubExpr); + bool NeedInnerParens = utils::fixit::areParensNeededForStatement(*SubExpr); bool NeedOuterParens = Parent != nullptr && utils::fixit::areParensNeededForStatement(*Parent); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy][NFC] Remove unnecessary nullptr check on cast subexpr (PR #85473)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/85473 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy][NFC] Remove unnecessary nullptr check on cast subexpr (PR #85473)
mikerice1969 wrote: I mentioned the assert just to make the point that setSubExpr is written so it doesn't return a nullptr. So it is not expected and the deference is ok. I went ahead with this change but feel free to update if you like. But adding a return when nullptr is seen here would confuse the code and static verifiers will complain that the return can never happen. https://github.com/llvm/llvm-project/pull/85473 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Fix result check after overwriteChangedFiles() (PR #86360)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/86360 If any return from overwriteChangedFiles is true some fixes were not applied. >From 492e0fc4e146d7321003470a9cd0b4be4ae39d7a Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Fri, 22 Mar 2024 16:02:54 -0700 Subject: [PATCH] [clang-tidy] Fix result check after overwriteChangedFiles() If any return from overwriteChangedFiles is true some fixes were not applied. --- clang-tools-extra/clang-tidy/ClangTidy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp index 40ac6918faf407..b877ea06dc05cd 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -233,7 +233,7 @@ class ErrorReporter { if (!tooling::applyAllReplacements(Replacements.get(), Rewrite)) { llvm::errs() << "Can't apply replacements for file " << File << "\n"; } -AnyNotWritten &= Rewrite.overwriteChangedFiles(); +AnyNotWritten |= Rewrite.overwriteChangedFiles(); } if (AnyNotWritten) { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Fix result check after overwriteChangedFiles() (PR #86360)
mikerice1969 wrote: > This could use a test. I thought about it, but I have no idea how to write that test. Do you have an idea? https://github.com/llvm/llvm-project/pull/86360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [openmp] [OpenMP] Introduce support for OMPX extensions and taskgraph frontend (PR #66919)
mikerice1969 wrote: Hi @josemonsalve2 if you want to help move this along it would be best to break this into at least three separate PRs. 1) Parsing/Sema/Serialization 2) CodeGen 3) Extension checking framework In whatever order makes sense to you. We've added several extension directives in our downstream so I should be able to help here if you can break these up a bit. https://github.com/llvm/llvm-project/pull/66919 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP] Move unsupported structured bindings diagnostic (PR #80216)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/80216 Move the diagnostic so it fires only when doing an OpenMP capture, not for non-OpenMP captures. This allows non-OpenMP code to work when using OpenMP elsewhere, such as the code reported in https://github.com/llvm/llvm-project/issues/66999. >From e5615a482b31c5cec1220c274c9391d47b5b0a8d Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Wed, 31 Jan 2024 15:18:39 -0800 Subject: [PATCH] [OpenMP] Move unsupported structured bindings diagnostic Move the diagnostic so it fires only when doing an OpenMP capture, not for non-OpenMP captures. This allows non-OpenMP code to work when using OpenMP elsewhere, such as the code reported in https://github.com/llvm/llvm-project/issues/66999. --- clang/lib/Sema/SemaExpr.cpp | 18 ++--- clang/test/SemaCXX/decomposition-openmp.cpp | 29 + 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index abe300ecc5431..d15278bce5a6b 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -19528,16 +19528,6 @@ static bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var, ByRef = (LSI->ImpCaptureStyle == LambdaScopeInfo::ImpCap_LambdaByref); } - BindingDecl *BD = dyn_cast(Var); - // FIXME: We should support capturing structured bindings in OpenMP. - if (!Invalid && BD && S.LangOpts.OpenMP) { -if (BuildAndDiagnose) { - S.Diag(Loc, diag::err_capture_binding_openmp) << Var; - S.Diag(Var->getLocation(), diag::note_entity_declared_at) << Var; -} -Invalid = true; - } - if (BuildAndDiagnose && S.Context.getTargetInfo().getTriple().isWasm() && CaptureType.getNonReferenceType().isWebAssemblyReferenceType()) { S.Diag(Loc, diag::err_wasm_ca_reference) << 0; @@ -19879,6 +19869,14 @@ bool Sema::tryCaptureVariable( // just break here. Similarly, global variables that are captured in a // target region should not be captured outside the scope of the region. if (RSI->CapRegionKind == CR_OpenMP) { + // FIXME: We should support capturing structured bindings in OpenMP. + if (isa(Var)) { +if (BuildAndDiagnose) { + Diag(ExprLoc, diag::err_capture_binding_openmp) << Var; + Diag(Var->getLocation(), diag::note_entity_declared_at) << Var; +} +return true; + } OpenMPClauseKind IsOpenMPPrivateDecl = isOpenMPPrivateDecl( Var, RSI->OpenMPLevel, RSI->OpenMPCaptureLevel); // If the variable is private (i.e. not captured) and has variably diff --git a/clang/test/SemaCXX/decomposition-openmp.cpp b/clang/test/SemaCXX/decomposition-openmp.cpp index 28afc39800399..2185f3db83d4e 100644 --- a/clang/test/SemaCXX/decomposition-openmp.cpp +++ b/clang/test/SemaCXX/decomposition-openmp.cpp @@ -1,13 +1,32 @@ - // RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 -fopenmp %s -// FIXME: OpenMP should support capturing structured bindings +// Okay, not an OpenMP capture. auto f() { int i[2] = {}; - auto [a, b] = i; // expected-note 2{{declared here}} + auto [a, b] = i; return [=, &a] { -// expected-error@-1 {{capturing a structured binding is not yet supported in OpenMP}} return a + b; -// expected-error@-1 {{capturing a structured binding is not yet supported in OpenMP}} }; } + +// Okay, not an OpenMP capture. +void foo(int); +void g() { + #pragma omp parallel + { +int i[2] = {}; +auto [a, b] = i; +auto L = [&] { foo(a+b); }; + } +} + +// FIXME: OpenMP should support capturing structured bindings +void h() { + int i[2] = {}; + auto [a, b] = i; // expected-note 2{{declared here}} + #pragma omp parallel + { +// expected-error@+1 2{{capturing a structured binding is not yet supported in OpenMP}} +foo(a + b); + } +} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP] Move unsupported structured bindings diagnostic (PR #80216)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/80216 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] e94a35a - [OpenMP] Fix comment and assertion strings (NFC).
Author: Mike Rice Date: 2021-01-31T17:17:33-08:00 New Revision: e94a35a744b780fcbe18e8bc6a4f774191588d45 URL: https://github.com/llvm/llvm-project/commit/e94a35a744b780fcbe18e8bc6a4f774191588d45 DIFF: https://github.com/llvm/llvm-project/commit/e94a35a744b780fcbe18e8bc6a4f774191588d45.diff LOG: [OpenMP] Fix comment and assertion strings (NFC). Added: Modified: clang/lib/Sema/SemaOpenMP.cpp Removed: diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 78707484f588..df42767f6ce4 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -12484,7 +12484,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause( case OMPD_distribute_parallel_for_simd: case OMPD_distribute: case OMPD_distribute_simd: - // Do not capture thread_limit-clause expressions. + // Do not capture dist_schedule-clause expressions. break; case OMPD_parallel_for: case OMPD_parallel_for_simd: @@ -12539,7 +12539,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause( case OMPD_atomic: case OMPD_target_teams: case OMPD_requires: - llvm_unreachable("Unexpected OpenMP directive with schedule clause"); + llvm_unreachable("Unexpected OpenMP directive with dist_schedule clause"); case OMPD_unknown: default: llvm_unreachable("Unknown OpenMP directive"); @@ -12616,7 +12616,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause( case OMPD_atomic: case OMPD_distribute_simd: case OMPD_requires: - llvm_unreachable("Unexpected OpenMP directive with num_teams-clause"); + llvm_unreachable("Unexpected OpenMP directive with device-clause"); case OMPD_unknown: default: llvm_unreachable("Unknown OpenMP directive"); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] ca98c15 - [OpenMP] Fix iterations calculation for dependent counters.
Author: Mike Rice Date: 2021-02-02T10:09:37-08:00 New Revision: ca98c15f23354520bf689bd5feb333a716159d2c URL: https://github.com/llvm/llvm-project/commit/ca98c15f23354520bf689bd5feb333a716159d2c DIFF: https://github.com/llvm/llvm-project/commit/ca98c15f23354520bf689bd5feb333a716159d2c.diff LOG: [OpenMP] Fix iterations calculation for dependent counters. The number of iterations calculation was failing in some cases with more than two collpased loops. Now the LoopIterationSpace selected matches InitDependOnLC and CondDependOnLC. Differential Revision: https://reviews.llvm.org/D95834 Added: Modified: clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/for_codegen.cpp clang/test/OpenMP/for_loop_messages.cpp Removed: diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index df42767f6ce4..b9315d287e6d 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -7413,10 +7413,7 @@ Expr *OpenMPIterationSpaceChecker::buildNumIterations( // LB = TestIsLessOp.getValue() ? min(LB(MinVal), LB(MaxVal)) : // max(LB(MinVal), LB(MaxVal)) if (InitDependOnLC) { -const LoopIterationSpace &IS = -ResultIterSpaces[ResultIterSpaces.size() - 1 - - InitDependOnLC.getValueOr( - CondDependOnLC.getValueOr(0))]; +const LoopIterationSpace &IS = ResultIterSpaces[*InitDependOnLC - 1]; if (!IS.MinValue || !IS.MaxValue) return nullptr; // OuterVar = Min @@ -7493,10 +7490,7 @@ Expr *OpenMPIterationSpaceChecker::buildNumIterations( // UB = TestIsLessOp.getValue() ? max(UB(MinVal), UB(MaxVal)) : // min(UB(MinVal), UB(MaxVal)) if (CondDependOnLC) { -const LoopIterationSpace &IS = -ResultIterSpaces[ResultIterSpaces.size() - 1 - - InitDependOnLC.getValueOr( - CondDependOnLC.getValueOr(0))]; +const LoopIterationSpace &IS = ResultIterSpaces[*CondDependOnLC - 1]; if (!IS.MinValue || !IS.MaxValue) return nullptr; // OuterVar = Min diff --git a/clang/test/OpenMP/for_codegen.cpp b/clang/test/OpenMP/for_codegen.cpp index 5a8402ee1702..64652e530f6a 100644 --- a/clang/test/OpenMP/for_codegen.cpp +++ b/clang/test/OpenMP/for_codegen.cpp @@ -198,6 +198,28 @@ void loop_with_counter_collapse() { } } } + +// CHECK-LABEL: loop_with_counter_collapse4 +void loop_with_counter_collapse4() { + + // Check bounds calculation when collapse > 2 + // CHECK: store i32 0, i32* [[I_TMP:%.+]], + // CHECK: [[VAL:%.+]] = load i32, i32* [[I_TMP]], + // CHECK: store i32 [[VAL]], i32* [[K_LB_MIN:%.+]], + // CHECK: store i32 6, i32* [[I_TMP]], + // CHECK: [[VAL:%.+]] = load i32, i32* [[I_TMP]], + // CHECK: store i32 [[VAL]], i32* [[K_LB_MAX:%.+]], + #pragma omp for collapse(4) + for (int i = 0; i < 7; i++) { +for (int j = 0; j < 11; j++) { + for (int k = i; k < 7; k++) { +for (int l = 0; l < 11; l++) { +} + } +} + } +} + // CHECK-LABEL: define {{.*void}} @{{.*}}without_schedule_clause{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}}) void without_schedule_clause(float *a, float *b, float *c, float *d) { // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:[@%].+]]) diff --git a/clang/test/OpenMP/for_loop_messages.cpp b/clang/test/OpenMP/for_loop_messages.cpp index a1bc9bd3e045..e62ec07acc04 100644 --- a/clang/test/OpenMP/for_loop_messages.cpp +++ b/clang/test/OpenMP/for_loop_messages.cpp @@ -653,9 +653,10 @@ class TC { ; #pragma omp parallel -// expected-error@+5 2 {{expected loop invariant expression or ' * ii + ' kind of expression}} -// expected-error@+4 {{expected loop invariant expression or ' * TC::ii + ' kind of expression}} -// expected-error@+4 {{expected loop invariant expression or ' * TC::ii + ' kind of expression}} +// expected-error@+6 {{expected loop invariant expression or ' * TC::ii + ' kind of expression}} +// expected-error@+6 {{expected loop invariant expression or ' * TC::ii + ' kind of expression}} +// expected-error@+4 2 {{expected loop invariant expression or ' * ii + ' kind of expression}} +// expected-error@+4 2 {{expected loop invariant expression or ' * ii + ' kind of expression}} #pragma omp for collapse(3) for (ii = 10 + 25; ii < 1000; ii += 1) for (iii = ii * 10 + 25; iii < ii / ii - 23; iii += 1) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 6f9c251 - [OpenMP] Initial parsing/sema for the 'omp loop' construct
Author: Mike Rice Date: 2021-10-28T08:26:43-07:00 New Revision: 6f9c25167d16acff3ff8e4f54a8c14a2a175fc59 URL: https://github.com/llvm/llvm-project/commit/6f9c25167d16acff3ff8e4f54a8c14a2a175fc59 DIFF: https://github.com/llvm/llvm-project/commit/6f9c25167d16acff3ff8e4f54a8c14a2a175fc59.diff LOG: [OpenMP] Initial parsing/sema for the 'omp loop' construct Adds basic parsing/sema/serialization support for the #pragma omp loop directive. Differential Revision: https://reviews.llvm.org/D112499 Added: clang/test/OpenMP/generic_loop_ast_print.cpp clang/test/OpenMP/generic_loop_messages.cpp Modified: clang/include/clang-c/Index.h clang/include/clang/AST/RecursiveASTVisitor.h clang/include/clang/AST/StmtOpenMP.h clang/include/clang/Basic/DiagnosticSemaKinds.td clang/include/clang/Basic/OpenMPKinds.h clang/include/clang/Basic/StmtNodes.td clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTBitCodes.h clang/lib/AST/StmtOpenMP.cpp clang/lib/AST/StmtPrinter.cpp clang/lib/AST/StmtProfile.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/CodeGen/CGStmt.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/CodeGen/CodeGenFunction.h clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaExceptionSpec.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp clang/tools/libclang/CIndex.cpp clang/tools/libclang/CXCursor.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index b49acf6b58543..b0d7ef509c26f 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -2596,7 +2596,11 @@ enum CXCursorKind { */ CXCursor_OMPMetaDirective = 294, - CXCursor_LastStmt = CXCursor_OMPMetaDirective, + /** OpenMP loop directive. + */ + CXCursor_OMPGenericLoopDirective = 295, + + CXCursor_LastStmt = CXCursor_OMPGenericLoopDirective, /** * Cursor that represents the translation unit itself. diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index f200cd3920e67..74c49546c00bc 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -3023,6 +3023,9 @@ DEF_TRAVERSE_STMT(OMPDispatchDirective, DEF_TRAVERSE_STMT(OMPMaskedDirective, { TRY_TO(TraverseOMPExecutableDirective(S)); }) +DEF_TRAVERSE_STMT(OMPGenericLoopDirective, + { TRY_TO(TraverseOMPExecutableDirective(S)); }) + // OpenMP clauses. template bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) { diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h index 60d47b93ba79f..48b2dce152a64 100644 --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -1144,7 +1144,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { if (isOpenMPLoopBoundSharingDirective(Kind)) return CombinedDistributeEnd; if (isOpenMPWorksharingDirective(Kind) || isOpenMPTaskLoopDirective(Kind) || -isOpenMPDistributeDirective(Kind)) +isOpenMPGenericLoopDirective(Kind) || isOpenMPDistributeDirective(Kind)) return WorksharingEnd; return DefaultEnd; } @@ -1176,6 +1176,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { } void setIsLastIterVariable(Expr *IL) { assert((isOpenMPWorksharingDirective(getDirectiveKind()) || +isOpenMPGenericLoopDirective(getDirectiveKind()) || isOpenMPTaskLoopDirective(getDirectiveKind()) || isOpenMPDistributeDirective(getDirectiveKind())) && "expected worksharing loop directive"); @@ -1183,6 +1184,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { } void setLowerBoundVariable(Expr *LB) { assert((isOpenMPWorksharingDirective(getDirectiveKind()) || +isOpenMPGenericLoopDirective(getDirectiveKind()) || isOpenMPTaskLoopDirective(getDirectiveKind()) || isOpenMPDistributeDirective(getDirectiveKind())) && "expected worksharing loop directive"); @@ -1190,6 +1192,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { } void setUpperBoundVariable(Expr *UB) { assert((isOpenMPWorksharingDirective(getDirectiveKind()) || +isOpenMPGenericLoopDirective(getDirectiveKind()) || isOpenMPTaskLoopDirective(getDirectiveKind()) || isOpenMPDistributeDirective(getDirectiveKind())) && "expected worksharing loop directive"); @@ -1197,6 +1200,7 @@ class OMPLoopDirective : public OMPLoopBasedDirective { } void setStrideVariable(Expr *ST) { assert((isOpenMPWorksharing
[clang] 72c3736 - [OpenMP] Add triple to run lines to avoid message differences
Author: Mike Rice Date: 2021-10-29T09:20:40-07:00 New Revision: 72c373644fc397e9443200865b58514a3d6cf69d URL: https://github.com/llvm/llvm-project/commit/72c373644fc397e9443200865b58514a3d6cf69d DIFF: https://github.com/llvm/llvm-project/commit/72c373644fc397e9443200865b58514a3d6cf69d.diff LOG: [OpenMP] Add triple to run lines to avoid message differences Diagnostics with function types can show calling conventions on some platforms. Just choose one to prevent that. Added: Modified: clang/test/OpenMP/declare_variant_clauses_messages.cpp Removed: diff --git a/clang/test/OpenMP/declare_variant_clauses_messages.cpp b/clang/test/OpenMP/declare_variant_clauses_messages.cpp index 648a1c1201c4b..e4db5b4e44eda 100644 --- a/clang/test/OpenMP/declare_variant_clauses_messages.cpp +++ b/clang/test/OpenMP/declare_variant_clauses_messages.cpp @@ -1,8 +1,8 @@ -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -DOMP51 -std=c++11 -o - %s -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -DOMP51 -std=c++11 \ +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DOMP51 -std=c++11 -o - %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DOMP51 -std=c++11 \ // RUN: -DNO_INTEROP_T_DEF -o - %s -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -DOMP50 -std=c++11 -o - %s -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -DOMP51 -DC -x c -o - %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=50 -DOMP50 -std=c++11 -o - %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DOMP51 -DC -x c -o - %s #ifdef NO_INTEROP_T_DEF void foo_v1(float *, void *); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 4eac7bc - [OpenMP] Add parsing/sema/serialization for 'bind' clause.
Author: Mike Rice Date: 2021-11-04T14:40:30-07:00 New Revision: 4eac7bcf1af1a94d76aec8d54f4a0f0014dd121c URL: https://github.com/llvm/llvm-project/commit/4eac7bcf1af1a94d76aec8d54f4a0f0014dd121c DIFF: https://github.com/llvm/llvm-project/commit/4eac7bcf1af1a94d76aec8d54f4a0f0014dd121c.diff LOG: [OpenMP] Add parsing/sema/serialization for 'bind' clause. Differential Revision: https://reviews.llvm.org/D113154 Added: Modified: clang/include/clang/AST/OpenMPClause.h clang/include/clang/AST/RecursiveASTVisitor.h clang/include/clang/Basic/OpenMPKinds.def clang/include/clang/Basic/OpenMPKinds.h clang/include/clang/Sema/Sema.h clang/lib/AST/OpenMPClause.cpp clang/lib/AST/StmtProfile.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/CodeGen/CGStmtOpenMP.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp clang/test/OpenMP/generic_loop_ast_print.cpp clang/test/OpenMP/generic_loop_messages.cpp clang/tools/libclang/CIndex.cpp flang/lib/Semantics/check-omp-structure.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index 749eff57313a..99554641a64b 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -8405,6 +8405,96 @@ class OMPFilterClause final : public OMPClause, public OMPClauseWithPreInit { } }; +/// This represents 'bind' clause in the '#pragma omp ...' directives. +/// +/// \code +/// #pragma omp loop bind(parallel) +/// \endcode +class OMPBindClause final : public OMPClause { + friend class OMPClauseReader; + + /// Location of '('. + SourceLocation LParenLoc; + + /// The binding kind of 'bind' clause. + OpenMPBindClauseKind Kind = OMPC_BIND_unknown; + + /// Start location of the kind in source code. + SourceLocation KindLoc; + + /// Sets the location of '('. + void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } + + /// Set the binding kind. + void setBindKind(OpenMPBindClauseKind K) { Kind = K; } + + /// Set the binding kind location. + void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; } + + /// Build 'bind' clause with kind \a K ('teams', 'parallel', or 'thread'). + /// + /// \param K Binding kind of the clause ('teams', 'parallel' or 'thread'). + /// \param KLoc Starting location of the binding kind. + /// \param StartLoc Starting location of the clause. + /// \param LParenLoc Location of '('. + /// \param EndLoc Ending location of the clause. + OMPBindClause(OpenMPBindClauseKind K, SourceLocation KLoc, +SourceLocation StartLoc, SourceLocation LParenLoc, +SourceLocation EndLoc) + : OMPClause(llvm::omp::OMPC_bind, StartLoc, EndLoc), LParenLoc(LParenLoc), +Kind(K), KindLoc(KLoc) {} + + /// Build an empty clause. + OMPBindClause() + : OMPClause(llvm::omp::OMPC_bind, SourceLocation(), SourceLocation()) {} + +public: + /// Build 'bind' clause with kind \a K ('teams', 'parallel', or 'thread'). + /// + /// \param C AST context + /// \param K Binding kind of the clause ('teams', 'parallel' or 'thread'). + /// \param KLoc Starting location of the binding kind. + /// \param StartLoc Starting location of the clause. + /// \param LParenLoc Location of '('. + /// \param EndLoc Ending location of the clause. + static OMPBindClause *Create(const ASTContext &C, OpenMPBindClauseKind K, + SourceLocation KLoc, SourceLocation StartLoc, + SourceLocation LParenLoc, SourceLocation EndLoc); + + /// Build an empty 'bind' clause. + /// + /// \param C AST context + static OMPBindClause *CreateEmpty(const ASTContext &C); + + /// Returns the location of '('. + SourceLocation getLParenLoc() const { return LParenLoc; } + + /// Returns kind of the clause. + OpenMPBindClauseKind getBindKind() const { return Kind; } + + /// Returns location of clause kind. + SourceLocation getBindKindLoc() const { return KindLoc; } + + child_range children() { +return child_range(child_iterator(), child_iterator()); + } + + const_child_range children() const { +return const_child_range(const_child_iterator(), const_child_iterator()); + } + + child_range used_children() { +return child_range(child_iterator(), child_iterator()); + } + const_child_range used_children() const { +return const_child_range(const_child_iterator(), const_child_iterator()); + } + + static bool classof(const OMPClause *T) { +return T->getClauseKind() == llvm::omp::OMPC_bind; + } +}; + /// This class implements a simple visitor for OMPClause /// subclasses. template class Ptr, typename RetTy> diff --git a/clang/include/clang/AST/RecursiveASTVis
[clang] 69f35f8 - [OpenMP] Add version macro support for 5.1 and 5.2
Author: Mike Rice Date: 2021-11-17T10:51:08-08:00 New Revision: 69f35f89691255eeed0dac26b2b642fea5c7db93 URL: https://github.com/llvm/llvm-project/commit/69f35f89691255eeed0dac26b2b642fea5c7db93 DIFF: https://github.com/llvm/llvm-project/commit/69f35f89691255eeed0dac26b2b642fea5c7db93.diff LOG: [OpenMP] Add version macro support for 5.1 and 5.2 Differential Revision: https://reviews.llvm.org/D114102 Added: Modified: clang/lib/Frontend/InitPreprocessor.cpp clang/test/OpenMP/declare_variant_clauses_messages.cpp clang/test/OpenMP/driver.c Removed: diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index fe65039291502..0ecb024fc6b97 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1152,6 +1152,12 @@ static void InitializePredefinedMacros(const TargetInfo &TI, case 45: Builder.defineMacro("_OPENMP", "201511"); break; +case 51: + Builder.defineMacro("_OPENMP", "202011"); + break; +case 52: + Builder.defineMacro("_OPENMP", "202111"); + break; default: // Default version is OpenMP 5.0 Builder.defineMacro("_OPENMP", "201811"); diff --git a/clang/test/OpenMP/declare_variant_clauses_messages.cpp b/clang/test/OpenMP/declare_variant_clauses_messages.cpp index e4db5b4e44eda..058b5d7675e65 100644 --- a/clang/test/OpenMP/declare_variant_clauses_messages.cpp +++ b/clang/test/OpenMP/declare_variant_clauses_messages.cpp @@ -1,8 +1,8 @@ -// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DOMP51 -std=c++11 -o - %s -// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DOMP51 -std=c++11 \ +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -std=c++11 -o - %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -std=c++11 \ // RUN: -DNO_INTEROP_T_DEF -o - %s -// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=50 -DOMP50 -std=c++11 -o - %s -// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DOMP51 -DC -x c -o - %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=50 -std=c++11 -o - %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-linux -fopenmp -fopenmp-version=51 -DC -x c -o - %s #ifdef NO_INTEROP_T_DEF void foo_v1(float *, void *); @@ -15,7 +15,7 @@ typedef void *omp_interop_t; int Other; -#ifdef OMP51 +#if _OPENMP >= 202011 // At least OpenMP 5.1 #ifdef __cplusplus class A { public: @@ -83,14 +83,14 @@ template void templatebar(const T& t) {} append_args(interop(target),interop(target)) void templatebar(const int &t) {} #endif // __cplusplus -#endif // OMP51 +#endif // _OPENMP >= 202011 void foo_v1(float *AAA, float *BBB, int *I) { return; } void foo_v2(float *AAA, float *BBB, int *I) { return; } void foo_v3(float *AAA, float *BBB, int *I) { return; } void foo_v4(float *AAA, float *BBB, int *I, omp_interop_t IOp) { return; } -#ifdef OMP51 +#if _OPENMP >= 202011 // At least OpenMP 5.1 void vararg_foo(const char *fmt, omp_interop_t it, ...); // expected-error@+3 {{'append_args' is not allowed with varargs functions}} #pragma omp declare variant(vararg_foo) match(construct={dispatch}) \ @@ -184,15 +184,15 @@ void vararg_bar2(const char *fmt) { return; } // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *, omp_interop_t)' (aka 'void (float *, float *, int *, void *)') is incompatible with type 'void (float *, float *, int *)'}} #pragma omp declare variant(foo_v4) match(construct={dispatch}) -#endif // OMP51 -#ifdef OMP50 +#endif // _OPENMP >= 202011 +#if _OPENMP < 202011 // OpenMP 5.0 or lower // expected-error@+2 {{expected 'match' clause on 'omp declare variant' directive}} #pragma omp declare variant(foo_v1)\ adjust_args(need_device_ptr:AAA) match(device={arch(arm)}) // expected-error@+2 {{expected 'match' clause on 'omp declare variant' directive}} #pragma omp declare variant(foo_v1)\ append_args(interop(target)) match(device={arch(arm)}) -#endif // OMP50 +#endif // _OPENMP < 202011 void foo(float *AAA, float *BBB, int *I) { return; } diff --git a/clang/test/OpenMP/driver.c b/clang/test/OpenMP/driver.c index d82e92b4e8894..2533ec7e05b60 100644 --- a/clang/test/OpenMP/driver.c +++ b/clang/test/OpenMP/driver.c @@ -33,6 +33,12 @@ // RUN: %clang %s -c -E -dM -fopenmp=libomp -fopenmp-version=50 | FileCheck --check-prefix=CHECK-50-VERSION %s // CHECK-50-VERSION: #define _OPENMP 201811 +// RUN: %clang %s -c -E -dM -fopenmp=libomp -fopenmp-version=51 | FileCheck --check-prefix=CHECK-51-VERSION %s +// CHECK-51-VERSION:
[clang] dd4c838 - [OpenMP] Allow data members in interop init/use/destroy clauses
Author: Mike Rice Date: 2022-08-11T09:39:12-07:00 New Revision: dd4c838da30ad4b6d5dc0f700df0a6629469f719 URL: https://github.com/llvm/llvm-project/commit/dd4c838da30ad4b6d5dc0f700df0a6629469f719 DIFF: https://github.com/llvm/llvm-project/commit/dd4c838da30ad4b6d5dc0f700df0a6629469f719.diff LOG: [OpenMP] Allow data members in interop init/use/destroy clauses Previously a diagnostic was given if the expression was not strictly a DeclRef. Now also allow use of data members inside member functions. Differential Revision: https://reviews.llvm.org/D131222 Added: Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/interop_ast_print.cpp clang/test/OpenMP/interop_irbuilder.cpp clang/test/OpenMP/interop_messages.cpp Removed: diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 92217aed89747..e4e7d7b7338a4 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10387,6 +10387,9 @@ def err_omp_unexpected_clause_value : Error< "expected %0 in OpenMP clause '%1'">; def err_omp_expected_var_name_member_expr : Error< "expected variable name%select{| or data member of current class}0">; +def err_omp_expected_var_name_member_expr_with_type : Error< + "expected variable%select{| or static data member|, static data member, " + "or non-static data member of current class}0 of type '%1'">; def err_omp_expected_var_name_member_expr_or_array_item : Error< "expected variable name%select{|, data member of current class}0, array element or array section">; def err_omp_expected_addressable_lvalue_or_array_item : Error< diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 3b1aab6ca0e5f..1d9ec1162bafb 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -2718,7 +2718,8 @@ void Sema::EndOpenMPClause() { static std::pair getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc, - SourceRange &ERange, bool AllowArraySection = false); + SourceRange &ERange, bool AllowArraySection = false, + StringRef DiagType = ""); /// Check consistency of the reduction clauses. static void checkReductionClauses(Sema &S, DSAStackTy *Stack, @@ -5279,7 +5280,8 @@ static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind, static std::pair getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc, SourceRange &ERange, - bool AllowArraySection) { + bool AllowArraySection, + StringRef DiagType) { if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() || RefExpr->containsUnexpandedParameterPack()) return std::make_pair(nullptr, true); @@ -5324,6 +5326,12 @@ static std::pair getPrivateItem(Sema &S, Expr *&RefExpr, if (IsArrayExpr != NoArrayExpr) { S.Diag(ELoc, diag::err_omp_expected_base_var_name) << IsArrayExpr << ERange; +} else if (!DiagType.empty()) { + unsigned DiagSelect = S.getLangOpts().CPlusPlus +? (S.getCurrentThisType().isNull() ? 1 : 2) +: 0; + S.Diag(ELoc, diag::err_omp_expected_var_name_member_expr_with_type) + << DiagSelect << DiagType << ERange; } else { S.Diag(ELoc, AllowArraySection @@ -17249,32 +17257,28 @@ StmtResult Sema::ActOnOpenMPInteropDirective(ArrayRef Clauses, // OpenMP 5.1 [2.15.1, interop Construct, Restrictions] // Each interop-var may be specified for at most one action-clause of each // interop construct. - llvm::SmallPtrSet InteropVars; - for (const OMPClause *C : Clauses) { + llvm::SmallPtrSet InteropVars; + for (OMPClause *C : Clauses) { OpenMPClauseKind ClauseKind = C->getClauseKind(); -const DeclRefExpr *DRE = nullptr; -SourceLocation VarLoc; +std::pair DeclResult; +SourceLocation ELoc; +SourceRange ERange; if (ClauseKind == OMPC_init) { - const auto *IC = cast(C); - VarLoc = IC->getVarLoc(); - DRE = dyn_cast_or_null(IC->getInteropVar()); + auto *E = cast(C)->getInteropVar(); + DeclResult = getPrivateItem(*this, E, ELoc, ERange); } else if (ClauseKind == OMPC_use) { - const auto *UC = cast(C); - VarLoc = UC->getVarLoc(); - DRE = dyn_cast_or_null(UC->getInteropVar()); + auto *E = cast(C)->getInteropVar(); + DeclResult = getPrivateItem(*this, E, ELoc, ERange); } else if (ClauseKind == OMPC_destroy) { - const auto *DC = cast(C); - VarLoc = DC->getVarLoc(); - DRE =
[clang] 89167e3 - [OpenMP][NFC] Refactor code for interop parts of 'init' and 'append_args' clauses
Author: Mike Rice Date: 2022-08-18T17:13:30-07:00 New Revision: 89167e3c5b008b44f1fa8a222652e7bdc62cfa8a URL: https://github.com/llvm/llvm-project/commit/89167e3c5b008b44f1fa8a222652e7bdc62cfa8a DIFF: https://github.com/llvm/llvm-project/commit/89167e3c5b008b44f1fa8a222652e7bdc62cfa8a.diff LOG: [OpenMP][NFC] Refactor code for interop parts of 'init' and 'append_args' clauses The 'init' clause allows an interop-modifier of prefer_type(list) and and interop-types 'target' and 'targetsync'. The 'append_args' clause uses an append-op that also includes interop-types ('target' and 'targetsync') and will allow a prefer_type list in the next OpenMP version. This change adds a helper struct OMPInteropInfo and uses it in the parsing of both the 'init' and 'append_args' clauses. One OMPInteropInfo object represents the info in a single 'init' clause. Since 'append_args' allows a variable number of interop items it will require an array of OMPInteropInfo objects once that is supported. Differential Revision: https://reviews.llvm.org/D132171 Added: Modified: clang/include/clang/AST/OpenMPClause.h clang/include/clang/Parse/Parser.h clang/include/clang/Sema/Sema.h clang/lib/AST/OpenMPClause.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h Removed: diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index 072519462b9f..a3982d7ba0ae 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -7709,6 +7709,13 @@ class OMPOrderClause final : public OMPClause { } }; +/// Contains 'interop' data for 'append_args' and 'init' clauses. +struct OMPInteropInfo final { + bool IsTarget = false; + bool IsTargetSync = false; + llvm::SmallVector PreferTypes; +}; + /// This represents the 'init' clause in '#pragma omp ...' directives. /// /// \code @@ -7763,16 +7770,14 @@ class OMPInitClause final /// /// \param C AST context. /// \param InteropVar The interop variable. - /// \param PrefExprs The list of preference expressions. - /// \param IsTarget Uses the 'target' interop-type. - /// \param IsTargetSync Uses the 'targetsync' interop-type. + /// \param InteropInfo The interop-type and prefer_type list. /// \param StartLoc Starting location of the clause. /// \param LParenLoc Location of '('. /// \param VarLoc Location of the interop variable. /// \param EndLoc Ending location of the clause. static OMPInitClause *Create(const ASTContext &C, Expr *InteropVar, - ArrayRef PrefExprs, bool IsTarget, - bool IsTargetSync, SourceLocation StartLoc, + OMPInteropInfo &InteropInfo, + SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc); diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index 41bfc9f48ecc..567433f2a889 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -3332,6 +3332,9 @@ class Parser : public CodeCompletionHandler { /// '(' { [ '(' ')' ] }+ ')' OMPClause *ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind); + /// Parses the 'interop' parts of the 'append_args' and 'init' clauses. + bool ParseOMPInteropInfo(OMPInteropInfo &InteropInfo, OpenMPClauseKind Kind); + /// Parses clause with an interop variable of kind \a Kind. /// /// \param Kind Kind of current clause. diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 85641f595d41..51e526a62274 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -11621,12 +11621,10 @@ class Sema final { SourceLocation EndLoc); /// Called on well-formed 'init' clause. - OMPClause *ActOnOpenMPInitClause(Expr *InteropVar, ArrayRef PrefExprs, - bool IsTarget, bool IsTargetSync, - SourceLocation StartLoc, - SourceLocation LParenLoc, - SourceLocation VarLoc, - SourceLocation EndLoc); + OMPClause * + ActOnOpenMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo, +SourceLocation StartLoc, SourceLocation LParenLoc, +SourceLocation VarLoc, SourceLocation EndLoc); /// Called on well-formed 'use' clause. OMPClause *ActOnOpenMPUseClause(Expr *InteropVar, SourceLocation StartLoc, diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp index dc2d90e366bc..214ae5bd6be4 100644 --- a/clang/lib/AST/OpenMPClause.cpp +++ b/cla
[clang] 129904d - [OpenMP][NFC] Use OMPInteropInfo in the OMPDeclareVariantAttr attribute
Author: Mike Rice Date: 2022-08-22T10:41:16-07:00 New Revision: 129904d5041ffad13747fd0ad77e44050d6c6aaa URL: https://github.com/llvm/llvm-project/commit/129904d5041ffad13747fd0ad77e44050d6c6aaa DIFF: https://github.com/llvm/llvm-project/commit/129904d5041ffad13747fd0ad77e44050d6c6aaa.diff LOG: [OpenMP][NFC] Use OMPInteropInfo in the OMPDeclareVariantAttr attribute In preparation for allowing the prefer_type list in the append_args clause, use the OMPInteropInfo in the attribute for 'declare variant'. This requires adding a new Argument kind to the attribute code. This change adds a specific attribute to pass an array of OMPInteropInfo. It implements new tablegen needed to handle the interop-type part of the structure. When prefer_type is added, more work will be needed to dump, instantiate, and serialize the PreferTypes field in OMPInteropInfo. Differential Revision: https://reviews.llvm.org/D132270 Added: Modified: clang/include/clang/AST/OpenMPClause.h clang/include/clang/Basic/Attr.td clang/include/clang/Basic/OpenMPKinds.h clang/include/clang/Parse/Parser.h clang/include/clang/Sema/Sema.h clang/lib/AST/AttrImpl.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/SemaTemplateInstantiateDecl.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReaderDecl.cpp clang/utils/TableGen/ClangAttrEmitter.cpp Removed: diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index a3982d7ba0aeb..fd6f50e31bfe1 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -7709,13 +7709,6 @@ class OMPOrderClause final : public OMPClause { } }; -/// Contains 'interop' data for 'append_args' and 'init' clauses. -struct OMPInteropInfo final { - bool IsTarget = false; - bool IsTargetSync = false; - llvm::SmallVector PreferTypes; -}; - /// This represents the 'init' clause in '#pragma omp ...' directives. /// /// \code diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 670af57c3def5..e504596a2067c 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -221,6 +221,7 @@ class DeclArgument // OMPTraitProperty := {Kind} // class OMPTraitInfoArgument : Argument; +class VariadicOMPInteropInfoArgument : Argument; class TypeArgument : Argument; class UnsignedArgument : Argument; @@ -3827,14 +3828,19 @@ def OMPDeclareVariant : InheritableAttr { OMPTraitInfoArgument<"TraitInfos">, VariadicExprArgument<"AdjustArgsNothing">, VariadicExprArgument<"AdjustArgsNeedDevicePtr">, -VariadicEnumArgument<"AppendArgs", "InteropType", - ["target", "targetsync", "target,targetsync"], - ["Target", "TargetSync", "Target_TargetSync"]> +VariadicOMPInteropInfoArgument<"AppendArgs">, ]; let AdditionalMembers = [{ OMPTraitInfo &getTraitInfo() { return *traitInfos; } void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy) const; +static StringRef getInteropTypeString(const OMPInteropInfo *I) { + if (I->IsTarget && I->IsTargetSync) +return "target,targetsync"; + if (I->IsTarget) +return "target"; + return "targetsync"; +} }]; } diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h index e95a717f268df..82875aa0fafa6 100644 --- a/clang/include/clang/Basic/OpenMPKinds.h +++ b/clang/include/clang/Basic/OpenMPKinds.h @@ -181,6 +181,16 @@ enum OpenMPBindClauseKind { OMPC_BIND_unknown }; +/// Contains 'interop' data for 'append_args' and 'init' clauses. +class Expr; +struct OMPInteropInfo final { + OMPInteropInfo(bool IsTarget = false, bool IsTargetSync = false) + : IsTarget(IsTarget), IsTargetSync(IsTargetSync) {} + bool IsTarget; + bool IsTargetSync; + llvm::SmallVector PreferTypes; +}; + unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str, const LangOptions &LangOpts); const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type); diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index 3dd92f08bff1f..690a56bf66142 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -3180,8 +3180,7 @@ class Parser : public CodeCompletionHandler { bool parseOMPContextSelectors(SourceLocation Loc, OMPTraitInfo &TI); /// Parse an 'append_args' clause for '#pragma omp declare variant'. - bool parseOpenMPAppendArgs( - SmallVectorImpl &InterOpTypes); + bool parseOpenMPAppendArgs(SmallVectorImpl &InteropInfos); /// Parse a `match` clause for an '#pragma omp declare variant'. Return true /// if there was an error. diff --git a/clang/includ
[clang] c954cfe - Some uses of the preprocessor can result in multiple target regions on the
Author: Mike Rice Date: 2022-11-04T12:54:22-07:00 New Revision: c954cfeb57a1c8c0996a34da64243bc7f7fe1107 URL: https://github.com/llvm/llvm-project/commit/c954cfeb57a1c8c0996a34da64243bc7f7fe1107 DIFF: https://github.com/llvm/llvm-project/commit/c954cfeb57a1c8c0996a34da64243bc7f7fe1107.diff LOG: Some uses of the preprocessor can result in multiple target regions on the same line. Cases such as those in the associated lit tests, can now be supported. This adds a 'Count' field to TargetRegionEntryInfo to differentiate regions with the same source position. The OffloadEntriesInfoManager routines are updated to maintain a count of regions seen at a location. The registration of regions proceeds that same as before, but now the next available count is always determined and used in the offload entry. Fixes: https://github.com/llvm/llvm-project/issues/52707 Differential Revision: https://reviews.llvm.org/D134816 Added: clang/test/OpenMP/Inputs/multiple_regions.inc clang/test/OpenMP/multiple_regions_per_line.cpp Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/test/OpenMP/target_codegen_registration.cpp clang/test/OpenMP/target_codegen_registration_naming.cpp clang/test/OpenMP/target_parallel_codegen_registration.cpp clang/test/OpenMP/target_parallel_codegen_registration_naming.cpp clang/test/OpenMP/target_parallel_for_codegen_registration.cpp clang/test/OpenMP/target_parallel_for_codegen_registration_naming.cpp clang/test/OpenMP/target_parallel_for_simd_codegen_registration.cpp clang/test/OpenMP/target_parallel_for_simd_codegen_registration_naming.cpp clang/test/OpenMP/target_simd_codegen_registration.cpp clang/test/OpenMP/target_simd_codegen_registration_naming.cpp clang/test/OpenMP/target_teams_codegen_registration.cpp clang/test/OpenMP/target_teams_codegen_registration_naming.cpp clang/test/OpenMP/target_teams_distribute_codegen_registration.cpp clang/test/OpenMP/target_teams_distribute_codegen_registration_naming.cpp clang/test/OpenMP/target_teams_distribute_parallel_for_simd_codegen_registration.cpp clang/test/OpenMP/target_teams_distribute_parallel_for_simd_codegen_registration_naming.cpp clang/test/OpenMP/target_teams_distribute_simd_codegen_registration.cpp clang/test/OpenMP/target_teams_distribute_simd_codegen_registration_naming.cpp llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp Removed: diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 6b0908d139f47..e52989b7c139b 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1858,7 +1858,7 @@ bool CGOpenMPRuntime::emitDeclareTargetVarDefinition(const VarDecl *VD, auto EntryInfo = getTargetEntryUniqueInfo(CGM.getContext(), Loc, VD->getName()); SmallString<128> Buffer, Out; - EntryInfo.getTargetRegionEntryFnName(Buffer); + OffloadEntriesInfoManager.getTargetRegionEntryFnName(Buffer, EntryInfo); const Expr *Init = VD->getAnyInitializer(); if (CGM.getLangOpts().CPlusPlus && PerformInit) { @@ -6101,18 +6101,20 @@ void CGOpenMPRuntime::emitTargetOutlinedFunctionHelper( // Create a unique name for the entry function using the source location // information of the current target region. The name will be something like: // - // __omp_offloading_DD__PP_lBB + // __omp_offloading_DD__PP_lBB[_CC] // // where DD_ is an ID unique to the file (device and file IDs), PP is the // mangled name of the function that encloses the target region and BB is the - // line number of the target region. + // line number of the target region. CC is a count added when more than one + // region is located at the same location. const bool BuildOutlinedFn = CGM.getLangOpts().OpenMPIsDevice || !CGM.getLangOpts().OpenMPOffloadMandatory; auto EntryInfo = getTargetEntryUniqueInfo(CGM.getContext(), D.getBeginLoc(), ParentName); + SmallString<64> EntryFnName; - EntryInfo.getTargetRegionEntryFnName(EntryFnName); + OffloadEntriesInfoManager.getTargetRegionEntryFnName(EntryFnName, EntryInfo); const CapturedStmt &CS = *D.getCapturedStmt(OMPD_target); diff --git a/clang/test/OpenMP/Inputs/multiple_regions.inc b/clang/test/OpenMP/Inputs/multiple_regions.inc new file mode 100644 index 0..f519bee6c5b5e --- /dev/null +++ b/clang/test/OpenMP/Inputs/multiple_regions.inc @@ -0,0 +1,4 @@ +#pragma omp target +{ + i = i + VALUE; +} diff --git a/clang/test/OpenMP/multiple_regions_per_line.cpp b/clang/test/OpenMP/multiple_regions_per_line.cpp new file mode 100644 index 0..4332ca052edce --- /dev/null +++ b/clang/test/OpenMP/multiple_regions_per_line.cpp @@ -0,0 +1,73 @@ +//RUN: %clang_cc
[clang] ab9eac7 - [OpenMP] Initial parsing/sema for 'strict' modifier with 'grainsize' clause
Author: Fazlay Rabbi Date: 2022-11-17T20:59:07-08:00 New Revision: ab9eac762c35068e77f57795e660d06f578c9614 URL: https://github.com/llvm/llvm-project/commit/ab9eac762c35068e77f57795e660d06f578c9614 DIFF: https://github.com/llvm/llvm-project/commit/ab9eac762c35068e77f57795e660d06f578c9614.diff LOG: [OpenMP] Initial parsing/sema for 'strict' modifier with 'grainsize' clause This patch gives basic parsing and semantic analysis support for 'strict' modifier with 'grainsize' clause of 'taskloop' construct introduced in OpenMP 5.1 (section 2.12.2) Differential Revision: https://reviews.llvm.org/D138217 Added: clang/test/OpenMP/taskloop_strict_modifier_ast_print.cpp clang/test/OpenMP/taskloop_strict_modifier_messages.cpp Modified: clang/include/clang/AST/OpenMPClause.h clang/include/clang/Basic/DiagnosticParseKinds.td clang/include/clang/Basic/OpenMPKinds.def clang/include/clang/Basic/OpenMPKinds.h clang/include/clang/Sema/Sema.h clang/lib/AST/OpenMPClause.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp clang/test/OpenMP/masked_taskloop_grainsize_messages.cpp clang/test/OpenMP/masked_taskloop_simd_grainsize_messages.cpp clang/test/OpenMP/master_taskloop_grainsize_messages.cpp clang/test/OpenMP/master_taskloop_simd_grainsize_messages.cpp clang/test/OpenMP/parallel_masked_taskloop_simd_grainsize_messages.cpp clang/test/OpenMP/parallel_master_taskloop_grainsize_messages.cpp clang/test/OpenMP/parallel_master_taskloop_simd_grainsize_messages.cpp clang/test/OpenMP/taskloop_grainsize_messages.cpp clang/test/OpenMP/taskloop_simd_grainsize_messages.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index e7dc5e72b3a82..1c9f62355e4ee 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -6354,26 +6354,43 @@ class OMPGrainsizeClause : public OMPClause, public OMPClauseWithPreInit { /// Location of '('. SourceLocation LParenLoc; + /// Modifiers for 'grainsize' clause. + OpenMPGrainsizeClauseModifier Modifier = OMPC_GRAINSIZE_unknown; + + /// Location of the modifier. + SourceLocation ModifierLoc; + /// Safe iteration space distance. Stmt *Grainsize = nullptr; /// Set safelen. void setGrainsize(Expr *Size) { Grainsize = Size; } + /// Sets modifier. + void setModifier(OpenMPGrainsizeClauseModifier M) { Modifier = M; } + + /// Sets modifier location. + void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; } + public: /// Build 'grainsize' clause. /// + /// \param Modifier Clause modifier. /// \param Size Expression associated with this clause. /// \param HelperSize Helper grainsize for the construct. /// \param CaptureRegion Innermost OpenMP region where expressions in this /// clause must be captured. /// \param StartLoc Starting location of the clause. + /// \param ModifierLoc Modifier location. + /// \param LParenLoc Location of '('. /// \param EndLoc Ending location of the clause. - OMPGrainsizeClause(Expr *Size, Stmt *HelperSize, - OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, - SourceLocation LParenLoc, SourceLocation EndLoc) + OMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier, Expr *Size, + Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion, + SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation ModifierLoc, SourceLocation EndLoc) : OMPClause(llvm::omp::OMPC_grainsize, StartLoc, EndLoc), -OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Grainsize(Size) { +OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Modifier(Modifier), +ModifierLoc(ModifierLoc), Grainsize(Size) { setPreInitStmt(HelperSize, CaptureRegion); } @@ -6392,6 +6409,12 @@ class OMPGrainsizeClause : public OMPClause, public OMPClauseWithPreInit { /// Return safe iteration space distance. Expr *getGrainsize() const { return cast_or_null(Grainsize); } + /// Gets modifier. + OpenMPGrainsizeClauseModifier getModifier() const { return Modifier; } + + /// Gets modifier location. + SourceLocation getModifierLoc() const { return ModifierLoc; } + child_range children() { return child_range(&Grainsize, &Grainsize + 1); } const_child_range children() const { diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 27cd3da1f191c..6f46ede56f66c 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticPar
[clang] a35141d - [OpenMP] Add handling cases when filter(tid) appears with default(none)
Author: Fazlay Rabbi Date: 2022-06-22T17:45:43-07:00 New Revision: a35141d395019c837d16419c6ef57662a6efefc5 URL: https://github.com/llvm/llvm-project/commit/a35141d395019c837d16419c6ef57662a6efefc5 DIFF: https://github.com/llvm/llvm-project/commit/a35141d395019c837d16419c6ef57662a6efefc5.diff LOG: [OpenMP] Add handling cases when filter(tid) appears with default(none) Differential Revision: https://reviews.llvm.org/D128397 Added: Modified: clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/parallel_masked_ast_print.cpp Removed: diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 84848c7be858d..e65f5a236a1ff 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -6502,6 +6502,7 @@ StmtResult Sema::ActOnOpenMPExecutableDirective( case OMPC_uses_allocators: case OMPC_affinity: case OMPC_bind: + case OMPC_filter: continue; case OMPC_allocator: case OMPC_flush: diff --git a/clang/test/OpenMP/parallel_masked_ast_print.cpp b/clang/test/OpenMP/parallel_masked_ast_print.cpp index 3532cf61ec25f..ce1552ff5bcf1 100644 --- a/clang/test/OpenMP/parallel_masked_ast_print.cpp +++ b/clang/test/OpenMP/parallel_masked_ast_print.cpp @@ -198,6 +198,7 @@ enum Enum { }; int main (int argc, char **argv) { long x; int b = argc, c, d, e, f, g; + int tid = 0; static int a; #pragma omp threadprivate(a) int arr[10][argc], arr1[2]; @@ -207,8 +208,8 @@ int main (int argc, char **argv) { // CHECK-NEXT: #pragma omp parallel masked a=2; // CHECK-NEXT: a = 2; -#pragma omp parallel masked default(none), private(argc,b) firstprivate(argv) if (parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(| : c, d, arr1[argc]) reduction(* : e, arr[:10][0:argc]) allocate(e) -// CHECK-NEXT: #pragma omp parallel masked default(none) private(argc,b) firstprivate(argv) if(parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(|: c,d,arr1[argc]) reduction(*: e,arr[:10][0:argc]) allocate(e) +#pragma omp parallel masked default(none), private(argc,b) firstprivate(argv) if (parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(| : c, d, arr1[argc]) reduction(* : e, arr[:10][0:argc]) allocate(e) filter(tid) +// CHECK-NEXT: #pragma omp parallel masked default(none) private(argc,b) firstprivate(argv) if(parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(|: c,d,arr1[argc]) reduction(*: e,arr[:10][0:argc]) allocate(e) filter(tid) foo(); // CHECK-NEXT: foo(); // CHECK-NEXT: #pragma omp parallel masked allocate(e) if(b) num_threads(c) proc_bind(close) reduction(^: e,f) reduction(&&: g,arr[0:argc][:10]) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] ba3f853 - [OpenMP] Add diagnostic for unterminated 'omp [begin] declare target'
Author: Mike Rice Date: 2022-05-25T10:34:07-07:00 New Revision: ba3f85390bde10eab1cbdb68f744b8f5ab31859b URL: https://github.com/llvm/llvm-project/commit/ba3f85390bde10eab1cbdb68f744b8f5ab31859b DIFF: https://github.com/llvm/llvm-project/commit/ba3f85390bde10eab1cbdb68f744b8f5ab31859b.diff LOG: [OpenMP] Add diagnostic for unterminated 'omp [begin] declare target' Warns when end-of-file is reached without seeing all matching 'omp end declare target' directives. The diagnostic shows the location of the related begin directive. Differential Revision: https://reviews.llvm.org/D126331 Added: clang/test/OpenMP/Inputs/unterminated_declare_target_include.h Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/include/clang/Sema/Sema.h clang/lib/Sema/Sema.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp Removed: diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 2969e24e3baf8..6dfe5af6ecfa3 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11001,6 +11001,9 @@ def err_omp_append_args_with_varargs : Error< "'append_args' is not allowed with varargs functions">; def err_openmp_vla_in_task_untied : Error< "variable length arrays are not supported in OpenMP tasking regions with 'untied' clause">; +def warn_omp_unterminated_declare_target : Warning< + "expected '#pragma omp end declare target' at end of file to match '#pragma omp %0'">, + InGroup; } // end of OpenMP category let CategoryName = "Related Result Type Issue" in { diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 9cbbeadc3d74b..bd7a809e40474 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -10769,6 +10769,10 @@ class Sema final { /// encountered. void ActOnFinishedOpenMPDeclareTargetContext(DeclareTargetContextInfo &DTCI); + /// Report unterminated 'omp declare target' or 'omp begin declare target' at + /// the end of a compilation unit. + void DiagnoseUnterminatedOpenMPDeclareTarget(); + /// Searches for the provided declaration name for OpenMP declare target /// directive. NamedDecl *lookupOpenMPDeclareTargetName(Scope *CurScope, diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index ce104f377730c..ad2cb62a18f0c 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1157,6 +1157,7 @@ void Sema::ActOnEndOfTranslationUnit() { DiagnoseUnterminatedPragmaAlignPack(); DiagnoseUnterminatedPragmaAttribute(); + DiagnoseUnterminatedOpenMPDeclareTarget(); // All delayed member exception specs should be checked or we end up accepting // incompatible declarations. diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 1fdb7df1feea4..fdb7658f77bda 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -22101,6 +22101,14 @@ void Sema::ActOnFinishedOpenMPDeclareTargetContext( ActOnOpenMPDeclareTargetName(It.first, It.second.Loc, It.second.MT, DTCI); } +void Sema::DiagnoseUnterminatedOpenMPDeclareTarget() { + if (DeclareTargetNesting.empty()) +return; + DeclareTargetContextInfo &DTCI = DeclareTargetNesting.back(); + Diag(DTCI.Loc, diag::warn_omp_unterminated_declare_target) + << getOpenMPDirectiveName(DTCI.Kind); +} + NamedDecl *Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id) { diff --git a/clang/test/OpenMP/Inputs/unterminated_declare_target_include.h b/clang/test/OpenMP/Inputs/unterminated_declare_target_include.h new file mode 100644 index 0..ddb60d562de15 --- /dev/null +++ b/clang/test/OpenMP/Inputs/unterminated_declare_target_include.h @@ -0,0 +1,3 @@ +// expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp declare target'}} +#pragma omp declare target +void zxy(); diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index 31185881e192b..7e7cc60e75e35 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -6,6 +6,9 @@ // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify=expected,omp5,host5 -fopenmp-simd -fopenmp-is-device -fopenmp-targets=x86_64-apple-macos10.7.0 -fnoopenmp-use-tls -ferror-limit 100 -o - %s // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify=expected,omp45 -fopenmp-version=45 -fopenmp-simd -fnoopenmp-use-tls -ferror-limit 100 -o - %s // RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify=expected,omp51 -fopenmp -fopenmp-version=51 -fnoopenmp-use-tls -ferror-limi
[clang] 0a5cfbf - [OpenMP] Use the align clause value from 'omp allocate' for globals
Author: Mike Rice Date: 2022-05-26T09:51:48-07:00 New Revision: 0a5cfbf7b2e82e7980b66428e88b4e28e814d7bb URL: https://github.com/llvm/llvm-project/commit/0a5cfbf7b2e82e7980b66428e88b4e28e814d7bb DIFF: https://github.com/llvm/llvm-project/commit/0a5cfbf7b2e82e7980b66428e88b4e28e814d7bb.diff LOG: [OpenMP] Use the align clause value from 'omp allocate' for globals Refactor the code that handles the align clause of 'omp allocate' so it can be used with globals as well as local variables. Differential Revision: https://reviews.llvm.org/D126426 Added: clang/test/OpenMP/align_clause_global_codegen.cpp Modified: clang/lib/CodeGen/CGDecl.cpp clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/CodeGenModule.h Removed: diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 0f16c7f50a003..a16551e83f93b 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -2694,3 +2694,22 @@ void CodeGenModule::EmitOMPAllocateDecl(const OMPAllocateDecl *D) { DummyGV->eraseFromParent(); } } + +llvm::Optional +CodeGenModule::getOMPAllocateAlignment(const VarDecl *VD) { + if (const auto *AA = VD->getAttr()) { +if (Expr *Alignment = AA->getAlignment()) { + unsigned UserAlign = + Alignment->EvaluateKnownConstInt(getContext()).getExtValue(); + CharUnits NaturalAlign = + getNaturalTypeAlignment(VD->getType().getNonReferenceType()); + + // OpenMP5.1 pg 185 lines 7-10 + // Each item in the align modifier list must be aligned to the maximum + // of the specified alignment and the type's natural alignment. + return CharUnits::fromQuantity( + std::max(UserAlign, NaturalAlign.getQuantity())); +} + } + return llvm::None; +} diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 89e26b10dfae5..605d4fe76bc96 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -12185,25 +12185,15 @@ static llvm::Value *getAllocatorVal(CodeGenFunction &CGF, return AllocVal; } -/// Given the allocate directive list item type and align clause value, -/// return appropriate alignment. -static llvm::Value *getAlignmentValue(CodeGenFunction &CGF, QualType ListItemTy, - const Expr *Alignment) { - if (!Alignment) -return nullptr; +/// Return the alignment from an allocate directive if present. +static llvm::Value *getAlignmentValue(CodeGenModule &CGM, const VarDecl *VD) { + llvm::Optional AllocateAlignment = CGM.getOMPAllocateAlignment(VD); - unsigned UserAlign = - Alignment->EvaluateKnownConstInt(CGF.getContext()).getExtValue(); - CharUnits NaturalAlign = CGF.CGM.getNaturalTypeAlignment(ListItemTy); + if (!AllocateAlignment) +return nullptr; - // OpenMP5.1 pg 185 lines 7-10 - // Each item in the align modifier list must be aligned to the maximum - // of the specified alignment and the type's natural alignment. - // - // If no alignment specified then use the natural alignment. - return llvm::ConstantInt::get( - CGF.CGM.SizeTy, - std::max(UserAlign, NaturalAlign.getQuantity())); + return llvm::ConstantInt::get(CGM.SizeTy, +AllocateAlignment.getValue().getQuantity()); } Address CGOpenMPRuntime::getAddressOfLocalVariable(CodeGenFunction &CGF, @@ -12244,8 +12234,7 @@ Address CGOpenMPRuntime::getAddressOfLocalVariable(CodeGenFunction &CGF, const auto *AA = CVD->getAttr(); const Expr *Allocator = AA->getAllocator(); llvm::Value *AllocVal = getAllocatorVal(CGF, Allocator); -llvm::Value *Alignment = getAlignmentValue( -CGF, VD->getType().getNonReferenceType(), AA->getAlignment()); +llvm::Value *Alignment = getAlignmentValue(CGM, CVD); SmallVector Args; Args.push_back(ThreadID); if (Alignment) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index a035e5ddd9e6d..b4ae266f89881 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4738,7 +4738,12 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D, GV->setConstant(true); } - GV->setAlignment(getContext().getDeclAlign(D).getAsAlign()); + CharUnits AlignVal = getContext().getDeclAlign(D); + // Check for alignment specifed in an 'omp allocate' directive. + if (llvm::Optional AlignValFromAllocate = + getOMPAllocateAlignment(D)) +AlignVal = AlignValFromAllocate.getValue(); + GV->setAlignment(AlignVal.getAsAlign()); // On Darwin, unlike other Itanium C++ ABI platforms, the thread-wrapper // function is only defined alongside the variable, not also alongside diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index a5ec4c8f988d6..0a
[clang] 48d6a6c - [OpenMP][NFC] update status for 'omp_all_memory' directive to 'done'
Author: Mike Rice Date: 2022-06-02T17:31:33-07:00 New Revision: 48d6a6c9add90f3684de362907d5f05a0988244a URL: https://github.com/llvm/llvm-project/commit/48d6a6c9add90f3684de362907d5f05a0988244a DIFF: https://github.com/llvm/llvm-project/commit/48d6a6c9add90f3684de362907d5f05a0988244a.diff LOG: [OpenMP][NFC] update status for 'omp_all_memory' directive to 'done' Added: Modified: clang/docs/OpenMPSupport.rst Removed: diff --git a/clang/docs/OpenMPSupport.rst b/clang/docs/OpenMPSupport.rst index 88e3050d3622..8e5c9158b351 100644 --- a/clang/docs/OpenMPSupport.rst +++ b/clang/docs/OpenMPSupport.rst @@ -312,7 +312,7 @@ want to help with the implementation. +--+--+--+---+ | memory model extension | seq_cst clause on flush construct | :none:`unclaimed`| | +--+--+--+---+ -| misc extension | 'omp_all_memory' keyword and use in 'depend' clause | :none:`unclaimed`| | +| misc extension | 'omp_all_memory' keyword and use in 'depend' clause | :good:`done` | D125828, D126321 | +--+--+--+---+ | misc extension | error directive | :none:`unclaimed`| | +--+--+--+---+ ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 56c1660 - [OpenMP] Initial parsing/sema for 'strict' modifier with 'num_tasks' clause
Author: Fazlay Rabbi Date: 2022-11-18T16:26:47-08:00 New Revision: 56c166017055595a9f26933e85bfd89e30c528d0 URL: https://github.com/llvm/llvm-project/commit/56c166017055595a9f26933e85bfd89e30c528d0 DIFF: https://github.com/llvm/llvm-project/commit/56c166017055595a9f26933e85bfd89e30c528d0.diff LOG: [OpenMP] Initial parsing/sema for 'strict' modifier with 'num_tasks' clause This patch gives basic parsing and semantic analysis support for 'strict' modifier with 'num_tasks' clause of 'taskloop' construct introduced in OpenMP 5.1 (section 2.12.2) Differential Revision: https://reviews.llvm.org/D138328 Added: Modified: clang/include/clang/AST/OpenMPClause.h clang/include/clang/Basic/OpenMPKinds.def clang/include/clang/Basic/OpenMPKinds.h clang/include/clang/Sema/Sema.h clang/lib/AST/OpenMPClause.cpp clang/lib/Basic/OpenMPKinds.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp clang/test/OpenMP/taskloop_strict_modifier_ast_print.cpp clang/test/OpenMP/taskloop_strict_modifier_messages.cpp llvm/include/llvm/Frontend/OpenMP/OMP.td Removed: diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index 1c9f62355e4ee..21d9f740eddf1 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -6486,26 +6486,43 @@ class OMPNumTasksClause : public OMPClause, public OMPClauseWithPreInit { /// Location of '('. SourceLocation LParenLoc; + /// Modifiers for 'num_tasks' clause. + OpenMPNumTasksClauseModifier Modifier = OMPC_NUMTASKS_unknown; + + /// Location of the modifier. + SourceLocation ModifierLoc; + /// Safe iteration space distance. Stmt *NumTasks = nullptr; /// Set safelen. void setNumTasks(Expr *Size) { NumTasks = Size; } + /// Sets modifier. + void setModifier(OpenMPNumTasksClauseModifier M) { Modifier = M; } + + /// Sets modifier location. + void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; } + public: /// Build 'num_tasks' clause. /// + /// \param Modifier Clause modifier. /// \param Size Expression associated with this clause. /// \param HelperSize Helper grainsize for the construct. /// \param CaptureRegion Innermost OpenMP region where expressions in this /// clause must be captured. /// \param StartLoc Starting location of the clause. /// \param EndLoc Ending location of the clause. - OMPNumTasksClause(Expr *Size, Stmt *HelperSize, -OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, -SourceLocation LParenLoc, SourceLocation EndLoc) + /// \param ModifierLoc Modifier location. + /// \param LParenLoc Location of '('. + OMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier, Expr *Size, +Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion, +SourceLocation StartLoc, SourceLocation LParenLoc, +SourceLocation ModifierLoc, SourceLocation EndLoc) : OMPClause(llvm::omp::OMPC_num_tasks, StartLoc, EndLoc), -OMPClauseWithPreInit(this), LParenLoc(LParenLoc), NumTasks(Size) { +OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Modifier(Modifier), +ModifierLoc(ModifierLoc), NumTasks(Size) { setPreInitStmt(HelperSize, CaptureRegion); } @@ -6524,6 +6541,12 @@ class OMPNumTasksClause : public OMPClause, public OMPClauseWithPreInit { /// Return safe iteration space distance. Expr *getNumTasks() const { return cast_or_null(NumTasks); } + /// Gets modifier. + OpenMPNumTasksClauseModifier getModifier() const { return Modifier; } + + /// Gets modifier location. + SourceLocation getModifierLoc() const { return ModifierLoc; } + child_range children() { return child_range(&NumTasks, &NumTasks + 1); } const_child_range children() const { diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def index 339139abe2a49..a084e9686f5ee 100644 --- a/clang/include/clang/Basic/OpenMPKinds.def +++ b/clang/include/clang/Basic/OpenMPKinds.def @@ -74,6 +74,9 @@ #ifndef OPENMP_GRAINSIZE_MODIFIER #define OPENMP_GRAINSIZE_MODIFIER(Name) #endif +#ifndef OPENMP_NUMTASKS_MODIFIER +#define OPENMP_NUMTASKS_MODIFIER(Name) +#endif // Static attributes for 'schedule' clause. OPENMP_SCHEDULE_KIND(static) @@ -187,6 +190,10 @@ OPENMP_BIND_KIND(thread) // Modifiers for the 'grainsize' clause. OPENMP_GRAINSIZE_MODIFIER(strict) +// Modifiers for the 'num_tasks' clause. +OPENMP_NUMTASKS_MODIFIER(strict) + +#undef OPENMP_NUMTASKS_MODIFIER #undef OPENMP_GRAINSIZE_MODIFIER #undef OPENMP_BIND_KIND #undef OPENMP_ADJUST_ARGS_KIND diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKin
[clang] 530eb26 - [clang] Add serialization for loop hint annotation tokens
Author: Mike Rice Date: 2022-11-29T10:51:11-08:00 New Revision: 530eb263c0ec02fe8d107cbdb41ac6e482514a00 URL: https://github.com/llvm/llvm-project/commit/530eb263c0ec02fe8d107cbdb41ac6e482514a00 DIFF: https://github.com/llvm/llvm-project/commit/530eb263c0ec02fe8d107cbdb41ac6e482514a00.diff LOG: [clang] Add serialization for loop hint annotation tokens When late parsed templates are used with PCH tokens are serialized. The existing code does not handle annotation tokens which can occur due to various pragmas. This patch implements the serialization for annot_pragma_loop_hint. This also enables use of OpenMP pragmas and #pragma unused which do not need special serialization of the PtrData field. Fixes https://github.com/llvm/llvm-project/issues/39504 Differential Revision: https://reviews.llvm.org/D138453 Added: clang/test/PCH/delayed-template-with-pragma.cpp Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Lex/Token.h clang/include/clang/Serialization/ASTBitCodes.h clang/lib/Parse/ParsePragma.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp Removed: diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index b4f217c92ffc8..7580b14fac5d6 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -450,6 +450,10 @@ Non-comprehensive list of changes in this release It can be used to writing conditionally constexpr code that uses builtins. - The time profiler (using ``-ftime-trace`` option) now traces various constant evaluation events. +- Clang can now generate a PCH when using ``-fdelayed-template-parsing`` for + code with templates containing loop hint pragmas, OpenMP pragmas, and + ``#pragma unused``. + New Compiler Flags -- diff --git a/clang/include/clang/Lex/Token.h b/clang/include/clang/Lex/Token.h index f0c0794096778..7fd48b1b4391e 100644 --- a/clang/include/clang/Lex/Token.h +++ b/clang/include/clang/Lex/Token.h @@ -15,6 +15,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/TokenKinds.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include @@ -330,6 +331,12 @@ struct PPConditionalInfo { bool FoundElse; }; +// Extra information needed for annonation tokens. +struct PragmaLoopHintInfo { + Token PragmaName; + Token Option; + ArrayRef Toks; +}; } // end namespace clang #endif // LLVM_CLANG_LEX_TOKEN_H diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index 591eb34ec8839..ceaade4a6e1e8 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -41,7 +41,7 @@ namespace serialization { /// Version 4 of AST files also requires that the version control branch and /// revision match exactly, since there is no backward compatibility of /// AST files at this time. -const unsigned VERSION_MAJOR = 23; +const unsigned VERSION_MAJOR = 24; /// AST file minor version number supported by this version of /// Clang. diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index cddc3780133b8..360601f27176a 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -1293,14 +1293,6 @@ bool Parser::HandlePragmaMSAllocText(StringRef PragmaName, return true; } -namespace { -struct PragmaLoopHintInfo { - Token PragmaName; - Token Option; - ArrayRef Toks; -}; -} // end anonymous namespace - static std::string PragmaLoopHintString(Token PragmaName, Token Option) { StringRef Str = PragmaName.getIdentifierInfo()->getName(); std::string ClangLoopStr("clang loop "); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 4c0395cc4107b..ff324cab57bf7 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1669,11 +1669,38 @@ Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, Token Tok; Tok.startToken(); Tok.setLocation(ReadSourceLocation(F, Record, Idx)); - Tok.setLength(Record[Idx++]); - if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) -Tok.setIdentifierInfo(II); Tok.setKind((tok::TokenKind)Record[Idx++]); Tok.setFlag((Token::TokenFlags)Record[Idx++]); + + if (Tok.isAnnotation()) { +Tok.setAnnotationEndLoc(ReadSourceLocation(F, Record, Idx)); +switch (Tok.getKind()) { +case tok::annot_pragma_loop_hint: { + auto *Info = new (PP.getPreprocessorAllocator()) PragmaLoopHintInfo; + Info->PragmaName = ReadToken(F, Record, Idx); + Info->Option = ReadToken(F, Record, Idx); + unsigned NumTokens = Record[Idx++]; + SmallVector Toks; + Toks.reserve(NumTokens); + for (unsigned I = 0; I < NumTokens; ++I) +Toks.push_back(ReadToken(F, Record, Idx)); + Info->Toks
[clang] c52053b - [clang] Fix buildbot failure in delayed-template-with-pragma.cpp
Author: Mike Rice Date: 2022-11-29T11:53:37-08:00 New Revision: c52053bd9961cc1854e86958ffb0f89e2cfe4e5f URL: https://github.com/llvm/llvm-project/commit/c52053bd9961cc1854e86958ffb0f89e2cfe4e5f DIFF: https://github.com/llvm/llvm-project/commit/c52053bd9961cc1854e86958ffb0f89e2cfe4e5f.diff LOG: [clang] Fix buildbot failure in delayed-template-with-pragma.cpp Use captured values to match loop metadata. Added: Modified: clang/test/PCH/delayed-template-with-pragma.cpp Removed: diff --git a/clang/test/PCH/delayed-template-with-pragma.cpp b/clang/test/PCH/delayed-template-with-pragma.cpp index abc959b20707..e54388456245 100644 --- a/clang/test/PCH/delayed-template-with-pragma.cpp +++ b/clang/test/PCH/delayed-template-with-pragma.cpp @@ -20,14 +20,14 @@ void a(T t) { } } #else -// CHECK: !llvm.loop !3 -// CHECK: !llvm.loop !7 -// CHECK: !3 = distinct !{!3, !4, !5} -// CHECK: !4 = !{!"llvm.loop.mustprogress"} -// CHECK: !5 = !{!"llvm.loop.unroll.count", i32 4} -// CHECK: !7 = distinct !{!7, !8, !9} -// CHECK: !8 = !{!"llvm.loop.parallel_accesses", !6} -// CHECK: !9 = !{!"llvm.loop.vectorize.enable", i1 true} +// CHECK: !llvm.loop [[LOOP1:!.*]] +// CHECK: !llvm.loop [[LOOP2:!.*]] +// CHECK: [[LOOP1]] = distinct !{[[LOOP1]], [[LOOP1A:!.*]], [[LOOP1B:!.*]]} +// CHECK: [[LOOP1A]] = !{!"llvm.loop.mustprogress"} +// CHECK: [[LOOP1B]] = !{!"llvm.loop.unroll.count", i32 4} +// CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[LOOP2A:!.*]], [[LOOP2B:!.*]]} +// CHECK: [[LOOP2A]] = !{!"llvm.loop.parallel_accesses", [[LOOP2C:!.*]]} +// CHECK: [[LOOP2B]] = !{!"llvm.loop.vectorize.enable", i1 true} // expected-warning@17 {{unused variable 'zz'}} void foo() { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 57caadc - [MSVC] Allow declaration of multi-dim 'property' array fields
Author: Mike Rice Date: 2023-04-05T10:29:37-07:00 New Revision: 57caadc57a30f2279099e5b86bb555b4aab621ce URL: https://github.com/llvm/llvm-project/commit/57caadc57a30f2279099e5b86bb555b4aab621ce DIFF: https://github.com/llvm/llvm-project/commit/57caadc57a30f2279099e5b86bb555b4aab621ce.diff LOG: [MSVC] Allow declaration of multi-dim 'property' array fields MSVC allows declaration of multi-dim arrays like this: __declspec(property(get=GetX, put=PutX)) int x[][][]; This syntax can appear in generated typelib headers. Currently clang errors on declarators like this since it forms an array type of incomplete array. Rather than try to handle such a type, ignore adjacent empty chunks so this is treated as if there was only one empty array chunk (i.e. int x[]). The functionality to handle multi-dim subscripts of property fields already works, but only if declared as a single-dim array. Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Sema/ParsedAttr.h clang/lib/Sema/SemaDeclCXX.cpp clang/lib/Sema/SemaType.cpp clang/test/CodeGenCXX/ms-property.cpp clang/test/SemaCXX/ms-property-error.cpp clang/test/SemaCXX/ms-property.cpp Removed: diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 1e280cb633e23..bbfef9ff3cf7c 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -146,6 +146,8 @@ Non-comprehensive list of changes in this release - Clang now supports ``__builtin_assume_separate_storage`` that indicates that its arguments point to objects in separate storage allocations. - Clang now supports expressions in ``#pragma clang __debug dump``. +- Clang now supports declaration of multi-dimensional arrays with + ``__declspec(property)``. New Compiler Flags -- diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h index e2b4be48c0bd1..5f45668851c73 100644 --- a/clang/include/clang/Sema/ParsedAttr.h +++ b/clang/include/clang/Sema/ParsedAttr.h @@ -896,6 +896,16 @@ class ParsedAttributesView { }); } + const ParsedAttr *getMSPropertyAttr() const { +auto It = llvm::find_if(AttrList, [](const ParsedAttr *AL) { + return AL->isDeclspecPropertyAttribute(); +}); +if (It != AttrList.end()) + return *It; +return nullptr; + } + bool hasMSPropertyAttr() const { return getMSPropertyAttr(); } + private: VecTy AttrList; }; diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e28c44f97f1fe..312b6f801c1f0 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3235,16 +3235,6 @@ static bool InitializationHasSideEffects(const FieldDecl &FD) { return false; } -static const ParsedAttr *getMSPropertyAttr(const ParsedAttributesView &list) { - ParsedAttributesView::const_iterator Itr = - llvm::find_if(list, [](const ParsedAttr &AL) { -return AL.isDeclspecPropertyAttribute(); - }); - if (Itr != list.end()) -return &*Itr; - return nullptr; -} - // Check if there is a field shadowing. void Sema::CheckShadowInheritedFields(const SourceLocation &Loc, DeclarationName FieldName, @@ -3322,7 +3312,7 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, bool isFunc = D.isDeclarationOfFunction(); const ParsedAttr *MSPropertyAttr = - getMSPropertyAttr(D.getDeclSpec().getAttributes()); + D.getDeclSpec().getAttributes().getMSPropertyAttr(); if (cast(CurContext)->isInterface()) { // The Microsoft extension __interface only permits public member functions diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 53852dd930a71..e195e85ab75b7 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -5070,6 +5070,19 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr; Expr *ArraySize = static_cast(ATI.NumElts); ArrayType::ArraySizeModifier ASM; + + // Microsoft property fields can have multiple sizeless array chunks + // (i.e. int x[][][]). Skip all of these except one to avoid creating + // bad incomplete array types. + if (chunkIndex != 0 && !ArraySize && + D.getDeclSpec().getAttributes().hasMSPropertyAttr()) { +// This is a sizeless chunk. If the next is also, skip this one. +DeclaratorChunk &NextDeclType = D.getTypeObject(chunkIndex - 1); +if (NextDeclType.Kind == DeclaratorChunk::Array && +!NextDeclType.Arr.NumElts) + break; + } + if (ATI.isStar) ASM = ArrayType::Star; else if (ATI.hasStatic) @@ -6523,6 +6536,12 @@ GetTypeSourceInfoForDeclarator(TypeProcessingState &State, } for (unsigned i = 0, e = D.getNumTypeObjects(); i
[clang] d27fb5e - [Serialization] Add support for (de)serializing #pragma pack
Author: Dustin Howett Date: 2023-02-07T11:37:02-08:00 New Revision: d27fb5efc5f2086fa157e7d836b61bae4d5f3734 URL: https://github.com/llvm/llvm-project/commit/d27fb5efc5f2086fa157e7d836b61bae4d5f3734 DIFF: https://github.com/llvm/llvm-project/commit/d27fb5efc5f2086fa157e7d836b61bae4d5f3734.diff LOG: [Serialization] Add support for (de)serializing #pragma pack Serialization of tokens is required when PCH is used with late parsed templates, including annotation tokens used for pragmas. This patch implements the serialization for annot_pragma_pack. Fixes https://github.com/llvm/llvm-project/issues/60543 Differential Revision: https://reviews.llvm.org/D143410 Added: clang/test/PCH/delayed-template-with-pragma-pack.cpp Modified: clang/include/clang/Sema/Sema.h clang/include/clang/Serialization/ASTReader.h clang/lib/Parse/ParsePragma.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTWriter.cpp Removed: diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 6247d4a5f6a53..223190602d921 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -483,6 +483,12 @@ class Sema final { PSK_Pop_Set = PSK_Pop | PSK_Set, // #pragma (pop[, id], value) }; + struct PragmaPackInfo { +PragmaMsStackAction Action; +StringRef SlotLabel; +Token Alignment; + }; + // #pragma pack and align. class AlignPackInfo { public: diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 5cdbdfe4e38d4..007872b10e242 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -2236,7 +2236,7 @@ class ASTReader unsigned &Idx, LocSeq *Seq = nullptr); // Read a string - static std::string ReadString(const RecordData &Record, unsigned &Idx); + static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx); // Skip a string static void SkipString(const RecordData &Record, unsigned &Idx) { diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 658853d42b746..ff7273eddb1a0 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -665,18 +665,10 @@ void Parser::HandlePragmaVisibility() { Actions.ActOnPragmaVisibility(VisType, VisLoc); } -namespace { -struct PragmaPackInfo { - Sema::PragmaMsStackAction Action; - StringRef SlotLabel; - Token Alignment; -}; -} // end anonymous namespace - void Parser::HandlePragmaPack() { assert(Tok.is(tok::annot_pragma_pack)); - PragmaPackInfo *Info = -static_cast(Tok.getAnnotationValue()); + Sema::PragmaPackInfo *Info = + static_cast(Tok.getAnnotationValue()); SourceLocation PragmaLoc = Tok.getLocation(); ExprResult Alignment; if (Info->Alignment.is(tok::numeric_constant)) { @@ -2110,8 +2102,8 @@ void PragmaPackHandler::HandlePragma(Preprocessor &PP, return; } - PragmaPackInfo *Info = - PP.getPreprocessorAllocator().Allocate(1); + Sema::PragmaPackInfo *Info = + PP.getPreprocessorAllocator().Allocate(1); Info->Action = Action; Info->SlotLabel = SlotLabel; Info->Alignment = Alignment; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index eb1eda98abc79..fb723d4e46d6b 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1687,6 +1687,16 @@ Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, Tok.setAnnotationValue(static_cast(Info)); break; } +case tok::annot_pragma_pack: { + auto *Info = new (PP.getPreprocessorAllocator()) Sema::PragmaPackInfo; + Info->Action = static_cast(Record[Idx++]); + auto SlotLabel = ReadString(Record, Idx); + Info->SlotLabel = + llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator()); + Info->Alignment = ReadToken(F, Record, Idx); + Tok.setAnnotationValue(static_cast(Info)); + break; +} // Some annotation tokens do not use the PtrData field. case tok::annot_pragma_openmp: case tok::annot_pragma_openmp_end: @@ -9084,7 +9094,7 @@ llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { } // Read a string -std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { +std::string ASTReader::ReadString(const RecordDataImpl &Record, unsigned &Idx) { unsigned Len = Record[Idx++]; std::string Result(Record.data() + Idx, Record.data() + Idx + Len); Idx += Len; diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index bdf11001473e2..c1afdeb6007db 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -4412,6 +4412,14 @@ void ASTWriter::AddToken(const T
[clang] e716b02 - [OpenMP 5.2] Deprecate 'destroy' clause without argument for 'depobj' construct
Author: Fazlay Rabbi Date: 2023-02-07T12:09:52-08:00 New Revision: e716b0204a5ae2a96289a335b2ab30a6c3fb09cf URL: https://github.com/llvm/llvm-project/commit/e716b0204a5ae2a96289a335b2ab30a6c3fb09cf DIFF: https://github.com/llvm/llvm-project/commit/e716b0204a5ae2a96289a335b2ab30a6c3fb09cf.diff LOG: [OpenMP 5.2] Deprecate 'destroy' clause without argument for 'depobj' construct Deprecate and diagnose uses of the 'destroy' clauses without an argument in 'omp depobj' directives. Differential Revision: https://reviews.llvm.org/D143021 Added: Modified: clang/include/clang/Basic/DiagnosticParseKinds.td clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/depobj_messages.cpp Removed: diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index 36d4bc2a700d8..31519f3c04795 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1369,6 +1369,9 @@ def err_omp_map_type_modifier_missing : Error< "missing map type modifier">; def err_omp_declare_simd_inbranch_notinbranch : Error< "unexpected '%0' clause, '%1' is specified already">; +def err_omp_expected_clause_argument +: Error<"expected '%0' clause with an argument on '#pragma omp %1' " +"construct">; def err_expected_end_declare_target_or_variant : Error< "expected '#pragma omp end declare %select{target|variant}0'">; def err_expected_begin_declare_variant diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index c767341d922bd..368f5ecfa23d5 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -17662,6 +17662,13 @@ OMPClause *Sema::ActOnOpenMPDestroyClause(Expr *InteropVar, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc) { + if (!InteropVar && LangOpts.OpenMP >= 52 && + DSAStack->getCurrentDirective() == OMPD_depobj) { +Diag(StartLoc, diag::err_omp_expected_clause_argument) +<< getOpenMPClauseName(OMPC_destroy) +<< getOpenMPDirectiveName(OMPD_depobj); +return nullptr; + } if (InteropVar && !isValidInteropVariable(*this, InteropVar, VarLoc, OMPC_destroy)) return nullptr; diff --git a/clang/test/OpenMP/depobj_messages.cpp b/clang/test/OpenMP/depobj_messages.cpp index c26daba2bf1d0..b05214d0ffe35 100644 --- a/clang/test/OpenMP/depobj_messages.cpp +++ b/clang/test/OpenMP/depobj_messages.cpp @@ -2,11 +2,15 @@ // RUN: -ferror-limit 100 %s -Wuninitialized // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp -fopenmp-version=51 \ // RUN: -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 \ +// RUN: -ferror-limit 100 %s -Wuninitialized // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 \ // RUN: -ferror-limit 100 %s -Wuninitialized // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd -fopenmp-version=51 \ // RUN: -ferror-limit 100 %s -Wuninitialized +// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=52 \ +// RUN: -ferror-limit 100 %s -Wuninitialized struct S1 { // expected-note 2 {{declared here}} int a; @@ -27,7 +31,7 @@ T tmain(T argc) { #pragma omp depobj(x) untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}} #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} if (argc) -#pragma omp depobj(x) destroy // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} +#pragma omp depobj(x) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} expected-error {{'#pragma omp depobj' cannot be an immediate substatement}} if (argc) { #pragma omp depobj(x) depend(in:s) } @@ -148,16 +152,16 @@ label1 : { #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}} ; #pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}} -#pragma omp depobj(x) depend(source: x) // omp51-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} +#pragma omp depobj(x) depend(source: x) // omp52-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp51-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp50-e
[clang] [NFC][OpenMP] Split nesting_of_regions test (PR #87842)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/87842 This test is the bottleneck for OpenMP lit tests, running about twice as long as the others. Break it into five tests based on run lines with the same version. >From e184c8ec9b25b3e077a42646775755dd3a4b4494 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Fri, 5 Apr 2024 16:39:50 -0700 Subject: [PATCH] [NFC][OpenMP] Split nesting_of_regions test This test is the bottleneck for OpenMP lit tests, running about twice as long as the others. Break it into five tests based on run lines with the same version. --- .../test/OpenMP/{ => Inputs}/nesting_of_regions.cpp | 13 - clang/test/OpenMP/nesting_of_regions_45.cpp | 4 clang/test/OpenMP/nesting_of_regions_50.cpp | 4 clang/test/OpenMP/nesting_of_regions_51.cpp | 4 clang/test/OpenMP/nesting_of_regions_simd_45.cpp| 3 +++ clang/test/OpenMP/nesting_of_regions_simd_50.cpp| 3 +++ 6 files changed, 18 insertions(+), 13 deletions(-) rename clang/test/OpenMP/{ => Inputs}/nesting_of_regions.cpp (99%) create mode 100644 clang/test/OpenMP/nesting_of_regions_45.cpp create mode 100644 clang/test/OpenMP/nesting_of_regions_50.cpp create mode 100644 clang/test/OpenMP/nesting_of_regions_51.cpp create mode 100644 clang/test/OpenMP/nesting_of_regions_simd_45.cpp create mode 100644 clang/test/OpenMP/nesting_of_regions_simd_50.cpp diff --git a/clang/test/OpenMP/nesting_of_regions.cpp b/clang/test/OpenMP/Inputs/nesting_of_regions.cpp similarity index 99% rename from clang/test/OpenMP/nesting_of_regions.cpp rename to clang/test/OpenMP/Inputs/nesting_of_regions.cpp index 9442fb20647d0f..e671f9b0cf4123 100644 --- a/clang/test/OpenMP/nesting_of_regions.cpp +++ b/clang/test/OpenMP/Inputs/nesting_of_regions.cpp @@ -1,15 +1,3 @@ -// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -fno-openmp-extensions -verify=expected,omp45,omp45warn,omp %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp -fno-openmp-extensions -verify=expected,omp50,omp %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-extensions -verify=expected,omp50 %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -verify=expected,omp45,omp -fno-openmp-extensions -Wno-openmp %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -verify=expected,omp45,omp -fno-openmp-extensions -Wno-source-uses-openmp %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=51 -verify=expected,omp51,omp -fno-openmp-extensions -Wno-source-uses-openmp %s - -// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -fno-openmp-extensions -verify=expected,omp45,omp45warn,omp %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -verify=expected,omp50,omp -fno-openmp-extensions %s -// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=51 -verify=expected,omp51,omp -fno-openmp-extensions %s -// SIMD-ONLY0-NOT: {{__kmpc|__tgt}} - void bar(); template @@ -19577,4 +19565,3 @@ void foo() { return foo(); } - diff --git a/clang/test/OpenMP/nesting_of_regions_45.cpp b/clang/test/OpenMP/nesting_of_regions_45.cpp new file mode 100644 index 00..d5870ec36486e7 --- /dev/null +++ b/clang/test/OpenMP/nesting_of_regions_45.cpp @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -fno-openmp-extensions -verify=expected,omp45,omp45warn,omp %s +// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=45 -verify=expected,omp45,omp -fno-openmp-extensions -Wno-openmp %s + +#include "Inputs/nesting_of_regions.cpp" diff --git a/clang/test/OpenMP/nesting_of_regions_50.cpp b/clang/test/OpenMP/nesting_of_regions_50.cpp new file mode 100644 index 00..f2061553a80463 --- /dev/null +++ b/clang/test/OpenMP/nesting_of_regions_50.cpp @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -fopenmp -fno-openmp-extensions -verify=expected,omp50,omp %s +// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-extensions -verify=expected,omp50 %s + +#include "Inputs/nesting_of_regions.cpp" diff --git a/clang/test/OpenMP/nesting_of_regions_51.cpp b/clang/test/OpenMP/nesting_of_regions_51.cpp new file mode 100644 index 00..856489b042821c --- /dev/null +++ b/clang/test/OpenMP/nesting_of_regions_51.cpp @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=51 -verify=expected,omp51,omp -fno-openmp-extensions %s +// RUN: %clang_cc1 -fsyntax-only -fopenmp -fopenmp-version=51 -verify=expected,omp51,omp -fno-openmp-extensions -Wno-source-uses-openmp %s + +#include "Inputs/nesting_of_regions.cpp" diff --git a/clang/test/OpenMP/nesting_of_regions_simd_45.cpp b/clang/test/OpenMP/nesting_of_regions_simd_45.cpp new file mode 100644 index 00..fb0d8bbfe3e486 --- /dev/null +++ b/clang/test/OpenMP/nesting_of_regions_simd_45.cpp @@ -0,0 +1,3 @@ +// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -fopenmp-version=45 -fno-openmp-extensions -verify=expected,omp45,omp45warn,omp
[clang] [NFC][OpenMP] Split nesting_of_regions test (PR #87842)
mikerice1969 wrote: This is one way to improve the overall test time. Open for other suggestions. ``` Before change: Slowest Tests: -- 144.09s: Clang :: OpenMP/nesting_of_regions.cpp 60.81s: Clang :: OpenMP/target_defaultmap_codegen_01.cpp 56.93s: Clang :: OpenMP/target_teams_distribute_parallel_for_simd_codegen_registration.cpp 51.11s: Clang :: OpenMP/target_update_codegen.cpp 50.76s: Clang :: OpenMP/target_parallel_for_simd_codegen_registration.cpp 49.79s: Clang :: OpenMP/target_parallel_for_codegen_registration.cpp 47.64s: Clang :: OpenMP/target_teams_distribute_codegen_registration.cpp 46.50s: Clang :: OpenMP/task_depend_messages.cpp 46.20s: Clang :: OpenMP/target_teams_distribute_simd_codegen_registration.cpp 43.90s: Clang :: OpenMP/target_parallel_codegen_registration.cpp 43.56s: Clang :: OpenMP/target_simd_codegen_registration.cpp 41.28s: Clang :: OpenMP/target_teams_codegen_registration.cpp 34.68s: Clang :: OpenMP/distribute_parallel_for_simd_reduction_messages.cpp 34.51s: Clang :: OpenMP/distribute_parallel_for_reduction_messages.cpp 31.47s: Clang :: OpenMP/target_parallel_for_simd_codegen.cpp 31.03s: Clang :: OpenMP/target_parallel_generic_loop_codegen-1.cpp 30.75s: Clang :: OpenMP/atomic_compare_codegen.cpp 29.19s: Clang :: OpenMP/target_parallel_for_codegen.cpp 28.99s: Clang :: OpenMP/distribute_simd_reduction_messages.cpp 28.32s: Clang :: OpenMP/target_teams_distribute_parallel_for_reduction_messages.cpp Tests Times: -- [ Range ] :: [ Percentage ] :: [ Count ] -- [140s,150s) :: [] :: [ 1/1401] [130s,140s) :: [] :: [ 0/1401] [120s,130s) :: [] :: [ 0/1401] [110s,120s) :: [] :: [ 0/1401] [100s,110s) :: [] :: [ 0/1401] [ 90s,100s) :: [] :: [ 0/1401] [ 80s, 90s) :: [] :: [ 0/1401] [ 70s, 80s) :: [] :: [ 0/1401] [ 60s, 70s) :: [] :: [ 1/1401] [ 50s, 60s) :: [] :: [ 4/1401] [ 40s, 50s) :: [] :: [ 6/1401] [ 30s, 40s) :: [] :: [ 7/1401] [ 20s, 30s) :: [* ] :: [ 46/1401] [ 10s, 20s) :: [** ] :: [ 83/1401] [ 0s, 10s) :: [*** ] :: [1253/1401] -- Testing Time: 152.87s After split: Slowest Tests: -- 74.79s: Clang :: OpenMP/target_teams_distribute_parallel_for_simd_codegen_registration.cpp 71.50s: Clang :: OpenMP/target_update_codegen.cpp 71.37s: Clang :: OpenMP/target_defaultmap_codegen_01.cpp 65.05s: Clang :: OpenMP/target_parallel_for_simd_codegen_registration.cpp 64.44s: Clang :: OpenMP/target_teams_distribute_simd_codegen_registration.cpp 63.47s: Clang :: OpenMP/task_depend_messages.cpp 62.47s: Clang :: OpenMP/target_parallel_for_codegen_registration.cpp 62.37s: Clang :: OpenMP/target_teams_distribute_codegen_registration.cpp 54.54s: Clang :: OpenMP/target_simd_codegen_registration.cpp 51.63s: Clang :: OpenMP/target_teams_codegen_registration.cpp 51.41s: Clang :: OpenMP/target_parallel_codegen_registration.cpp 40.03s: Clang :: OpenMP/nesting_of_regions_45.cpp 39.75s: Clang :: OpenMP/nesting_of_regions_51.cpp 39.70s: Clang :: OpenMP/nesting_of_regions_50.cpp 34.36s: Clang :: OpenMP/distribute_parallel_for_simd_reduction_messages.cpp 33.65s: Clang :: OpenMP/distribute_parallel_for_reduction_messages.cpp 32.35s: Clang :: OpenMP/target_parallel_for_simd_codegen.cpp 32.31s: Clang :: OpenMP/target_parallel_generic_loop_codegen-1.cpp 32.16s: Clang :: OpenMP/teams_distribute_parallel_for_reduction_messages.cpp 32.14s: Clang :: OpenMP/teams_distribute_parallel_for_simd_reduction_messages.cpp Tests Times: -- [Range] :: [ Percentage ] :: [ Count ] -- [70.0s,75.0s) :: [] :: [ 3/1405] [65.0s,70.0s) :: [] :: [ 1/1405] [60.0s,65.0s) :: [] :: [ 4/1405] [55.0s,60.0s) :: [] :: [ 0/1405] [50.0s,55.0s) :: [] :: [ 3/1405] [45.0s,50.0s
[clang] [NFC][OpenMP] Split nesting_of_regions test (PR #87842)
https://github.com/mikerice1969 ready_for_review https://github.com/llvm/llvm-project/pull/87842 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC][OpenMP] Split nesting_of_regions test (PR #87842)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/87842 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/88215 In 4d5e834c5b7f0d90a6d543e182df602f6bc8, casts were removed for pointers but one case was missed. Add missing check. >From b1eaa2f5b13db4d63390a0358ad0f9b13cbe927f Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Tue, 9 Apr 2024 16:11:30 -0700 Subject: [PATCH] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types In 4d5e834c5b7f0d90a6d543e182df602f6bc8, casts were removed for pointers but one case was missed. Add missing check. --- clang/lib/CodeGen/CGAtomic.cpp | 6 +- clang/test/OpenMP/atomic_update_codegen.cpp | 11 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp index d35ce0409d7232..07452b18a85ea4 100644 --- a/clang/lib/CodeGen/CGAtomic.cpp +++ b/clang/lib/CodeGen/CGAtomic.cpp @@ -1806,7 +1806,11 @@ void AtomicInfo::EmitAtomicUpdateOp( /*NumReservedValues=*/2); PHI->addIncoming(OldVal, CurBB); Address NewAtomicAddr = CreateTempAlloca(); - Address NewAtomicIntAddr = castToAtomicIntPointer(NewAtomicAddr); + Address NewAtomicIntAddr = + shouldCastToInt(NewAtomicAddr.getElementType(), /*CmpXchg=*/true) + ? castToAtomicIntPointer(NewAtomicAddr) + : NewAtomicAddr; + if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) || requiresMemSetZero(getAtomicAddress().getElementType())) { CGF.Builder.CreateStore(PHI, NewAtomicIntAddr); diff --git a/clang/test/OpenMP/atomic_update_codegen.cpp b/clang/test/OpenMP/atomic_update_codegen.cpp index ce0765118922a1..fe745590a9f919 100644 --- a/clang/test/OpenMP/atomic_update_codegen.cpp +++ b/clang/test/OpenMP/atomic_update_codegen.cpp @@ -27,6 +27,7 @@ long double ldv, ldx; _Complex int civ, cix; _Complex float cfv, cfx; _Complex double cdv, cdx; +char *cpx; typedef int int4 __attribute__((__vector_size__(16))); int4 int4x; @@ -851,6 +852,16 @@ int main(void) { // CHECK: call{{.*}} @__kmpc_flush( #pragma omp atomic seq_cst rix = dv / rix; + +// CHECK: [[LD_CPX:%.+]] = load atomic ptr, ptr @cpx monotonic +// CHECK: br label %[[CONT:.+]] +// CHECK: [[CONT]] +// CHECK: [[PHI:%.+]] = phi ptr +// CHECK: [[RES:%.+]] = cmpxchg ptr @cpx, +// CHECK: br i1 %{{.+}}, label %[[EXIT:.+]], label %[[CONT]] + #pragma omp atomic update + cpx += 1; + return 0; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)
mikerice1969 wrote: See: https://godbolt.org/z/av7axb9as https://github.com/llvm/llvm-project/pull/88215 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)
mikerice1969 wrote: > We should really fix using cmpxchg here. Can you open an IR issue for it? Sure, I'll look into it and follow-up. Thanks for the review! https://github.com/llvm/llvm-project/pull/88215 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/88215 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][OpenMP][NFC] Remove unnecessary nullptr check (PR #94680)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/94680 Static verifier reports unchecked use of pointer after explicitly checking earlier in the function. It appears the pointer won't be a nullptr, so remove the unneeded check for consistency. >From 476c5a8580c066cce91def36f8e8ed20626d3ab0 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Thu, 6 Jun 2024 11:56:04 -0700 Subject: [PATCH] [OpenMP][NFC] Remove unnecessary nullptr check Static verifier reports unchecked use of pointer after explicitly checking earlier in the function. It appears the pointer won't be a nullptr, so remove the unneeded check for consistency. --- clang/lib/Sema/SemaOpenMP.cpp | 23 +++ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 6e6815328e913..5af32cb3589d3 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -6198,18 +6198,17 @@ class TeamsLoopChecker final : public ConstStmtVisitor { // unless the assume-no-nested-parallelism flag has been specified. // OpenMP API runtime library calls do not inhibit parallel loop // translation, regardless of the assume-no-nested-parallelism. -if (C) { - bool IsOpenMPAPI = false; - auto *FD = dyn_cast_or_null(C->getCalleeDecl()); - if (FD) { -std::string Name = FD->getNameInfo().getAsString(); -IsOpenMPAPI = Name.find("omp_") == 0; - } - TeamsLoopCanBeParallelFor = - IsOpenMPAPI || SemaRef.getLangOpts().OpenMPNoNestedParallelism; - if (!TeamsLoopCanBeParallelFor) -return; -} +bool IsOpenMPAPI = false; +auto *FD = dyn_cast_or_null(C->getCalleeDecl()); +if (FD) { + std::string Name = FD->getNameInfo().getAsString(); + IsOpenMPAPI = Name.find("omp_") == 0; +} +TeamsLoopCanBeParallelFor = +IsOpenMPAPI || SemaRef.getLangOpts().OpenMPNoNestedParallelism; +if (!TeamsLoopCanBeParallelFor) + return; + for (const Stmt *Child : C->children()) if (Child) Visit(Child); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][OpenMP] Fix error handling of the adjust_args clause (PR #94696)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/94696 Static verifier noticed the current code has logically dead code parsing the clause where IsComma is assigned. Fix this and improve the error message received when a bad adjust-op is specified. This will now be handled like 'map' where a nice diagnostic is given with the correct values, then parsing continues on the next clause reducing unhelpful diagnostics. >From 26ece1d7f046e81d095b7da609d34d19eebfed89 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Thu, 6 Jun 2024 15:57:27 -0700 Subject: [PATCH] [clang][OpenMP] Fix error handling of the adjust_args clause Static verifier noticed the current code has logically dead code parsing the clause where IsComma is assigned. Fix this and improve the error message received when a bad adjust-op is specified. This will now be handled like 'map' where a nice diagnostic is given with the correct values, then parsing continues on the next clause reducing unhelpful diagnostics. --- clang/include/clang/Basic/DiagnosticParseKinds.td | 2 ++ clang/lib/Parse/ParseOpenMP.cpp| 6 +++--- clang/test/OpenMP/declare_variant_clauses_messages.cpp | 10 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index d8c3fee7841f4..1160b0f7a7a5a 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1508,6 +1508,8 @@ def err_omp_unexpected_append_op : Error< "unexpected operation specified in 'append_args' clause, expected 'interop'">; def err_omp_unexpected_execution_modifier : Error< "unexpected 'execution' modifier in non-executable context">; +def err_omp_unknown_adjust_args_op : Error< + "incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'">; def err_omp_declare_variant_wrong_clause : Error< "expected %select{'match'|'match', 'adjust_args', or 'append_args'}0 clause " "on 'omp declare variant' directive">; diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 50a872fedebf7..76d1854520382 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -4785,8 +4785,8 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind, getLangOpts()); Data.ExtraModifierLoc = Tok.getLocation(); if (Data.ExtraModifier == OMPC_ADJUST_ARGS_unknown) { - SkipUntil(tok::colon, tok::r_paren, tok::annot_pragma_openmp_end, -StopBeforeMatch); + Diag(Tok, diag::err_omp_unknown_adjust_args_op); + SkipUntil(tok::r_paren, tok::annot_pragma_openmp_end, StopBeforeMatch); } else { ConsumeToken(); if (Tok.is(tok::colon)) @@ -4799,7 +4799,7 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind, bool IsComma = (Kind != OMPC_reduction && Kind != OMPC_task_reduction && Kind != OMPC_in_reduction && Kind != OMPC_depend && - Kind != OMPC_doacross && Kind != OMPC_map) || + Kind != OMPC_doacross && Kind != OMPC_map && Kind != OMPC_adjust_args) || (Kind == OMPC_reduction && !InvalidReductionId) || (Kind == OMPC_map && Data.ExtraModifier != OMPC_MAP_unknown) || (Kind == OMPC_depend && Data.ExtraModifier != OMPC_DEPEND_unknown) || diff --git a/clang/test/OpenMP/declare_variant_clauses_messages.cpp b/clang/test/OpenMP/declare_variant_clauses_messages.cpp index 2a9e5385c9ca6..284e49bbd21b4 100644 --- a/clang/test/OpenMP/declare_variant_clauses_messages.cpp +++ b/clang/test/OpenMP/declare_variant_clauses_messages.cpp @@ -186,6 +186,16 @@ void vararg_bar2(const char *fmt) { return; } // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'void (float *, float *, int *, omp_interop_t)' (aka 'void (float *, float *, int *, void *)') is incompatible with type 'void (float *, float *, int *)'}} #pragma omp declare variant(foo_v4) match(construct={dispatch}) +// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'}} +#pragma omp declare variant(foo_v1)\ + match(construct={dispatch}, device={arch(arm)}) \ + adjust_args(badaaop:AAA,BBB) + +// expected-error@+3 {{incorrect adjust_args type, expected 'need_device_ptr' or 'nothing'}} +#pragma omp declare variant(foo_v1)\ + match(construct={dispatch}, device={arch(arm)}) \ + adjust_args(badaaop AAA,BBB) + #endif // _OPENMP >= 202011 #if _OPENMP < 202011 // OpenMP 5.0 or lower // expected-error@+2 {{expected 'match' clause on 'omp declare variant' directive}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [CodeGen][arm64e] Add methods and data members to Address, which are needed to authenticate signed pointers (PR #86923)
@@ -201,14 +211,26 @@ template <> struct DominatingValue { class saved_type { enum Kind { ScalarLiteral, ScalarAddress, AggregateLiteral, AggregateAddress, ComplexAddress }; - -llvm::Value *Value; -llvm::Type *ElementType; +union { + struct { +DominatingLLVMValue::saved_type first, second; + } Vals; + DominatingValue::saved_type AggregateAddr; +}; LLVM_PREFERRED_TYPE(Kind) unsigned K : 3; -unsigned Align : 29; -saved_type(llvm::Value *v, llvm::Type *e, Kind k, unsigned a = 0) - : Value(v), ElementType(e), K(k), Align(a) {} +unsigned IsVolatile : 1; mikerice1969 wrote: Hi @ahatanak, static verifier is concerned that IsVolatile is not initialized in the constructor. Can we add an initializer here? Also one of the constructors below has a IsVolatile parameter but isn't using it to initialize the field. Do you know what we should be doing here? https://github.com/llvm/llvm-project/pull/86923 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][NFC] Fix argument order of SourceLocations for allocate clause (PR #94777)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/94777 Static verifier caught passing ColonLoc/LParenLoc in wrong order. Marked as NFC since these don't seem to be used for anything currently that I can think to test for. >From ae0438eda2b5fcffc70b991d2c496bac9b89a5a2 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Fri, 7 Jun 2024 10:47:55 -0700 Subject: [PATCH] [OpenMP][NFC] Fix argument order of SourceLocations for allocate clause Static verifier caught passing ColonLoc/LParenLoc in wrong order. Marked as NFC since these don't seem to be used for anything currently that I can think to test for. --- clang/lib/Sema/SemaOpenMP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 6e6815328e913..f1ebe9d3b9db7 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -24331,7 +24331,7 @@ SemaOpenMP::ActOnOpenMPHasDeviceAddrClause(ArrayRef VarList, OMPClause *SemaOpenMP::ActOnOpenMPAllocateClause( Expr *Allocator, ArrayRef VarList, SourceLocation StartLoc, -SourceLocation ColonLoc, SourceLocation LParenLoc, SourceLocation EndLoc) { +SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) { if (Allocator) { // OpenMP [2.11.4 allocate Clause, Description] // allocator is an expression of omp_allocator_handle_t type. ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][OpenMP] Fix teams nesting of region check (PR #94806)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/94806 The static verifier flagged dead code in the check since the loop will only execute once and never reach the iterator increment. The loop needs to iterate twice to correctly diagnose when a statement is after the teams. Since there are two iterations again, reset the iterator to the first teams directive when the double teams case is seen so the diagnostic can report both locations. >From 61ea96129753641f7528c0f29c78143a2281cde9 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Fri, 7 Jun 2024 14:26:37 -0700 Subject: [PATCH] [clang][OpenMP] Fix teams nesting of region check The static verifier flagged dead code in the check since the loop will only execute once and never reach the iterator increment. The loop needs to iterate twice to correctly diagnose when a statement is after the teams. Since there are two iterations again, reset the iterator to the first teams directive when the double teams case is seen so the diagnostic can report both locations. --- clang/lib/Sema/SemaOpenMP.cpp | 10 +++--- clang/test/OpenMP/Inputs/nesting_of_regions.cpp | 12 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 6e6815328e913..0fe04094c5912 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -13434,10 +13434,14 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetDirective(ArrayRef Clauses, auto I = CS->body_begin(); while (I != CS->body_end()) { const auto *OED = dyn_cast(*I); -if (!OED || !isOpenMPTeamsDirective(OED->getDirectiveKind()) || -OMPTeamsFound) { - +bool IsTeams = OED && isOpenMPTeamsDirective(OED->getDirectiveKind()); +if (!IsTeams || I != CS->body_begin()) { OMPTeamsFound = false; + if (IsTeams && I != CS->body_begin()) { +// This is the two teams case. Since the InnerTeamsRegionLoc will +// point to this second one reset the iterator to the other teams. +--I; + } break; } ++I; diff --git a/clang/test/OpenMP/Inputs/nesting_of_regions.cpp b/clang/test/OpenMP/Inputs/nesting_of_regions.cpp index e671f9b0cf412..969ddfcce4cb0 100644 --- a/clang/test/OpenMP/Inputs/nesting_of_regions.cpp +++ b/clang/test/OpenMP/Inputs/nesting_of_regions.cpp @@ -4880,6 +4880,12 @@ void foo() { #pragma omp teams // expected-note {{nested teams construct here}} ++a; } +#pragma omp target // expected-error {{target construct with nested teams region contains statements outside of the teams construct}} + { +#pragma omp teams // expected-note {{nested teams construct here}} +++a; +++a; // expected-note {{statement outside teams construct here}} + } #pragma omp target // expected-error {{target construct with nested teams region contains statements outside of the teams construct}} { while (0) // expected-note {{statement outside teams construct here}} @@ -14133,6 +14139,12 @@ void foo() { #pragma omp teams // expected-note {{nested teams construct here}} ++a; } +#pragma omp target // expected-error {{target construct with nested teams region contains statements outside of the teams construct}} + { +#pragma omp teams // expected-note {{nested teams construct here}} +++a; +++a; // expected-note {{statement outside teams construct here}} + } #pragma omp target { #pragma omp taskloop ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [BitInt] Expose a _BitInt literal suffix in C++ (PR #86586)
@@ -1117,6 +1118,31 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling, if (isImaginary) break; // Cannot be repeated. isImaginary = true; continue; // Success. +case '_': + if (isFPConstant) +break; // Invalid for floats + if (HasSize) +break; + if (DoubleUnderscore) +break; // Cannot be repeated. mikerice1969 wrote: Hi @js324. our static verifier is reporting this 'break' as dead code saying that it will always be false. I removed all references to DoubleUnderscore and ran the lit tests and there are no fails. Do you have a test case in mind that exercises this condition? If so we should add a test for it. If not we can simplify this code and remove DoubleUnderscore. What do you think? https://github.com/llvm/llvm-project/pull/86586 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][OpenMP][NFC] Remove unnecessary nullptr check (PR #94680)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/94680 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [OpenMP][NFC] Fix argument order of SourceLocations for allocate clause (PR #94777)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/94777 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
mikerice1969 wrote: > Does this impact anything user-facing? e.g., should there be an additional > test somewhere in clang/test/Sema/ for this change? I don't think there is any user-visible issue with the one attribute that uses this. At least how the Parse code is written currently. The attribute has three EnumArguments followed by an IntArgument. The call to attributeHasStrictIdentifierArgAtIndex is only done if the token is an identifier and if the IntArgument is an identifier that same thing happens anyway. Looking at this code now, I am not convinced the call to attributeHasStrictIdentifierArgAtIndex does anything useful. ``` if (Tok.is(tok::identifier) && attributeHasStrictIdentifierArgAtIndex( *AttrName, ArgExprs.size())) { ArgExprs.push_back(ParseIdentifierLoc()); continue; } ExprResult ArgExpr; if (Tok.is(tok::identifier)) { ArgExprs.push_back(ParseIdentifierLoc()); } else { ``` So I think we can remove the whole function attributeHasStrictIdentifierArgAtIndex and the related tablegen. No tests fail without it. The function attributeHasStrictIdentifierArgs still seems necessary but not the AtIndex. What do you think? https://github.com/llvm/llvm-project/pull/3 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
@@ -314,64 +314,92 @@ void Parser::ParseGNUAttributes(ParsedAttributes &Attrs, } /// Determine whether the given attribute has an identifier argument. -static bool attributeHasIdentifierArg(const IdentifierInfo &II) { +static bool attributeHasIdentifierArg(const IdentifierInfo &II, + ParsedAttr::Syntax Syntax, + IdentifierInfo *ScopeName) { + std::string FullName = AttributeCommonInfo::getNormalizedFullNameWithSyntax( + &II, ScopeName, Syntax); #define CLANG_ATTR_IDENTIFIER_ARG_LIST - return llvm::StringSwitch(normalizeAttrName(II.getName())) + return llvm::StringSwitch(FullName) mikerice1969 wrote: > Can we remove `normalizeAttrName` since this looks like it replaces all of > the uses? There are still two uses of this function. I didn't change the tablegen for the 'LateParsed' uses (CLANG_ATTR_LATE_PARSED_EXPERIMENTAL_EXT_LIST and CLANG_ATTR_LATE_PARSED_LIST) since these only use the GNU syntax so there isn't a problem just using the attribute name. We could add "GNU::" to the tablegen for these and then use the new function. Or leave it alone. I don't have a strong preference. https://github.com/llvm/llvm-project/pull/3 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
https://github.com/mikerice1969 updated https://github.com/llvm/llvm-project/pull/3 >From 5f8b68d9dfd7680adeadbae1d761dc03a2455685 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Mon, 22 Jul 2024 15:28:15 -0700 Subject: [PATCH 1/2] [clang] Update argument checking tablegen code to use a 'full' name In 92fc1eb0c1ae3813f2ac9208e2c74207aae9d23 the HLSLLoopHint attribute was added with an 'unroll' spelling. There is an existing LoopHint attribute with the same spelling. These attributes have different arguments. The tablegen used to produce checks on arguments uses only the attribute name, making it impossible to return correct info for attribute with different argument types but the same name. Improve the situation by using a 'full' name that combines the syntax, scope, and name. This allows, for example, #pragma unroll and [[unroll(x)]] to coexist correctly even with different argument types. Also fix a bug in the StrictEnumParameters tablegen. If will now correctly specify each parameter instead of only the first. --- .../include/clang/Basic/AttributeCommonInfo.h | 6 + clang/lib/Basic/Attributes.cpp| 34 +++ clang/lib/Parse/ParseDecl.cpp | 104 +--- clang/lib/Sema/SemaStmtAttr.cpp | 7 - clang/test/SemaHLSL/Loops/unroll.hlsl | 5 +- .../TableGen/attrs-parser-string-switches.td | 232 ++ clang/utils/TableGen/ClangAttrEmitter.cpp | 71 -- 7 files changed, 394 insertions(+), 65 deletions(-) create mode 100644 clang/test/TableGen/attrs-parser-string-switches.td diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h index 5f024b4b5fd78..2c5baaf921cdf 100644 --- a/clang/include/clang/Basic/AttributeCommonInfo.h +++ b/clang/include/clang/Basic/AttributeCommonInfo.h @@ -191,6 +191,12 @@ class AttributeCommonInfo { /// __gnu__::__attr__ will be normalized to gnu::attr). std::string getNormalizedFullName() const; + /// Gets a normalized full name, with syntax, scope and name. + static std::string + getNormalizedFullNameWithSyntax(const IdentifierInfo *Name, + const IdentifierInfo *Scope, + AttributeCommonInfo::Syntax SyntaxUsed); + bool isDeclspecAttribute() const { return SyntaxUsed == AS_Declspec; } bool isMicrosoftAttribute() const { return SyntaxUsed == AS_Microsoft; } diff --git a/clang/lib/Basic/Attributes.cpp b/clang/lib/Basic/Attributes.cpp index 867d241a2cf84..0625c7637c009 100644 --- a/clang/lib/Basic/Attributes.cpp +++ b/clang/lib/Basic/Attributes.cpp @@ -153,6 +153,40 @@ std::string AttributeCommonInfo::getNormalizedFullName() const { normalizeName(getAttrName(), getScopeName(), getSyntax())); } +static StringRef getSyntaxName(AttributeCommonInfo::Syntax SyntaxUsed) { + switch (SyntaxUsed) { + case AttributeCommonInfo::AS_GNU: +return "GNU"; + case AttributeCommonInfo::AS_CXX11: +return "CXX11"; + case AttributeCommonInfo::AS_C23: +return "C23"; + case AttributeCommonInfo::AS_Declspec: +return "Declspec"; + case AttributeCommonInfo::AS_Microsoft: +return "Microsoft"; + case AttributeCommonInfo::AS_Keyword: +return "Keyword"; + case AttributeCommonInfo::AS_Pragma: +return "Pragma"; + case AttributeCommonInfo::AS_ContextSensitiveKeyword: +return "ContextSensitiveKeyword"; + case AttributeCommonInfo::AS_HLSLAnnotation: +return "HLSLAnnotation"; + case AttributeCommonInfo::AS_Implicit: +return "Implicit"; + } +} + +std::string AttributeCommonInfo::getNormalizedFullNameWithSyntax( +const IdentifierInfo *Name, const IdentifierInfo *ScopeName, +Syntax SyntaxUsed) { + std::string FullName = getSyntaxName(SyntaxUsed).str(); + FullName += "::"; + return FullName += + static_cast(normalizeName(Name, ScopeName, SyntaxUsed)); +} + unsigned AttributeCommonInfo::calculateAttributeSpellingListIndex() const { // Both variables will be used in tablegen generated // attribute spell list index matching code. diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 7ce9a9cea1c7a..28c69f9981abd 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -314,9 +314,13 @@ void Parser::ParseGNUAttributes(ParsedAttributes &Attrs, } /// Determine whether the given attribute has an identifier argument. -static bool attributeHasIdentifierArg(const IdentifierInfo &II) { +static bool attributeHasIdentifierArg(const IdentifierInfo &II, + ParsedAttr::Syntax Syntax, + IdentifierInfo *ScopeName) { + std::string FullName = AttributeCommonInfo::getNormalizedFullNameWithSyntax( + &II, ScopeName, Syntax); #define CLANG_ATTR_IDENTIFIER_ARG_LIST - return llvm::StringSwitch(normalizeAttrName(II.getName())) + return llvm::StringSwitch(FullName) #include "clang/Parse/AttrParserStringS
[clang] [clang][NFC] remove unneeded nullptr checks after dereference (PR #100489)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/100489 Fix static verifer concerns of null pointer checks after dereferencing the pointer. Update the assert to make it super clear it is not null and remove the checks. >From e7d006169a195856eb55a910a162286eb5925cb1 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Wed, 24 Jul 2024 17:03:39 -0700 Subject: [PATCH 1/2] [clang][NFC] remove unneeded nullptr checks after dereference Fix static verifer concerns of null pointer checks after dereferencing the pointer. Update the assert to make it super clear it is not null and remove the checks. --- clang/lib/Sema/SemaDeclCXX.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 04b8d88cae217..a9e2495cf2cde 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -12248,16 +12248,16 @@ Decl *Sema::ActOnUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, CXXScopeSpec *SS) { - assert(!SS->isInvalid() && "ScopeSpec is invalid"); + assert(SS && !SS->isInvalid() && "ScopeSpec is invalid"); TypeSourceInfo *TSI = nullptr; SourceLocation IdentLoc = TyLoc.getBegin(); QualType EnumTy = GetTypeFromParser(Ty, &TSI); if (EnumTy.isNull()) { -Diag(IdentLoc, SS && isDependentScopeSpecifier(*SS) +Diag(IdentLoc, isDependentScopeSpecifier(*SS) ? diag::err_using_enum_is_dependent : diag::err_unknown_typename) << II.getName() -<< SourceRange(SS ? SS->getBeginLoc() : IdentLoc, TyLoc.getEnd()); +<< SourceRange(SS->getBeginLoc(), TyLoc.getEnd()); return nullptr; } >From b7aa05e8a35fc17ecb0dd5f3cdd32ec0a8821877 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Wed, 24 Jul 2024 17:40:34 -0700 Subject: [PATCH 2/2] Fix format --- clang/lib/Sema/SemaDeclCXX.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index a9e2495cf2cde..1cca8ac9b9343 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -12256,8 +12256,7 @@ Decl *Sema::ActOnUsingEnumDeclaration(Scope *S, AccessSpecifier AS, Diag(IdentLoc, isDependentScopeSpecifier(*SS) ? diag::err_using_enum_is_dependent : diag::err_unknown_typename) -<< II.getName() -<< SourceRange(SS->getBeginLoc(), TyLoc.getEnd()); +<< II.getName() << SourceRange(SS->getBeginLoc(), TyLoc.getEnd()); return nullptr; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][NFC] remove unneeded nullptr checks after dereference (PR #100489)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/100489 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [InstallAPI] Pick up input headers by directory traversal (PR #94508)
@@ -0,0 +1,300 @@ +//===- DirectoryScanner.cpp ---===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "clang/InstallAPI/DirectoryScanner.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/TextAPI/DylibReader.h" + +using namespace llvm; +using namespace llvm::MachO; + +namespace clang::installapi { + +HeaderSeq DirectoryScanner::getHeaders(ArrayRef Libraries) { + HeaderSeq Headers; + for (const Library &Lib : Libraries) +llvm::append_range(Headers, Lib.Headers); + return Headers; +} + +llvm::Error DirectoryScanner::scan(StringRef Directory) { + if (Mode == ScanMode::ScanFrameworks) +return scanForFrameworks(Directory); + + return scanForUnwrappedLibraries(Directory); +} + +llvm::Error DirectoryScanner::scanForUnwrappedLibraries(StringRef Directory) { + // Check some known sub-directory locations. + auto GetDirectory = [&](const char *Sub) -> OptionalDirectoryEntryRef { +SmallString Path(Directory); +sys::path::append(Path, Sub); +return FM.getOptionalDirectoryRef(Path); + }; + + auto DirPublic = GetDirectory("usr/include"); + auto DirPrivate = GetDirectory("usr/local/include"); + if (!DirPublic && !DirPrivate) { +std::error_code ec = std::make_error_code(std::errc::not_a_directory); +return createStringError(ec, + "cannot find any public (usr/include) or private " + "(usr/local/include) header directory"); + } + + Library &Lib = getOrCreateLibrary(Directory, Libraries); + Lib.IsUnwrappedDylib = true; + + if (DirPublic) +if (Error Err = scanHeaders(DirPublic->getName(), Lib, HeaderType::Public, +Directory)) + return Err; + + if (DirPrivate) +if (Error Err = scanHeaders(DirPrivate->getName(), Lib, HeaderType::Private, +Directory)) + return Err; + + return Error::success(); +} + +static bool isFramework(StringRef Path) { + while (Path.back() == '/') +Path = Path.slice(0, Path.size() - 1); + + return llvm::StringSwitch(llvm::sys::path::extension(Path)) + .Case(".framework", true) + .Default(false); +} + +Library & +DirectoryScanner::getOrCreateLibrary(StringRef Path, + std::vector &Libs) const { + if (Path.consume_front(RootPath) && Path.empty()) +Path = "/"; + + auto LibIt = + find_if(Libs, [Path](const Library &L) { return L.getPath() == Path; }); + if (LibIt != Libs.end()) +return *LibIt; + + Libs.emplace_back(Path); + return Libs.back(); +} + +Error DirectoryScanner::scanHeaders(StringRef Path, Library &Lib, +HeaderType Type, StringRef BasePath, +StringRef ParentPath) const { + std::error_code ec; + auto &FS = FM.getVirtualFileSystem(); + PathSeq SubDirectories; + for (vfs::directory_iterator i = FS.dir_begin(Path, ec), ie; i != ie; + i.increment(ec)) { +StringRef HeaderPath = i->path(); +if (ec) + return createStringError(ec, "unable to read: " + HeaderPath); + +if (sys::fs::is_symlink_file(HeaderPath)) + continue; + +// Ignore tmp files from unifdef. +const StringRef Filename = sys::path::filename(HeaderPath); +if (Filename.starts_with(".")) + continue; + +// If it is a directory, remember the subdirectory. +if (FM.getOptionalDirectoryRef(HeaderPath)) + SubDirectories.push_back(HeaderPath.str()); + +if (!isHeaderFile(HeaderPath)) + continue; + +// Skip files that do not exist. This usually happens for broken symlinks. +if (FS.status(HeaderPath) == std::errc::no_such_file_or_directory) + continue; + +auto IncludeName = createIncludeHeaderName(HeaderPath); +Lib.addHeaderFile(HeaderPath, Type, + IncludeName.has_value() ? IncludeName.value() : ""); + } + + // Go through the subdirectories. + // Sort the sub-directory first since different file systems might have + // different traverse order. + llvm::sort(SubDirectories); + if (ParentPath.empty()) +ParentPath = Path; + for (const StringRef Dir : SubDirectories) +return scanHeaders(Dir, Lib, Type, BasePath, ParentPath); mikerice1969 wrote: Hi @cyndyishida Our static verification run reports that this loop always exits on the first iteration (so it is not really a loop). Is that really what you want here? If you only want to scan the first item maybe something other than a loop makes sense? https://github.com/llvm/llvm-project/pull/94508 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http
[clang] [Clang] Fix potential null pointer dereferences in Sema::AddInitializerToDecl (PR #94368)
@@ -13681,12 +13681,13 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { } Init = Result.getAs(); +assert(Init && "Init must not be null"); + IsParenListInit = !InitSeq.steps().empty() && InitSeq.step_begin()->Kind == InitializationSequence::SK_ParenthesizedListInit; QualType VDeclType = VDecl->getType(); -if (Init && !Init->getType().isNull() && -!Init->getType()->isDependentType() && !VDeclType->isDependentType() && +if (!Init->getType()->isDependentType() && !VDeclType->isDependentType() && mikerice1969 wrote: > Was the static analysis tool perhaps complaining about later uses of `Init`? Yes. FWIW Here is the logic: ``` if (!VDecl->isInvalidDecl()) { ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Args, &DclT); if (Result.isInvalid()) { return } Init = Result.getAs(); if (Init && !Init->getType().isNull() && // verifier expects Init can be null. } … if (!VDecl->isInvalidDecl()) { .. Init->getBeginLoc())) // Deref of Init without check } ``` https://github.com/llvm/llvm-project/pull/94368 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][Sema][NFC] remove unreachable return statement (PR #100642)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/100642 The switch now returns in every case so the end return is unreachable. >From 8804f18fcaf1a70bad10a8e66414f91556df23bd Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Thu, 25 Jul 2024 11:35:11 -0700 Subject: [PATCH] [clang][Sema][NFC] remove unreachable return statement The switch now returns in every case so the end return is unreachable. --- clang/lib/Sema/SemaPPC.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaPPC.cpp b/clang/lib/Sema/SemaPPC.cpp index 99f46b12e6968..5b764ed396ebc 100644 --- a/clang/lib/Sema/SemaPPC.cpp +++ b/clang/lib/Sema/SemaPPC.cpp @@ -93,7 +93,6 @@ bool SemaPPC::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) { ASTContext &Context = getASTContext(); - unsigned i = 0, l = 0, u = 0; bool IsTarget64Bit = TI.getTypeWidth(TI.getIntPtrType()) == 64; llvm::APSInt Result; @@ -248,7 +247,7 @@ bool SemaPPC::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, return BuiltinPPCMMACall(TheCall, BuiltinID, Types); #include "clang/Basic/BuiltinsPPC.def" } - return SemaRef.BuiltinConstantArgRange(TheCall, i, l, u); + llvm_unreachable("must return from switch"); } // Check if the given type is a non-pointer PPC MMA type. This function is used ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [analyzer][NFC] Factor out NoOwnershipChangeVisitor (PR #94357)
=?utf-8?q?Kristóf?= Umann Message-ID: In-Reply-To: @@ -804,23 +751,21 @@ class NoOwnershipChangeVisitor final : public NoStateChangeFuncVisitor { return false; } + bool hasResourceStateChanged(ProgramStateRef CallEnterState, + ProgramStateRef CallExitEndState) final { +return CallEnterState->get(Sym) != + CallExitEndState->get(Sym); + } + /// Heuristically guess whether the callee intended to free memory. This is /// done syntactically, because we are trying to argue about alternative /// paths of execution, and as a consequence we don't have path-sensitive /// information. - bool doesFnIntendToHandleOwnership(const Decl *Callee, ASTContext &ACtx) { + bool doesFnIntendToHandleOwnership(const Decl *Callee, + ASTContext &ACtx) final { using namespace clang::ast_matchers; const FunctionDecl *FD = dyn_cast(Callee); mikerice1969 wrote: Following up on static verifier hits. This dyn_cast result is now not checked before it is dereferenced below (FD->getBody()). Should this be a cast instead? Or should there be a check before the dereference? https://github.com/llvm/llvm-project/pull/94357 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [HLSL] Default and Relaxed Availability Diagnostics (PR #92704)
@@ -290,3 +294,296 @@ void SemaHLSL::DiagnoseAttrStageMismatch( << A << HLSLShaderAttr::ConvertShaderTypeToStr(Stage) << (AllowedStages.size() != 1) << join(StageStrings, ", "); } + +namespace { + +/// This class implements HLSL availability diagnostics for default +/// and relaxed mode +/// +/// The goal of this diagnostic is to emit an error or warning when an +/// unavailable API is found in code that is reachable from the shader +/// entry function or from an exported function (when compiling a shader +/// library). +/// +/// This is done by traversing the AST of all shader entry point functions +/// and of all exported functions, and any functions that are refrenced +/// from this AST. In other words, any functions that are reachable from +/// the entry points. +class DiagnoseHLSLAvailability +: public RecursiveASTVisitor { + + Sema &SemaRef; + + // Stack of functions to be scaned + llvm::SmallVector DeclsToScan; + + // Tracks which environments functions have been scanned in. + // + // Maps FunctionDecl to an unsigned number that represents the set of shader + // environments the function has been scanned for. + // Since HLSLShaderAttr::ShaderType enum is generated from Attr.td and is + // defined without any assigned values, it is guaranteed to be numbered + // sequentially from 0 up and we can use it to 'index' individual bits + // in the set. + // The N'th bit in the set will be set if the function has been scanned + // in shader environment whose ShaderType integer value equals N. + // For example, if a function has been scanned in compute and pixel stage + // environment, the value will be 0x21 (11 binary) because + // (int)HLSLShaderAttr::ShaderType::Pixel == 1 and + // (int)HLSLShaderAttr::ShaderType::Compute == 5. + // A FunctionDecl is mapped to 0 (or not included in the map) if it has not + // been scanned in any environment. + llvm::DenseMap ScannedDecls; + + // Do not access these directly, use the get/set methods below to make + // sure the values are in sync + llvm::Triple::EnvironmentType CurrentShaderEnvironment; + unsigned CurrentShaderStageBit; + + // True if scanning a function that was already scanned in a different + // shader stage context, and therefore we should not report issues that + // depend only on shader model version because they would be duplicate. + bool ReportOnlyShaderStageIssues; mikerice1969 wrote: Hi @hekota, just following up on some static verifier hits. These three members are reported as not initialized in the constructor. Is it possible to initialize these to a sane default? That would make it clear to random readers (and static verifier tools) that it wasn't overlooked. https://github.com/llvm/llvm-project/pull/92704 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][Sema][NFC] remove unreachable return statement (PR #100642)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/100642 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [HLSL] Default and Relaxed Availability Diagnostics (PR #92704)
@@ -290,3 +294,296 @@ void SemaHLSL::DiagnoseAttrStageMismatch( << A << HLSLShaderAttr::ConvertShaderTypeToStr(Stage) << (AllowedStages.size() != 1) << join(StageStrings, ", "); } + +namespace { + +/// This class implements HLSL availability diagnostics for default +/// and relaxed mode +/// +/// The goal of this diagnostic is to emit an error or warning when an +/// unavailable API is found in code that is reachable from the shader +/// entry function or from an exported function (when compiling a shader +/// library). +/// +/// This is done by traversing the AST of all shader entry point functions +/// and of all exported functions, and any functions that are refrenced +/// from this AST. In other words, any functions that are reachable from +/// the entry points. +class DiagnoseHLSLAvailability +: public RecursiveASTVisitor { + + Sema &SemaRef; + + // Stack of functions to be scaned + llvm::SmallVector DeclsToScan; + + // Tracks which environments functions have been scanned in. + // + // Maps FunctionDecl to an unsigned number that represents the set of shader + // environments the function has been scanned for. + // Since HLSLShaderAttr::ShaderType enum is generated from Attr.td and is + // defined without any assigned values, it is guaranteed to be numbered + // sequentially from 0 up and we can use it to 'index' individual bits + // in the set. + // The N'th bit in the set will be set if the function has been scanned + // in shader environment whose ShaderType integer value equals N. + // For example, if a function has been scanned in compute and pixel stage + // environment, the value will be 0x21 (11 binary) because + // (int)HLSLShaderAttr::ShaderType::Pixel == 1 and + // (int)HLSLShaderAttr::ShaderType::Compute == 5. + // A FunctionDecl is mapped to 0 (or not included in the map) if it has not + // been scanned in any environment. + llvm::DenseMap ScannedDecls; + + // Do not access these directly, use the get/set methods below to make + // sure the values are in sync + llvm::Triple::EnvironmentType CurrentShaderEnvironment; + unsigned CurrentShaderStageBit; + + // True if scanning a function that was already scanned in a different + // shader stage context, and therefore we should not report issues that + // depend only on shader model version because they would be duplicate. + bool ReportOnlyShaderStageIssues; mikerice1969 wrote: @hekota Thanks! https://github.com/llvm/llvm-project/pull/92704 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
mikerice1969 wrote: > That code was added very recently by #94056 and seem to be specific to the > `ptrauth_vtable_pointer` attribute. Perhaps we're lacking test coverage if > nothing breaks without that code? @AaronBallman The code is logically useless so there's no way to add tests that make it useful. ``` do { if (Tok.is(tok::identifier) && attributeHasStrictIdentifierArgAtIndex()) { ArgExprs.push_back(ParseIdentifierLoc()); continue; } if (Tok.is(tok::identifier)) { ArgExprs.push_back(ParseIdentifierLoc()); } else { // Do something if not an identifier } } while (TryConsumeToken(tok::comma); ``` It doesn't matter what attributeHasStrictIdentifierArgAtIndex returns we will always just add identifiers to ArgExprs. The only question is what was intended in the code. Unless @ojhunt and/or @ahmedbougacha can clarify I think we should just remove it. https://github.com/llvm/llvm-project/pull/3 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/3 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
mikerice1969 wrote: > You probably need to separately match the syntax and the name without > constructing a temporary `std::string`. @nikic Thanks. I'll look into improving this. If anyone thinks this should be reverted until then let me know, or just go ahead and revert it. https://github.com/llvm/llvm-project/pull/3 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
mikerice1969 wrote: The old tablegen produced a single entry per name: `.Case("unroll", true)` The new tablegen can produce multiple entries: ``` .Case("Microsoft::unroll", true) .Case("Pragma::unroll", true) ``` I think we can instead produce something like this, one per name: ``` .Case("unroll", (Syntax==AttributeCommonInfo::AS_Microsoft && !Scope) || (Syntax==AttributeCommonInfo::AS_Pragma && Scope && Scope=="whatever") || ...) ``` That should elimate the need for any new std::strings. @AaronBallman does this sound reasonable? https://github.com/llvm/llvm-project/pull/3 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC][clang] Replace unchecked dyn_cast with cast (PR #98948)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/98948 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Implement function pointer signing and authenticated function calls (PR #93906)
@@ -14,10 +14,144 @@ #ifndef LLVM_CLANG_BASIC_POINTERAUTHOPTIONS_H #define LLVM_CLANG_BASIC_POINTERAUTHOPTIONS_H +#include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" +#include "llvm/ADT/STLForwardCompat.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Target/TargetOptions.h" +#include + namespace clang { constexpr unsigned PointerAuthKeyNone = -1; +class PointerAuthSchema { +public: + enum class Kind : unsigned { +None, +ARM8_3, + }; + + /// Hardware pointer-signing keys in ARM8.3. + /// + /// These values are the same used in ptrauth.h. + enum class ARM8_3Key : unsigned { +ASIA = 0, +ASIB = 1, +ASDA = 2, +ASDB = 3 + }; + + /// Forms of extra discrimination. + enum class Discrimination : unsigned { +/// No additional discrimination. +None, + +/// Discriminate using a constant value. +Constant, + }; + +private: + Kind TheKind : 2; + unsigned IsAddressDiscriminated : 1; + unsigned IsIsaPointer : 1; + unsigned AuthenticatesNullValues : 1; + PointerAuthenticationMode SelectedAuthenticationMode : 2; + Discrimination DiscriminationKind : 2; + unsigned Key : 2; + unsigned ConstantDiscriminator : 16; + +public: + PointerAuthSchema() : TheKind(Kind::None) {} + + PointerAuthSchema( + ARM8_3Key Key, bool IsAddressDiscriminated, + PointerAuthenticationMode AuthenticationMode, + Discrimination OtherDiscrimination, + std::optional ConstantDiscriminatorOrNone = std::nullopt, + bool IsIsaPointer = false, bool AuthenticatesNullValues = false) + : TheKind(Kind::ARM8_3), IsAddressDiscriminated(IsAddressDiscriminated), +IsIsaPointer(IsIsaPointer), +AuthenticatesNullValues(AuthenticatesNullValues), +SelectedAuthenticationMode(AuthenticationMode), +DiscriminationKind(OtherDiscrimination), Key(llvm::to_underlying(Key)) { +assert((getOtherDiscrimination() != Discrimination::Constant || +ConstantDiscriminatorOrNone) && + "constant discrimination requires a constant!"); +if (ConstantDiscriminatorOrNone) + ConstantDiscriminator = *ConstantDiscriminatorOrNone; mikerice1969 wrote: Hi @ahmedbougacha @ahatanak The static verifier is reporting that 'ConstantDiscriminator' is not initialized when taking the false branch of that if. Is that possible? https://github.com/llvm/llvm-project/pull/93906 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Update argument checking tablegen code to use a 'full' name (PR #99993)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/3 In 92fc1eb0c1ae3813f2ac9208e2c74207aae9d23 the HLSLLoopHint attribute was added with an 'unroll' spelling. There is an existing LoopHint attribute with the same spelling. These attributes have different arguments. The tablegen used to produce checks on arguments uses only the attribute name, making it impossible to return correct info for attribute with different argument types but the same name. Improve the situation by using a 'full' name that combines the syntax, scope, and name. This allows, for example, #pragma unroll and [[unroll(x)]] to coexist correctly even with different argument types. Also fix a bug in the StrictEnumParameters tablegen. If will now correctly specify each parameter instead of only the first. >From 5f8b68d9dfd7680adeadbae1d761dc03a2455685 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Mon, 22 Jul 2024 15:28:15 -0700 Subject: [PATCH] [clang] Update argument checking tablegen code to use a 'full' name In 92fc1eb0c1ae3813f2ac9208e2c74207aae9d23 the HLSLLoopHint attribute was added with an 'unroll' spelling. There is an existing LoopHint attribute with the same spelling. These attributes have different arguments. The tablegen used to produce checks on arguments uses only the attribute name, making it impossible to return correct info for attribute with different argument types but the same name. Improve the situation by using a 'full' name that combines the syntax, scope, and name. This allows, for example, #pragma unroll and [[unroll(x)]] to coexist correctly even with different argument types. Also fix a bug in the StrictEnumParameters tablegen. If will now correctly specify each parameter instead of only the first. --- .../include/clang/Basic/AttributeCommonInfo.h | 6 + clang/lib/Basic/Attributes.cpp| 34 +++ clang/lib/Parse/ParseDecl.cpp | 104 +--- clang/lib/Sema/SemaStmtAttr.cpp | 7 - clang/test/SemaHLSL/Loops/unroll.hlsl | 5 +- .../TableGen/attrs-parser-string-switches.td | 232 ++ clang/utils/TableGen/ClangAttrEmitter.cpp | 71 -- 7 files changed, 394 insertions(+), 65 deletions(-) create mode 100644 clang/test/TableGen/attrs-parser-string-switches.td diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h index 5f024b4b5fd78..2c5baaf921cdf 100644 --- a/clang/include/clang/Basic/AttributeCommonInfo.h +++ b/clang/include/clang/Basic/AttributeCommonInfo.h @@ -191,6 +191,12 @@ class AttributeCommonInfo { /// __gnu__::__attr__ will be normalized to gnu::attr). std::string getNormalizedFullName() const; + /// Gets a normalized full name, with syntax, scope and name. + static std::string + getNormalizedFullNameWithSyntax(const IdentifierInfo *Name, + const IdentifierInfo *Scope, + AttributeCommonInfo::Syntax SyntaxUsed); + bool isDeclspecAttribute() const { return SyntaxUsed == AS_Declspec; } bool isMicrosoftAttribute() const { return SyntaxUsed == AS_Microsoft; } diff --git a/clang/lib/Basic/Attributes.cpp b/clang/lib/Basic/Attributes.cpp index 867d241a2cf84..0625c7637c009 100644 --- a/clang/lib/Basic/Attributes.cpp +++ b/clang/lib/Basic/Attributes.cpp @@ -153,6 +153,40 @@ std::string AttributeCommonInfo::getNormalizedFullName() const { normalizeName(getAttrName(), getScopeName(), getSyntax())); } +static StringRef getSyntaxName(AttributeCommonInfo::Syntax SyntaxUsed) { + switch (SyntaxUsed) { + case AttributeCommonInfo::AS_GNU: +return "GNU"; + case AttributeCommonInfo::AS_CXX11: +return "CXX11"; + case AttributeCommonInfo::AS_C23: +return "C23"; + case AttributeCommonInfo::AS_Declspec: +return "Declspec"; + case AttributeCommonInfo::AS_Microsoft: +return "Microsoft"; + case AttributeCommonInfo::AS_Keyword: +return "Keyword"; + case AttributeCommonInfo::AS_Pragma: +return "Pragma"; + case AttributeCommonInfo::AS_ContextSensitiveKeyword: +return "ContextSensitiveKeyword"; + case AttributeCommonInfo::AS_HLSLAnnotation: +return "HLSLAnnotation"; + case AttributeCommonInfo::AS_Implicit: +return "Implicit"; + } +} + +std::string AttributeCommonInfo::getNormalizedFullNameWithSyntax( +const IdentifierInfo *Name, const IdentifierInfo *ScopeName, +Syntax SyntaxUsed) { + std::string FullName = getSyntaxName(SyntaxUsed).str(); + FullName += "::"; + return FullName += + static_cast(normalizeName(Name, ScopeName, SyntaxUsed)); +} + unsigned AttributeCommonInfo::calculateAttributeSpellingListIndex() const { // Both variables will be used in tablegen generated // attribute spell list index matching code. diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 7ce9a9cea1c7a..28c69f9981abd 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/l
[clang] [clang] Refactor `IdentifierInfo::ObjcOrBuiltinID` (PR #71709)
@@ -3597,8 +3597,13 @@ class ASTIdentifierTableTrait { /// doesn't check whether the name has macros defined; use PublicMacroIterator /// to check that. bool isInterestingIdentifier(const IdentifierInfo *II, uint64_t MacroOffset) { -if (MacroOffset || II->isPoisoned() || -(!IsModule && II->getObjCOrBuiltinID()) || +II->getObjCOrBuiltinID(); mikerice1969 wrote: Hi @Endilll, Does this call to getObjCOrBuiltinID do anything? Static verifiers report it 'useless' since it only returns a value and the value is not used. https://github.com/llvm/llvm-project/pull/71709 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC][analyzer] Initialize pointer field in StreamOperationEvaluator (PR #89837)
https://github.com/mikerice1969 created https://github.com/llvm/llvm-project/pull/89837 Add an initializer for StreamSym, which is a pointer. The pointers in this class are set in the Init function, but all should be initialized in the constructor to avoid confusion and static verifier hits. >From 000ab376b0d853a417c5727b0e87edc11d7e66a2 Mon Sep 17 00:00:00 2001 From: Mike Rice Date: Tue, 23 Apr 2024 14:27:56 -0700 Subject: [PATCH] [NFC][analyzer] Initialize pointer field in StreamOperationEvaluator Add an initializer for StreamSym, which is a pointer. The pointers in this class are set in the Init function, but all should be initialized in the constructor to avoid confusion and static verifier hits. --- clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index bd495cd0f9710d..a0aa2316a7b45d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -600,7 +600,7 @@ struct StreamOperationEvaluator { SValBuilder &SVB; const ASTContext &ACtx; - SymbolRef StreamSym; + SymbolRef StreamSym = nullptr; const StreamState *SS = nullptr; const CallExpr *CE = nullptr; StreamErrorState NewES; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC][clang][analyzer] Initialize pointer field in StreamOperationEvaluator (PR #89837)
https://github.com/mikerice1969 edited https://github.com/llvm/llvm-project/pull/89837 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC][clang][analyzer] Initialize pointer field in StreamOperationEvaluator (PR #89837)
https://github.com/mikerice1969 closed https://github.com/llvm/llvm-project/pull/89837 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits