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/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/D138472.diff b/D138472.diff deleted file mode 100644 index 5d3cd60..0000000 --- a/D138472.diff +++ /dev/null @@ -1,53 +0,0 @@ -From 04b642c646048dd9df652eba05d45beaa13bc895 Mon Sep 17 00:00:00 2001 -From: Konrad Kleine -Date: Mon, 23 Jan 2023 13:14:17 +0000 -Subject: [PATCH] Rebased D138472 - ---- - clang/CMakeLists.txt | 23 ++++++++++------------- - 1 file changed, 10 insertions(+), 13 deletions(-) - -diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt -index 090cfa352078..f87838776c32 100644 ---- a/clang/CMakeLists.txt -+++ b/clang/CMakeLists.txt -@@ -118,12 +118,11 @@ if(CLANG_BUILT_STANDALONE) - set(LLVM_UTILS_PROVIDED ON) - set(CLANG_TEST_DEPS FileCheck count not) - endif() -- set(UNITTEST_DIR ${LLVM_THIRD_PARTY_DIR}/unittest) -- if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h -- AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX} -- AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt) -- add_subdirectory(${UNITTEST_DIR} third-party/unittest) -- endif() -+ endif() -+ -+ find_package(LLVMGTest HINTS "${LLVM_CMAKE_DIR}") -+ if (NOT TARGET llvm_gtest) -+ message(FATAL_ERROR "llvm-gtest not found. Please install llvm-gtest or disable tests with -DLLVM_INCLUDE_TESTS=OFF") - endif() - - if(LLVM_LIT) -@@ -506,13 +505,11 @@ endif() - - - if( CLANG_INCLUDE_TESTS ) -- if(EXISTS ${LLVM_THIRD_PARTY_DIR}/unittest/googletest/include/gtest/gtest.h) -- add_subdirectory(unittests) -- list(APPEND CLANG_TEST_DEPS ClangUnitTests) -- list(APPEND CLANG_TEST_PARAMS -- clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg -- ) -- endif() -+ add_subdirectory(unittests) -+ list(APPEND CLANG_TEST_DEPS ClangUnitTests) -+ list(APPEND CLANG_TEST_PARAMS -+ clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg -+ ) - add_subdirectory(test) - add_subdirectory(bindings/python/tests) - --- -2.34.3 - diff --git a/D141581.diff b/D141581.diff deleted file mode 100644 index c227e22..0000000 --- a/D141581.diff +++ /dev/null @@ -1,25 +0,0 @@ -diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt ---- a/clang/lib/Basic/CMakeLists.txt -+++ b/clang/lib/Basic/CMakeLists.txt -@@ -110,7 +110,7 @@ - - DEPENDS - omp_gen -- RISCVTargetParserTableGen -+ LLVMTargetParser - ) - - target_link_libraries(clangBasic -diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt ---- a/clang/lib/Driver/CMakeLists.txt -+++ b/clang/lib/Driver/CMakeLists.txt -@@ -93,7 +93,7 @@ - - DEPENDS - ClangDriverOptions -- RISCVTargetParserTableGen -+ LLVMTargetParser - - LINK_LIBS - clangBasic - 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.rpmlintrc b/clang.rpmlintrc index 145e0a5..8781b63 100644 --- a/clang.rpmlintrc +++ b/clang.rpmlintrc @@ -1,4 +1,6 @@ # clang needs libstdc++-devel installed in order to compile c++ programs. addFilter("E: devel-dependency libstdc\+\+-devel") addFilter("E: explicit-lib-dependency libstdc\+\+-devel") +# clang installs libear to /usr/lib on all arches, so we have to use +# a hard-coded /usr/lib path in order to move it to the python3 sitelib. addFilter("E: hardcoded-library-path in %{_prefix}/lib/{libear") diff --git a/clang.spec b/clang.spec index ec13f09..87be54e 100644 --- a/clang.spec +++ b/clang.spec @@ -8,14 +8,24 @@ # See https://docs.fedoraproject.org/en-US/packaging-guidelines/#_compiler_macros %global toolchain clang +# Opt out of https://fedoraproject.org/wiki/Changes/fno-omit-frame-pointer +# https://bugzilla.redhat.com/show_bug.cgi?id=2158587 +%undefine _include_frame_pointers %global gts_version 13 %bcond_with compat_build -%bcond_with bundle_compat_lib +%bcond_without bundle_compat_lib %bcond_without check -%global maj_ver 17 -%global min_ver 0 +%ifnarch s390x +%global build_ldflags %{build_ldflags} -Wl,--build-id=sha1 +%bcond_without linker_lld +%else +%bcond_with linker_lld +%endif + +%global maj_ver 18 +%global min_ver 1 %global patch_ver 6 #global rc_ver 4 @@ -37,32 +47,45 @@ %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 16 +%global compat_maj_ver 17 %global compat_ver %{compat_maj_ver}.0.6 %endif -%ifarch ppc64le aarch64 -# Too many threads on ppc64 and aarch64 systems causes OOM errors. +%ifarch ppc64le +# Too many threads on ppc64 systems causes OOM errors. %global _smp_mflags -j8 %endif +%if 0%{?fedora} +# Try to limit memory use on i686. +%ifarch %ix86 +%constrain_build -m 3072 +%endif +%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: 5%{?dist} +Release: 1%{?dist} Summary: A C language family front-end for LLVM License: Apache-2.0 WITH LLVM-exception OR NCSA @@ -75,10 +98,8 @@ 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} Source5: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{compat_ver}/clang-%{compat_ver}.src.tar.xz @@ -96,34 +117,27 @@ Source105: 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 - # RHEL specific patches -Patch101: 0009-disable-recommonmark.patch +# Avoid unwanted dependency on python-myst-parser +Patch101: 0009-disable-myst-parser.patch Patch102: 0001-Driver-Give-devtoolset-path-precedence-over-Installe.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 # Required for 64-bit atomics on i686. BuildRequires: gcc-toolset-%{gts_version}-libatomic-devel # Required to handle LTO debuginfo. BuildRequires: gcc-toolset-%{gts_version}-gdb BuildRequires: clang +%if %{with linker_lld} +BuildRequires: lld +%endif BuildRequires: cmake BuildRequires: ninja-build @@ -131,8 +145,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} @@ -152,16 +166,19 @@ BuildRequires: emacs BuildRequires: python3-lit BuildRequires: python3-sphinx +%if %{undefined rhel} +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 %if 0%{?fedora} BuildRequires: /usr/bin/marshalparser +%if %{without compat_build} %global py_reproducible_pyc_path %{buildroot}%{python3_sitelib} %endif %endif @@ -224,35 +241,28 @@ Recommends: libatomic%{?_isa} Recommends: libomp-devel%{_isa} = %{version} Recommends: libomp%{_isa} = %{version} -# Use lld as the default linker on ARM due to rhbz#1918924 -%ifarch %{arm} -Requires: lld -%endif - %description libs 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: clang-devel(major) = %{maj_ver} %description devel Development header files for clang. %package resource-filesystem Summary: Filesystem package that owns the clang resource directory -Provides: %{name}-resource-filesystem(major) = %{maj_ver} +Provides: clang-resource-filesystem(major) = %{maj_ver} 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 @@ -273,14 +283,12 @@ Requires: emacs-filesystem %description tools-extra A set of extra tools built using Clang's tooling API. -%if 0%{?fedora} %package tools-extra-devel Summary: Development header files for clang tools Requires: %{name}-tools-extra = %{version}-%{release} %description tools-extra-devel Development header files for clang tools. -%endif # Put git-clang-format in its own package, because it Requires git # and we don't want to force users to install all those dependenices if they @@ -294,7 +302,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} @@ -354,14 +362,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 -# Use ThinLTO to limit build time. -%define _lto_cflags -flto=thin -# And disable LTO on AArch64 entirely. -%ifarch aarch64 +# Disable lto on i686 due to memory constraints. +%ifarch %ix86 %define _lto_cflags %{nil} %endif @@ -370,23 +375,17 @@ rm test/CodeGen/profile-filter.c %global _lto_cflags %nil %endif - -%if 0%{?__isa_bits} == 64 -sed -i 's/\@FEDORA_LLVM_LIB_SUFFIX\@/64/g' test/lit.cfg.py -%else -sed -i 's/\@FEDORA_LLVM_LIB_SUFFIX\@//g' test/lit.cfg.py -%endif - -%ifarch %ix86 -# Linking libclang.so goes out of memory even with ThinLTO and a single link job. -%global _lto_cflags %nil -%endif - -%ifarch s390 s390x %{arm} aarch64 %ix86 ppc64le +%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} @@ -424,11 +423,7 @@ mv ../cmake-%{compat_ver}.src ../cmake # We set CLANG_DEFAULT_PIE_ON_LINUX=OFF and PPC_LINUX_DEFAULT_IEEELONGDOUBLE=ON to match the # defaults used by Fedora's GCC. -# See https://bugzilla.redhat.com/show_bug.cgi?id=2134146 -%cmake -G Ninja \ -%ifarch %ix86 - -DHAVE_CXX_ATOMICS64_WITHOUT_LIB=OFF \ -%endif +%cmake -G Ninja \ -DCLANG_DEFAULT_PIE_ON_LINUX=OFF \ %if 0%{?fedora} || 0%{?rhel} > 9 -DPPC_LINUX_DEFAULT_IEEELONGDOUBLE=ON \ @@ -438,30 +433,26 @@ mv ../cmake-%{compat_ver}.src ../cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DPYTHON_EXECUTABLE=%{__python3} \ -DCMAKE_SKIP_RPATH:BOOL=ON \ -%ifarch s390 s390x %{arm} %ix86 ppc64le +%ifarch s390 s390x %ix86 ppc64le -DCMAKE_C_FLAGS_RELWITHDEBINFO="%{optflags} -DNDEBUG" \ -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="%{optflags} -DNDEBUG" \ %endif %if %{with compat_build} - -DCLANG_BUILD_TOOLS:BOOL=OFF \ - -DLLVM_CONFIG:FILEPATH=%{pkg_bindir}/llvm-config-%{maj_ver}-%{__isa_bits} \ -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}" \ @@ -489,6 +480,7 @@ mv ../cmake-%{compat_ver}.src ../cmake -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 @@ -506,25 +498,18 @@ export GDB=`which gdb` %cmake_install +# 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 + %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 -%if %{with compat_build} - -# 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 - # 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 %{SOURCE105} %{buildroot}%{_rpmmacrodir}/macros.%{name} sed -i -e "s|@@CLANG_MAJOR_VERSION@@|%{maj_ver}|" \ -e "s|@@CLANG_MINOR_VERSION@@|%{min_ver}|" \ @@ -540,62 +525,89 @@ 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 +%if 0%{?fedora} == 38 +# Install config file +mkdir -p %{buildroot}%{_sysconfdir}/%{name}/ +mv %{SOURCE6} %{buildroot}%{_sysconfdir}/%{name}/%{_target_platform}.cfg +%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}/%{_target_platform}-clang.cfg +echo "--gcc-triple=%{_target_cpu}-redhat-linux" >> %{buildroot}%{_sysconfdir}/%{name}/%{_target_platform}-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}/ - -# Remove clang-tidy headers. We don't ship the libraries for these. -rm -Rvf %{buildroot}%{_includedir}/clang-tidy/ - -%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 -%endif +#Add versioned resource directory macro +mkdir -p %{buildroot}%{_rpmmacrodir}/ +echo "%%clang%{maj_ver}_resource_dir %%{_prefix}/lib/clang/%{maj_ver}" >> %{buildroot}%{_rpmmacrodir}/macros.%{name} %check -# see rhbz#1994082 -sed -i -e "s/'ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH'/'ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH', 'SOURCE_DATE_EPOCH'/" test/lit.cfg.py - -%if %{without compat_build} %if %{with check} # Build test dependencies separately, to prevent invocations of host clang from being affected # by LD_LIBRARY_PATH below. @@ -610,12 +622,7 @@ mv "$compat_lib" . %endif # requires lit.py from LLVM utilities -# FIXME: Fix failing ARM tests -SOURCE_DATA_EPOCH=1629181597 LD_LIBRARY_PATH=%{buildroot}/%{_libdir} %{__ninja} check-all -C %{__cmake_builddir} || \ -%ifarch %{arm} -: -%else -false +SOURCE_DATA_EPOCH=1629181597 LD_LIBRARY_PATH=%{buildroot}/%{install_libdir} %{__ninja} check-all -C %{__cmake_builddir} %endif %if %{with bundle_compat_lib} @@ -623,18 +630,17 @@ mv ./libclang-cpp.so.%{compat_maj_ver} "$compat_lib" %endif %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 +%if %{without compat_build} %{_mandir}/man1/clang.1.gz %{_mandir}/man1/clang++.1.gz %{_mandir}/man1/clang-%{maj_ver}.1.gz @@ -648,22 +654,19 @@ mv ./libclang-cpp.so.%{compat_maj_ver} "$compat_lib" %{_libdir}/libclang.so.%{compat_maj_ver}* %{_libdir}/libclang-cpp.so.%{compat_maj_ver}* %endif +%{_sysconfdir}/%{name}/%{_target_platform}-clang.cfg +%{_sysconfdir}/%{name}/%{_target_platform}-clang++.cfg %files devel -%if %{without compat_build} -%{_libdir}/*.so -%{_includedir}/clang/ -%{_includedir}/clang-c/ -%{_libdir}/cmake/* -%{_bindir}/clang-tblgen -%dir %{_datadir}/clang/ -%{_rpmmacrodir}/macros.%{name} -%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/ @@ -672,86 +675,133 @@ mv ./libclang-cpp.so.%{compat_maj_ver} "$compat_lib" %dir %{install_prefix}/lib/clang/%{maj_ver}/include/ %dir %{install_prefix}/lib/clang/%{maj_ver}/lib/ %dir %{install_prefix}/lib/clang/%{maj_ver}/share/ -%if %{without compat_build} %{_rpmmacrodir}/macros.%{name} %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* - -%if 0%{?fedora} -%files tools-extra-devel -%{_includedir}/clang-tidy/ %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 +%{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 +* Tue May 28 2024 Konrad Kleine 18.1.6-1 +- Update to 18.1.6 + * Tue Jan 09 2024 Timm Bäder - 17.0.6-5 - Remove compat libs diff --git a/fix-ieee128-cross.diff b/fix-ieee128-cross.diff deleted file mode 100644 index 218c229..0000000 --- a/fix-ieee128-cross.diff +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/clang/test/Driver/ppc-float-abi-warning.cpp b/clang/test/Driver/ppc-float-abi-warning.cpp -index e3baa9f4c059..87d6d87a3b31 100644 ---- a/clang/test/Driver/ppc-float-abi-warning.cpp -+++ b/clang/test/Driver/ppc-float-abi-warning.cpp -@@ -17,10 +17,12 @@ - // RUN: -mabi=ieeelongdouble -stdlib=libc++ -Wno-unsupported-abi 2>&1 | \ - // RUN: FileCheck %s --check-prefix=NOWARN - // RUN: %clang -### --driver-mode=g++ -target powerpc64le-linux-gnu %s\ -+// RUN: --dyld-prefix=%S/Inputs/powerpc64le-linux-gnu-tree/gcc-12 \ - // RUN: -mabi=%if ppc_linux_default_ieeelongdouble %{ieeelongdouble%} \ - // RUN: %else %{ibmlongdouble%} -stdlib=libc++ 2>&1 | \ - // RUN: FileCheck %s --check-prefix=NOWARN - // RUN: %clang -### --driver-mode=g++ -target powerpc64le-linux-gnu %s\ -+// RUN: --dyld-prefix=%S/Inputs/powerpc64le-linux-gnu-tree/gcc-12 \ - // RUN: -mabi=%if ppc_linux_default_ieeelongdouble %{ibmlongdouble%} \ - // RUN: %else %{ieeelongdouble%} -stdlib=libc++ 2>&1 | FileCheck %s diff --git a/sources b/sources index c6498b6..a3b5ae3 100644 --- a/sources +++ b/sources @@ -1,10 +1,10 @@ +SHA512 (clang-18.1.6.src.tar.xz) = db9c41ae9cb9dc327ed819667b01ee75df4badbc7c11c1eadaa8d926c917c8e942d9282bed812f090ffa5cb3305b1d0145872530e267d16e2d4ea8c3fbe1b00f +SHA512 (clang-tools-extra-18.1.6.src.tar.xz) = 5f44491fe486d0c294d2b94801fadcb5ae72aa0a2b72df41ab9195b9199ce6f57df43b34e7e90ed0539fdbf0568e772b41cf097804a623b6c7384effa95783cd +SHA512 (clang-tools-extra-18.1.6.src.tar.xz.sig) = eaa5ad7f567b22eb57cf97b061a019cfe1b6833c806a07178c7bd558d8fd373aad4fdd836883ea87a13328e66ec138487e66b9088c76694ede991006d545e5f7 +SHA512 (clang-18.1.6.src.tar.xz.sig) = 618ee98d13c1a53e53e1d0b93e41ccddf38273721b2bf45e46a3c17f550c9d30545205c33171ffbcc8db5fa956dd2b4f6cf91cbd75222e45892ef3a4ce639f40 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 (clang-16.0.6.src.tar.xz) = 92c65b882e1504f4a9b8a3f6b8a24061505987aaacc8bb835115b4e4d74ac3a8c98343a308567b07c6b42bb99877c300bce3c4a5a25ada77abe65606aa25188d -SHA512 (clang-16.0.6.src.tar.xz.sig) = a3e68c07d61ce62dfe406464f1afce352f36480966ceaa3171889ac1f02441d9df48e938b3e81d6b73b5957dd6623171323a9915281dc052be0c5c7014e75f24 -SHA512 (llvm-16.0.6.src.tar.xz.sig) = 9adda28085f4a2e2a64dab1d8e4ff23c5629bbb0bb6b34afc081e44f6f85ac4f3c6cd0c3488af98c0fad939c33f9d2a8a0cbef67a577cd7fe3013bc2200452b1 -SHA512 (cmake-16.0.6.src.tar.xz) = 52ecd941d2d85a5b668caa5d0d40480cb6a97b3bf1174e634c2a93e9ef6d03670ca7e96abb0a60cb33ba537b93d5788754dab1f2f45c1f623f788162717d088b -SHA512 (cmake-16.0.6.src.tar.xz.sig) = d20c5e51315aa476775e6ce886684b9f882ce283fc40aa6c1b8f03964c77a1e745e2e1fb00b3488dddfe1a04378e2bfd090350de28e58088525a5305ecb1bea6 -SHA512 (llvm-16.0.6.src.tar.xz) = 8d4cdadc9a1ad249fbf9248c8e56f3bcafab73a473a0b0ca73499ed8825c62e27668aac4f1d03341631e5ad93701621e834e9e196ca32eac3ef805cf1c860083 +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/tests/README.md b/tests/README.md new file mode 100644 index 0000000..66adb43 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,6 @@ +# Gating testplans for Clang + +The tests for clang are in a separate repo: https://src.fedoraproject.org/tests/clang +This directory should contain only fmf plans (such as build-gating.fmf) which import +the tests from the tests repo. This can be done using the "url" parameter of the +plan's "discover" step. Reference: https://tmt.readthedocs.io/en/stable/spec/plans.html#fmf 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; - } -