https://github.com/mstorsjo updated https://github.com/llvm/llvm-project/pull/97232
From bc68b1bc25f7a04a0ddf2188ae26ed7853913b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <mar...@martin.st> Date: Tue, 11 Jun 2024 15:50:26 +0300 Subject: [PATCH] [clang] Disable C++14 sized deallocation by default for MinGW targets This reverts 130e93cc26ca9d3ac50ec5a92e3109577ca2e702 for the MinGW target. This avoids the issue that is discussed in https://github.com/llvm/llvm-project/issues/96899 (and which is summarized in the code comment). This is intended as a temporary workaround until the issue is handled better within libc++. --- clang/lib/Driver/ToolChains/MinGW.cpp | 24 +++++++++++++++++++ .../StaticAnalyzer/CallEventTest.cpp | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp index 11e81ebde7eeb..c81a7ed170296 100644 --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -726,6 +726,30 @@ void toolchains::MinGW::addClangTargetOptions( } } + // Default to not enabling sized deallocation, but let user provided options + // override it. + // + // If using sized deallocation, user code that invokes delete will end up + // calling delete(void*,size_t). If the user wanted to override the + // operator delete(void*), there may be a fallback operator + // delete(void*,size_t) which calls the regular operator delete(void*). + // + // However, if the C++ standard library is linked in the form of a DLL, + // and the fallback operator delete(void*,size_t) is within this DLL (which is + // the case for libc++ at least) it will only redirect towards the library's + // default operator delete(void*), not towards the user's provided operator + // delete(void*). + // + // This issue can be avoided, if the fallback operators are linked statically + // into the callers, even if the C++ standard library is linked as a DLL. + // + // This is meant as a temporary workaround until libc++ implements this + // technique, which is tracked in + // https://github.com/llvm/llvm-project/issues/96899. + if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation, + options::OPT_fno_sized_deallocation)) + CC1Args.push_back("-fno-sized-deallocation"); + CC1Args.push_back("-fno-use-init-array"); for (auto Opt : {options::OPT_mthreads, options::OPT_mwindows, diff --git a/clang/unittests/StaticAnalyzer/CallEventTest.cpp b/clang/unittests/StaticAnalyzer/CallEventTest.cpp index 7c4132788ca7e..ba5b3e4e05ad8 100644 --- a/clang/unittests/StaticAnalyzer/CallEventTest.cpp +++ b/clang/unittests/StaticAnalyzer/CallEventTest.cpp @@ -76,7 +76,11 @@ TEST(CXXDeallocatorCall, SimpleDestructor) { } )", Diags)); +#ifdef __MINGW32__ + EXPECT_EQ(Diags, "test.CXXDeallocator: NumArgs: 1\n"); +#else EXPECT_EQ(Diags, "test.CXXDeallocator: NumArgs: 2\n"); +#endif } } // namespace _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits