[clang] [clang] Disable C++14 sized deallocation by default for MinGW targets (PR #97232)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jun 30 13:58:26 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-driver
Author: Martin Storsjö (mstorsjo)
<details>
<summary>Changes</summary>
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++.
---
Full diff: https://github.com/llvm/llvm-project/pull/97232.diff
2 Files Affected:
- (modified) clang/lib/Driver/ToolChains/MinGW.cpp (+22)
- (modified) clang/unittests/StaticAnalyzer/CallEventTest.cpp (+4)
``````````diff
diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp
index 11e81ebde7eeb..945863a4a8d63 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -726,6 +726,28 @@ 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
``````````
</details>
https://github.com/llvm/llvm-project/pull/97232
More information about the cfe-commits
mailing list