2017-02-14 11 views
1

いくつかの単語で問題__builtin_mul_overflow clang5拡張子を認識するために失敗します。打ち鳴らす5.1で、MAC OSX 10.8.5上、コンパイラは__builtin_mul_overflow特に、「clang5」伸長を認識していないようですunknown builtinとなります。この問題は、最新のsqlite3(3.17)をコンパイルしようとした後に発生し、この条件付きで私に強制的に強制することを主張しています#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000。私はCLANGテストに合格しますが、GCCテストに失敗します(バージョンについては以下を参照)。OSX 10.8.5:gccが

sqlite3.cを修正して、これらの組み込み関数を使用しないようにすることで、この問題を回避することができました(短絡したCLANGとGCC_VERSIONのプリプロセッサ条件付きチェックがあります)。

私の質問はです:自分のシステムでclang5拡張機能を利用できないと誤解していますか?あるいは何か壊れているかもしれませんか? sqlite3.c私のシステムでは、これらの余分な組み込み関数について知ることができるはずです.GCC-または -CLANG version-checkが成功し、コンパイラ(gcc)はエラーunknown builtinで失敗します。

詳細

$ clang --version 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin12.6.0 
Thread model: posix 

$ gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin12.6.0 
Thread model: posix 

以下のプログラム:

 # define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) 
# define CLANG_VERSION (__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__) 

    #include <stdio.h> 

    int main(void){ 
      printf("CLANG_VERSION: %d\n", CLANG_VERSION); 
      printf("GCC_VERSION: %d\n", GCC_VERSION); 
    } 

は(sqlite3のから借りた)出力を与える:

CLANG_VERSION: 5001000 
GCC_VERSION: 4002001 

とsqlite3.cに決定しますこのコードを使用して__builtin_mul_overflowを使用します(li ne 28856など):

#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000 
    return __builtin_mul_overflow(*pA, iB, pA); 
#else 
    ... code without the builtin which succeeds if check is short-circuited ... 
#endif 
+0

'sqlite3'は' CLANG_VERSIONで大丈夫コンパイル:8000000'、 'GCC_VERSION:あなたは'の#if GCC_VERSIONを行う際4002001' ...また何が=>起こります4002001 || CLANG_VERSION> = 5001000'? –

+0

ありがとうございます。以前と同じように失敗します(私のバージョンからは明らかです)。私のclangのバージョン文字列、 'Apple LLVM version 5.1(clang-503.0.40)(LLVM 3.4svnに基づいています) 'は、clang5 **とclang5の拡張**を除いた何かを意味するのでしょうか? – bliako

+0

拡張機能は基本的には、機能が現在の言語(言語拡張機能または標準言語機能のいずれか)で 'Clang 'によってサポートされているかどうかを示します。そうでない場合は' 0'、そうであれば '1'を示します。どの 'sqlite3'をソースからコンパイルしようとしていますか? –

答えて

0

これは明らかにバグです。要するに、誰がClangのアップルのバージョンを実現していないsqlite3.cCLANG_VERSION>=4000000チェックを入れます(5.1)は組み込み関数をサポートしていませんがあります。

__builtin_add_overflow(*pA, iB, pA); 
__builtin_sub_overflow(*pA, iB, pA); 
__builtin_mul_overflow(*pA, iB, pA); 

それははっきりしませんが、まだコンパイラは続きますあなたがエラーを取得したときだと思っています。これらのチェックを外して、この場合はそれぞれ#elseの後ろにあるコードを使用するか、CLANG_VERSION>=を実際にサポートしているバージョンに変更してください。いずれにしても、コンパイル時に正しいコードを使用する必要があります。

Modified Code(ラインsqlite3.cで28834から28889を置き換える)

+0

"(5.1)が組み込み関数をサポートしていないというClangのアップル版を実現していない":本当ですか? OSX 10.8.5のclang 5.1は実際には、これらの拡張機能をサポートしていないclangのいくつかの他のバージョン(時にはこれらのリンゴOSで発生する)を意味しますか? – bliako

+0

はい、macOSのClang/LLVMはLinux上のClangと同じではありません。アップル独自の修正版であり、実装されているいくつかの機能は、Linux対応のものよりもやや遅れている可能性がある。 –

+0

私はsqlite3フォーラムにバグレポートを掲載しており、その回答を待っています。 – bliako

関連する問題