2016-05-06 5 views
1

私は今この問題に取り組んできましたが、私の間違いを指摘してくれることを願っています。私はもはや木々を通して森を見ることができないと思う。__ARM_FEATURE_CRC32がコンパイラによって定義されていないのはなぜですか?

私はLeMaker HiKey私はテスト用のボードを持っています。私はプログラムをコンパイルしようとすると

$ cat /proc/cpuinfo 
Processor : AArch64 Processor rev 3 (aarch64) 
... 
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 
... 

:そのはNEONとAES、SHAやCRC32のような他のCPU機能を持っているように、そのAArch64は、

$ cat test.cxx 
#if (defined(__ARM_NEON__) || defined(__ARM_NEON)) 
# define NEON_INTRINSICS_AVAILABLE 1 
#else 
# define NEON_INTRINSICS_AVAILABLE 0 
#endif 

#if BOOL_NEON_INTRINSICS_AVAILABLE 
# include <arm_neon.h> 
# if defined(__ARM_FEATURE_CRC32) || (__ARM_ACLE >= 200) 
# include <arm_acle.h> 
# endif 
#endif 

#include <stdint.h> 

int main(int argc, char* argv[]) 
{ 
    uint32_t crc = 0; 

    crc = __crc32b(crc, (uint8_t)0); 
    return 0 
} 

それは次のようになり:

$ g++ test.cxx -o test.exe 
test.cxx: In function ‘int main(int, char**)’: 
test.cxx:20:33: error: ‘__crc32b’ was not declared in this scope 
    crc = __crc32b(crc, (uint8_t)0); 
           ^
test.cxx:22:1: error: expected ‘;’ before ‘}’ token 
} 
^ 

$ clang++ test.cxx -o test.exe 
test.cxx:20:9: error: use of undeclared identifier '__crc32b' 
    crc = __crc32b(crc, (uint8_t)0); 
     ^
test.cxx:21:11: error: expected ';' after return statement 
    return 0 
     ^
      ; 
2 errors generated. 

ファイルシステムのgrepのはarm_acle.hが実際にヘッダで明らかに6142992

ARM® C Language Extensions、セクション9.7 CRC32組み込み関数によれば、__ARM_FEATURE_CRC32が定義されている場合、欠けているシンボルが存在すると考えられます。それを確認するとarm_acle.hが確認されます。

-march=nativeでコンパイルしようとしましたが、コンパイラが拒否しました。

__ARM_FEATURE_CRC32がコンパイラによって定義されていないのはなぜですか?

ボード上のネイティブ機能を使用してプログラムをコンパイルするにはどうすればよいですか?この機能はデフォルトで有効になっていない理由については


$ gcc --version 
gcc (Debian/Linaro 4.9.2-10) 4.9.2 
Copyright (C) 2014 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

$ clang --version 
Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0) 
Target: aarch64-unknown-linux-gnu 
Thread model: posix 

$ g++ -dM -E - </dev/null | egrep -i '(arm|neon|acle)' 
#define __ARM_NEON 1 

$ clang++ -dM -E - </dev/null | egrep -i '(arm|neon|acle)' 
#define __ARM_64BIT_STATE 1 
#define __ARM_ACLE 200 
#define __ARM_ALIGN_MAX_STACK_PWR 4 
#define __ARM_ARCH 8 
#define __ARM_ARCH_ISA_A64 1 
#define __ARM_ARCH_PROFILE 'A' 
#define __ARM_FEATURE_CLZ 1 
#define __ARM_FEATURE_DIV 1 
#define __ARM_FEATURE_FMA 1 
#define __ARM_FEATURE_UNALIGNED 1 
#define __ARM_FP 0xe 
#define __ARM_FP16_FORMAT_IEEE 1 
#define __ARM_FP_FENV_ROUNDING 1 
#define __ARM_NEON 1 
#define __ARM_NEON_FP 0xe 
#define __ARM_PCS_AAPCS64 1 
#define __ARM_SIZEOF_MINIMAL_ENUM 4 
#define __ARM_SIZEOF_WCHAR_T 4 

答えて

2

。これは、コンパイラがターゲットとするベースラインABIにはないオプション機能です。つまり、コンパイラが生成するバイナリは、CRC機能を持たないデバイス上で実行できることが期待されます。

は、少なくともGCCについて、あなたはこのように、-march修飾crcでこの機能を有効にすることができます

$ gcc -dM -E - -march=armv8-a+crc < /dev/null | egrep -i '(arm|neon|acle|crc)' 
#define __ARM_FEATURE_CRC32 1 
#define __ARM_NEON 1 

は、これを設定する方法の詳細ドキュメントのためhttps://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/AArch64-Options.html(または古いバージョンのgccのための同じページ)を参照してください。 。

-march=nativeは同じことを期待できますが、現在のところ、そのオプションはx86アーキテクチャ用に実装されているようです。

+0

ありがとう@mstorsjo。これは私のために多くを説明します。再度、感謝します。 '__ARM_ARCH'と' __ARM_ACLE'という他の欠落している機能のように、存在するはずの他の定義を取得するにはどうしたらいいですか? Linaroが4.9コンパイラを提供するので '__ARM_ACLE'は重要です。したがって、' has_include(x) 'は利用できません。 – jww

+0

Wrt '__ARM_ARCH'、明らかにgccはaarch64にそれを含めないことを選択しました。 '__AARCH64__'が定義されていれば' __ARM_ARCH> = 8'とほぼ同等です。 '__ARM_ACLE'に関しては、明らかにgccはそれを設定しません。私は '__ARM_FEATURE_CRC32'がセットされていると' arm_acle 'をインクルードすることができると思います。もしあなたがgcc/clang上にあって、 '__ARM_FEATURE_CRC32'が追加されたバージョンの場合は、それはどちらかといえば - 私は手を知らない)。 – mstorsjo

+0

ああ、ここに行きます... [GCCバグ57989 - ARMのgccは__ARM_FEATURE_SIMD32を定義しますが、SIMD32(ARMv6)の組み込み関数は提供していません](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57989) 。バグから:*「ACLEの実装は進行中です。この定義が組み込み関数の前に追加されたのは残念です」*。彼らは、ARM関連のすべての定義をヤンクしたようです。 – jww

関連する問題