LLVMReactor: Remove "stack-probe-size" fudge, bind _chkstk extern

Fixes a number of dEQP tests that use over 4kB's of allocas on Win32.

Bug: b/135866359
Change-Id: I0e50eea6a70d284c8d653fb070f4ae982c02914c
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/33213
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index cc70e91..90dea9e 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -88,10 +88,16 @@
 #include <math.h>
 
 #if defined(__x86_64__) && defined(_WIN32)
-extern "C" void X86CompilationCallback()
-{
-	UNIMPLEMENTED("X86CompilationCallback");
-}
+	extern "C" void X86CompilationCallback()
+	{
+		UNIMPLEMENTED("X86CompilationCallback");
+	}
+#endif
+
+#if defined(_WIN64)
+	extern "C" void __chkstk();
+#elif defined(_WIN32)
+	extern "C" void _chkstk();
 #endif
 
 namespace rr
@@ -610,7 +616,11 @@
 			func_.emplace("sincosf_stret", reinterpret_cast<void*>(__sincosf_stret));
 #elif defined(__linux__)
 			func_.emplace("sincosf", reinterpret_cast<void*>(sincosf));
-#endif // __APPLE__
+#elif defined(_WIN64)
+			func_.emplace("chkstk", reinterpret_cast<void*>(__chkstk));
+#elif defined(_WIN32)
+			func_.emplace("chkstk", reinterpret_cast<void*>(_chkstk));
+#endif
 
 #ifdef __ANDROID__
 			func_.emplace("aeabi_unwind_cpp_pr0", reinterpret_cast<void*>(F::neverCalled));
@@ -936,18 +946,6 @@
 		auto func = llvm::Function::Create(functionType, llvm::GlobalValue::InternalLinkage, name, ::module);
 		func->setDoesNotThrow();
 		func->setCallingConv(llvm::CallingConv::C);
-
-		#if defined(_WIN32)
-			// FIXME(capn):
-			// On Windows, stack memory is committed in increments of 4 kB pages, with the last page
-			// having a trap which allows the OS to grow the stack. For functions with a stack frame
-			// larger than 4 kB this can cause an issue when a variable is accessed beyond the guard
-			// page. Therefore the compiler emits a call to __chkstk in the function prolog to probe
-			// the stack and ensure all pages have been committed. This is currently broken in LLVM
-			// JIT, but we can prevent emitting the stack probe call:
-			func->addFnAttr("stack-probe-size", "1048576");
-		#endif
-
 		return func;
 	}