-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang] Disable C++14 sized deallocation by default for MinGW targets #97232
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-driver Author: Martin Storsjö (mstorsjo) ChangesThis reverts 130e93c for the MinGW target. This avoids the issue that is discussed in Full diff: https://github.com/llvm/llvm-project/pull/97232.diff 2 Files Affected:
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
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
424eb0f
to
bc68b1b
Compare
This reverts 130e93c for the MinGW target. This avoids the issue that is discussed in llvm#96899 (and which is summarized in the code comment). This is intended as a temporary workaround until the issue is handled better within libc++.
bc68b1b
to
a70379a
Compare
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/144/builds/1360 Here is the relevant piece of the build log for the reference:
|
…llvm#97232) This reverts 130e93c for the MinGW target. This avoids the issue that is discussed in llvm#96899 (and which is summarized in the code comment). This is intended as a temporary workaround until the issue is handled better within libc++.
…llvm#97232) This reverts 130e93c for the MinGW target. This avoids the issue that is discussed in llvm#96899 (and which is summarized in the code comment). This is intended as a temporary workaround until the issue is handled better within libc++.
This reverts 130e93c for the MinGW target.
This avoids the issue that is discussed in
#96899 (and which is summarized in the code comment). This is intended as a temporary workaround until the issue is handled better within libc++.