[Openmp-dev] (no subject)

Jack Howarth howarth.mailing.lists at gmail.com
Sat May 31 11:41:50 PDT 2014


    We seem to have an issue on linux with both the CMakefiles from
pathscale (lightly modified) and my recreation of the same approach in
cmake. On darwin, my attached CMakelist.txt, when placed
in openmp/runtime/src, has no problems compiling and linking libiomp5.dylib…

% cd openmp/runtime/src
% mkdir build
% cd build
% cmake ..
% make VERBOSE=1

However on x86_64, Fedora 15, with the clang set to use clang-omp
(currently based on 3.4), I find the final linkage fails with…

Linking CXX shared library libiomp5.so
/usr/bin/cmake -E cmake_link_script CMakeFiles/iomp5.dir/link.txt
--verbose=1
clang++  -fPIC  -D USE_ITT_BUILD -D NDEBUG -D KMP_ARCH_STR="\"Intel(R)
64\"" -D _GNU_SOURCE -D _REENTRANT -D KMP_USE_ASSERT -D BUILD_I8 -D
BUILD_TV -D KMP_LIBRARY_FILE=\"libiomp5.so\" -D KMP_VERSION_MAJOR=5 -D
CACHE_LINE=64 -D KMP_ADJUST_BLOCKTIME=1 -D BUILD_PARALLEL_ORDERED -D
KMP_ASM_INTRINS -D USE_LOAD_BALANCE -D USE_CBLKDATA -D GUIDEDLL_EXPORTS -D
KMP_GOMP_COMPAT -D KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0
-D OMP_50_ENABLED=0 -D OMP_41_ENABLED=0 -D OMP_40_ENABLED=1 -D
OMP_30_ENABLED=1 -D USE_ITT_NOTIFY=1 -D INTEL_ITTNOTIFY_PREFIX=__kmp_itt_
-D KMP_TDATA_GTID -D _KMP_BUILD_TIME="\"2014-05-31 14:03:22 UTC\"" -fPIC
-Wno-unused-value -Wno-switch -Wno-deprecated-register -fno-exceptions
 -shared -Wl,-soname,libiomp5.so -o libiomp5.so
CMakeFiles/iomp5.dir/thirdparty/ittnotify/ittnotify_static.c.o
CMakeFiles/iomp5.dir/kmp_affinity.cpp.o CMakeFiles/iomp5.dir/kmp_alloc.c.o
CMakeFiles/iomp5.dir/kmp_atomic.c.o CMakeFiles/iomp5.dir/kmp_cancel.cpp.o
CMakeFiles/iomp5.dir/kmp_csupport.c.o CMakeFiles/iomp5.dir/kmp_debug.c.o
CMakeFiles/iomp5.dir/kmp_dispatch.cpp.o
CMakeFiles/iomp5.dir/kmp_environment.c.o CMakeFiles/iomp5.dir/kmp_error.c.o
CMakeFiles/iomp5.dir/kmp_ftn_cdecl.c.o
CMakeFiles/iomp5.dir/kmp_ftn_extra.c.o CMakeFiles/iomp5.dir/kmp_global.c.o
CMakeFiles/iomp5.dir/kmp_gsupport.c.o CMakeFiles/iomp5.dir/kmp_i18n.c.o
CMakeFiles/iomp5.dir/kmp_io.c.o CMakeFiles/iomp5.dir/kmp_itt.c.o
CMakeFiles/iomp5.dir/kmp_lock.cpp.o CMakeFiles/iomp5.dir/kmp_runtime.c.o
CMakeFiles/iomp5.dir/kmp_sched.cpp.o CMakeFiles/iomp5.dir/kmp_settings.c.o
CMakeFiles/iomp5.dir/kmp_str.c.o CMakeFiles/iomp5.dir/kmp_taskdeps.cpp.o
CMakeFiles/iomp5.dir/kmp_tasking.c.o CMakeFiles/iomp5.dir/kmp_taskq.c.o
CMakeFiles/iomp5.dir/kmp_threadprivate.c.o
CMakeFiles/iomp5.dir/kmp_utility.c.o CMakeFiles/iomp5.dir/kmp_version.c.o
CMakeFiles/iomp5.dir/z_Linux_util.c.o z_Linux_asm.o
/usr/bin/ld: libiomp5.so: version node not found for symbol omp_test_lock_@
@VERSION
/usr/bin/ld: failed to set dynamic section sizes: Bad value
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
make[2]: *** [libiomp5.so] Error 1
make[2]: Leaving directory
`/home/howarth/llvm-clang-omp/openmp/runtime/src/build'
make[1]: *** [CMakeFiles/iomp5.dir/all] Error 2
make[1]: Leaving directory
`/home/howarth/llvm-clang-omp/openmp/runtime/src/build'
make: *** [all] Error 2

A careful comparison with the log from 'make compiler=clang' on x86_64
Fedora 15 reveals no substantial differences to the cmake  build other than
the details of how clang is invoked to do the linkage…

----- 1/1 --- unstripped/.dir -----
mkdir -p unstripped/
touch unstripped/.dir
----- 1/1 --- unstripped/libiomp5.so.lst -----
echo ittnotify_static.o kmp_affinity.o kmp_alloc.o kmp_atomic.o
kmp_cancel.o kmp_csupport.o kmp_debug.o kmp_dispatch.o kmp_environment.o
kmp_error.o kmp_ftn_cdecl.o kmp_ftn_extra.o kmp_global.o kmp_gsupport.o
kmp_i18n.o kmp_io.o kmp_itt.o kmp_lock.o kmp_runtime.o kmp_sched.o
kmp_settings.o kmp_str.o kmp_taskdeps.o kmp_tasking.o kmp_taskq.o
kmp_threadprivate.o kmp_utility.o kmp_version.o z_Linux_asm.o
z_Linux_util.o  > unstripped/libiomp5.so.lst
----- 1/1 --- unstripped/libiomp5.so -----
clang -shared -Wl,-soname=libiomp5.so -Wl,--as-needed -Wl,-z,noexecstack -g
-Wsign-compare -Wl,--warn-shared-textrel -Wl,-fini=__kmp_internal_end_fini
-pthread -fPIC -Wl,--version-script=../../src/exports_so.txt  -o
unstripped/libiomp5.so $(cat unstripped/libiomp5.so.lst) -Wl,-ldl
----- 1/1 --- unstripped/libiomp5.dbg -----
objcopy --only-keep-debug unstripped/libiomp5.so unstripped/libiomp5.dbg
----- 1/1 --- libiomp5.dbg -----
cp -f unstripped/libiomp5.dbg libiomp5.dbg
----- 1/1 --- stripped/.dir -----
mkdir -p stripped/
touch stripped/.dir
----- 1/1 --- stripped/libiomp5.so -----
objcopy --strip-debug unstripped/libiomp5.so stripped/libiomp5.so.tmp
objcopy --add-gnu-debuglink=libiomp5.dbg stripped/libiomp5.so.tmp
stripped/libiomp5.so
----- 1/1 --- libiomp5.so -----
cp -f stripped/libiomp5.so libiomp5.so
----- 1/1 --- test-touch-rt/.dir -----
mkdir -p test-touch-rt/
touch test-touch-rt/.dir
----- 1/1 --- test-touch-rt/.test -----
rm -f test-touch-rt/*
cc -pthread -o test-touch-rt/test-touch -m64  ../../src/test-touch.c
libiomp5.so
rm -f test-touch-rt/test-touch
cc -pthread -o test-touch-rt/test-touch -m64  ../../src/test-touch.c
libiomp5.so  -Wl,--verbose > test-touch-rt/build.log 2>&1
LD_LIBRARY_PATH=".:/usr/lib64/alliance/lib:/usr/local/share/man:/usr/share/man:/usr/lib64/alliance/man"
KMP_VERSION=1 test-touch-rt/test-touch

One difference between the cmake build and the 'make compiler=clang' build,
is that CMakelist.txt doesn't pass all of the COMMON_FLAGS when
assembling z_Linux_asm.s due to the compiler being invoked via perl which
chokes on the quotes…

----- 1/1 --- z_Linux_asm.o -----
clang -I ./ -I ../../src/ -I ../../src/i18n/ -I ../../src/include/40/ -I
../../src/thirdparty/ittnotify/ -D USE_ITT_BUILD -D NDEBUG -D
KMP_ARCH_STR="\"Intel(R) 64\"" -D _GNU_SOURCE -D _REENTRANT -D
KMP_USE_ASSERT -D BUILD_I8 -D BUILD_TV -D KMP_LIBRARY_FILE=\"libiomp5.so\"
-D KMP_VERSION_MAJOR=5 -D CACHE_LINE=64 -D KMP_ADJUST_BLOCKTIME=1 -D
BUILD_PARALLEL_ORDERED -D KMP_ASM_INTRINS -D USE_LOAD_BALANCE -D
USE_CBLKDATA -D GUIDEDLL_EXPORTS -D KMP_GOMP_COMPAT -D
KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0 -D OMP_50_ENABLED=0
-D OMP_41_ENABLED=0 -D OMP_40_ENABLED=1 -D OMP_30_ENABLED=1 -D
USE_ITT_NOTIFY=1 -D INTEL_ITTNOTIFY_PREFIX=__kmp_itt_ -D KMP_TDATA_GTID  -D
_KMP_BUILD_TIME="\"2014-05-31 18:05:28 UTC\"" -D KMP_ARCH_X86_64 -c -x
assembler-with-cpp -o z_Linux_asm.o ../../src/z_Linux_asm.s

in the build.pl based build vs the following for the cmake build…

[  0%] Generating z_Linux_asm.o
clang++ -c -o z_Linux_asm.o -D KMP_ASM_INTRINS -D KMP_GOMP_COMPAT -D
KMP_ARCH_X86_64 -x assembler-with-cpp
/home/howarth/llvm-clang-omp/openmp/runtime/src/z_Linux_asm.s

A Google search suggests that folks running into this "version node not
found for symbol " error normally solve it with --disable-symver in
configure but it is unclear if a similar option exists in cmake or if it
would even have the expected impact here.
                  Jack
ps The attached CMakefile.txt has the same behavior as the Pathscale ones
(in emulating the build.pl build of openmp) with a couple corrections for
openmp svn. On linux,   -D KMP_TDATA_GTID  is passed like in the 'make
compiler=clang' build. When z_Linux_asm.s is compiled, the missing -D
KMP_ASM_INTRINS was added into the command line to match the  'make
compiler=clang' build on both Apple and Linux.

pps The actual failing linkage line (as emitted from clang++ with -v) is…

 "/usr/bin/ld" --hash-style=gnu --no-add-needed --build-id --eh-frame-hdr
-m elf_x86_64 -shared -o libiomp5.so
/usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/4.6.3/crtbeginS.o
-L/usr/lib/gcc/x86_64-redhat-linux/4.6.3
-L/usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64 -L/lib/../lib64
-L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../..
-L/lib -L/usr/lib -soname libiomp5.so
CMakeFiles/iomp5.dir/thirdparty/ittnotify/ittnotify_static.c.o
CMakeFiles/iomp5.dir/kmp_affinity.cpp.o CMakeFiles/iomp5.dir/kmp_alloc.c.o
CMakeFiles/iomp5.dir/kmp_atomic.c.o CMakeFiles/iomp5.dir/kmp_cancel.cpp.o
CMakeFiles/iomp5.dir/kmp_csupport.c.o CMakeFiles/iomp5.dir/kmp_debug.c.o
CMakeFiles/iomp5.dir/kmp_dispatch.cpp.o
CMakeFiles/iomp5.dir/kmp_environment.c.o CMakeFiles/iomp5.dir/kmp_error.c.o
CMakeFiles/iomp5.dir/kmp_ftn_cdecl.c.o
CMakeFiles/iomp5.dir/kmp_ftn_extra.c.o CMakeFiles/iomp5.dir/kmp_global.c.o
CMakeFiles/iomp5.dir/kmp_gsupport.c.o CMakeFiles/iomp5.dir/kmp_i18n.c.o
CMakeFiles/iomp5.dir/kmp_io.c.o CMakeFiles/iomp5.dir/kmp_itt.c.o
CMakeFiles/iomp5.dir/kmp_lock.cpp.o CMakeFiles/iomp5.dir/kmp_runtime.c.o
CMakeFiles/iomp5.dir/kmp_sched.cpp.o CMakeFiles/iomp5.dir/kmp_settings.c.o
CMakeFiles/iomp5.dir/kmp_str.c.o CMakeFiles/iomp5.dir/kmp_taskdeps.cpp.o
CMakeFiles/iomp5.dir/kmp_tasking.c.o CMakeFiles/iomp5.dir/kmp_taskq.c.o
CMakeFiles/iomp5.dir/kmp_threadprivate.c.o
CMakeFiles/iomp5.dir/kmp_utility.c.o CMakeFiles/iomp5.dir/kmp_version.c.o
CMakeFiles/iomp5.dir/z_Linux_util.c.o z_Linux_asm.o -lstdc++ -lm -lgcc_s
-lc -lgcc_s /usr/lib/gcc/x86_64-redhat-linux/4.6.3/crtendS.o
/usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64/crtn.o
/usr/bin/ld: libiomp5.so: version node not found for symbol omp_test_lock_@
@VERSION
/usr/bin/ld: failed to set dynamic section sizes: Bad value



On Sat, May 31, 2014 at 9:51 AM, Jack Howarth <
howarth.mailing.lists at gmail.com> wrote:

> C. Bergström,
>         My initial attempts are  just to duplicate the behavior of 'make
> compiler=clang' as closely as possible to order to maintain continuity
> between the two build approaches. I have been pondering the usage of the
> external_symbols.lst file in the build.pl approach. It is unclear to me
> that this is really hiding any symbols. Shouldn't we just be passing
> -fvisibility=hidden to the c++ compiler and adding explicit instances of
>
> __attribute__ ((visibility ("default")))
>
> to the c++ source files for those symbols we want to export from libiomp?
>          Jack
>
>
> On Sat, May 31, 2014 at 12:18 AM, "C. Bergström" <cbergstrom at pathscale.com
> > wrote:
>
>> On 05/31/14 11:13 AM, Alp Toker wrote:
>>
>>>
>>> On 31/05/2014 06:58, "C. Bergström" wrote:
>>>
>>>> Jack - you have permission to use/abuse the publicly available
>>>> PathScale copyright portions of code in our github repo in accordance with
>>>> the license they are published under. I wish there was less stupidity and
>>>> red tape around this community, but c'est la vie.
>>>>
>>>
>>> Cool!
>>>
>>>
>>>> /* Seriously, it's not a simple email "OK" is some binding contract
>>>> which is like or can replace an actual contributor agreement. */
>>>>
>>>> Since I have no authority to review OMP related codes it's unlikely
>>>> I'll reply or participate further in any of those topics.
>>>>
>>>
>>> Disagree. The authority is for all of us to share and nobody should have
>>> told you otherwise.
>>>
>> last reply - I really don't want to bring this up again or hi-jack the
>> author's thread
>> clarification - Hal and Chandler have said I'm not qualified to do
>> binding review on clang OMP sema or other OMP related changes. As such,
>> others would still have to review the changes and I just lost interest to
>> participate</end>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/openmp-dev/attachments/20140531/697f8561/attachment.html>
-------------- next part --------------
project(openmp)
cmake_minimum_required(VERSION 2.8)

set(VERSION 5)
set(OMP_VERSION "201107")
set(OMP_VERSION_NUM "40")

execute_process(COMMAND "date" "+%Y-%m-%d %H:%M:%S" OUTPUT_VARIABLE BUILD_TIME)
string(REGEX REPLACE "\n" "" BUILD_TIME ${BUILD_TIME})

include_directories(
        .
        include
        include/${OMP_VERSION}
        i18n
        thirdparty/ittnotify
        ${CMAKE_CURRENT_BINARY_DIR}
        )

if(WIN32)
  set(OS_GEN "win")
elseif(UNIX)
  set(OS_GEN "lin")
elseif(APPLE)
  set(OS_GEN "mac")
endif()

if("${ARCH}" STREQUAL "")
  set(ARCH "32e")
endif()

set(ARCH_STR "Intel(R) 64")

set(FEATURE_FLAGS "-D USE_ITT_BUILD")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D NDEBUG")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ARCH_STR=\"\\\"${ARCH_STR}\\\"\"")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D _GNU_SOURCE")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D _REENTRANT")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ASSERT")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_I8")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_TV")
if(APPLE)
  set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_LIBRARY_FILE=\\\"libiomp5.dylib\\\"")
  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -current_version 5.0")
  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -compatibility_version 5.0")
else()
  set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_LIBRARY_FILE=\\\"libiomp5.so\\\"")
endif()
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_VERSION_MAJOR=${VERSION}")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D CACHE_LINE=64")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ADJUST_BLOCKTIME=1")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_PARALLEL_ORDERED")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ASM_INTRINS")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_LOAD_BALANCE")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_CBLKDATA")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D GUIDEDLL_EXPORTS")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_GOMP_COMPAT")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ADAPTIVE_LOCKS=1")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_DEBUG_ADAPTIVE_LOCKS=0")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_50_ENABLED=0")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_41_ENABLED=0")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_40_ENABLED=1")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_30_ENABLED=1")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_ITT_NOTIFY=1")
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D INTEL_ITTNOTIFY_PREFIX=__kmp_itt_")
if (NOT APPLE)
  set(FEATURE_FLAGS "${FEATURE_FLAGS}   -D KMP_TDATA_GTID")
endif()
set(FEATURE_FLAGS "${FEATURE_FLAGS} -D _KMP_BUILD_TIME=\"\\\"${BUILD_TIME} UTC\\\"\"")

set(COMMON_FLAGS "-fPIC")
set(COMMON_FLAGS "${COMMON_FLAGS} -Wno-unused-value")
set(COMMON_FLAGS "${COMMON_FLAGS} -Wno-switch")
set(COMMON_FLAGS "${COMMON_FLAGS} -Wno-deprecated-register")
set(COMMON_FLAGS "${COMMON_FLAGS} -fno-exceptions")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FEATURE_FLAGS} ${COMMON_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FEATURE_FLAGS} ${COMMON_FLAGS}")

set(ASM_SOURCES
 z_Linux_asm.s
)
set(SOURCES
 thirdparty/ittnotify/ittnotify_static.c
 kmp_affinity.cpp
 kmp_alloc.c
 kmp_atomic.c
 kmp_cancel.cpp
 kmp_csupport.c
 kmp_debug.c
 kmp_dispatch.cpp
 kmp_environment.c
 kmp_error.c
 kmp_ftn_cdecl.c
 kmp_ftn_extra.c
 kmp_global.c
 kmp_gsupport.c
 kmp_global.c
 kmp_i18n.c
 kmp_io.c
 kmp_itt.c
 kmp_lock.cpp
 kmp_runtime.c
 kmp_sched.cpp
 kmp_settings.c
 kmp_str.c
 kmp_taskdeps.cpp
 kmp_tasking.c
 kmp_taskq.c
 kmp_threadprivate.c
 kmp_utility.c
 kmp_version.c 
 z_Linux_util.c
)

set_source_files_properties(${SOURCES} PROPERTIES LANGUAGE CXX)
set_source_files_properties(${ASM_SOURCES} PROPERTIES LANGUAGE CXX)

set(CMAKE_CXX_COMPILER "clang++")

add_custom_command(
        OUTPUT kmp_i18n_id.inc
        COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/../tools/message-converter.pl --os=${OS_GEN} --arch=${ARCH} --prefix=kmp_i18n --enum=kmp_i18n_id.inc ${CMAKE_CURRENT_SOURCE_DIR}/i18n/en_US.txt
        )
add_custom_command(
        OUTPUT kmp_i18n_default.inc
        COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/../tools/message-converter.pl --os=${OS_GEN} --arch=${ARCH} --prefix=kmp_i18n --default=kmp_i18n_default.inc ${CMAKE_CURRENT_SOURCE_DIR}/i18n/en_US.txt
        )
add_custom_command(
        OUTPUT omp.h
        COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/../tools/expand-vars.pl --strict -D Revision=\"\\$$Revision\" -D Date=\"\\$$Date\" -D KMP_TYPE=\"Performance\" -D KMP_ARCH=\"\\\"${ARCH_STR}\\\"\" -D KMP_VERSION_MAJOR=${VERSION} -D KMP_VERSION_MINOR=0 -D KMP_VERSION_BUILD=00000000 -D KMP_BUILD_DATE=\"${BUILD_TIME} UTC\" -D KMP_TARGET_COMPILER=12 -D KMP_DIAG=0 -D KMP_DEBUG_INFO=0 -D OMP_VERSION=${OMP_VERSION} ${CMAKE_CURRENT_SOURCE_DIR}/include/${OMP_VERSION_NUM}/omp.h.var omp.h
        )
add_custom_command(
        OUTPUT z_Linux_asm.o
        COMMAND ${CMAKE_CXX_COMPILER} -c -o z_Linux_asm.o -D KMP_ASM_INTRINS -D KMP_GOMP_COMPAT -D KMP_ARCH_X86_64 -x assembler-with-cpp ${CMAKE_CURRENT_SOURCE_DIR}/${ASM_SOURCES}
)

add_custom_target(gen_kmp_i18n DEPENDS kmp_i18n_id.inc kmp_i18n_default.inc omp.h z_Linux_asm.o)

add_library(iomp5 SHARED ${SOURCES} z_Linux_asm.o)
add_dependencies(iomp5 gen_kmp_i18n)



More information about the Openmp-dev mailing list