OSDN Git Service

Subzero. Removes X8664_STACK_HACK from the crosstests.
authorJohn Porto <jpp@chromium.org>
Wed, 17 Feb 2016 18:16:12 +0000 (10:16 -0800)
committerJohn Porto <jpp@chromium.org>
Wed, 17 Feb 2016 18:16:12 +0000 (10:16 -0800)
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 .

16 files changed:
crosstest/mem_intrin_main.cpp
crosstest/simple_loop_main.c
crosstest/stack_hack.x8664.c [deleted file]
crosstest/test_arith_main.cpp
crosstest/test_bitmanip_main.cpp
crosstest/test_calling_conv_main.cpp
crosstest/test_cast_main.cpp
crosstest/test_fcmp_main.cpp
crosstest/test_icmp_main.cpp
crosstest/test_select_main.cpp
crosstest/test_stacksave_main.c
crosstest/test_strengthreduce_main.cpp
crosstest/test_sync_atomic_main.cpp
crosstest/test_vector_ops_main.cpp
crosstest/xdefs.h
pydir/crosstest.py

index 3b5135d..e20a9ab 100644 (file)
@@ -63,11 +63,7 @@ void testFixedLen(SizeT &TotalTests, SizeT &Passes, SizeT &Failures) {
 #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;
index 6c738b9..ed34b02 100644 (file)
@@ -6,11 +6,7 @@
 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;
diff --git a/crosstest/stack_hack.x8664.c b/crosstest/stack_hack.x8664.c
deleted file mode 100644 (file)
index 45b0bb7..0000000
+++ /dev/null
@@ -1,76 +0,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;
-}
index 9cee652..08fe361 100644 (file)
@@ -380,11 +380,7 @@ void testsVecFp(size_t &TotalTests, size_t &Passes, size_t &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;
index f872f20..9e643ff 100644 (file)
@@ -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[]) {
-#endif // X8664_STACK_HACK
   size_t TotalTests = 0;
   size_t Passes = 0;
   size_t Failures = 0;
index f0feef0..ce5ecda 100644 (file)
@@ -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[]) {
-#endif // X8664_STACK_HACK
   size_t TotalTests = 0;
   size_t Passes = 0;
   size_t Failures = 0;
index 97e7181..996a063 100644 (file)
@@ -114,11 +114,7 @@ void testVector(size_t &TotalTests, size_t &Passes, size_t &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;
index 187bf96..2bff297 100644 (file)
@@ -204,11 +204,7 @@ void testsVector(size_t &TotalTests, size_t &Passes, size_t &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;
index d34c57e..b4db01b 100644 (file)
@@ -350,11 +350,7 @@ void testsVecI1(size_t &TotalTests, size_t &Passes, size_t &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;
index d3408a0..63d701c 100644 (file)
@@ -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[]) {
-#endif // X8664_STACK_HACK
   size_t TotalTests = 0;
   size_t Passes = 0;
   size_t Failures = 0;
index f03304e..79168c4 100644 (file)
 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;
index acde64e..0569b82 100644 (file)
@@ -25,11 +25,7 @@ namespace Subzero_ {
 #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;
index 37b6b40..82b4472 100644 (file)
@@ -176,22 +176,6 @@ template <typename Type> void *threadWrapper(void *Data) {
   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) {
@@ -232,7 +216,6 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
         *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";
@@ -248,7 +231,6 @@ void testAtomicRMWThreads(volatile Type *AtomicLoc, size_t &TotalTests,
         *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)
@@ -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[]) {
-#endif // X8664_STACK_HACK
   size_t TotalTests = 0;
   size_t Passes = 0;
   size_t Failures = 0;
index 4b9591a..1232799 100644 (file)
@@ -130,11 +130,7 @@ void testExtractElement(size_t &TotalTests, size_t &Passes, size_t &Failures) {
   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;
index 00a4512..75f3a38 100644 (file)
@@ -21,33 +21,4 @@ typedef long long int64;
 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_
index 306f894..20cc349 100755 (executable)
@@ -199,14 +199,7 @@ def main():
                 ).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')