This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#include "hack/stack_pivot.hpp"
#pragma once #include <cstdlib> /** * @note This is a workaround for WSL. We cannot use ulimit -s unlimited on the environment. * @note To use such techniques, you should take care of the alignment of rsp. If not, you'll get SIGSEGV around XMM registers. */ #define BEGIN_STACK_PIVOT(STACK_SIZE) \ static volatile char *old_stack; \ asm volatile("mov %%rsp, %0" : "=r" (old_stack) ); \ char *new_stack = ((char *)malloc(STACK_SIZE) + (STACK_SIZE) - 0x10); \ asm volatile("mov %0, %%rsp" : : "r" (new_stack) ); #define END_STACK_PIVOT() \ asm volatile("mov %0, %%rsp" : : "r" (old_stack) ); #define STACK_PIVOT_MAIN(moin) \ int main() { \ BEGIN_STACK_PIVOT(1 << 28) \ static int returncode = moin(); \ END_STACK_PIVOT() \ return returncode; \ }
#line 2 "hack/stack_pivot.hpp" #include <cstdlib> /** * @note This is a workaround for WSL. We cannot use ulimit -s unlimited on the environment. * @note To use such techniques, you should take care of the alignment of rsp. If not, you'll get SIGSEGV around XMM registers. */ #define BEGIN_STACK_PIVOT(STACK_SIZE) \ static volatile char *old_stack; \ asm volatile("mov %%rsp, %0" : "=r" (old_stack) ); \ char *new_stack = ((char *)malloc(STACK_SIZE) + (STACK_SIZE) - 0x10); \ asm volatile("mov %0, %%rsp" : : "r" (new_stack) ); #define END_STACK_PIVOT() \ asm volatile("mov %0, %%rsp" : : "r" (old_stack) ); #define STACK_PIVOT_MAIN(moin) \ int main() { \ BEGIN_STACK_PIVOT(1 << 28) \ static int returncode = moin(); \ END_STACK_PIVOT() \ return returncode; \ }