[clang] [clang] Remove old Linux kernel workaround for ensuring stack space (PR #81533)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 12 13:00:35 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Arthur Eubanks (aeubanks)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/81533.diff
1 Files Affected:
- (modified) clang/tools/driver/cc1_main.cpp (-62)
``````````diff
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() {}
``````````
</details>
https://github.com/llvm/llvm-project/pull/81533
More information about the cfe-commits
mailing list