スタック拡張マクロ
概要
自分で確保した領域にスタックを付け替える.一度実行して正しく動くか確認すること.
実装
#define BEGIN_STACK(size) \
void *dummy = malloc(size); \
void *org_stack; \
char *my = (char *)alloca((1 + (int)(((long long)dummy) & 127)) * 16); \
*my = 0; \
asm volatile( \
"mov %%rsp, %%rbx\n" \
"mov %%rax, %%rsp" \
: "=b"(org_stack) \
: "a"((char *)dummy + (size)-1024));
#define END_STACK \
asm volatile("mov %%rax, %%rsp" ::"a"(org_stack)); \
free(dummy);
int test(int i) {
char weight[1024];
memset(weight, -1, sizeof weight);
std::cout << i << " KB" << std::endl;
if (weight[0])
return test(i + 1);
else
return 0;
}
int main() {
BEGIN_STACK(256 * 1024 * 1024); // 256 MB
test(0);
END_STACK;
}