From 92907c2ab9ceba3d96ec480350e9cfb44cea1423 Mon Sep 17 00:00:00 2001 From: Jonathan Peyton Date: Fri, 29 May 2015 16:13:56 +0000 Subject: [PATCH] Allow CMAKE_OSX_ARCHITECTURES to build fat library. The CMAKE_OSX_ARCHITECTURES CMake variable allows users to build universal fat libraries that contain both i386 and x86_64 code. These changes allow this build by having the z_Linux_asm.s file detect the architecture itself instead of receiving it through the build system. Also, there was a LIBOMP_OSX_ARCHITECTURES CMake variable added to allow people to only build libomp as a fat library and not the entire LLVM/Clang system. http://lists.cs.uiuc.edu/pipermail/openmp-dev/2015-May/000626.html llvm-svn: 238566 --- openmp/runtime/CMakeLists.txt | 20 ++---- openmp/runtime/src/kmp_os.h | 129 +-------------------------------- openmp/runtime/src/kmp_platform.h | 147 ++++++++++++++++++++++++++++++++++++++ openmp/runtime/src/makefile.mk | 23 ------ openmp/runtime/src/z_Linux_asm.s | 2 + 5 files changed, 157 insertions(+), 164 deletions(-) create mode 100644 openmp/runtime/src/kmp_platform.h diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt index 9294b75..8767f3b3 100644 --- a/openmp/runtime/CMakeLists.txt +++ b/openmp/runtime/CMakeLists.txt @@ -117,6 +117,13 @@ set(LIBOMP_MICRO_TESTS false CACHE BOOL set(LIBOMP_STATS false CACHE BOOL "Stats-Gathering functionality?") +# - Support for universal fat binary builds on Mac +# - Having this extra variable allows people to build this library as a universal library +# without forcing a universal build of the llvm/clang compiler. +set(LIBOMP_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}" CACHE STRING + "For Mac builds, semicolon separated list of architectures to build for universal fat binary.") +set(CMAKE_OSX_ARCHITECTURES ${LIBOMP_OSX_ARCHITECTURES}) + # OMPT-support set(LIBOMP_OMPT_SUPPORT false CACHE BOOL "OMPT-support?") @@ -710,19 +717,6 @@ endif() # kmp_version.o : -D _KMP_BUILD_TIME="\"$(date)}\"" set_source_files_properties(${src_dir}/kmp_version.c PROPERTIES COMPILE_DEFINITIONS "_KMP_BUILD_TIME=\"\\\"${date}\\\"\"") -# z_Linux_asm.o : -D KMP_ARCH_* -if(${ARM}) - set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_ARM") -elseif(${AARCH64}) - set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_AARCH64") -elseif(${INTEL64} OR ${MIC}) - set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_X86_64") -elseif(${IA32}) - set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_X86") -elseif(${PPC64}) - set_source_files_properties(${src_dir}/z_Linux_asm.s PROPERTIES COMPILE_DEFINITIONS "KMP_ARCH_PPC64") -endif() - if(${WINDOWS}) set_source_files_properties(${src_dir}/thirdparty/ittnotify/ittnotify_static.c PROPERTIES COMPILE_DEFINITIONS "UNICODE") endif() diff --git a/openmp/runtime/src/kmp_os.h b/openmp/runtime/src/kmp_os.h index 076f943..6b82bb4 100644 --- a/openmp/runtime/src/kmp_os.h +++ b/openmp/runtime/src/kmp_os.h @@ -62,134 +62,7 @@ # error Unknown compiler #endif -/* ---------------------- Operating system recognition ------------------- */ - -#define KMP_OS_LINUX 0 -#define KMP_OS_FREEBSD 0 -#define KMP_OS_DARWIN 0 -#define KMP_OS_WINDOWS 0 -#define KMP_OS_CNK 0 -#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */ - -#define KMP_ARCH_X86 0 -#define KMP_ARCH_X86_64 0 -#define KMP_ARCH_AARCH64 0 -#define KMP_ARCH_PPC64_BE 0 -#define KMP_ARCH_PPC64_LE 0 - -#define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_LE || KMP_ARCH_PPC64_BE) - - -#ifdef _WIN32 -# undef KMP_OS_WINDOWS -# define KMP_OS_WINDOWS 1 -#endif - -#if ( defined __APPLE__ && defined __MACH__ ) -# undef KMP_OS_DARWIN -# define KMP_OS_DARWIN 1 -#endif - -// in some ppc64 linux installations, only the second condition is met -#if ( defined __linux ) -# undef KMP_OS_LINUX -# define KMP_OS_LINUX 1 -#elif ( defined __linux__) -# undef KMP_OS_LINUX -# define KMP_OS_LINUX 1 -#else -#endif - -#if ( defined __FreeBSD__ ) -# undef KMP_OS_FREEBSD -# define KMP_OS_FREEBSD 1 -#endif - -#if ( defined __bgq__ ) -# undef KMP_OS_CNK -# define KMP_OS_CNK 1 -#endif - -#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS) -# error Unknown OS -#endif - -#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN -# undef KMP_OS_UNIX -# define KMP_OS_UNIX 1 -#endif - -#if KMP_OS_WINDOWS -# if defined _M_AMD64 -# undef KMP_ARCH_X86_64 -# define KMP_ARCH_X86_64 1 -# else -# undef KMP_ARCH_X86 -# define KMP_ARCH_X86 1 -# endif -#endif - -#if KMP_OS_UNIX -# if defined __x86_64 -# undef KMP_ARCH_X86_64 -# define KMP_ARCH_X86_64 1 -# elif defined __i386 -# undef KMP_ARCH_X86 -# define KMP_ARCH_X86 1 -# elif defined __powerpc64__ -# if defined __LITTLE_ENDIAN__ -# undef KMP_ARCH_PPC64_LE -# define KMP_ARCH_PPC64_LE 1 -# else -# undef KMP_ARCH_PPC64_BE -# define KMP_ARCH_PPC64_BE 1 -# endif -# elif defined __aarch64__ -# undef KMP_ARCH_AARCH64 -# define KMP_ARCH_AARCH64 1 -# endif -#endif - -#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \ - defined(__ARM_ARCH_7A__) -# define KMP_ARCH_ARMV7 1 -#endif - -#if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \ - defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \ - defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \ - defined(__ARM_ARCH_6ZK__) -# define KMP_ARCH_ARMV6 1 -#endif - -#if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \ - defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ - defined(__ARM_ARCH_5TEJ__) -# define KMP_ARCH_ARMV5 1 -#endif - -#if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \ - defined(__ARM_ARCH_4T__) -# define KMP_ARCH_ARMV4 1 -#endif - -#if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \ - defined(__ARM_ARCH_3M__) -# define KMP_ARCH_ARMV3 1 -#endif - -#if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__) -# define KMP_ARCH_ARMV2 1 -#endif - -#if defined(KMP_ARCH_ARMV2) -# define KMP_ARCH_ARM 1 -#endif - -// TODO: Fixme - This is clever, but really fugly -#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + KMP_ARCH_AARCH64) -# error Unknown or unsupported architecture -#endif +#include "kmp_platform.h" #if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64 # define KMP_AFFINITY_SUPPORTED 1 diff --git a/openmp/runtime/src/kmp_platform.h b/openmp/runtime/src/kmp_platform.h new file mode 100644 index 0000000..9f6b0c4 --- /dev/null +++ b/openmp/runtime/src/kmp_platform.h @@ -0,0 +1,147 @@ +/* + * kmp_platform.h -- header for determining operating system and architecture + */ + +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.txt for details. +// +//===----------------------------------------------------------------------===// + +#ifndef KMP_PLATFORM_H +#define KMP_PLATFORM_H + +/* ---------------------- Operating system recognition ------------------- */ + +#define KMP_OS_LINUX 0 +#define KMP_OS_FREEBSD 0 +#define KMP_OS_DARWIN 0 +#define KMP_OS_WINDOWS 0 +#define KMP_OS_CNK 0 +#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */ + + +#ifdef _WIN32 +# undef KMP_OS_WINDOWS +# define KMP_OS_WINDOWS 1 +#endif + +#if ( defined __APPLE__ && defined __MACH__ ) +# undef KMP_OS_DARWIN +# define KMP_OS_DARWIN 1 +#endif + +// in some ppc64 linux installations, only the second condition is met +#if ( defined __linux ) +# undef KMP_OS_LINUX +# define KMP_OS_LINUX 1 +#elif ( defined __linux__) +# undef KMP_OS_LINUX +# define KMP_OS_LINUX 1 +#else +#endif + +#if ( defined __FreeBSD__ ) +# undef KMP_OS_FREEBSD +# define KMP_OS_FREEBSD 1 +#endif + +#if ( defined __bgq__ ) +# undef KMP_OS_CNK +# define KMP_OS_CNK 1 +#endif + +#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS) +# error Unknown OS +#endif + +#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN +# undef KMP_OS_UNIX +# define KMP_OS_UNIX 1 +#endif + +/* ---------------------- Architecture recognition ------------------- */ + +#define KMP_ARCH_X86 0 +#define KMP_ARCH_X86_64 0 +#define KMP_ARCH_AARCH64 0 +#define KMP_ARCH_PPC64_BE 0 +#define KMP_ARCH_PPC64_LE 0 +#define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_LE || KMP_ARCH_PPC64_BE) + +#if KMP_OS_WINDOWS +# if defined _M_AMD64 +# undef KMP_ARCH_X86_64 +# define KMP_ARCH_X86_64 1 +# else +# undef KMP_ARCH_X86 +# define KMP_ARCH_X86 1 +# endif +#endif + +#if KMP_OS_UNIX +# if defined __x86_64 +# undef KMP_ARCH_X86_64 +# define KMP_ARCH_X86_64 1 +# elif defined __i386 +# undef KMP_ARCH_X86 +# define KMP_ARCH_X86 1 +# elif defined __powerpc64__ +# if defined __LITTLE_ENDIAN__ +# undef KMP_ARCH_PPC64_LE +# define KMP_ARCH_PPC64_LE 1 +# else +# undef KMP_ARCH_PPC64_BE +# define KMP_ARCH_PPC64_BE 1 +# endif +# elif defined __aarch64__ +# undef KMP_ARCH_AARCH64 +# define KMP_ARCH_AARCH64 1 +# endif +#endif + +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \ + defined(__ARM_ARCH_7A__) +# define KMP_ARCH_ARMV7 1 +#endif + +#if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \ + defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \ + defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \ + defined(__ARM_ARCH_6ZK__) +# define KMP_ARCH_ARMV6 1 +#endif + +#if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \ + defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ + defined(__ARM_ARCH_5TEJ__) +# define KMP_ARCH_ARMV5 1 +#endif + +#if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \ + defined(__ARM_ARCH_4T__) +# define KMP_ARCH_ARMV4 1 +#endif + +#if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \ + defined(__ARM_ARCH_3M__) +# define KMP_ARCH_ARMV3 1 +#endif + +#if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__) +# define KMP_ARCH_ARMV2 1 +#endif + +#if defined(KMP_ARCH_ARMV2) +# define KMP_ARCH_ARM 1 +#endif + +// TODO: Fixme - This is clever, but really fugly +#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + KMP_ARCH_AARCH64) +# error Unknown or unsupported architecture +#endif + +#endif // KMP_PLATFORM_H diff --git a/openmp/runtime/src/makefile.mk b/openmp/runtime/src/makefile.mk index dfbd8da..d6e0d47 100644 --- a/openmp/runtime/src/makefile.mk +++ b/openmp/runtime/src/makefile.mk @@ -611,29 +611,6 @@ ifneq "$(filter lin ,$(os))" "" endif endif -# Intel compiler has a bug: in case of cross-build if used with -# -x assembler-with-cpp option, it defines macros for both architectures, -# host and tartget. For example, if compiler for IA-32 architecture -# runs on Intel(R) 64, it defines both __i386 and __x86_64. (Note it is a bug -# only if -x assembler-with-cpp is specified, in case of C files icc defines -# only one, target architecture). So we cannot autodetect target architecture -# within the file, and have to pass target architecture from command line. -ifneq "$(os)" "win" - ifeq "$(arch)" "arm" - z_Linux_asm$(obj) : \ - cpp-flags += -D KMP_ARCH_ARM - else ifneq "$(filter ppc64 ppc64le,$(arch))" "" - z_Linux_asm$(obj) : \ - cpp-flags += -D KMP_ARCH_PPC64 - else ifeq "$(arch)" "aarch64" - z_Linux_asm$(obj) : \ - cpp-flags += -D KMP_ARCH_AARCH64 - else - z_Linux_asm$(obj) : \ - cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e mic,$(arch)),_64) - endif -endif - # Defining KMP_BUILD_DATE for all files leads to warning "incompatible redefinition", because the # same macro is also defined in omp.h. To avoid conflict, let us define macro with different name, # _KMP_BUILD_TIME. diff --git a/openmp/runtime/src/z_Linux_asm.s b/openmp/runtime/src/z_Linux_asm.s index ebbd18f..840065e 100644 --- a/openmp/runtime/src/z_Linux_asm.s +++ b/openmp/runtime/src/z_Linux_asm.s @@ -16,6 +16,8 @@ // macros // ----------------------------------------------------------------------- +#include "kmp_platform.h" + #if KMP_ARCH_X86 || KMP_ARCH_X86_64 # if __MIC__ || __MIC2__ -- 2.7.4