Commit b35615b4 by John Porto

Subzero. Removes X8664_STACK_HACK from the crosstests.

X8664_STACK_HACK was an intrusive way to get the crosstests to run while x32 support was not implemented in llvm. The hack is longer needed. R=eholk@chromium.org Review URL: https://codereview.chromium.org/1706883003 .
parent 425e06b0
...@@ -63,11 +63,7 @@ void testFixedLen(SizeT &TotalTests, SizeT &Passes, SizeT &Failures) { ...@@ -63,11 +63,7 @@ void testFixedLen(SizeT &TotalTests, SizeT &Passes, SizeT &Failures) {
#undef do_test_fixed #undef do_test_fixed
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
unsigned TotalTests = 0; unsigned TotalTests = 0;
unsigned Passes = 0; unsigned Passes = 0;
unsigned Failures = 0; unsigned Failures = 0;
......
...@@ -6,11 +6,7 @@ ...@@ -6,11 +6,7 @@
int simple_loop(int *a, int n); int simple_loop(int *a, int n);
int Subzero_simple_loop(int *a, int n); int Subzero_simple_loop(int *a, int n);
#ifdef X8664_STACK_HACK
int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
unsigned TotalTests = 0; unsigned TotalTests = 0;
unsigned Passes = 0; unsigned Passes = 0;
unsigned Failures = 0; unsigned Failures = 0;
......
//===- subzero/crosstest/stack_hack.x8664.c - X8664 stack hack ------------===//
//
// The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Implements main() for crosstests in x86-64.
//
//===----------------------------------------------------------------------===//
#include <assert.h>
#include <stdint.h>
#include <sys/mman.h>
// X8664_STACK_HACK needs to be defined before xdefs.h is included.
#define X8664_STACK_HACK
#include "xdefs.h"
/// xSetStack is used to set %rsp to NewRsp. OldRsp is a pointer that will be
/// used to save the old %rsp value.
#define xSetStack(NewRsp, OldRsp) \
do { \
__asm__ volatile("xchgq %1, %%rsp\n\t" \
"xchgq %1, %0" \
: "=r"(*(OldRsp)) \
: "r"(NewRsp)); \
} while (0)
extern int wrapped_main(int argc, char *argv[]);
unsigned char *xStackStart(uint32 StackEnd, uint32 Size) {
const uint32 PageBoundary = 4 << 20; // 4 MB.
const uint64 StackStart = StackEnd - Size;
assert(StackStart + (PageBoundary - 1) & ~(PageBoundary - 1) &&
"StackStart not aligned to page boundary.");
(void)PageBoundary;
assert((StackStart & 0xFFFFFFFF00000000ull) == 0 && "StackStart wraps.");
return (unsigned char *)StackStart;
}
unsigned char *xAllocStack(uint64 StackEnd, uint32 Size) {
assert((StackEnd & 0xFFFFFFFF00000000ull) == 0 && "Invalid StackEnd.");
void *Stack =
mmap(xStackStart(StackEnd, Size), Size, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS, -1, 0);
assert(Stack != MAP_FAILED && "mmap failed. no stack.");
return Stack;
}
void xDeallocStack(uint64 StackEnd, uint32 Size) {
assert((StackEnd & 0xFFFFFFFF00000000ull) == 0 && "Invalid StackEnd.");
munmap(xStackStart(StackEnd, Size), Size);
}
int main(int argc, char *argv[]) {
// These "locals" need to live **NOT** in the stack.
static int Argc;
static char **Argv;
static const uint32_t StackEnd = 0x80000000;
static const uint32_t StackSize = 40 * 1024 * 1024;
static unsigned char *new_rsp;
static unsigned char *old_rsp;
static unsigned char *dummy_rsp;
static int Failures;
Argc = argc;
Argv = argv;
new_rsp = xAllocStack(StackEnd, StackSize) + StackSize;
xSetStack(new_rsp, &old_rsp);
Failures = wrapped_main(Argc, Argv);
xSetStack(old_rsp, &new_rsp);
xDeallocStack(StackEnd, StackSize);
return Failures;
}
...@@ -380,11 +380,7 @@ void testsVecFp(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -380,11 +380,7 @@ void testsVecFp(size_t &TotalTests, size_t &Passes, size_t &Failures) {
#endif // !ARM32 #endif // !ARM32
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -111,11 +111,7 @@ void testByteSwap(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -111,11 +111,7 @@ void testByteSwap(size_t &TotalTests, size_t &Passes, size_t &Failures) {
} }
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -162,11 +162,7 @@ void testCallee(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -162,11 +162,7 @@ void testCallee(size_t &TotalTests, size_t &Passes, size_t &Failures) {
} }
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -114,11 +114,7 @@ void testVector(size_t &TotalTests, size_t &Passes, size_t &Failures, ...@@ -114,11 +114,7 @@ void testVector(size_t &TotalTests, size_t &Passes, size_t &Failures,
#endif // ARM32 #endif // ARM32
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -204,11 +204,7 @@ void testsVector(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -204,11 +204,7 @@ void testsVector(size_t &TotalTests, size_t &Passes, size_t &Failures) {
#endif // ARM32 #endif // ARM32
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -350,11 +350,7 @@ void testsVecI1(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -350,11 +350,7 @@ void testsVecI1(size_t &TotalTests, size_t &Passes, size_t &Failures) {
#endif // !ARM32 #endif // !ARM32
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -132,11 +132,7 @@ void testSelectI1(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -132,11 +132,7 @@ void testSelectI1(size_t &TotalTests, size_t &Passes, size_t &Failures) {
} }
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -22,11 +22,7 @@ ...@@ -22,11 +22,7 @@
DECLARE_TESTS() DECLARE_TESTS()
DECLARE_TESTS(Subzero_) DECLARE_TESTS(Subzero_)
#ifdef X8664_STACK_HACK
int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -25,11 +25,7 @@ namespace Subzero_ { ...@@ -25,11 +25,7 @@ namespace Subzero_ {
#include "test_strengthreduce.h" #include "test_strengthreduce.h"
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -176,22 +176,6 @@ template <typename Type> void *threadWrapper(void *Data) { ...@@ -176,22 +176,6 @@ template <typename Type> void *threadWrapper(void *Data) {
return NULL; return NULL;
} }
#ifndef X8664_STACK_HACK
void AllocStackForThread(uint32, pthread_attr_t *) {}
#else // defined(X8664_STACK_HACK)
void AllocStackForThread(uint32 m, pthread_attr_t *attr) {
static const uint32_t ThreadStackBase = 0x60000000;
static const uint32_t ThreadStackSize = 4 << 20; // 4MB.
if (pthread_attr_setstack(
attr, xAllocStack(ThreadStackBase - 2 * m * ThreadStackSize,
ThreadStackSize),
ThreadStackSize) != 0) {
std::cout << "pthread_attr_setstack: " << strerror(errno) << "\n";
abort();
}
}
#endif // X8664_STACK_HACK
template <typename Type> template <typename Type>
void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests, void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
size_t &Passes, size_t &Failures) { size_t &Passes, size_t &Failures) {
...@@ -232,7 +216,6 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests, ...@@ -232,7 +216,6 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
*AtomicLoc = Value1; *AtomicLoc = Value1;
for (size_t m = 0; m < NumThreads; ++m) { for (size_t m = 0; m < NumThreads; ++m) {
pthread_attr_init(&attr[m]); pthread_attr_init(&attr[m]);
AllocStackForThread(m, &attr[m]);
if (pthread_create(&t[m], &attr[m], &threadWrapper<Type>, if (pthread_create(&t[m], &attr[m], &threadWrapper<Type>,
reinterpret_cast<void *>(&TDataLlc)) != 0) { reinterpret_cast<void *>(&TDataLlc)) != 0) {
std::cout << "pthread_create failed w/ " << strerror(errno) << "\n"; std::cout << "pthread_create failed w/ " << strerror(errno) << "\n";
...@@ -248,7 +231,6 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests, ...@@ -248,7 +231,6 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
*AtomicLoc = Value1; *AtomicLoc = Value1;
for (size_t m = 0; m < NumThreads; ++m) { for (size_t m = 0; m < NumThreads; ++m) {
pthread_attr_init(&attr[m]); pthread_attr_init(&attr[m]);
AllocStackForThread(m, &attr[m]);
if (pthread_create(&t[m], &attr[m], &threadWrapper<Type>, if (pthread_create(&t[m], &attr[m], &threadWrapper<Type>,
m % 2 == 0 m % 2 == 0
? reinterpret_cast<void *>(&TDataLlc) ? reinterpret_cast<void *>(&TDataLlc)
...@@ -282,11 +264,7 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests, ...@@ -282,11 +264,7 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
} }
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -130,11 +130,7 @@ void testExtractElement(size_t &TotalTests, size_t &Passes, size_t &Failures) { ...@@ -130,11 +130,7 @@ void testExtractElement(size_t &TotalTests, size_t &Passes, size_t &Failures) {
free(TestVectors); free(TestVectors);
} }
#ifdef X8664_STACK_HACK
extern "C" int wrapped_main(int argc, char *argv[]) {
#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
#endif // X8664_STACK_HACK
size_t TotalTests = 0; size_t TotalTests = 0;
size_t Passes = 0; size_t Passes = 0;
size_t Failures = 0; size_t Failures = 0;
......
...@@ -21,33 +21,4 @@ typedef long long int64; ...@@ -21,33 +21,4 @@ typedef long long int64;
typedef unsigned long long uint64; typedef unsigned long long uint64;
typedef unsigned int SizeT; typedef unsigned int SizeT;
#ifdef X8664_STACK_HACK
// the X86_STACK_HACK is an intrusive way of getting the crosstests to run in
// x86_64 LP64 even with an ILP32 model. This hack allocates a new stack for
// running the tests in the low 4GB of the address space.
#ifdef __cplusplus
#define XTEST_EXTERN extern "C"
#else // !defined(__cplusplus)
#define XTEST_EXTERN extern
#endif // __cplusplus
/// xAllocStack allocates the memory chunk [StackEnd - Size - 1, StackEnd). It
/// requires StackEnd to be less than 32-bits long. Conversely, xDeallocStack
/// frees that memory chunk.
/// {@
XTEST_EXTERN unsigned char *xAllocStack(uint64 StackEnd, uint32 Size);
XTEST_EXTERN void xDeallocStack(uint64 StackEnd, uint32 Size);
/// @}
// wrapped_main is invoked by the x86-64 stack hack main. We declare a prototype
// so the compiler (and not the linker) can yell if a test's wrapped_main
// prototype does not match what we want.
XTEST_EXTERN int wrapped_main(int argc, char *argv[]);
#undef XTEST_EXTERN
#endif // X8664_STACK_HACK
#endif // SUBZERO_CROSSTEST_XDEFS_H_ #endif // SUBZERO_CROSSTEST_XDEFS_H_
...@@ -199,14 +199,7 @@ def main(): ...@@ -199,14 +199,7 @@ def main():
).format(root=nacl_root, ).format(root=nacl_root,
sb=get_sfi_string(args, 'sb', 'nonsfi', 'native'))) sb=get_sfi_string(args, 'sb', 'nonsfi', 'native')))
# TODO(jpp): clean up stack hack related code.
needs_stack_hack = False
target_params = [] target_params = []
if needs_stack_hack:
shellcmd('{bin}/clang -g -o stack_hack.x8664.{key}.o -c '
'stack_hack.x8664.c'.format(bin=bindir, key=key))
target_params.append('-DX8664_STACK_HACK')
target_params.append('stack_hack.x8664.{key}.o'.format(key=key))
if args.target == 'arm32': if args.target == 'arm32':
target_params.append('-DARM32') target_params.append('-DARM32')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment