[clang] aef36eb - [clang] Remove old Linux kernel workaround for ensuring stack space (#81533)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 12 13:42:03 PST 2024
Author: Arthur Eubanks
Date: 2024-02-12T13:41:58-08:00
New Revision: aef36ebb3b74c81589885c61b4fc066052dd9498
URL: https://github.com/llvm/llvm-project/commit/aef36ebb3b74c81589885c61b4fc066052dd9498
DIFF: https://github.com/llvm/llvm-project/commit/aef36ebb3b74c81589885c61b4fc066052dd9498.diff
LOG: [clang] Remove old Linux kernel workaround for ensuring stack space (#81533)
PR #71709 broke the Linux PIE build with `undefined symbol: alloca`
errors. With the newly included `clang/Basic/Builtins.h` in that PR, it
surfaces an issue with a combination of two previous patches.
26670dcba1609574cba5942aff78ff97b567c5f3 added `#undef alloca` so clang
builtins handling of alloca would work under MSVC (unsure if this is
still necessary).
194b6a3b1b1a99cc3c12c466a04320f271ebd8aa added code that calls `alloca`
to workaround a Linux kernel < 4.1 bug. Given that Linux 4.1 was EOL in
2018, it should be ok to remove this workaround.
Added:
Modified:
clang/tools/driver/cc1_main.cpp
Removed:
################################################################################
diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp
index e9d2c6aad371db..b5c6be3c557bb3 100644
--- a/clang/tools/driver/cc1_main.cpp
+++ b/clang/tools/driver/cc1_main.cpp
@@ -78,64 +78,6 @@ static void LLVMErrorHandler(void *UserData, const char *Message,
}
#ifdef CLANG_HAVE_RLIMITS
-#if defined(__linux__) && defined(__PIE__)
-static size_t getCurrentStackAllocation() {
- // If we can't compute the current stack usage, allow for 512K of command
- // line arguments and environment.
- size_t Usage = 512 * 1024;
- if (FILE *StatFile = fopen("/proc/self/stat", "r")) {
- // We assume that the stack extends from its current address to the end of
- // the environment space. In reality, there is another string literal (the
- // program name) after the environment, but this is close enough (we only
- // need to be within 100K or so).
- unsigned long StackPtr, EnvEnd;
- // Disable silly GCC -Wformat warning that complains about length
- // modifiers on ignored format specifiers. We want to retain these
- // for documentation purposes even though they have no effect.
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wformat"
-#endif
- if (fscanf(StatFile,
- "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*lu %*lu %*lu %*lu %*lu "
- "%*lu %*ld %*ld %*ld %*ld %*ld %*ld %*llu %*lu %*ld %*lu %*lu "
- "%*lu %*lu %lu %*lu %*lu %*lu %*lu %*lu %*llu %*lu %*lu %*d %*d "
- "%*u %*u %*llu %*lu %*ld %*lu %*lu %*lu %*lu %*lu %*lu %lu %*d",
- &StackPtr, &EnvEnd) == 2) {
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
- Usage = StackPtr < EnvEnd ? EnvEnd - StackPtr : StackPtr - EnvEnd;
- }
- fclose(StatFile);
- }
- return Usage;
-}
-
-#include <alloca.h>
-
-LLVM_ATTRIBUTE_NOINLINE
-static void ensureStackAddressSpace() {
- // Linux kernels prior to 4.1 will sometimes locate the heap of a PIE binary
- // relatively close to the stack (they are only guaranteed to be 128MiB
- // apart). This results in crashes if we happen to heap-allocate more than
- // 128MiB before we reach our stack high-water mark.
- //
- // To avoid these crashes, ensure that we have sufficient virtual memory
- // pages allocated before we start running.
- size_t Curr = getCurrentStackAllocation();
- const int kTargetStack = DesiredStackSize - 256 * 1024;
- if (Curr < kTargetStack) {
- volatile char *volatile Alloc =
- static_cast<volatile char *>(alloca(kTargetStack - Curr));
- Alloc[0] = 0;
- Alloc[kTargetStack - Curr - 1] = 0;
- }
-}
-#else
-static void ensureStackAddressSpace() {}
-#endif
-
/// Attempt to ensure that we have at least 8MiB of usable stack space.
static void ensureSufficientStack() {
struct rlimit rlim;
@@ -159,10 +101,6 @@ static void ensureSufficientStack() {
rlim.rlim_cur != DesiredStackSize)
return;
}
-
- // We should now have a stack of size at least DesiredStackSize. Ensure
- // that we can actually use that much, if necessary.
- ensureStackAddressSpace();
}
#else
static void ensureSufficientStack() {}
More information about the cfe-commits
mailing list