From a2adba8f4c6c0da291f9b82cb8dbd47e4f768586 Mon Sep 17 00:00:00 2001 From: Tulio Magno Quites Machado Filho Date: Tue, 2 Apr 2024 15:15:55 -0300 Subject: [PATCH] Update to LLVM 18.1.2 Resolves: RHEL-27724 --- ...instantiation-of-explicit-specifier-.patch | 260 ---------- 0001-Clang-Fix-build-with-GCC-14-on-ARM.patch | 65 --- ...-equivalent-triple-to-the-list-of-tr.patch | 59 --- 0001-Produce-DWARF4-by-default.patch | 125 ----- ...p-implicit-rpath-disabled-by-default.patch | 92 ++++ ...a-Make-test-dependency-on-LLVMHello-.patch | 1 - ...ed-libraries-to-customize-the-soname.patch | 39 ++ 0009-disable-myst-parser.patch | 26 + 0009-disable-recommonmark.patch | 26 - cfg.patch | 298 ----------- clang.spec | 482 ++++++++++++------ sources | 10 +- tsa.patch | 124 ----- 13 files changed, 488 insertions(+), 1119 deletions(-) delete mode 100644 0001-Clang-Defer-the-instantiation-of-explicit-specifier-.patch delete mode 100644 0001-Clang-Fix-build-with-GCC-14-on-ARM.patch delete mode 100644 0001-Driver-Add-a-gcc-equivalent-triple-to-the-list-of-tr.patch delete mode 100644 0001-Produce-DWARF4-by-default.patch create mode 100644 0001-Restore-fopenmp-implicit-rpath-disabled-by-default.patch create mode 100644 0001-cmake-Allow-shared-libraries-to-customize-the-soname.patch create mode 100644 0009-disable-myst-parser.patch delete mode 100644 0009-disable-recommonmark.patch delete mode 100644 cfg.patch delete mode 100644 tsa.patch diff --git a/0001-Clang-Defer-the-instantiation-of-explicit-specifier-.patch b/0001-Clang-Defer-the-instantiation-of-explicit-specifier-.patch deleted file mode 100644 index 69fb3ba..0000000 --- a/0001-Clang-Defer-the-instantiation-of-explicit-specifier-.patch +++ /dev/null @@ -1,260 +0,0 @@ -From fabda7312b91a768617f4ff1fabe0e1cc7d9131c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E5=88=98=E9=9B=A8=E5=9F=B9?= -Date: Wed, 1 Nov 2023 21:45:48 +0800 -Subject: [PATCH] [Clang] Defer the instantiation of explicit-specifier until - constraint checking completes (#70548) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Modifications: - -- Skip the instantiation of the explicit-specifier during Decl -substitution if we are deducing template arguments and the -explicit-specifier is value dependent. - -- Instantiate the explicit-specifier after the constraint checking -completes. - -- Make `instantiateExplicitSpecifier` a member function in order to -instantiate the explicit-specifier in different stages. - -This PR doesn’t defer the instantiation of the explicit specifier for -deduction guides, because I’m not familiar with deduction guides yet. -I’ll dig into it after this PR. - -According to my local test, GCC 13 tuple works with this PR. - -Fixes #59827. - ---------- - -Co-authored-by: Erich Keane -(cherry picked from commit 128b3b61fe6768c724975fd1df2be0abec848cf6) ---- - clang/docs/ReleaseNotes.rst | 4 ++ - clang/include/clang/Sema/Sema.h | 3 ++ - clang/lib/Sema/SemaTemplateDeduction.cpp | 53 +++++++++++++++++++ - .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 40 +++++++++----- - .../SemaCXX/cxx2a-explicit-bool-deferred.cpp | 31 +++++++++++ - 5 files changed, 117 insertions(+), 14 deletions(-) - create mode 100644 clang/test/SemaCXX/cxx2a-explicit-bool-deferred.cpp - -diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst -index a1143e14562e..8e3b94ca2017 100644 ---- a/clang/docs/ReleaseNotes.rst -+++ b/clang/docs/ReleaseNotes.rst -@@ -857,6 +857,10 @@ Bug Fixes to C++ Support - (`#64172 `_) and - (`#64723 `_). - -+- Clang now defers the instantiation of explicit specifier until constraint checking -+ completes (except deduction guides). Fixes: -+ (`#59827 `_) -+ - Bug Fixes to AST Handling - ^^^^^^^^^^^^^^^^^^^^^^^^^ - -diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h -index 3752a23faa85..b2ab6d0f8445 100644 ---- a/clang/include/clang/Sema/Sema.h -+++ b/clang/include/clang/Sema/Sema.h -@@ -10293,6 +10293,9 @@ public: - const CXXConstructorDecl *Tmpl, - const MultiLevelTemplateArgumentList &TemplateArgs); - -+ ExplicitSpecifier instantiateExplicitSpecifier( -+ const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES); -+ - NamedDecl *FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, - const MultiLevelTemplateArgumentList &TemplateArgs, - bool FindingInstantiatedContext = false); -diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp -index 31ea7be2975e..58dd1b783bac 100644 ---- a/clang/lib/Sema/SemaTemplateDeduction.cpp -+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp -@@ -3546,6 +3546,48 @@ static unsigned getPackIndexForParam(Sema &S, - llvm_unreachable("parameter index would not be produced from template"); - } - -+// if `Specialization` is a `CXXConstructorDecl` or `CXXConversionDecl`, -+// we'll try to instantiate and update its explicit specifier after constraint -+// checking. -+static Sema::TemplateDeductionResult instantiateExplicitSpecifierDeferred( -+ Sema &S, FunctionDecl *Specialization, -+ const MultiLevelTemplateArgumentList &SubstArgs, -+ TemplateDeductionInfo &Info, FunctionTemplateDecl *FunctionTemplate, -+ ArrayRef DeducedArgs) { -+ auto GetExplicitSpecifier = [](FunctionDecl *D) { -+ return isa(D) -+ ? cast(D)->getExplicitSpecifier() -+ : cast(D)->getExplicitSpecifier(); -+ }; -+ auto SetExplicitSpecifier = [](FunctionDecl *D, ExplicitSpecifier ES) { -+ isa(D) -+ ? cast(D)->setExplicitSpecifier(ES) -+ : cast(D)->setExplicitSpecifier(ES); -+ }; -+ -+ ExplicitSpecifier ES = GetExplicitSpecifier(Specialization); -+ Expr *ExplicitExpr = ES.getExpr(); -+ if (!ExplicitExpr) -+ return Sema::TDK_Success; -+ if (!ExplicitExpr->isValueDependent()) -+ return Sema::TDK_Success; -+ -+ Sema::InstantiatingTemplate Inst( -+ S, Info.getLocation(), FunctionTemplate, DeducedArgs, -+ Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution, Info); -+ if (Inst.isInvalid()) -+ return Sema::TDK_InstantiationDepth; -+ Sema::SFINAETrap Trap(S); -+ const ExplicitSpecifier InstantiatedES = -+ S.instantiateExplicitSpecifier(SubstArgs, ES); -+ if (InstantiatedES.isInvalid() || Trap.hasErrorOccurred()) { -+ Specialization->setInvalidDecl(true); -+ return Sema::TDK_SubstitutionFailure; -+ } -+ SetExplicitSpecifier(Specialization, InstantiatedES); -+ return Sema::TDK_Success; -+} -+ - /// Finish template argument deduction for a function template, - /// checking the deduced template arguments for completeness and forming - /// the function template specialization. -@@ -3675,6 +3717,17 @@ Sema::TemplateDeductionResult Sema::FinishTemplateArgumentDeduction( - } - } - -+ // We skipped the instantiation of the explicit-specifier during the -+ // substitution of `FD` before. So, we try to instantiate it back if -+ // `Specialization` is either a constructor or a conversion function. -+ if (isa(Specialization)) { -+ if (TDK_Success != instantiateExplicitSpecifierDeferred( -+ *this, Specialization, SubstArgs, Info, -+ FunctionTemplate, DeducedArgs)) { -+ return TDK_SubstitutionFailure; -+ } -+ } -+ - if (OriginalCallArgs) { - // C++ [temp.deduct.call]p4: - // In general, the deduction process attempts to find template argument -diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp -index f78d46f59503..a40510ce5f2c 100644 ---- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp -+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp -@@ -555,18 +555,16 @@ static void instantiateDependentAMDGPUFlatWorkGroupSizeAttr( - S.addAMDGPUFlatWorkGroupSizeAttr(New, Attr, MinExpr, MaxExpr); - } - --static ExplicitSpecifier --instantiateExplicitSpecifier(Sema &S, -- const MultiLevelTemplateArgumentList &TemplateArgs, -- ExplicitSpecifier ES, FunctionDecl *New) { -+ExplicitSpecifier Sema::instantiateExplicitSpecifier( -+ const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES) { - if (!ES.getExpr()) - return ES; - Expr *OldCond = ES.getExpr(); - Expr *Cond = nullptr; - { - EnterExpressionEvaluationContext Unevaluated( -- S, Sema::ExpressionEvaluationContext::ConstantEvaluated); -- ExprResult SubstResult = S.SubstExpr(OldCond, TemplateArgs); -+ *this, Sema::ExpressionEvaluationContext::ConstantEvaluated); -+ ExprResult SubstResult = SubstExpr(OldCond, TemplateArgs); - if (SubstResult.isInvalid()) { - return ExplicitSpecifier::Invalid(); - } -@@ -574,7 +572,7 @@ instantiateExplicitSpecifier(Sema &S, - } - ExplicitSpecifier Result(Cond, ES.getKind()); - if (!Cond->isTypeDependent()) -- S.tryResolveExplicitSpecifier(Result); -+ tryResolveExplicitSpecifier(Result); - return Result; - } - -@@ -2065,8 +2063,8 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl( - - ExplicitSpecifier InstantiatedExplicitSpecifier; - if (auto *DGuide = dyn_cast(D)) { -- InstantiatedExplicitSpecifier = instantiateExplicitSpecifier( -- SemaRef, TemplateArgs, DGuide->getExplicitSpecifier(), DGuide); -+ InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier( -+ TemplateArgs, DGuide->getExplicitSpecifier()); - if (InstantiatedExplicitSpecifier.isInvalid()) - return nullptr; - } -@@ -2440,11 +2438,25 @@ Decl *TemplateDeclInstantiator::VisitCXXMethodDecl( - } - } - -- ExplicitSpecifier InstantiatedExplicitSpecifier = -- instantiateExplicitSpecifier(SemaRef, TemplateArgs, -- ExplicitSpecifier::getFromDecl(D), D); -- if (InstantiatedExplicitSpecifier.isInvalid()) -- return nullptr; -+ auto InstantiatedExplicitSpecifier = ExplicitSpecifier::getFromDecl(D); -+ // deduction guides need this -+ const bool CouldInstantiate = -+ InstantiatedExplicitSpecifier.getExpr() == nullptr || -+ !InstantiatedExplicitSpecifier.getExpr()->isValueDependent(); -+ -+ // Delay the instantiation of the explicit-specifier until after the -+ // constraints are checked during template argument deduction. -+ if (CouldInstantiate || -+ SemaRef.CodeSynthesisContexts.back().Kind != -+ Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution) { -+ InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier( -+ TemplateArgs, InstantiatedExplicitSpecifier); -+ -+ if (InstantiatedExplicitSpecifier.isInvalid()) -+ return nullptr; -+ } else { -+ InstantiatedExplicitSpecifier.setKind(ExplicitSpecKind::Unresolved); -+ } - - // Implicit destructors/constructors created for local classes in - // DeclareImplicit* (see SemaDeclCXX.cpp) might not have an associated TSI. -diff --git a/clang/test/SemaCXX/cxx2a-explicit-bool-deferred.cpp b/clang/test/SemaCXX/cxx2a-explicit-bool-deferred.cpp -new file mode 100644 -index 000000000000..4d667008f2e2 ---- /dev/null -+++ b/clang/test/SemaCXX/cxx2a-explicit-bool-deferred.cpp -@@ -0,0 +1,31 @@ -+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s -+ -+template struct is_same { -+ static constexpr bool value = false; -+}; -+ -+template struct is_same { -+ static constexpr bool value = true; -+}; -+ -+template -+concept SameHelper = is_same::value; -+template -+concept same_as = SameHelper && SameHelper; -+ -+namespace deferred_instantiation { -+template constexpr X do_not_instantiate() { return nullptr; } -+ -+struct T { -+ template X> explicit(do_not_instantiate()) T(X) {} -+ -+ T(int) {} -+}; -+ -+T t(5); -+// expected-error@17{{cannot initialize}} -+// expected-note@20{{in instantiation of function template specialization}} -+// expected-note@30{{while substituting deduced template arguments}} -+// expected-note@30{{in instantiation of function template specialization}} -+T t2(5.0f); -+} // namespace deferred_instantiation --- -2.43.0 - diff --git a/0001-Clang-Fix-build-with-GCC-14-on-ARM.patch b/0001-Clang-Fix-build-with-GCC-14-on-ARM.patch deleted file mode 100644 index d916586..0000000 --- a/0001-Clang-Fix-build-with-GCC-14-on-ARM.patch +++ /dev/null @@ -1,65 +0,0 @@ -From bd2e848f15c0f25231126eb10cb0ab350717dfc0 Mon Sep 17 00:00:00 2001 -From: Nikita Popov -Date: Fri, 19 Jan 2024 12:09:13 +0100 -Subject: [PATCH] [Clang] Fix build with GCC 14 on ARM - -GCC 14 defines `__arm_streaming` as a macro expanding to -`[[arm::streaming]]`. Due to the nested macro use, this gets -expanded prior to concatenation. - -It doesn't look like C++ has a really clean way to prevent -macro expansion. The best I have found is to use `EMPTY ## X` where -`EMPTY` is an empty macro argument, so this is the hack I'm -implementing here. - -Fixes https://github.com/llvm/llvm-project/issues/78691. ---- - clang/include/clang/Basic/TokenKinds.def | 3 ++- - clang/include/clang/Basic/TokenKinds.h | 2 +- - clang/utils/TableGen/ClangAttrEmitter.cpp | 2 +- - 3 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def -index ef0dad0f2dcd..3add13c079f3 100644 ---- a/clang/include/clang/Basic/TokenKinds.def -+++ b/clang/include/clang/Basic/TokenKinds.def -@@ -752,8 +752,9 @@ KEYWORD(__builtin_available , KEYALL) - KEYWORD(__builtin_sycl_unique_stable_name, KEYSYCL) - - // Keywords defined by Attr.td. -+// The "EMPTY ## X" is used to prevent early macro-expansion of the keyword. - #ifndef KEYWORD_ATTRIBUTE --#define KEYWORD_ATTRIBUTE(X) KEYWORD(X, KEYALL) -+#define KEYWORD_ATTRIBUTE(X, EMPTY) KEYWORD(EMPTY ## X, KEYALL) - #endif - #include "clang/Basic/AttrTokenKinds.inc" - -diff --git a/clang/include/clang/Basic/TokenKinds.h b/clang/include/clang/Basic/TokenKinds.h -index e4857405bc7f..ff117bd5afc5 100644 ---- a/clang/include/clang/Basic/TokenKinds.h -+++ b/clang/include/clang/Basic/TokenKinds.h -@@ -109,7 +109,7 @@ bool isPragmaAnnotation(TokenKind K); - - inline constexpr bool isRegularKeywordAttribute(TokenKind K) { - return (false --#define KEYWORD_ATTRIBUTE(X) || (K == tok::kw_##X) -+#define KEYWORD_ATTRIBUTE(X, ...) || (K == tok::kw_##X) - #include "clang/Basic/AttrTokenKinds.inc" - ); - } -diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp -index b5813c6abc2b..79db17501b64 100644 ---- a/clang/utils/TableGen/ClangAttrEmitter.cpp -+++ b/clang/utils/TableGen/ClangAttrEmitter.cpp -@@ -3430,7 +3430,7 @@ void EmitClangAttrTokenKinds(RecordKeeper &Records, raw_ostream &OS) { - "RegularKeyword attributes with arguments are not " - "yet supported"); - OS << "KEYWORD_ATTRIBUTE(" -- << S.getSpellingRecord().getValueAsString("Name") << ")\n"; -+ << S.getSpellingRecord().getValueAsString("Name") << ", )\n"; - } - OS << "#undef KEYWORD_ATTRIBUTE\n"; - } --- -2.43.0 - diff --git a/0001-Driver-Add-a-gcc-equivalent-triple-to-the-list-of-tr.patch b/0001-Driver-Add-a-gcc-equivalent-triple-to-the-list-of-tr.patch deleted file mode 100644 index 6c94b4d..0000000 --- a/0001-Driver-Add-a-gcc-equivalent-triple-to-the-list-of-tr.patch +++ /dev/null @@ -1,59 +0,0 @@ -From d68a5a7817dc0d43853d8b84c9185dc24338664f Mon Sep 17 00:00:00 2001 -From: Tom Stellard -Date: Wed, 6 Oct 2021 05:32:44 +0000 -Subject: [PATCH] Driver: Add a gcc equivalent triple to the list of triples to - search - -There are some gcc triples, like x86_64-redhat-linux, that provide the -same behavior as a clang triple with a similar name (e.g. -x86_64-redhat-linux-gnu). When searching for a gcc install, also search -for a gcc equivalent triple if one exists. - -Differential Revision: https://reviews.llvm.org/D111207 ---- - clang/lib/Driver/ToolChains/Gnu.cpp | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp -index fe5bda5c6605..fd4a7f72be14 100644 ---- a/clang/lib/Driver/ToolChains/Gnu.cpp -+++ b/clang/lib/Driver/ToolChains/Gnu.cpp -@@ -1884,6 +1884,18 @@ static llvm::StringRef getGCCToolchainDir(const ArgList &Args, - return GCC_INSTALL_PREFIX; - } - -+/// This function takes a 'clang' triple and converts it to an equivalent gcc -+/// triple. -+static const char *ConvertToGccTriple(StringRef CandidateTriple) { -+ return llvm::StringSwitch(CandidateTriple) -+ .Case("aarch64-redhat-linux-gnu", "aarch64-redhat-linux") -+ .Case("i686-redhat-linux-gnu", "i686-redhat-linux") -+ .Case("ppc64le-redhat-linux-gnu", "ppc64le-redhat-linux") -+ .Case("s390x-redhat-linux-gnu", "s390x-redhat-linux") -+ .Case("x86_64-redhat-linux-gnu", "x86_64-redhat-linux") -+ .Default(NULL); -+} -+ - /// Initialize a GCCInstallationDetector from the driver. - /// - /// This performs all of the autodetection and sets up the various paths. -@@ -1904,6 +1916,16 @@ void Generic_GCC::GCCInstallationDetector::init( - // The compatible GCC triples for this particular architecture. - SmallVector CandidateTripleAliases; - SmallVector CandidateBiarchTripleAliases; -+ -+ // In some cases gcc uses a slightly different triple than clang for the -+ // same target. Convert the clang triple to the gcc equivalent and use that -+ // to search for the gcc install. -+ const char *ConvertedTriple = ConvertToGccTriple(TargetTriple.str()); -+ if (ConvertedTriple) { -+ CandidateTripleAliases.push_back(ConvertedTriple); -+ CandidateBiarchTripleAliases.push_back(ConvertedTriple); -+ } -+ - CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs, - CandidateTripleAliases, CandidateBiarchLibDirs, - CandidateBiarchTripleAliases); --- -2.26.2 - diff --git a/0001-Produce-DWARF4-by-default.patch b/0001-Produce-DWARF4-by-default.patch deleted file mode 100644 index 9b5b46b..0000000 --- a/0001-Produce-DWARF4-by-default.patch +++ /dev/null @@ -1,125 +0,0 @@ -From adbe188f3b1e3a0dd5ec80d9409601ba7f5b0423 Mon Sep 17 00:00:00 2001 -From: Konrad Kleine -Date: Thu, 24 Mar 2022 09:44:21 +0100 -Subject: [PATCH] Produce DWARF4 by default - -Have a look at the following commit to see when the move from DWARF 4 to 5 first happened upstream: - -https://github.com/llvm/llvm-project/commit/d3b26dea16108c427b19b5480c9edc76edf8f5b4?diff=unified ---- - clang/lib/Driver/ToolChain.cpp | 4 +--- - clang/test/CodeGen/dwarf-version.c | 4 ++-- - clang/test/Driver/as-options.s | 4 ++-- - clang/test/Driver/cl-options.c | 2 +- - clang/test/Driver/clang-g-opts.c | 2 +- - clang/test/Driver/ve-toolchain.c | 2 +- - clang/test/Driver/ve-toolchain.cpp | 2 +- - 7 files changed, 9 insertions(+), 11 deletions(-) - -diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp -index 8dafc3d481c2..92bf26dc8ec6 100644 ---- a/clang/lib/Driver/ToolChain.cpp -+++ b/clang/lib/Driver/ToolChain.cpp -@@ -428,9 +428,7 @@ ToolChain::getDefaultUnwindTableLevel(const ArgList &Args) const { - } - - unsigned ToolChain::GetDefaultDwarfVersion() const { -- // TODO: Remove the RISC-V special case when R_RISCV_SET_ULEB128 linker -- // support becomes more widely available. -- return getTriple().isRISCV() ? 4 : 5; -+ return 4; - } - - Tool *ToolChain::getClang() const { -diff --git a/clang/test/CodeGen/dwarf-version.c b/clang/test/CodeGen/dwarf-version.c -index d307eb3f101f..e7e93bf6688c 100644 ---- a/clang/test/CodeGen/dwarf-version.c -+++ b/clang/test/CodeGen/dwarf-version.c -@@ -2,8 +2,8 @@ - // RUN: %clang -target x86_64-linux-gnu -gdwarf-3 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER3 - // RUN: %clang -target x86_64-linux-gnu -gdwarf-4 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER4 - // RUN: %clang -target x86_64-linux-gnu -gdwarf-5 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER5 --// RUN: %clang -target x86_64-linux-gnu -g -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER5 --// RUN: %clang -target x86_64-linux-gnu -gdwarf -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER5 -+// RUN: %clang -target x86_64-linux-gnu -g -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER4 -+// RUN: %clang -target x86_64-linux-gnu -gdwarf -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER4 - - // The -isysroot is used as a hack to avoid LIT messing with the SDKROOT - // environment variable which indirecty overrides the version in the target -diff --git a/clang/test/Driver/as-options.s b/clang/test/Driver/as-options.s -index 73d002c7ef7e..71d55f7fd537 100644 ---- a/clang/test/Driver/as-options.s -+++ b/clang/test/Driver/as-options.s -@@ -122,7 +122,7 @@ - // RUN: FileCheck --check-prefix=DEBUG %s - // RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -g0 -g %s -### 2>&1 | \ - // RUN: FileCheck --check-prefix=DEBUG %s --// DEBUG: "-g" "-gdwarf-5" -+// DEBUG: "-g" "-gdwarf-4" - // RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -g -g0 %s -### 2>&1 | \ - // RUN: FileCheck --check-prefix=NODEBUG %s - // RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -gdwarf-5 -g0 %s -### 2>&1 | \ -@@ -141,7 +141,7 @@ - // RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -gdwarf-2 %s -### 2>&1 | \ - // RUN: FileCheck --check-prefix=GDWARF2 %s - // RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -gdwarf %s -### 2>&1 | \ --// RUN: FileCheck --check-prefix=GDWARF5 %s -+// RUN: FileCheck --check-prefix=GDWARF4 %s - - // RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -gdwarf-5 %s -### 2>&1 | \ - // RUN: FileCheck --check-prefix=GDWARF5 %s -diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c -index 6d929b19e7e2..373905c2e0fc 100644 ---- a/clang/test/Driver/cl-options.c -+++ b/clang/test/Driver/cl-options.c -@@ -569,7 +569,7 @@ - // RUN: %clang_cl /Z7 -gdwarf /c -### -- %s 2>&1 | FileCheck -check-prefix=Z7_gdwarf %s - // Z7_gdwarf: "-gcodeview" - // Z7_gdwarf: "-debug-info-kind=constructor" --// Z7_gdwarf: "-dwarf-version= -+// Z7_gdwarf: "-dwarf-version=4 - - // RUN: %clang_cl /ZH:MD5 /c -### -- %s 2>&1 | FileCheck -check-prefix=ZH_MD5 %s - // ZH_MD5: "-gsrc-hash=md5" -diff --git a/clang/test/Driver/clang-g-opts.c b/clang/test/Driver/clang-g-opts.c -index 5ee0fe64fe48..985158746137 100644 ---- a/clang/test/Driver/clang-g-opts.c -+++ b/clang/test/Driver/clang-g-opts.c -@@ -32,7 +32,7 @@ - - // CHECK-WITHOUT-G-NOT: -debug-info-kind - // CHECK-WITH-G: "-debug-info-kind=constructor" --// CHECK-WITH-G: "-dwarf-version=5" -+// CHECK-WITH-G: "-dwarf-version=4" - // CHECK-WITH-G-DWARF2: "-dwarf-version=2" - - // CHECK-WITH-G-STANDALONE: "-debug-info-kind=standalone" -diff --git a/clang/test/Driver/ve-toolchain.c b/clang/test/Driver/ve-toolchain.c -index 32e25769b6da..b8a2852daba8 100644 ---- a/clang/test/Driver/ve-toolchain.c -+++ b/clang/test/Driver/ve-toolchain.c -@@ -6,7 +6,7 @@ - /// Checking dwarf-version - - // RUN: %clang -### -g --target=ve %s 2>&1 | FileCheck -check-prefix=DWARF_VER %s --// DWARF_VER: "-dwarf-version=5" -+// DWARF_VER: "-dwarf-version=4" - - ///----------------------------------------------------------------------------- - /// Checking include-path -diff --git a/clang/test/Driver/ve-toolchain.cpp b/clang/test/Driver/ve-toolchain.cpp -index 5a33d5eceb61..cedf895b36dc 100644 ---- a/clang/test/Driver/ve-toolchain.cpp -+++ b/clang/test/Driver/ve-toolchain.cpp -@@ -7,7 +7,7 @@ - - // RUN: %clangxx -### -g --target=ve-unknown-linux-gnu \ - // RUN: %s 2>&1 | FileCheck -check-prefix=DWARF_VER %s --// DWARF_VER: "-dwarf-version=5" -+// DWARF_VER: "-dwarf-version=4" - - ///----------------------------------------------------------------------------- - /// Checking include-path --- -2.41.0 - diff --git a/0001-Restore-fopenmp-implicit-rpath-disabled-by-default.patch b/0001-Restore-fopenmp-implicit-rpath-disabled-by-default.patch new file mode 100644 index 0000000..bda5127 --- /dev/null +++ b/0001-Restore-fopenmp-implicit-rpath-disabled-by-default.patch @@ -0,0 +1,92 @@ +From ba9cfbe8e1d034d823dabf1c76d270fce8085f1b Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Thu, 9 Mar 2023 21:52:41 -0800 +Subject: [PATCH] Restore -fopenmp-implicit-rpath, disabled by default + +Used by redhat-rpm-config on older Fedora versions. +--- + clang/include/clang/Driver/Options.td | 6 ++++++ + clang/lib/Driver/ToolChains/CommonArgs.cpp | 19 +++++++++++++++++++ + clang/lib/Driver/ToolChains/CommonArgs.h | 3 +++ + clang/test/OpenMP/Inputs/libomp.a | 1 + + 4 files changed, 29 insertions(+) + create mode 100644 clang/test/OpenMP/Inputs/libomp.a + +diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td +index 31ecf98b806b..46aa49e1d0d1 100644 +--- a/clang/include/clang/Driver/Options.td ++++ b/clang/include/clang/Driver/Options.td +@@ -5194,6 +5194,12 @@ def offload_add_rpath: Flag<["--"], "offload-add-rpath">, + def no_offload_add_rpath: Flag<["--"], "no-offload-add-rpath">, + Flags<[NoArgumentUnused]>, + Alias; ++defm openmp_implicit_rpath: BoolFOption<"openmp-implicit-rpath", ++ LangOpts<"OpenMP">, ++ DefaultFalse, ++ PosFlag, ++ NegFlag, ++ BothFlags<[NoArgumentUnused]>>; + def r : Flag<["-"], "r">, Flags<[LinkerInput, NoArgumentUnused]>, + Group; + def regcall4 : Flag<["-"], "regcall4">, Group, +diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp +index 483ecd0ae592..55c673460a2f 100644 +--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp ++++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp +@@ -889,6 +889,22 @@ static void addOpenMPDeviceLibC(const ToolChain &TC, const ArgList &Args, + } + } + ++void tools::addOpenMPRuntimeSpecificRPath(const ToolChain &TC, ++ const ArgList &Args, ++ ArgStringList &CmdArgs) { ++ ++ if (Args.hasFlag(options::OPT_fopenmp_implicit_rpath, ++ options::OPT_fno_openmp_implicit_rpath, false)) { ++ // Default to clang lib / lib64 folder, i.e. the same location as device ++ // runtime ++ SmallString<256> DefaultLibPath = ++ llvm::sys::path::parent_path(TC.getDriver().Dir); ++ llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME); ++ CmdArgs.push_back("-rpath"); ++ CmdArgs.push_back(Args.MakeArgString(DefaultLibPath)); ++ } ++} ++ + void tools::addOpenMPRuntimeLibraryPath(const ToolChain &TC, + const ArgList &Args, + ArgStringList &CmdArgs) { +@@ -963,6 +979,9 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, + addOpenMPDeviceLibC(TC, Args, CmdArgs); + + addArchSpecificRPath(TC, Args, CmdArgs); ++ ++ if (RTKind == Driver::OMPRT_OMP) ++ addOpenMPRuntimeSpecificRPath(TC, Args, CmdArgs); + addOpenMPRuntimeLibraryPath(TC, Args, CmdArgs); + + return true; +diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h +index 096152bfbdcf..7e8bf6b8830c 100644 +--- a/clang/lib/Driver/ToolChains/CommonArgs.h ++++ b/clang/lib/Driver/ToolChains/CommonArgs.h +@@ -117,6 +117,9 @@ void AddAssemblerKPIC(const ToolChain &ToolChain, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + ++void addOpenMPRuntimeSpecificRPath(const ToolChain &TC, ++ const llvm::opt::ArgList &Args, ++ llvm::opt::ArgStringList &CmdArgs); + void addArchSpecificRPath(const ToolChain &TC, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + void addOpenMPRuntimeLibraryPath(const ToolChain &TC, +diff --git a/clang/test/OpenMP/Inputs/libomp.a b/clang/test/OpenMP/Inputs/libomp.a +new file mode 100644 +index 000000000000..8b277f0dd5dc +--- /dev/null ++++ b/clang/test/OpenMP/Inputs/libomp.a +@@ -0,0 +1 @@ ++! +-- +2.41.0 + diff --git a/0001-clang-tools-extra-Make-test-dependency-on-LLVMHello-.patch b/0001-clang-tools-extra-Make-test-dependency-on-LLVMHello-.patch index b69c7e7..37284a2 100644 --- a/0001-clang-tools-extra-Make-test-dependency-on-LLVMHello-.patch +++ b/0001-clang-tools-extra-Make-test-dependency-on-LLVMHello-.patch @@ -4,7 +4,6 @@ Date: Tue, 24 Jan 2023 22:46:25 +0000 Subject: [PATCH] clang-tools-extra: Make test dependency on LLVMHello optional This fixes clang + clang-tools-extra standalone build after -36892727e4f19a60778e371d78f8fb09d8122c85. --- clang-tools-extra/test/CMakeLists.txt | 10 +++++++++- clang-tools-extra/test/clang-tidy/CTTestTidyModule.cpp | 2 +- diff --git a/0001-cmake-Allow-shared-libraries-to-customize-the-soname.patch b/0001-cmake-Allow-shared-libraries-to-customize-the-soname.patch new file mode 100644 index 0000000..e425475 --- /dev/null +++ b/0001-cmake-Allow-shared-libraries-to-customize-the-soname.patch @@ -0,0 +1,39 @@ +From 3dc5722d5c7673a879f2b4680369d3ac8b6b64b6 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Wed, 4 Aug 2021 14:05:38 -0700 +Subject: [PATCH] cmake: Allow shared libraries to customize the soname using + LLVM_ABI_REVISION + +The LLVM_ABI_REVISION variable is intended to be used for release +candidates which introduce an ABI change to a shared library. This +variable can be specified per library, so there is not one global value +for all of LLVM. + +For example, if we LLVM X.0.0-rc2 introduces an ABI change for a library +compared with LLVM X.0.0-rc1, then the LLVM_ABI_REVISION number for +library will be incremented by 1. + +In the main branch, LLVM_ABI_REVISION should always be 0, it is only +meant to be used in the release branch. + +Differential Revision: https://reviews.llvm.org/D105594 +--- + clang/tools/clang-shlib/CMakeLists.txt | 5 +++++ + 3 files changed, 19 insertions(+), 2 deletions(-) + +diff --git a/clang/tools/clang-shlib/CMakeLists.txt b/clang/tools/clang-shlib/CMakeLists.txt +index 9c1f8ea452b3..4d785924e4bb 100644 +--- a/clang/tools/clang-shlib/CMakeLists.txt ++++ b/clang/tools/clang-shlib/CMakeLists.txt +@@ -1,3 +1,8 @@ ++# In the main branch, LLVM_ABI_REVISION should always be 0. In the release ++# branches, this should be incremented before each release candidate every ++# time the ABI of libclang-cpp.so changes. ++set(LLVM_ABI_REVISION 0) ++ + # Building libclang-cpp.so fails if LLVM_ENABLE_PIC=Off + if (NOT LLVM_ENABLE_PIC) + return() +-- +2.27.0 + diff --git a/0009-disable-myst-parser.patch b/0009-disable-myst-parser.patch new file mode 100644 index 0000000..12a5154 --- /dev/null +++ b/0009-disable-myst-parser.patch @@ -0,0 +1,26 @@ +From 988dd3f3363d8ab4ee53f61e0eb5afc6646c9d4f Mon Sep 17 00:00:00 2001 +From: Nikita Popov +Date: Tue, 26 Sep 2023 13:06:29 +0200 +Subject: [PATCH] disable myst parser + +--- + clang/docs/conf.py | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/clang/docs/conf.py b/clang/docs/conf.py +index ca310026f53e..dfb74273b5b2 100644 +--- a/clang/docs/conf.py ++++ b/clang/docs/conf.py +@@ -35,9 +35,6 @@ templates_path = ["_templates"] + + import sphinx + +-if sphinx.version_info >= (3, 0): +- extensions.append("myst_parser") +- + # The encoding of source files. + # source_encoding = 'utf-8-sig' + +-- +2.41.0 + diff --git a/0009-disable-recommonmark.patch b/0009-disable-recommonmark.patch deleted file mode 100644 index f6db5da..0000000 --- a/0009-disable-recommonmark.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff -Naur a/clang/docs/conf.py b/clang/docs/conf.py ---- a/clang/docs/conf.py 2020-09-15 09:12:24.318287611 +0000 -+++ b/clang/docs/conf.py 2020-09-15 15:01:00.025893199 +0000 -@@ -37,21 +37,7 @@ - ".rst": "restructuredtext", - } - --try: -- import recommonmark --except ImportError: -- # manpages do not use any .md sources -- if not tags.has("builder-man"): -- raise --else: -- import sphinx -- -- if sphinx.version_info >= (3, 0): -- # This requires 0.5 or later. -- extensions.append("recommonmark") -- else: -- source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} -- source_suffix[".md"] = "markdown" -+import sphinx - - # The encoding of source files. - # source_encoding = 'utf-8-sig' diff --git a/cfg.patch b/cfg.patch deleted file mode 100644 index 779558a..0000000 --- a/cfg.patch +++ /dev/null @@ -1,298 +0,0 @@ -commit ad4a5130277776d8f15f40ac5a6dede6ad3aabfb -Author: Timm Bäder -Date: Tue Aug 8 14:11:33 2023 +0200 - - [clang][CFG] Cleanup functions - - Add declarations declared with attribute(cleanup(...)) to the CFG, - similar to destructors. - - Differential Revision: https://reviews.llvm.org/D157385 - -diff --git a/clang/include/clang/Analysis/CFG.h b/clang/include/clang/Analysis/CFG.h -index cf4fa2da2a35..67383bb316d3 100644 ---- a/clang/include/clang/Analysis/CFG.h -+++ b/clang/include/clang/Analysis/CFG.h -@@ -14,10 +14,11 @@ - #ifndef LLVM_CLANG_ANALYSIS_CFG_H - #define LLVM_CLANG_ANALYSIS_CFG_H - --#include "clang/Analysis/Support/BumpVector.h" --#include "clang/Analysis/ConstructionContext.h" -+#include "clang/AST/Attr.h" - #include "clang/AST/ExprCXX.h" - #include "clang/AST/ExprObjC.h" -+#include "clang/Analysis/ConstructionContext.h" -+#include "clang/Analysis/Support/BumpVector.h" - #include "clang/Basic/LLVM.h" - #include "llvm/ADT/DenseMap.h" - #include "llvm/ADT/GraphTraits.h" -@@ -74,7 +75,8 @@ public: - MemberDtor, - TemporaryDtor, - DTOR_BEGIN = AutomaticObjectDtor, -- DTOR_END = TemporaryDtor -+ DTOR_END = TemporaryDtor, -+ CleanupFunction, - }; - - protected: -@@ -383,6 +385,32 @@ private: - } - }; - -+class CFGCleanupFunction final : public CFGElement { -+public: -+ CFGCleanupFunction() = default; -+ CFGCleanupFunction(const VarDecl *VD) -+ : CFGElement(Kind::CleanupFunction, VD) { -+ assert(VD->hasAttr()); -+ } -+ -+ const VarDecl *getVarDecl() const { -+ return static_cast(Data1.getPointer()); -+ } -+ -+ /// Returns the function to be called when cleaning up the var decl. -+ const FunctionDecl *getFunctionDecl() const { -+ const CleanupAttr *A = getVarDecl()->getAttr(); -+ return A->getFunctionDecl(); -+ } -+ -+private: -+ friend class CFGElement; -+ -+ static bool isKind(const CFGElement E) { -+ return E.getKind() == Kind::CleanupFunction; -+ } -+}; -+ - /// Represents C++ object destructor implicitly generated for automatic object - /// or temporary bound to const reference at the point of leaving its local - /// scope. -@@ -1142,6 +1170,10 @@ public: - Elements.push_back(CFGAutomaticObjDtor(VD, S), C); - } - -+ void appendCleanupFunction(const VarDecl *VD, BumpVectorContext &C) { -+ Elements.push_back(CFGCleanupFunction(VD), C); -+ } -+ - void appendLifetimeEnds(VarDecl *VD, Stmt *S, BumpVectorContext &C) { - Elements.push_back(CFGLifetimeEnds(VD, S), C); - } -diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp -index b82f9010a83f..03ab4c6fdf29 100644 ---- a/clang/lib/Analysis/CFG.cpp -+++ b/clang/lib/Analysis/CFG.cpp -@@ -881,6 +881,10 @@ private: - B->appendAutomaticObjDtor(VD, S, cfg->getBumpVectorContext()); - } - -+ void appendCleanupFunction(CFGBlock *B, VarDecl *VD) { -+ B->appendCleanupFunction(VD, cfg->getBumpVectorContext()); -+ } -+ - void appendLifetimeEnds(CFGBlock *B, VarDecl *VD, Stmt *S) { - B->appendLifetimeEnds(VD, S, cfg->getBumpVectorContext()); - } -@@ -1346,7 +1350,8 @@ private: - return {}; - } - -- bool hasTrivialDestructor(VarDecl *VD); -+ bool hasTrivialDestructor(const VarDecl *VD) const; -+ bool needsAutomaticDestruction(const VarDecl *VD) const; - }; - - } // namespace -@@ -1861,14 +1866,14 @@ void CFGBuilder::addAutomaticObjDestruction(LocalScope::const_iterator B, - if (B == E) - return; - -- SmallVector DeclsNonTrivial; -- DeclsNonTrivial.reserve(B.distance(E)); -+ SmallVector DeclsNeedDestruction; -+ DeclsNeedDestruction.reserve(B.distance(E)); - - for (VarDecl* D : llvm::make_range(B, E)) -- if (!hasTrivialDestructor(D)) -- DeclsNonTrivial.push_back(D); -+ if (needsAutomaticDestruction(D)) -+ DeclsNeedDestruction.push_back(D); - -- for (VarDecl *VD : llvm::reverse(DeclsNonTrivial)) { -+ for (VarDecl *VD : llvm::reverse(DeclsNeedDestruction)) { - if (BuildOpts.AddImplicitDtors) { - // If this destructor is marked as a no-return destructor, we need to - // create a new block for the destructor which does not have as a -@@ -1879,7 +1884,8 @@ void CFGBuilder::addAutomaticObjDestruction(LocalScope::const_iterator B, - Ty = getReferenceInitTemporaryType(VD->getInit()); - Ty = Context->getBaseElementType(Ty); - -- if (Ty->getAsCXXRecordDecl()->isAnyDestructorNoReturn()) -+ const CXXRecordDecl *CRD = Ty->getAsCXXRecordDecl(); -+ if (CRD && CRD->isAnyDestructorNoReturn()) - Block = createNoReturnBlock(); - } - -@@ -1890,8 +1896,10 @@ void CFGBuilder::addAutomaticObjDestruction(LocalScope::const_iterator B, - // objects, we end lifetime with scope end. - if (BuildOpts.AddLifetime) - appendLifetimeEnds(Block, VD, S); -- if (BuildOpts.AddImplicitDtors) -+ if (BuildOpts.AddImplicitDtors && !hasTrivialDestructor(VD)) - appendAutomaticObjDtor(Block, VD, S); -+ if (VD->hasAttr()) -+ appendCleanupFunction(Block, VD); - } - } - -@@ -1922,7 +1930,7 @@ void CFGBuilder::addScopeExitHandling(LocalScope::const_iterator B, - // is destroyed, for automatic variables, this happens when the end of the - // scope is added. - for (VarDecl* D : llvm::make_range(B, E)) -- if (hasTrivialDestructor(D)) -+ if (!needsAutomaticDestruction(D)) - DeclsTrivial.push_back(D); - - if (DeclsTrivial.empty()) -@@ -2095,7 +2103,11 @@ LocalScope* CFGBuilder::addLocalScopeForDeclStmt(DeclStmt *DS, - return Scope; - } - --bool CFGBuilder::hasTrivialDestructor(VarDecl *VD) { -+bool CFGBuilder::needsAutomaticDestruction(const VarDecl *VD) const { -+ return !hasTrivialDestructor(VD) || VD->hasAttr(); -+} -+ -+bool CFGBuilder::hasTrivialDestructor(const VarDecl *VD) const { - // Check for const references bound to temporary. Set type to pointee. - QualType QT = VD->getType(); - if (QT->isReferenceType()) { -@@ -2149,7 +2161,7 @@ LocalScope* CFGBuilder::addLocalScopeForVarDecl(VarDecl *VD, - return Scope; - - if (!BuildOpts.AddLifetime && !BuildOpts.AddScopes && -- hasTrivialDestructor(VD)) { -+ !needsAutomaticDestruction(VD)) { - assert(BuildOpts.AddImplicitDtors); - return Scope; - } -@@ -5287,6 +5299,7 @@ CFGImplicitDtor::getDestructorDecl(ASTContext &astContext) const { - case CFGElement::CXXRecordTypedCall: - case CFGElement::ScopeBegin: - case CFGElement::ScopeEnd: -+ case CFGElement::CleanupFunction: - llvm_unreachable("getDestructorDecl should only be used with " - "ImplicitDtors"); - case CFGElement::AutomaticObjectDtor: { -@@ -5830,6 +5843,11 @@ static void print_elem(raw_ostream &OS, StmtPrinterHelper &Helper, - break; - } - -+ case CFGElement::Kind::CleanupFunction: -+ OS << "CleanupFunction (" -+ << E.castAs().getFunctionDecl()->getName() << ")\n"; -+ break; -+ - case CFGElement::Kind::LifetimeEnds: - Helper.handleDecl(E.castAs().getVarDecl(), OS); - OS << " (Lifetime ends)\n"; -diff --git a/clang/lib/Analysis/PathDiagnostic.cpp b/clang/lib/Analysis/PathDiagnostic.cpp -index 348afc42319e..0cb03943c547 100644 ---- a/clang/lib/Analysis/PathDiagnostic.cpp -+++ b/clang/lib/Analysis/PathDiagnostic.cpp -@@ -567,6 +567,7 @@ getLocationForCaller(const StackFrameContext *SFC, - } - case CFGElement::ScopeBegin: - case CFGElement::ScopeEnd: -+ case CFGElement::CleanupFunction: - llvm_unreachable("not yet implemented!"); - case CFGElement::LifetimeEnds: - case CFGElement::LoopExit: -diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp -index 0e2ac78f7089..d7c5bd1d4042 100644 ---- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp -+++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp -@@ -993,6 +993,7 @@ void ExprEngine::processCFGElement(const CFGElement E, ExplodedNode *Pred, - ProcessLoopExit(E.castAs().getLoopStmt(), Pred); - return; - case CFGElement::LifetimeEnds: -+ case CFGElement::CleanupFunction: - case CFGElement::ScopeBegin: - case CFGElement::ScopeEnd: - return; -diff --git a/clang/test/Analysis/scopes-cfg-output.cpp b/clang/test/Analysis/scopes-cfg-output.cpp -index 6877d124e67a..4eb8967e3735 100644 ---- a/clang/test/Analysis/scopes-cfg-output.cpp -+++ b/clang/test/Analysis/scopes-cfg-output.cpp -@@ -1419,3 +1419,68 @@ label: - } - } - } -+ -+// CHECK: [B1] -+// CHECK-NEXT: 1: CFGScopeBegin(i) -+// CHECK-NEXT: 2: int i __attribute__((cleanup(cleanup_int))); -+// CHECK-NEXT: 3: CleanupFunction (cleanup_int) -+// CHECK-NEXT: 4: CFGScopeEnd(i) -+void cleanup_int(int *i); -+void test_cleanup_functions() { -+ int i __attribute__((cleanup(cleanup_int))); -+} -+ -+// CHECK: [B1] -+// CHECK-NEXT: 1: 10 -+// CHECK-NEXT: 2: i -+// CHECK-NEXT: 3: [B1.2] = [B1.1] -+// CHECK-NEXT: 4: return; -+// CHECK-NEXT: 5: CleanupFunction (cleanup_int) -+// CHECK-NEXT: 6: CFGScopeEnd(i) -+// CHECK-NEXT: Preds (1): B3 -+// CHECK-NEXT: Succs (1): B0 -+// CHECK: [B2] -+// CHECK-NEXT: 1: return; -+// CHECK-NEXT: 2: CleanupFunction (cleanup_int) -+// CHECK-NEXT: 3: CFGScopeEnd(i) -+// CHECK-NEXT: Preds (1): B3 -+// CHECK-NEXT: Succs (1): B0 -+// CHECK: [B3] -+// CHECK-NEXT: 1: CFGScopeBegin(i) -+// CHECK-NEXT: 2: int i __attribute__((cleanup(cleanup_int))); -+// CHECK-NEXT: 3: m -+// CHECK-NEXT: 4: [B3.3] (ImplicitCastExpr, LValueToRValue, int) -+// CHECK-NEXT: 5: 1 -+// CHECK-NEXT: 6: [B3.4] == [B3.5] -+// CHECK-NEXT: T: if [B3.6] -+// CHECK-NEXT: Preds (1): B4 -+// CHECK-NEXT: Succs (2): B2 B1 -+void test_cleanup_functions2(int m) { -+ int i __attribute__((cleanup(cleanup_int))); -+ -+ if (m == 1) { -+ return; -+ } -+ -+ i = 10; -+ return; -+} -+ -+// CHECK: [B1] -+// CHECK-NEXT: 1: CFGScopeBegin(f) -+// CHECK-NEXT: 2: (CXXConstructExpr, [B1.3], F) -+// CHECK-NEXT: 3: F f __attribute__((cleanup(cleanup_F))); -+// CHECK-NEXT: 4: CleanupFunction (cleanup_F) -+// CHECK-NEXT: 5: [B1.3].~F() (Implicit destructor) -+// CHECK-NEXT: 6: CFGScopeEnd(f) -+// CHECK-NEXT: Preds (1): B2 -+// CHECK-NEXT: Succs (1): B0 -+class F { -+public: -+ ~F(); -+}; -+void cleanup_F(F *f); -+ -+void test() { -+ F f __attribute((cleanup(cleanup_F))); -+} diff --git a/clang.spec b/clang.spec index ddeede0..ef62bce 100644 --- a/clang.spec +++ b/clang.spec @@ -11,11 +11,21 @@ %undefine _include_frame_pointers %bcond_with compat_build +%bcond_without bundle_compat_lib %bcond_without check -%global maj_ver 17 -%global min_ver 0 -%global patch_ver 6 +# Use lld to workaround memory limits on i686 and to fix bootstrap +# issue where clang uses the wrong gold plugin version when the +# LLVM compat package is present. +%ifnarch s390x +%bcond_without linker_lld +%else +%bcond_with linker_lld +%endif + +%global maj_ver 18 +%global min_ver 1 +%global patch_ver 2 #global rc_ver 4 %if %{with snapshot_build} @@ -36,13 +46,24 @@ %global install_includedir %{install_prefix}/include %global install_libdir %{install_prefix}/lib %global install_datadir %{install_prefix}/share +%global install_libexecdir %{install_prefix}/libexec +%global install_docdir %{install_datadir}/doc %global pkg_includedir %{install_includedir} %else %global pkg_name clang -%global install_prefix /usr +%global install_prefix %{_prefix} +%global install_bindir %{_bindir} %global install_datadir %{_datadir} %global install_libdir %{_libdir} +%global install_includedir %{_includedir} +%global install_libexecdir %{_libexecdir} +%global install_docdir %{_docdir} +%endif + +%if %{with bundle_compat_lib} +%global compat_maj_ver 17 +%global compat_ver %{compat_maj_ver}.0.6 %endif %ifarch ppc64le @@ -50,12 +71,17 @@ %global _smp_mflags -j8 %endif +# Try to limit memory use on i686. +%ifarch %ix86 +%constrain_build -m 3072 +%endif + %global clang_srcdir clang-%{clang_version}%{?rc_ver:rc%{rc_ver}}.src %global clang_tools_srcdir clang-tools-extra-%{clang_version}%{?rc_ver:rc%{rc_ver}}.src Name: %pkg_name Version: %{clang_version}%{?rc_ver:~rc%{rc_ver}}%{?llvm_snapshot_version_suffix:~%{llvm_snapshot_version_suffix}} -Release: 6%{?dist} +Release: 1%{?dist} Summary: A C language family front-end for LLVM License: Apache-2.0 WITH LLVM-exception OR NCSA @@ -68,11 +94,17 @@ Source1: %{llvm_snapshot_source_prefix}clang-tools-extra-%{llvm_snapshot_yyyy %else Source0: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{clang_version}%{?rc_ver:-rc%{rc_ver}}/%{clang_srcdir}.tar.xz Source3: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{clang_version}%{?rc_ver:-rc%{rc_ver}}/%{clang_srcdir}.tar.xz.sig -%if %{without compat_build} Source1: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{clang_version}%{?rc_ver:-rc%{rc_ver}}/%{clang_tools_srcdir}.tar.xz Source2: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{clang_version}%{?rc_ver:-rc%{rc_ver}}/%{clang_tools_srcdir}.tar.xz.sig -%endif Source4: release-keys.asc +%if %{with bundle_compat_lib} +Source6: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/clang-%{compat_ver}.src.tar.xz +Source7: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/clang-%{compat_ver}.src.tar.xz.sig +Source8: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/llvm-%{compat_ver}.src.tar.xz +Source9: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/llvm-%{compat_ver}.src.tar.xz.sig +Source10: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/cmake-%{compat_ver}.src.tar.xz +Source11: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/cmake-%{compat_ver}.src.tar.xz.sig +%endif %endif %if %{without compat_build} Source5: macros.%{name} @@ -81,32 +113,22 @@ Source5: macros.%{name} # Patches for clang Patch1: 0001-PATCH-clang-Make-funwind-tables-the-default-on-all-a.patch Patch2: 0003-PATCH-clang-Don-t-install-static-libraries.patch -Patch3: 0001-Driver-Add-a-gcc-equivalent-triple-to-the-list-of-tr.patch -# Drop the following patch after debugedit adds support to DWARF-5: -# https://sourceware.org/bugzilla/show_bug.cgi?id=28728 -Patch4: 0001-Produce-DWARF4-by-default.patch # Workaround a bug in ORC on ppc64le. # More info is available here: https://reviews.llvm.org/D159115#4641826 Patch5: 0001-Workaround-a-bug-in-ORC-on-ppc64le.patch -# Patches for https://issues.redhat.com/browse/RHEL-1650 -# Remove in clang 18. -Patch6: cfg.patch -Patch7: tsa.patch -Patch8: 0001-Clang-Fix-build-with-GCC-14-on-ARM.patch -Patch9: 0001-Clang-Defer-the-instantiation-of-explicit-specifier-.patch - # RHEL specific patches -# Avoid unwanted dependency on python-recommonmark -Patch101: 0009-disable-recommonmark.patch +# Avoid unwanted dependency on python-myst-parser +Patch101: 0009-disable-myst-parser.patch -%if %{without compat_build} # Patches for clang-tools-extra # See https://reviews.llvm.org/D120301 Patch201: 0001-clang-tools-extra-Make-test-dependency-on-LLVMHello-.patch -%endif BuildRequires: clang +%if %{with linker_lld} +BuildRequires: lld +%endif BuildRequires: cmake BuildRequires: ninja-build @@ -114,8 +136,8 @@ BuildRequires: ninja-build %global llvm_pkg_name llvm%{maj_ver} %else %global llvm_pkg_name llvm -BuildRequires: llvm-test = %{version} -BuildRequires: llvm-googletest = %{version} +BuildRequires: %{llvm_pkg_name}-test = %{version} +BuildRequires: %{llvm_pkg_name}-googletest = %{version} %endif BuildRequires: %{llvm_pkg_name}-devel = %{version} @@ -136,17 +158,17 @@ BuildRequires: python3-lit BuildRequires: python3-sphinx %if %{undefined rhel} -BuildRequires: python3-recommonmark +BuildRequires: python3-myst-parser %endif BuildRequires: libatomic # We need python3-devel for %%py3_shebang_fix BuildRequires: python3-devel -%if %{without compat_build} # For reproducible pyc file generation # See https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#_byte_compilation_reproducibility BuildRequires: /usr/bin/marshalparser +%if %{without compat_build} %global py_reproducible_pyc_path %{buildroot}%{python3_sitelib} %endif @@ -213,11 +235,9 @@ Runtime library for clang. %package devel Summary: Development header files for clang Requires: %{name}-libs = %{version}-%{release} -%if %{without compat_build} Requires: %{name}%{?_isa} = %{version}-%{release} # The clang CMake files reference tools from clang-tools-extra. Requires: %{name}-tools-extra%{?_isa} = %{version}-%{release} -%endif Provides: %{name}-devel(major) = %{maj_ver} %description devel @@ -231,7 +251,6 @@ BuildArch: noarch %description resource-filesystem This package owns the clang resouce directory: lib/clang/$version/ -%if %{without compat_build} %package analyzer Summary: A source code analysis framework License: Apache-2.0 WITH LLVM-exception OR NCSA OR MIT @@ -271,7 +290,7 @@ Requires: python3 %description -n git-clang-format clang-format integration for git. - +%if %{without compat_build} %package -n python3-clang Summary: Python3 bindings for clang Requires: %{name}-devel%{?_isa} = %{version}-%{release} @@ -288,9 +307,15 @@ Requires: python3 %{gpgverify} --keyring='%{SOURCE4}' --signature='%{SOURCE3}' --data='%{SOURCE0}' %endif -%if %{with compat_build} -%autosetup -n %{clang_srcdir} -p2 -%else +%if %{with bundle_compat_lib} +%{gpgverify} --keyring='%{SOURCE4}' --signature='%{SOURCE7}' --data='%{SOURCE6}' +%{gpgverify} --keyring='%{SOURCE4}' --signature='%{SOURCE9}' --data='%{SOURCE8}' +%{gpgverify} --keyring='%{SOURCE4}' --signature='%{SOURCE11}' --data='%{SOURCE10}' + +%setup -T -q -b 6 -n clang-%{compat_ver}.src +%setup -T -q -b 8 -n llvm-%{compat_ver}.src +%setup -T -q -b 10 -n cmake-%{compat_ver}.src +%endif %if %{without snapshot_build} %{gpgverify} --keyring='%{SOURCE4}' --signature='%{SOURCE2}' --data='%{SOURCE1}' @@ -321,12 +346,11 @@ rm test/CodeGen/profile-filter.c tools/scan-view/share/startfile.py \ tools/scan-build-py/bin/* \ tools/scan-build-py/libexec/* -%endif %build -# And disable LTO on AArch64 entirely. -%ifarch aarch64 +# Disable lto on i686 due to memory constraints. +%ifarch %ix86 %define _lto_cflags %{nil} %endif @@ -335,23 +359,50 @@ rm test/CodeGen/profile-filter.c %global _lto_cflags %nil %endif -%if 0%{?rhel} -%ifarch %{ix86} -# Linking libclang.so goes out of memory even with ThinLTO and a single link job. -%global _lto_cflags %nil -%endif -%endif - %ifarch s390 s390x aarch64 %ix86 ppc64le # Decrease debuginfo verbosity to reduce memory consumption during final library linking %global optflags %(echo %{optflags} | sed 's/-g /-g1 /') %endif +%if %{with linker_lld} +# TODO: Use LLVM_USE_LLD cmake option, but this doesn't seem to work with +# standalone builds. +%global build_ldflags %(echo %{build_ldflags} -fuse-ld=lld) +%endif + # Disable dwz on aarch64, because it takes a huge amount of time to decide not to optimize things. %ifarch aarch64 %define _find_debuginfo_dwz_opts %{nil} %endif +%if %{with bundle_compat_lib} + +mv ../clang-%{compat_ver}.src ../clang +mv ../cmake-%{compat_ver}.src ../cmake + +%global targets_to_build "X86;AMDGPU;PowerPC;NVPTX;SystemZ;AArch64;ARM;Mips;BPF;WebAssembly" + +# Disable LTO when building the compat libraries. This would perform LTO across all of LLVM and +# Clang, and fails due to "too many open files". We don't particularly care about the performance +# of these compat libraries. +%cmake -S ../llvm-%{compat_ver}.src -B ../clang-compat-libs -G Ninja \ + -DLLVM_ENABLE_PROJECTS=clang \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS:BOOL=OFF \ + -DLLVM_ENABLE_EH=ON \ + -DLLVM_ENABLE_RTTI:BOOL=ON \ + -DCMAKE_SKIP_RPATH:BOOL=ON \ + -DLLVM_TARGETS_TO_BUILD=%{targets_to_build} \ + -DLLVM_INCLUDE_BENCHMARKS=OFF \ + -DCMAKE_C_FLAGS_RELEASE="-fno-lto" \ + -DCMAKE_CXX_FLAGS_RELEASE="-fno-lto" \ + -DLLVM_INCLUDE_TESTS:BOOL=OFF + +%ninja_build -C ../clang-compat-libs libclang.so +%ninja_build -C ../clang-compat-libs libclang-cpp.so + +%endif + # We set CLANG_DEFAULT_PIE_ON_LINUX=OFF and PPC_LINUX_DEFAULT_IEEELONGDOUBLE=ON to match the # defaults used by Fedora's GCC. %cmake -G Ninja \ @@ -369,24 +420,21 @@ rm test/CodeGen/profile-filter.c -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="%{optflags} -DNDEBUG" \ %endif %if %{with compat_build} - -DCLANG_BUILD_TOOLS:BOOL=OFF \ -DCMAKE_INSTALL_PREFIX=%{install_prefix} \ - -DCLANG_INCLUDE_TESTS:BOOL=OFF \ - -DLLVM_INCLUDE_TESTS:BOOL=OFF \ -DLLVM_CMAKE_DIR=%{install_libdir}/cmake/llvm \ %else - -DCLANG_INCLUDE_TESTS:BOOL=ON \ - -DLLVM_BUILD_UTILS:BOOL=ON \ - -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=../%{clang_tools_srcdir} \ - -DLLVM_EXTERNAL_LIT=%{_bindir}/lit \ - -DLLVM_LIT_ARGS="-vv" \ - -DLLVM_MAIN_SRC_DIR=%{_datadir}/llvm/src \ %if 0%{?__isa_bits} == 64 -DLLVM_LIBDIR_SUFFIX=64 \ %else -DLLVM_LIBDIR_SUFFIX= \ %endif %endif + -DCLANG_INCLUDE_TESTS:BOOL=ON \ + -DLLVM_BUILD_UTILS:BOOL=ON \ + -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=../%{clang_tools_srcdir} \ + -DLLVM_EXTERNAL_LIT=%{_bindir}/lit \ + -DLLVM_LIT_ARGS="-vv" \ + -DLLVM_MAIN_SRC_DIR=%{_datadir}/llvm/src \ \ %if %{with snapshot_build} -DLLVM_VERSION_SUFFIX="%{llvm_snapshot_version_suffix}" \ @@ -414,6 +462,10 @@ rm test/CodeGen/profile-filter.c -DBUILD_SHARED_LIBS=OFF \ -DCLANG_REPOSITORY_STRING="%{?dist_vendor} %{version}-%{release}" \ -DCLANG_RESOURCE_DIR=../lib/clang/%{maj_ver} \ + -DCLANG_CONFIG_FILE_SYSTEM_DIR=%{_sysconfdir}/%{name}/ \ +%ifarch %{arm} + -DCLANG_DEFAULT_LINKER=lld \ +%endif -DCLANG_DEFAULT_UNWINDLIB=libgcc %cmake_build @@ -422,20 +474,18 @@ rm test/CodeGen/profile-filter.c %cmake_install -%if %{with compat_build} +%if %{with bundle_compat_lib} +install -m 0755 ../clang-compat-libs/lib/libclang.so.%{compat_maj_ver}* %{buildroot}%{_libdir} +install -m 0755 ../clang-compat-libs/lib/libclang-cpp.so.%{compat_maj_ver}* %{buildroot}%{_libdir} +%endif -# Remove binaries/other files -rm -Rf %{buildroot}%{install_bindir} -rm -Rf %{buildroot}%{install_prefix}/share -rm -Rf %{buildroot}%{install_prefix}/libexec -# Remove scanview-py helper libs -rm -Rf %{buildroot}%{install_prefix}/lib/{libear,libscanbuild} - -%else +# Add a symlink in /usr/bin to clang-format-diff +ln -s %{install_datadir}/clang/clang-format-diff.py %{buildroot}%{install_bindir}/clang-format-diff # File in the macros file for other packages to use. We are not doing this # in the compat package, because the version macros would # conflict with # eachother if both clang and the clang compat package were installed together. +%if %{without compat_build} install -p -m0644 -D %{SOURCE5} %{buildroot}%{_rpmmacrodir}/macros.%{name} sed -i -e "s|@@CLANG_MAJOR_VERSION@@|%{maj_ver}|" \ -e "s|@@CLANG_MINOR_VERSION@@|%{min_ver}|" \ @@ -451,100 +501,148 @@ install -p -m644 bindings/python/clang/* %{buildroot}%{python3_sitelib}/clang/ mv %{buildroot}%{_prefix}/%{_lib}/{libear,libscanbuild} %{buildroot}%{python3_sitelib} %py_byte_compile %{__python3} %{buildroot}%{python3_sitelib}/{libear,libscanbuild} -# Fix permissions of scan-view scripts -chmod a+x %{buildroot}%{_datadir}/scan-view/{Reporter.py,startfile.py} - -# multilib fix -%multilib_fix_c_header --file %{_includedir}/clang/Config/config.h - # Move emacs integration files to the correct directory mkdir -p %{buildroot}%{_emacs_sitestartdir} for f in clang-format.el clang-rename.el clang-include-fixer.el; do mv %{buildroot}{%{_datadir}/clang,%{_emacs_sitestartdir}}/$f done -# remove editor integrations (bbedit, sublime, emacs, vim) -rm -vf %{buildroot}%{_datadir}/clang/clang-format-bbedit.applescript -rm -vf %{buildroot}%{_datadir}/clang/clang-format-sublime.py* - -# TODO: Package html docs -rm -Rvf %{buildroot}%{_docdir}/Clang/clang/html -rm -Rvf %{buildroot}%{_datadir}/clang/clang-doc-default-stylesheet.css -rm -Rvf %{buildroot}%{_datadir}/clang/index.js - -# TODO: What are the Fedora guidelines for packaging bash autocomplete files? -rm -vf %{buildroot}%{_datadir}/clang/bash-autocomplete.sh - # Create Manpage symlinks ln -s clang.1.gz %{buildroot}%{_mandir}/man1/clang++.1.gz ln -s clang.1.gz %{buildroot}%{_mandir}/man1/clang-%{maj_ver}.1.gz ln -s clang.1.gz %{buildroot}%{_mandir}/man1/clang++-%{maj_ver}.1.gz -# Add clang++-{version} symlink -ln -s clang++ %{buildroot}%{_bindir}/clang++-%{maj_ver} - - # Fix permission chmod u-x %{buildroot}%{_mandir}/man1/scan-build.1* +# Add clang++-{version} symlink +ln -s clang++ %{buildroot}%{_bindir}/clang++-%{maj_ver} + +%else +# Not sure where to put these python modules for the compat build. +rm -Rf %{buildroot}%{install_libdir}/{libear,libscanbuild} + +# Not sure where to put the emacs integration files for the compat build. +rm -Rf %{buildroot}%{install_datadir}/clang/*.el + +# Not sure what to do with man pages for the compat builds +rm -Rf %{buildroot}%{install_prefix}/share/man/ + +# Add version suffix to binaries +mkdir -p %{buildroot}%{_bindir} +for f in %{buildroot}/%{install_bindir}/*; do + filename=`basename $f` + if echo $filename | grep -e '%{maj_ver}'; then + continue + fi + ln -s ../../%{install_bindir}/$filename %{buildroot}/%{_bindir}/$filename-%{maj_ver} +done + +# Add clang++-{version} symlink +ln -s ../../%{install_bindir}/clang++ %{buildroot}%{install_bindir}/clang++-%{maj_ver} + %endif +# Install config file for clang +%if %{maj_ver} >=18 +mkdir -p %{buildroot}%{_sysconfdir}/%{name}/ +echo "--gcc-triple=%{_target_cpu}-redhat-linux" >> %{buildroot}%{_sysconfdir}/%{name}/clang.cfg +%endif + +# Fix permissions of scan-view scripts +chmod a+x %{buildroot}%{install_datadir}/scan-view/{Reporter.py,startfile.py} + +# multilib fix +%multilib_fix_c_header --file %{install_includedir}/clang/Config/config.h + +# remove editor integrations (bbedit, sublime, emacs, vim) +rm -vf %{buildroot}%{install_datadir}/clang/clang-format-bbedit.applescript +rm -vf %{buildroot}%{install_datadir}/clang/clang-format-sublime.py* + +# TODO: Package html docs +rm -Rvf %{buildroot}%{install_docdir}/Clang/clang/html +rm -Rvf %{buildroot}%{install_datadir}/clang/clang-doc-default-stylesheet.css +rm -Rvf %{buildroot}%{install_datadir}/clang/index.js + +# TODO: What are the Fedora guidelines for packaging bash autocomplete files? +rm -vf %{buildroot}%{install_datadir}/clang/bash-autocomplete.sh + + # Create sub-directories in the clang resource directory that will be # populated by other packages mkdir -p %{buildroot}%{install_prefix}/lib/clang/%{maj_ver}/{bin,include,lib,share}/ - -%if %{without compat_build} -# Add a symlink in /usr/bin to clang-format-diff -ln -s %{_datadir}/clang/clang-format-diff.py %{buildroot}%{_bindir}/clang-format-diff +%if 0%{?fedora} == 38 +# Install config file +mkdir -p %{buildroot}%{_sysconfdir}/%{name}/ +mv %{SOURCE6} %{buildroot}%{_sysconfdir}/%{name}/%{_target_platform}.cfg %endif %check -%if %{without compat_build} %if %{with check} +%if %{with bundle_compat_lib} +# Move the compat -cpp.so out of the way so it's not picked up +# by the LD_LIBRARY_PATH below. +compat_lib=$(find %{buildroot}%{_libdir} -name libclang-cpp.so.%{compat_maj_ver}) +mv "$compat_lib" . +%endif + # Build test dependencies separately, to prevent invocations of host clang from being affected # by LD_LIBRARY_PATH below. %cmake_build --target clang-test-depends \ ExtraToolsUnitTests ClangdUnitTests ClangIncludeCleanerUnitTests ClangPseudoUnitTests # requires lit.py from LLVM utilities -LD_LIBRARY_PATH=%{buildroot}/%{_libdir} %{__ninja} check-all -C %{__cmake_builddir} +LD_LIBRARY_PATH=%{buildroot}/%{install_libdir} %{__ninja} check-all -C %{__cmake_builddir} + +%if %{with bundle_compat_lib} +mv ./libclang-cpp.so.%{compat_maj_ver} "$compat_lib" %endif %endif -%if %{without compat_build} %files %license LICENSE.TXT -%{_bindir}/clang -%{_bindir}/clang++ -%{_bindir}/clang-%{maj_ver} -%{_bindir}/clang++-%{maj_ver} -%{_bindir}/clang-cl -%{_bindir}/clang-cpp +%{install_bindir}/clang +%{install_bindir}/clang++ +%{install_bindir}/clang-%{maj_ver} +%{install_bindir}/clang++-%{maj_ver} +%{install_bindir}/clang-cl +%{install_bindir}/clang-cpp +%{_sysconfdir}/%{name}/clang.cfg +%if %{without compat_build} %{_mandir}/man1/clang.1.gz %{_mandir}/man1/clang++.1.gz %{_mandir}/man1/clang-%{maj_ver}.1.gz %{_mandir}/man1/clang++-%{maj_ver}.1.gz +%else +%{_bindir}/clang-%{maj_ver} +%{_bindir}/clang++-%{maj_ver} +%{_bindir}/clang-cl-%{maj_ver} +%{_bindir}/clang-cpp-%{maj_ver} %endif %files libs %{install_prefix}/lib/clang/%{maj_ver}/include/* %{install_libdir}/*.so.* +%if 0%{?fedora} == 38 +%{_sysconfdir}/%{name}/%{_target_platform}.cfg +%endif +%if %{with bundle_compat_lib} +%{_libdir}/libclang.so.%{compat_maj_ver}* +%{_libdir}/libclang-cpp.so.%{compat_maj_ver}* +%endif + %files devel -%if %{without compat_build} -%{_libdir}/*.so -%{_includedir}/clang/ -%{_includedir}/clang-c/ -%{_libdir}/cmake/* -%{_bindir}/clang-tblgen -%dir %{_datadir}/clang/ -%else %{install_libdir}/*.so -%{pkg_includedir}/clang/ -%{pkg_includedir}/clang-c/ -%{install_libdir}/cmake/ +%{install_includedir}/clang/ +%{install_includedir}/clang-c/ +%{install_libdir}/cmake/* +%{install_bindir}/clang-tblgen +%if %{with compat_build} +%{_bindir}/clang-tblgen-%{maj_ver} %endif +%dir %{install_datadir}/clang/ %files resource-filesystem %dir %{install_prefix}/lib/clang/ @@ -555,82 +653,148 @@ LD_LIBRARY_PATH=%{buildroot}/%{_libdir} %{__ninja} check-all -C %{__cmake_buildd %dir %{install_prefix}/lib/clang/%{maj_ver}/share/ %if %{without compat_build} %{_rpmmacrodir}/macros.%{name} +%endif %files analyzer -%{_bindir}/scan-view -%{_bindir}/scan-build -%{_bindir}/analyze-build -%{_bindir}/intercept-build -%{_bindir}/scan-build-py -%{_libexecdir}/ccc-analyzer -%{_libexecdir}/c++-analyzer -%{_libexecdir}/analyze-c++ -%{_libexecdir}/analyze-cc -%{_libexecdir}/intercept-c++ -%{_libexecdir}/intercept-cc -%{_datadir}/scan-view/ -%{_datadir}/scan-build/ +%{install_bindir}/scan-view +%{install_bindir}/scan-build +%{install_bindir}/analyze-build +%{install_bindir}/intercept-build +%{install_bindir}/scan-build-py +%if %{with compat_build} +%{_bindir}/scan-view-%{maj_ver} +%{_bindir}/scan-build-%{maj_ver} +%{_bindir}/analyze-build-%{maj_ver} +%{_bindir}/intercept-build-%{maj_ver} +%{_bindir}/scan-build-py-%{maj_ver} +%endif +%{install_libexecdir}/ccc-analyzer +%{install_libexecdir}/c++-analyzer +%{install_libexecdir}/analyze-c++ +%{install_libexecdir}/analyze-cc +%{install_libexecdir}/intercept-c++ +%{install_libexecdir}/intercept-cc +%{install_datadir}/scan-view/ +%{install_datadir}/scan-build/ +%if %{without compat_build} %{_mandir}/man1/scan-build.1.* %{python3_sitelib}/libear %{python3_sitelib}/libscanbuild +%endif %files tools-extra -%{_bindir}/amdgpu-arch -%{_bindir}/clang-apply-replacements -%{_bindir}/clang-change-namespace -%{_bindir}/clang-check -%{_bindir}/clang-doc -%{_bindir}/clang-extdef-mapping -%{_bindir}/clang-format -%{_bindir}/clang-include-cleaner -%{_bindir}/clang-include-fixer -%{_bindir}/clang-move -%{_bindir}/clang-offload-bundler -%{_bindir}/clang-offload-packager -%{_bindir}/clang-linker-wrapper -%{_bindir}/clang-pseudo -%{_bindir}/clang-query -%{_bindir}/clang-refactor -%{_bindir}/clang-rename -%{_bindir}/clang-reorder-fields -%{_bindir}/clang-repl -%{_bindir}/clang-scan-deps -%{_bindir}/clang-tidy -%{_bindir}/clangd -%{_bindir}/diagtool -%{_bindir}/hmaptool -%{_bindir}/nvptx-arch -%{_bindir}/pp-trace -%{_bindir}/c-index-test -%{_bindir}/find-all-symbols -%{_bindir}/modularize -%{_bindir}/clang-format-diff +%{install_bindir}/amdgpu-arch +%{install_bindir}/clang-apply-replacements +%{install_bindir}/clang-change-namespace +%{install_bindir}/clang-check +%{install_bindir}/clang-doc +%{install_bindir}/clang-extdef-mapping +%{install_bindir}/clang-format +%{install_bindir}/clang-include-cleaner +%{install_bindir}/clang-include-fixer +%{install_bindir}/clang-move +%{install_bindir}/clang-offload-bundler +%{install_bindir}/clang-offload-packager +%{install_bindir}/clang-linker-wrapper +%{install_bindir}/clang-pseudo +%{install_bindir}/clang-query +%{install_bindir}/clang-refactor +%{install_bindir}/clang-rename +%{install_bindir}/clang-reorder-fields +%{install_bindir}/clang-repl +%{install_bindir}/clang-scan-deps +%{install_bindir}/clang-tidy +%{install_bindir}/clangd +%{install_bindir}/diagtool +%{install_bindir}/hmaptool +%{install_bindir}/nvptx-arch +%{install_bindir}/pp-trace +%{install_bindir}/c-index-test +%{install_bindir}/find-all-symbols +%{install_bindir}/modularize +%{install_bindir}/clang-format-diff +%{install_bindir}/run-clang-tidy +%if %{with compat_build} +%{_bindir}/amdgpu-arch-%{maj_ver} +%{_bindir}/clang-apply-replacements-%{maj_ver} +%{_bindir}/clang-change-namespace-%{maj_ver} +%{_bindir}/clang-check-%{maj_ver} +%{_bindir}/clang-doc-%{maj_ver} +%{_bindir}/clang-extdef-mapping-%{maj_ver} +%{_bindir}/clang-format-%{maj_ver} +%{_bindir}/clang-include-cleaner-%{maj_ver} +%{_bindir}/clang-include-fixer-%{maj_ver} +%{_bindir}/clang-move-%{maj_ver} +%{_bindir}/clang-offload-bundler-%{maj_ver} +%{_bindir}/clang-offload-packager-%{maj_ver} +%{_bindir}/clang-linker-wrapper-%{maj_ver} +%{_bindir}/clang-pseudo-%{maj_ver} +%{_bindir}/clang-query-%{maj_ver} +%{_bindir}/clang-refactor-%{maj_ver} +%{_bindir}/clang-rename-%{maj_ver} +%{_bindir}/clang-reorder-fields-%{maj_ver} +%{_bindir}/clang-repl-%{maj_ver} +%{_bindir}/clang-scan-deps-%{maj_ver} +%{_bindir}/clang-tidy-%{maj_ver} +%{_bindir}/clangd-%{maj_ver} +%{_bindir}/diagtool-%{maj_ver} +%{_bindir}/hmaptool-%{maj_ver} +%{_bindir}/nvptx-arch-%{maj_ver} +%{_bindir}/pp-trace-%{maj_ver} +%{_bindir}/c-index-test-%{maj_ver} +%{_bindir}/find-all-symbols-%{maj_ver} +%{_bindir}/modularize-%{maj_ver} +%{_bindir}/clang-format-diff-%{maj_ver} +%{_bindir}/run-clang-tidy-%{maj_ver} +%else %{_mandir}/man1/diagtool.1.gz %{_emacs_sitestartdir}/clang-format.el %{_emacs_sitestartdir}/clang-rename.el %{_emacs_sitestartdir}/clang-include-fixer.el -%{_datadir}/clang/clang-format.py* -%{_datadir}/clang/clang-format-diff.py* -%{_datadir}/clang/clang-include-fixer.py* -%{_datadir}/clang/clang-tidy-diff.py* -%{_bindir}/run-clang-tidy -%{_datadir}/clang/run-find-all-symbols.py* -%{_datadir}/clang/clang-rename.py* +%endif +%{install_datadir}/clang/clang-format.py* +%{install_datadir}/clang/clang-format-diff.py* +%{install_datadir}/clang/clang-include-fixer.py* +%{install_datadir}/clang/clang-tidy-diff.py* +%{install_datadir}/clang/run-find-all-symbols.py* +%{install_datadir}/clang/clang-rename.py* %files tools-extra-devel -%{_includedir}/clang-tidy/ +%{install_includedir}/clang-tidy/ %files -n git-clang-format -%{_bindir}/git-clang-format +%{install_bindir}/git-clang-format +%if %{with compat_build} +%{_bindir}/git-clang-format-%{maj_ver} +%endif +%if %{without compat_build} %files -n python3-clang %{python3_sitelib}/clang/ %endif %changelog +* Mon Apr 01 2024 Tulio Magno Quites Machado Filho - 18.1.2-1 +- Update to LLVM 18.1.2 (RHEL-27724) + +* Thu Mar 21 2024 Tom Stellrd - 18.1.2-1 +- 18.1.2 Release + +* Mon Mar 11 2024 Tom Stellrd - 18.1.1-1 +- 18.1.1 Release + +* Fri Mar 08 2024 Tom Stellard - 18.1.0~rc4-3 +- Remove some LTO workarounds + +* Wed Feb 28 2024 Tom Stellard - 18.1.0~rc4-2 +- Fix gcc triple on i686 + +* Tue Feb 27 2024 Tom Stellard - 18.1.0~rc4-1 +- 18.0.1-rc4 Release + * Fri Jan 26 2024 Kefu Chai - 17.0.6-6 - Fix the too-early instantiation of conditional "explict" by applying the patch of https://github.com/llvm/llvm-project/commit/128b3b61fe6768c724975fd1df2be0abec848cf6 diff --git a/sources b/sources index 75492ab..0040f4a 100644 --- a/sources +++ b/sources @@ -1,4 +1,10 @@ +SHA512 (clang-18.1.2.src.tar.xz) = e969eb8ad163f0bbcd3998253fc6698d3e6c75ccf5233bc5d637736d522dfd67a5cc6977ee89b21d3d3866a07849460eeb3701d89986c139b7110dc6e27ff9fd +SHA512 (clang-18.1.2.src.tar.xz.sig) = 0f36efa13d034321b74f73bbb1de893e725936c77d04629b23e29af24bef1c76b73328e9818afd0e32bef632c74fb0b2c54dfff265f8bfce7b5c6dffbc7f3c18 +SHA512 (clang-tools-extra-18.1.2.src.tar.xz) = dbfb476c75e720ce06bea700f15227a6a21e446335843d0cd539f73692a19864c3ec1036b1378bf0446ccf7850c382d19bbb2742d7159ef2a6caa57f63611d8c +SHA512 (clang-tools-extra-18.1.2.src.tar.xz.sig) = 4fc4f4add88b0a70c83b4eba2478616a7223c5bf399cf027ddef14f82fd41fdd26c8784b26522ca1cc0198b22451bd76d747222d80e7a7a750ec171a3c32b088 SHA512 (clang-17.0.6.src.tar.xz) = da6f670a52d60c46bbe6bfa2870106f6a6714c9566fab293b8c624a555308104a1a05cd065643091d7006ef4533a9a722dff1fccaf26f348a0c0a5c7b9331439 -SHA512 (clang-tools-extra-17.0.6.src.tar.xz) = 5110dd36ee1c966d22760000f0c28cf070fd00b05445d418d264dbd3b48426a203f934e402d408fab2602dbf39a29d66898cc7c69c1a52b5e0e6e7097f9db877 -SHA512 (clang-tools-extra-17.0.6.src.tar.xz.sig) = 17ed3072a402ffa9f723e5ae5257a68ea6f9c874bec50d91c88159d38d8c121d23974ff3983f6f0d3308b5ec07086ba5c2d4cabfe6cbefeb6613fc30b577f966 SHA512 (clang-17.0.6.src.tar.xz.sig) = 091dca426d275f5a71836f2230e0f12f212527259cc4a941638104b8fcf42b4a122f9c140d07f8c663d38242d10ca5390de1f89d9d7bc0171b66c77a9aebbb3f +SHA512 (llvm-17.0.6.src.tar.xz) = bf9b04d0d45c67168b195c550cd8326e3a01176f92776705846aad3956a494bcb7a053b0b0bde19abd68dc0068e5c97ef99dee7eadfdb727bc0d758b2684f3bd +SHA512 (llvm-17.0.6.src.tar.xz.sig) = 904066c34ec0adf5b9e789af640329cadc7919b111aca77fa3ce26450696bace20e299e2592251f96ee33fb83da603423cc0ca63a67ad627916fcab0bed59689 +SHA512 (cmake-17.0.6.src.tar.xz) = b2c5e404ca36542d44e1a7f2801bbcecbcf5f1e8c63b793bb2308228483406bdfe002720aadb913c0228cd2bbe5998465eaadc4a49fad6a5eb6ff907fa5fd45a +SHA512 (cmake-17.0.6.src.tar.xz.sig) = fad2d91fc3e499dbd1b8c4acbc48ef748c106a04f7529232ea95abf3d006c4494e495643f77e653b1c96f7a0b79fe0706c5cdedd4f7dc4cbbab0ee5cf749c8ce diff --git a/tsa.patch b/tsa.patch deleted file mode 100644 index 2cf698e..0000000 --- a/tsa.patch +++ /dev/null @@ -1,124 +0,0 @@ -commit cf8e189a99f988398a48148b9ea7901948665ab0 -Author: Timm Bäder -Date: Wed Sep 6 12:19:20 2023 +0200 - - [clang][TSA] Thread safety cleanup functions - - Consider cleanup functions in thread safety analysis. - - Differential Revision: https://reviews.llvm.org/D152504 - -diff --git a/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h b/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h -index 9d28325c1ea6..13e37ac2b56b 100644 ---- a/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h -+++ b/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h -@@ -361,7 +361,7 @@ public: - unsigned NumArgs = 0; - - // Function arguments -- const Expr *const *FunArgs = nullptr; -+ llvm::PointerUnion FunArgs = nullptr; - - // is Self referred to with -> or .? - bool SelfArrow = false; -diff --git a/clang/lib/Analysis/ThreadSafety.cpp b/clang/lib/Analysis/ThreadSafety.cpp -index 3107d035254d..3e6ceb7d54c4 100644 ---- a/clang/lib/Analysis/ThreadSafety.cpp -+++ b/clang/lib/Analysis/ThreadSafety.cpp -@@ -1773,7 +1773,8 @@ void BuildLockset::checkPtAccess(const Expr *Exp, AccessKind AK, - /// - /// \param Exp The call expression. - /// \param D The callee declaration. --/// \param Self If \p Exp = nullptr, the implicit this argument. -+/// \param Self If \p Exp = nullptr, the implicit this argument or the argument -+/// of an implicitly called cleanup function. - /// \param Loc If \p Exp = nullptr, the location. - void BuildLockset::handleCall(const Expr *Exp, const NamedDecl *D, - til::LiteralPtr *Self, SourceLocation Loc) { -@@ -2417,6 +2418,15 @@ void ThreadSafetyAnalyzer::runAnalysis(AnalysisDeclContext &AC) { - AD.getTriggerStmt()->getEndLoc()); - break; - } -+ -+ case CFGElement::CleanupFunction: { -+ const CFGCleanupFunction &CF = BI.castAs(); -+ LocksetBuilder.handleCall(/*Exp=*/nullptr, CF.getFunctionDecl(), -+ SxBuilder.createVariable(CF.getVarDecl()), -+ CF.getVarDecl()->getLocation()); -+ break; -+ } -+ - case CFGElement::TemporaryDtor: { - auto TD = BI.castAs(); - -diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp -index b8286cef396c..63cc66852a9e 100644 ---- a/clang/lib/Analysis/ThreadSafetyCommon.cpp -+++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp -@@ -110,7 +110,8 @@ static StringRef ClassifyDiagnostic(QualType VDT) { - /// \param D The declaration to which the attribute is attached. - /// \param DeclExp An expression involving the Decl to which the attribute - /// is attached. E.g. the call to a function. --/// \param Self S-expression to substitute for a \ref CXXThisExpr. -+/// \param Self S-expression to substitute for a \ref CXXThisExpr in a call, -+/// or argument to a cleanup function. - CapabilityExpr SExprBuilder::translateAttrExpr(const Expr *AttrExp, - const NamedDecl *D, - const Expr *DeclExp, -@@ -144,7 +145,11 @@ CapabilityExpr SExprBuilder::translateAttrExpr(const Expr *AttrExp, - - if (Self) { - assert(!Ctx.SelfArg && "Ambiguous self argument"); -- Ctx.SelfArg = Self; -+ assert(isa(D) && "Self argument requires function"); -+ if (isa(D)) -+ Ctx.SelfArg = Self; -+ else -+ Ctx.FunArgs = Self; - - // If the attribute has no arguments, then assume the argument is "this". - if (!AttrExp) -@@ -312,8 +317,14 @@ til::SExpr *SExprBuilder::translateDeclRefExpr(const DeclRefExpr *DRE, - ? (cast(D)->getCanonicalDecl() == Canonical) - : (cast(D)->getCanonicalDecl() == Canonical)) { - // Substitute call arguments for references to function parameters -- assert(I < Ctx->NumArgs); -- return translate(Ctx->FunArgs[I], Ctx->Prev); -+ if (const Expr *const *FunArgs = -+ Ctx->FunArgs.dyn_cast()) { -+ assert(I < Ctx->NumArgs); -+ return translate(FunArgs[I], Ctx->Prev); -+ } -+ -+ assert(I == 0); -+ return Ctx->FunArgs.get(); - } - } - // Map the param back to the param of the original function declaration -diff --git a/clang/test/Sema/warn-thread-safety-analysis.c b/clang/test/Sema/warn-thread-safety-analysis.c -index 355616b73d96..642ea88ec3c9 100644 ---- a/clang/test/Sema/warn-thread-safety-analysis.c -+++ b/clang/test/Sema/warn-thread-safety-analysis.c -@@ -72,6 +72,8 @@ int get_value(int *p) SHARED_LOCKS_REQUIRED(foo_.mu_){ - return *p; - } - -+void unlock_scope(struct Mutex *const *mu) __attribute__((release_capability(**mu))); -+ - int main(void) { - - Foo_fun1(1); // expected-warning{{calling function 'Foo_fun1' requires holding mutex 'mu2'}} \ -@@ -127,6 +129,13 @@ int main(void) { - // expected-note@-1{{mutex released here}} - mutex_shared_unlock(&mu1); // expected-warning {{releasing mutex 'mu1' that was not held}} - -+ /// Cleanup functions -+ { -+ struct Mutex* const __attribute__((cleanup(unlock_scope))) scope = &mu1; -+ mutex_exclusive_lock(scope); // Note that we have to lock through scope, because no alias analysis! -+ // Cleanup happens automatically -> no warning. -+ } -+ - return 0; - } -