2016-06-02 7 views
1

私のシステムのファイル/usr/include/c++/4.9/atomicのg ++​​ソースコードでは、関数atomic::compare_exchange_strongは次のような本体を持っています。g ++ソースで `__atomic_compare_exchange`がどこに定義されていますか?

bool 
    compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, 
       memory_order __f) noexcept 
    { 
return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f); 
    } 

しかし、このファイルには、bits/atomic_base.h含まれており、私は、このファイルに__atomic_compare_exchangeの定義を見つけられませんでした。

__atomic_compare_exchangeはどこですか?

+0

https://github.com/gcc-mirror/gcc/blob/03a400fb461fdc020418f3841d446f565e208db3/gcc/builtins.c#L5091:それを表現するx86命令はsync.mdという名前の別のプラットフォーム固有のジェネレータファイルに記載されています –

答えて

2

__atomic_compare_exchangeはコンパイラを内蔵しています。実際にヘッダには定義されていません。コンパイラ自体はそれが何であるかを知っています。

GCCソース自体では、それはsync-builtins.defで宣言されています。私はGCCのソースに慣れていないので、アーキテクチャー固有の実装にどのように浸透するか正確にはわかりませんが(maybe_emit_atomic_exchangeを通過するようですが)、

(define_insn "atomic_exchange<mode>" 
    [(set (match_operand:SWI 0 "register_operand" "=<r>")  ;; output 
    (unspec_volatile:SWI 
     [(match_operand:SWI 1 "memory_operand" "+m")  ;; memory 
     (match_operand:SI 3 "const_int_operand")]  ;; model 
     UNSPECV_XCHG)) 
    (set (match_dup 1) 
    (match_operand:SWI 2 "register_operand" "0"))]  ;; input 
    "" 
    "%K3xchg{<imodesuffix>}\t{%1, %0|%0, %1}") 
0

これはおそらく、コンパイラ固有のものです。コンパイラ自体は、純粋なライブラリソリューションではなく、コンパイラ自身が採用して動作するものです。いくつかの型の特性など、完全な標準ライブラリを実装するためにはいくつかのコンパイラの助けが必要であり、他のケースでは、コンパイラはより最近ではこの処理を実行しているstd::make_index_sequence小以外の値に対しても同様です。

関連する問題