diff --git a/llvm/include/llvm/Support/ProgramStack.h b/llvm/include/llvm/Support/ProgramStack.h index 13729a299058..8be0f2ae170b 100644 --- a/llvm/include/llvm/Support/ProgramStack.h +++ b/llvm/include/llvm/Support/ProgramStack.h @@ -12,17 +12,6 @@ #include "llvm/ADT/STLFunctionalExtras.h" #include "llvm/Support/Compiler.h" -// LLVM_HAS_SPLIT_STACKS is exposed in the header because CrashRecoveryContext -// needs to know if it's running on another thread or not. -// -// Currently only Apple AArch64 is known to support split stacks in the debugger -// and other tooling. -#if defined(__APPLE__) && defined(__MACH__) && defined(__aarch64__) && \ - __has_extension(gnu_asm) -# define LLVM_HAS_SPLIT_STACKS -# define LLVM_HAS_SPLIT_STACKS_AARCH64 -#endif - namespace llvm { /// \returns an address close to the current value of the stack pointer. diff --git a/llvm/lib/Support/CrashRecoveryContext.cpp b/llvm/lib/Support/CrashRecoveryContext.cpp index 1ba0c2383dae..fc30d421506a 100644 --- a/llvm/lib/Support/CrashRecoveryContext.cpp +++ b/llvm/lib/Support/CrashRecoveryContext.cpp @@ -526,10 +526,5 @@ bool CrashRecoveryContext::RunSafelyOnThread(function_ref Fn, bool CrashRecoveryContext::RunSafelyOnNewStack(function_ref Fn, unsigned RequestedStackSize) { -#ifdef LLVM_HAS_SPLIT_STACKS - return runOnNewStack(RequestedStackSize, - function_ref([&]() { return RunSafely(Fn); })); -#else return RunSafelyOnThread(Fn, RequestedStackSize); -#endif } diff --git a/llvm/lib/Support/ProgramStack.cpp b/llvm/lib/Support/ProgramStack.cpp index 66f74ff660b2..e48265afb93f 100644 --- a/llvm/lib/Support/ProgramStack.cpp +++ b/llvm/lib/Support/ProgramStack.cpp @@ -18,9 +18,7 @@ # include // for _AddressOfReturnAddress #endif -#ifndef LLVM_HAS_SPLIT_STACKS -# include "llvm/Support/thread.h" -#endif +#include "llvm/Support/thread.h" using namespace llvm; @@ -54,74 +52,8 @@ unsigned llvm::getDefaultStackSize() { #endif } -// Not an anonymous namespace to avoid warning about undefined local function. -namespace llvm { -#ifdef LLVM_HAS_SPLIT_STACKS_AARCH64 -void runOnNewStackImpl(void *Stack, void (*Fn)(void *), void *Ctx) __asm__( - "_ZN4llvm17runOnNewStackImplEPvPFvS0_ES0_"); - -// This can't use naked functions because there is no way to know if cfi -// directives are being emitted or not. -// -// When adding new platforms it may be better to move to a .S file with macros -// for dealing with platform differences. -__asm__ ( - ".globl _ZN4llvm17runOnNewStackImplEPvPFvS0_ES0_\n\t" - ".p2align 2\n\t" - "_ZN4llvm17runOnNewStackImplEPvPFvS0_ES0_:\n\t" - ".cfi_startproc\n\t" - "mov x16, sp\n\t" - "sub x0, x0, #0x20\n\t" // subtract space from stack - "stp xzr, x16, [x0, #0x00]\n\t" // save old sp - "stp x29, x30, [x0, #0x10]\n\t" // save fp, lr - "mov sp, x0\n\t" // switch to new stack - "add x29, x0, #0x10\n\t" // switch to new frame - ".cfi_def_cfa w29, 16\n\t" - ".cfi_offset w30, -8\n\t" // lr - ".cfi_offset w29, -16\n\t" // fp - - "mov x0, x2\n\t" // Ctx is the only argument - "blr x1\n\t" // call Fn - - "ldp x29, x30, [sp, #0x10]\n\t" // restore fp, lr - "ldp xzr, x16, [sp, #0x00]\n\t" // load old sp - "mov sp, x16\n\t" - "ret\n\t" - ".cfi_endproc" -); -#endif -} // namespace llvm - -namespace { -#ifdef LLVM_HAS_SPLIT_STACKS -void callback(void *Ctx) { - (*reinterpret_cast *>(Ctx))(); -} -#endif -} // namespace - -#ifdef LLVM_HAS_SPLIT_STACKS -void llvm::runOnNewStack(unsigned StackSize, function_ref Fn) { - if (StackSize == 0) - StackSize = getDefaultStackSize(); - - // We use malloc here instead of mmap because: - // - it's simpler, - // - many malloc implementations will reuse the allocation in cases where - // we're bouncing accross the edge of a stack boundry, and - // - many malloc implemenations will already provide guard pages for - // allocations this large. - void *Stack = malloc(StackSize); - void *BottomOfStack = (char *)Stack + StackSize; - - runOnNewStackImpl(BottomOfStack, callback, &Fn); - - free(Stack); -} -#else void llvm::runOnNewStack(unsigned StackSize, function_ref Fn) { llvm::thread Thread( StackSize == 0 ? std::nullopt : std::optional(StackSize), Fn); Thread.join(); } -#endif