turf icon indicating copy to clipboard operation
turf copied to clipboard

aarch64 compile problem

Open 892768447 opened this issue 3 years ago • 5 comments

  1. modify https://github.com/preshing/turf/blob/master/turf/c/platform_detect.h#L97 #elif defined(__arm64__) || defined(__aarch64__ )
  2. modify https://github.com/preshing/turf/blob/master/turf/c/platform_detect.h#L101 #if defined(__ARM64_ARCH_8__) || defined(__ARM_ARCH_8A) || defined(__ARM_ARCH)
  3. modify https://github.com/preshing/turf/blob/master/turf/Atomic.h#L23 remove TURF_CPU_ARM || TURF_CPU_ARM64 ||
  4. add define to CMakeLists.txt
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_definitions(-DTURF_COMPILER_GCC)
add_definitions(-DTURF_CPU_ARM)
  1. use /usr/bin/aarch64-linux-gnu-gcc and /usr/bin/aarch64-linux-gnu-g++,
Using built-in specs.
COLLECT_GCC=/usr/bin/aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/5/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 5.4.0-6kord1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-arm64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-arm64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-arm64 --with-arch-directory=aarch64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6kord1~16.04.12) 

then compile the demo. but there has some assembler error.

[main] Building folder: junction-sample 
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /tmp/junction-sample/build --config Debug --target all -j 6 --
[build] Consolidate compiler generated dependencies of target turf
[build] Consolidate compiler generated dependencies of target junction
[build] [  3%] Building CXX object junction/turf/CMakeFiles/turf.dir/turf/UTCTime.cpp.o
[build] [  7%] Building CXX object junction/turf/CMakeFiles/turf.dir/turf/Heap.cpp.o
[build] [ 14%] Building CXX object junction/turf/CMakeFiles/turf.dir/turf/Core.cpp.o
[build] [ 14%] Building C object junction/turf/CMakeFiles/turf.dir/turf/c/impl/atomic_gcc_arm.c.o
[build] [ 21%] Building CXX object junction/CMakeFiles/junction.dir/junction/ConcurrentMap_Grampa.cpp.o
[build] [ 21%] Building CXX object junction/turf/CMakeFiles/turf.dir/turf/extra/Options.cpp.o
[build] /tmp/ccXshPqk.s: Assembler messages:
[build] /tmp/ccXshPqk.s:11: 错误:operand 1 should be an integer register -- `mov r2,r0'
[build] /tmp/ccXshPqk.s:13: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r2]'
[build] /tmp/ccXshPqk.s:14: 错误:unknown mnemonic `strexd' -- `strexd r3,r0,r1,[r2]'
[build] /tmp/ccXshPqk.s:15: 错误:operand 1 should be an integer or stack pointer register -- `cmp r3,#0'
[build] /tmp/ccXshPqk.s:17: 错误:unknown mnemonic `bx' -- `bx lr'
[build] /tmp/ccXshPqk.s:23: 错误:unknown mnemonic `push' -- `push {r4-r5}'
[build] /tmp/ccXshPqk.s:24: 错误:operand 1 should be an integer register -- `mov r5,r0'
[build] /tmp/ccXshPqk.s:25: 错误:operand 1 should be an integer register -- `mov r3,r2'
[build] /tmp/ccXshPqk.s:26: 错误:operand 1 should be an integer register -- `mov r2,r1'
[build] /tmp/ccXshPqk.s:28: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r5]'
[build] /tmp/ccXshPqk.s:29: 错误:unknown mnemonic `strexd' -- `strexd r4,r2,r3,[r5]'
[build] /tmp/ccXshPqk.s:30: 错误:operand 1 should be an integer or stack pointer register -- `cmp r4,#0'
[build] /tmp/ccXshPqk.s:32: 错误:unknown mnemonic `pop' -- `pop {r4-r5}'
[build] /tmp/ccXshPqk.s:33: 错误:unknown mnemonic `bx' -- `bx lr'
[build] /tmp/ccXshPqk.s:39: 错误:unknown mnemonic `push' -- `push {r4-r7}'
[build] /tmp/ccXshPqk.s:40: 错误:operand 1 should be an integer register -- `mov r6,r3'
[build] /tmp/ccXshPqk.s:41: 错误:operand 1 should be an integer register -- `ldr r7,[sp,#16]'
[build] /tmp/ccXshPqk.s:42: 错误:operand 1 should be an integer register -- `mov r5,r0'
[build] /tmp/ccXshPqk.s:43: 错误:operand 1 should be an integer register -- `mov r4,r1'
[build] /tmp/ccXshPqk.s:45: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r5]'
[build] /tmp/ccXshPqk.s:46: 错误:operand 1 should be an integer or stack pointer register -- `cmp r0,r4'
[build] /tmp/ccXshPqk.s:47: 错误:unknown mnemonic `cmpeq' -- `cmpeq r1,r2'
[build] /tmp/ccXshPqk.s:49: 错误:unknown mnemonic `strexd' -- `strexd r3,r6,r7,[r5]'
[build] /tmp/ccXshPqk.s:50: 错误:operand 1 should be an integer or stack pointer register -- `cmp r3,#0'
[build] /tmp/ccXshPqk.s:53: 错误:unknown mnemonic `pop' -- `pop {r4-r7}'
[build] /tmp/ccXshPqk.s:54: 错误:unknown mnemonic `bx' -- `bx lr'
[build] /tmp/ccXshPqk.s:60: 错误:unknown mnemonic `push' -- `push {r4-r7}'
[build] /tmp/ccXshPqk.s:61: 错误:operand 1 should be an integer register -- `mov r6,r3'
[build] /tmp/ccXshPqk.s:62: 错误:operand 1 should be an integer register -- `ldr r7,[sp,#16]'
[build] /tmp/ccXshPqk.s:63: 错误:operand 1 should be an integer register -- `mov r5,r0'
[build] /tmp/ccXshPqk.s:64: 错误:operand 1 should be an integer register -- `mov r4,r1'
[build] /tmp/ccXshPqk.s:66: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r5]'
[build] /tmp/ccXshPqk.s:67: 错误:operand 1 should be an integer or stack pointer register -- `cmp r0,r4'
[build] /tmp/ccXshPqk.s:68: 错误:unknown mnemonic `cmpeq' -- `cmpeq r1,r2'
[build] /tmp/ccXshPqk.s:70: 错误:unknown mnemonic `strexd' -- `strexd r3,r6,r7,[r5]'
[build] /tmp/ccXshPqk.s:71: 错误:operand 1 should be an integer or stack pointer register -- `cmp r3,#0'
[build] /tmp/ccXshPqk.s:74: 错误:unknown mnemonic `pop' -- `pop {r4-r7}'
[build] /tmp/ccXshPqk.s:75: 错误:unknown mnemonic `bx' -- `bx lr'
[build] /tmp/ccXshPqk.s:81: 错误:unknown mnemonic `push' -- `push {r4-r7}'
[build] /tmp/ccXshPqk.s:82: 错误:operand 1 should be an integer register -- `mov r5,r0'
[build] /tmp/ccXshPqk.s:83: 错误:operand 1 should be an integer register -- `mov r4,r1'
[build] /tmp/ccXshPqk.s:85: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r5]'
[build] /tmp/ccXshPqk.s:86: 错误:operand 1 should be an integer register -- `adds r6,r0,r4'
[build] /tmp/ccXshPqk.s:87: 错误:operand 1 should be an integer register -- `adc r7,r1,r2'
[build] /tmp/ccXshPqk.s:88: 错误:unknown mnemonic `strexd' -- `strexd r3,r6,r7,[r5]'
[build] /tmp/ccXshPqk.s:89: 错误:operand 1 should be an integer or stack pointer register -- `cmp r3,#0'
[build] /tmp/ccXshPqk.s:91: 错误:unknown mnemonic `pop' -- `pop {r4-r7}'
[build] /tmp/ccXshPqk.s:92: 错误:unknown mnemonic `bx' -- `bx lr'
[build] /tmp/ccXshPqk.s:98: 错误:unknown mnemonic `push' -- `push {r4-r7}'
[build] /tmp/ccXshPqk.s:99: 错误:operand 1 should be an integer register -- `mov r5,r0'
[build] /tmp/ccXshPqk.s:100: 错误:operand 1 should be an integer register -- `mov r4,r1'
[build] /tmp/ccXshPqk.s:102: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r5]'
[build] /tmp/ccXshPqk.s:103: 错误:operand 1 should be an integer or stack pointer register -- `and r6,r0,r4'
[build] /tmp/ccXshPqk.s:104: 错误:operand 1 should be an integer or stack pointer register -- `and r7,r1,r2'
[build] /tmp/ccXshPqk.s:105: 错误:unknown mnemonic `strexd' -- `strexd r3,r6,r7,[r5]'
[build] /tmp/ccXshPqk.s:106: 错误:operand 1 should be an integer or stack pointer register -- `cmp r3,#0'
[build] /tmp/ccXshPqk.s:108: 错误:unknown mnemonic `pop' -- `pop {r4-r7}'
[build] /tmp/ccXshPqk.s:109: 错误:unknown mnemonic `bx' -- `bx lr'
[build] /tmp/ccXshPqk.s:115: 错误:unknown mnemonic `push' -- `push {r4-r7}'
[build] /tmp/ccXshPqk.s:116: 错误:operand 1 should be an integer register -- `mov r5,r0'
[build] /tmp/ccXshPqk.s:117: 错误:operand 1 should be an integer register -- `mov r4,r1'
[build] /tmp/ccXshPqk.s:119: 错误:unknown mnemonic `ldrexd' -- `ldrexd r0,r1,[r5]'
[build] /tmp/ccXshPqk.s:120: 错误:operand 1 should be a SIMD vector register -- `orr r6,r0,r4'
[build] /tmp/ccXshPqk.s:121: 错误:operand 1 should be a SIMD vector register -- `orr r7,r1,r2'
[build] /tmp/ccXshPqk.s:122: 错误:unknown mnemonic `strexd' -- `strexd r3,r6,r7,[r5]'
[build] /tmp/ccXshPqk.s:123: 错误:operand 1 should be an integer or stack pointer register -- `cmp r3,#0'
[build] /tmp/ccXshPqk.s:125: 错误:unknown mnemonic `pop' -- `pop {r4-r7}'
[build] /tmp/ccXshPqk.s:126: 错误:unknown mnemonic `bx' -- `bx lr'
[build] make[2]: *** [junction/turf/CMakeFiles/turf.dir/turf/c/impl/atomic_gcc_arm.c.o] Error 1
[build] make[2]: *** 正在等待未完成的任务....
[build] [ 25%] Building CXX object junction/turf/CMakeFiles/turf.dir/turf/extra/Random.cpp.o
[build] junction/turf/CMakeFiles/turf.dir/build.make:117: recipe for target 'junction/turf/CMakeFiles/turf.dir/turf/c/impl/atomic_gcc_arm.c.o' failed
[build] [ 28%] Building CXX object junction/CMakeFiles/junction.dir/junction/ConcurrentMap_Leapfrog.cpp.o
[build] [ 32%] Building CXX object junction/CMakeFiles/junction.dir/junction/QSBR.cpp.o
[build] [ 35%] Building CXX object junction/CMakeFiles/junction.dir/junction/ConcurrentMap_Linear.cpp.o
[build] [ 39%] Building CXX object junction/CMakeFiles/junction.dir/junction/details/Grampa.cpp.o
[build] [ 42%] Building CXX object junction/CMakeFiles/junction.dir/junction/details/Leapfrog.cpp.o
[build] [ 46%] Building CXX object junction/CMakeFiles/junction.dir/junction/details/Linear.cpp.o
[build] [ 50%] Building CXX object junction/CMakeFiles/junction.dir/junction/extra/MemHook_NBDS.cpp.o
[build] [ 53%] Building CXX object junction/CMakeFiles/junction.dir/junction/extra/MemHook_TBB.cpp.o
[build] [ 57%] Building CXX object junction/CMakeFiles/junction.dir/junction/striped/ConditionBank.cpp.o
[build] /tmp/cciSrMa7.s: Assembler messages:
[build] /tmp/cciSrMa7.s:47: 错误:unknown mnemonic `ldrex' -- `ldrex x4,[x0]'
[build] /tmp/cciSrMa7.s:50: 错误:unknown mnemonic `strex' -- `strex x6,x2,[x0]'
[build] junction/CMakeFiles/junction.dir/build.make:201: recipe for target 'junction/CMakeFiles/junction.dir/junction/striped/ConditionBank.cpp.o' failed
[build] CMakeFiles/Makefile2:143: recipe for target 'junction/CMakeFiles/junction.dir/all' failed
[build] make[2]: *** [junction/CMakeFiles/junction.dir/junction/striped/ConditionBank.cpp.o] Error 1
[build] make[1]: *** [junction/CMakeFiles/junction.dir/all] Error 2
[build] make[1]: *** 正在等待未完成的任务....
[build] CMakeFiles/Makefile2:169: recipe for target 'junction/turf/CMakeFiles/turf.dir/all' failed
[build] Makefile:90: recipe for target 'all' failed
[build] make[1]: *** [junction/turf/CMakeFiles/turf.dir/all] Error 2
[build] make: *** [all] Error 2
[proc] The command: /usr/bin/cmake --build /tmp/junction-sample/build --config Debug --target all -j 6 -- exited with code: 2 and signal: null
[build] Build finished with exit code 2

892768447 avatar Sep 08 '22 09:09 892768447

and I try define TURF_PREFER_CPP11 and remove atomic_gcc_arm.c , it's build and test ok. but I don't know if there are other problems.

892768447 avatar Sep 08 '22 10:09 892768447

set(DTURF_PREFER_CPP11 TRUE)

if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") add_definitions(-D__arm64__) add_definitions(-D__ARM64_ARCH_8__) endif()

892768447 avatar Sep 09 '22 01:09 892768447

Just a guess, but your compiler might be invoking the wrong assembler. What's the output from this command?

> /usr/bin/aarch64-linux-gnu-gcc -x c++ - -Wa,--version < /dev/null

preshing avatar Sep 09 '22 13:09 preshing

  1. in local server:

GNU assembler (GNU Binutils for Ubuntu) 2.26.1 Copyright (C) 2015 Free Software Foundation, Inc.

  1. in docker centos 7.9

source /opt/rh/devtoolset-8/enable

GNU assembler version 2.30-55.el7.2 Copyright (C) 2018 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or later. This program has absolutely no warranty. This assembler was configured for a target of `aarch64-redhat-linux'. /tmp/ccnomEom.o: file not recognized: File truncated collect2: error: ld returned 1 exit status

892768447 avatar Sep 09 '22 13:09 892768447

Maybe this is a custom CPU

Architecture: aarch64 Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Socket(s): 2 Model name: Phytium,FT-2000/4 CPU max MHz: 2600.0000 CPU min MHz: 1900.0000 BogoMIPS: 3456.00 Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32

892768447 avatar Sep 10 '22 03:09 892768447