[Openmp-commits] [openmp] r270464 - Allow unit testing on Windows

Churbanov, Andrey via Openmp-commits openmp-commits at lists.llvm.org
Thu Jun 2 08:40:55 PDT 2016


I am OK to merge it into 3.8.1.

- Andrey

-----Original Message-----
From: Peyton, Jonathan L 
Sent: Tuesday, May 31, 2016 10:00 PM
To: Peyton, Jonathan L <jonathan.l.peyton at intel.com>; Churbanov, Andrey <Andrey.Churbanov at intel.com>; Tom Stellard <tom at stellard.net>
Cc: openmp-commits (openmp-commits at lists.llvm.org) <openmp-commits at lists.llvm.org>
Subject: RE: [Openmp-commits] [openmp] r270464 - Allow unit testing on Windows

Andrey (code owner), Tom,

Can this be merged into 3.8.1?  It enables unit testing on Windows using clang.exe.

-- Johnny

-----Original Message-----
From: Openmp-commits [mailto:openmp-commits-bounces at lists.llvm.org] On Behalf Of Jonathan Peyton via Openmp-commits
Sent: Monday, May 23, 2016 12:51 PM
To: openmp-commits at lists.llvm.org
Subject: [Openmp-commits] [openmp] r270464 - Allow unit testing on Windows

Author: jlpeyton
Date: Mon May 23 12:50:32 2016
New Revision: 270464

URL: http://llvm.org/viewvc/llvm-project?rev=270464&view=rev
Log:
Allow unit testing on Windows

These changes allow testing on Windows using clang.exe.
There are two main changes:
1. Only link to -lm when it actually exists on the system 2. Create basic versions of pthread_create() and pthread_join() for windows.
   They are not POSIX compliant by any stretch but will allow any existing
   and future tests to use pthread_create() and pthread_join() for testing
   interactions of libomp with os threads.

Differential Revision: http://reviews.llvm.org/D20391

Modified:
    openmp/trunk/runtime/src/CMakeLists.txt
    openmp/trunk/runtime/test/CMakeLists.txt
    openmp/trunk/runtime/test/lit.cfg
    openmp/trunk/runtime/test/lit.site.cfg.in
    openmp/trunk/runtime/test/misc_bugs/omp_foreign_thread_team_reuse.c
    openmp/trunk/runtime/test/omp_testsuite.h

Modified: openmp/trunk/runtime/src/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/CMakeLists.txt?rev=270464&r1=270463&r2=270464&view=diff
==============================================================================
--- openmp/trunk/runtime/src/CMakeLists.txt (original)
+++ openmp/trunk/runtime/src/CMakeLists.txt Mon May 23 12:50:32 2016
@@ -146,7 +146,11 @@ set_target_properties(omp PROPERTIES
 )
 
 # Get the library's location within the build tree for the unit tester -get_target_property(LIBOMP_LIBRARY_DIR omp LIBRARY_OUTPUT_DIRECTORY)
+if(NOT WIN32)
+  get_target_property(LIBOMP_LIBRARY_DIR omp LIBRARY_OUTPUT_DIRECTORY)
+else()
+  get_target_property(LIBOMP_LIBRARY_DIR omp RUNTIME_OUTPUT_DIRECTORY)
+endif()
 if(NOT LIBOMP_LIBRARY_DIR)
   set(LIBOMP_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
   set(LIBOMP_LIBRARY_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)

Modified: openmp/trunk/runtime/test/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/test/CMakeLists.txt?rev=270464&r1=270463&r2=270464&view=diff
==============================================================================
--- openmp/trunk/runtime/test/CMakeLists.txt (original)
+++ openmp/trunk/runtime/test/CMakeLists.txt Mon May 23 12:50:32 2016
@@ -1,6 +1,7 @@
 # CMakeLists.txt file for unit testing OpenMP Library
 include(FindPythonInterp)
 include(CheckTypeSize)
+include(CheckLibraryExists)
 
 if(NOT PYTHONINTERP_FOUND)
   libomp_warning_say("Could not find Python.") @@ -8,6 +9,9 @@ if(NOT PYTHONINTERP_FOUND)
   return()
 endif()
 
+# Some tests use math functions
+check_library_exists(m sqrt "" LIBOMP_HAVE_LIBM)
+
 macro(pythonize_bool var)
   if (${var})
     set(${var} True)
@@ -20,6 +24,7 @@ pythonize_bool(LIBOMP_USE_HWLOC)
 pythonize_bool(LIBOMP_OMPT_SUPPORT)
 pythonize_bool(LIBOMP_OMPT_BLAME)
 pythonize_bool(LIBOMP_OMPT_TRACE)
+pythonize_bool(LIBOMP_HAVE_LIBM)
 
 set(LIBOMP_TEST_CFLAGS "" CACHE STRING
   "Extra compiler flags to send to the test compiler")

Modified: openmp/trunk/runtime/test/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/test/lit.cfg?rev=270464&r1=270463&r2=270464&view=diff
==============================================================================
--- openmp/trunk/runtime/test/lit.cfg (original)
+++ openmp/trunk/runtime/test/lit.cfg Mon May 23 12:50:32 2016
@@ -48,6 +48,11 @@ config.test_cflags = config.test_openmp_
     " -L " + config.library_dir + \
     " " + config.test_extra_cflags
 
+# extra libraries
+libs = ""
+if config.has_libm:
+    libs += " -lm"
+
 # Allow XFAIL to work
 config.target_triple = [ ]
 if re.search('gcc', config.test_compiler) is not None:
@@ -92,7 +97,7 @@ if config.has_ompt:
 config.substitutions.append(("%libomp-compile-and-run", \
     "%libomp-compile && %libomp-run"))
 config.substitutions.append(("%libomp-compile", \
-    "%clang %cflags %s -o %t -lm"))
+    "%clang %cflags %s -o %t" + libs))
 config.substitutions.append(("%libomp-run", "%t"))  config.substitutions.append(("%clang", config.test_compiler))  config.substitutions.append(("%openmp_flag", config.test_openmp_flag))

Modified: openmp/trunk/runtime/test/lit.site.cfg.in
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/test/lit.site.cfg.in?rev=270464&r1=270463&r2=270464&view=diff
==============================================================================
--- openmp/trunk/runtime/test/lit.site.cfg.in (original)
+++ openmp/trunk/runtime/test/lit.site.cfg.in Mon May 23 12:50:32 2016
@@ -11,6 +11,7 @@ config.operating_system = "@CMAKE_SYSTEM  config.hwloc_library_dir = "@LIBOMP_HWLOC_LIBRARY_DIR@"
 config.using_hwloc = @LIBOMP_USE_HWLOC@  config.has_ompt = @LIBOMP_OMPT_SUPPORT@ and @LIBOMP_OMPT_BLAME@ and @LIBOMP_OMPT_TRACE@
+config.has_libm = @LIBOMP_HAVE_LIBM@
 
 # Let the main config do the real work.
 lit_config.load_config(config, "@LIBOMP_BASE_DIR@/test/lit.cfg")

Modified: openmp/trunk/runtime/test/misc_bugs/omp_foreign_thread_team_reuse.c
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/test/misc_bugs/omp_foreign_thread_team_reuse.c?rev=270464&r1=270463&r2=270464&view=diff
==============================================================================
--- openmp/trunk/runtime/test/misc_bugs/omp_foreign_thread_team_reuse.c (original)
+++ openmp/trunk/runtime/test/misc_bugs/omp_foreign_thread_team_reuse.c
+++ Mon May 23 12:50:32 2016
@@ -1,6 +1,5 @@
 // RUN: %libomp-compile-and-run
 #include <stdio.h>
-#include <pthread.h>
 #include "omp_testsuite.h"
 
 #define NUM_THREADS 10

Modified: openmp/trunk/runtime/test/omp_testsuite.h
URL: http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/test/omp_testsuite.h?rev=270464&r1=270463&r2=270464&view=diff
==============================================================================
--- openmp/trunk/runtime/test/omp_testsuite.h (original)
+++ openmp/trunk/runtime/test/omp_testsuite.h Mon May 23 12:50:32 2016
@@ -4,6 +4,7 @@
 #define OMP_TESTSUITE_H
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <omp.h>
 
 /* General                                                */
@@ -19,4 +20,60 @@
 #define NUM_TASKS 25
 #define MAX_TASKS_PER_THREAD 5
 
+#ifdef  _WIN32
+// Windows versions of pthread_create() and pthread_join() # include 
+<windows.h> typedef HANDLE pthread_t;
+
+// encapsulates the information about a pthread-callable function 
+struct thread_func_info_t {
+  void* (*start_routine)(void*);
+  void* arg;
+};
+
+// call the void* start_routine(void*); static DWORD 
+__thread_func_wrapper(LPVOID lpParameter) {
+  struct thread_func_info_t* function_information;
+  function_information = (struct thread_func_info_t*)lpParameter;
+  function_information->start_routine(function_information->arg);
+  free(function_information);
+  return 0;
+}
+
+// attr is ignored
+static int pthread_create(pthread_t *thread, void *attr,
+                          void *(*start_routine) (void *), void *arg) {
+  pthread_t pthread;
+  struct thread_func_info_t* info;
+  info = (struct thread_func_info_t*)malloc(sizeof(struct
+thread_func_info_t));
+  info->start_routine = start_routine;
+  info->arg = arg;
+  pthread = CreateThread(NULL, 0, __thread_func_wrapper, info, 0, 
+NULL);
+  if (pthread == NULL) {
+    fprintf(stderr, "CreateThread() failed: Error #%u.\n", GetLastError());
+    exit(1);
+  }
+  *thread = pthread;
+  return 0;
+}
+// retval is ignored for now
+static int pthread_join(pthread_t thread, void **retval) {
+  int rc;
+  rc = WaitForSingleObject(thread, INFINITE);
+  if (rc == WAIT_FAILED) {
+    fprintf(stderr, "WaitForSingleObject() failed: Error #%u.\n",
+            GetLastError());
+    exit(1);
+  }
+  rc = CloseHandle(thread);
+  if (rc == 0) {
+    fprintf(stderr, "CloseHandle() failed: Error #%u.\n", GetLastError());
+    exit(1);
+  }
+  return 0;
+}
+#else
+# include <pthread.h>
+#endif
+
 #endif


_______________________________________________
Openmp-commits mailing list
Openmp-commits at lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/openmp-commits

--------------------------------------------------------------------
Joint Stock Company Intel A/O
Registered legal address: Krylatsky Hills Business Park,
17 Krylatskaya Str., Bldg 4, Moscow 121614,
Russian Federation

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.


More information about the Openmp-commits mailing list