#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[]) {
-#endif // X8664_STACK_HACK
unsigned TotalTests = 0;
unsigned Passes = 0;
unsigned Failures = 0;
int 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[]) {
-#endif // X8664_STACK_HACK
unsigned TotalTests = 0;
unsigned Passes = 0;
unsigned Failures = 0;
+++ /dev/null
-//===- 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;
-}
#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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
}
}
-#ifdef X8664_STACK_HACK
-extern "C" int wrapped_main(int argc, char *argv[]) {
-#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
}
}
-#ifdef X8664_STACK_HACK
-extern "C" int wrapped_main(int argc, char *argv[]) {
-#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
#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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
#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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
#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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
}
}
-#ifdef X8664_STACK_HACK
-extern "C" int wrapped_main(int argc, char *argv[]) {
-#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
DECLARE_TESTS()
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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
#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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
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>
void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
size_t &Passes, size_t &Failures) {
*AtomicLoc = Value1;
for (size_t m = 0; m < NumThreads; ++m) {
pthread_attr_init(&attr[m]);
- AllocStackForThread(m, &attr[m]);
if (pthread_create(&t[m], &attr[m], &threadWrapper<Type>,
reinterpret_cast<void *>(&TDataLlc)) != 0) {
std::cout << "pthread_create failed w/ " << strerror(errno) << "\n";
*AtomicLoc = Value1;
for (size_t m = 0; m < NumThreads; ++m) {
pthread_attr_init(&attr[m]);
- AllocStackForThread(m, &attr[m]);
if (pthread_create(&t[m], &attr[m], &threadWrapper<Type>,
m % 2 == 0
? reinterpret_cast<void *>(&TDataLlc)
}
}
-#ifdef X8664_STACK_HACK
-extern "C" int wrapped_main(int argc, char *argv[]) {
-#else // !defined(X8664_STACK_HACK)
int main(int argc, char *argv[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
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[]) {
-#endif // X8664_STACK_HACK
size_t TotalTests = 0;
size_t Passes = 0;
size_t Failures = 0;
typedef unsigned long long uint64;
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_
).format(root=nacl_root,
sb=get_sfi_string(args, 'sb', 'nonsfi', 'native')))
- # TODO(jpp): clean up stack hack related code.
- needs_stack_hack = False
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':
target_params.append('-DARM32')