2017-11-25 18 views
2

私はシステムによって提供されたものに対して関数宣言を追加しようとしていました。
しかし、関数プロトタイプはsize_tを返します。これは、32ビットプラットフォームではint32、64ビットプラットフォームではint64です。
ターゲットプラットフォームを検出し、それに応じて宣言を追加する方法があるかどうかを知りたいですか?プラットフォーム固有の関数定義をLLVMパスに追加する方法は?

答えて

1

少しの研究の後で、ターゲット中立言語としてLLVM IRは、おそらくターゲット固有のタイプサイズを知ることができません。 thisを見て、Chris Lattnerがこの件に関するコメントをしてください。また、thisに関連する質問があります。

これはフロントエンドの仕事であり、フロントエンドがターゲットとそのABIを「知る」必要があるという余分な簿記情報が発生します。たとえば、Lociプログラミング言語の場合、thisのようなプロジェクトのニーズがあるかもしれません。 thisに従ってsize_tに特に今

[...] std::size_t安全それはstd::uintptr_tと同義である場合 における任意の非メンバポインタの値を格納することができます。

したがってDataLayoutクラスのgetIntPtrTypeメソッドを使用できます。

その他のデータ型については、「推測」があなたを得ることができるかどうかはわかりません(これまでの参考文献からはあまり遠くないと思われます)。

最後に、別の代替は、必然的に、ターゲットごとの具体的な定義を通過する固有のカスタム(例えばmemcpyを参照)、とextendingLLVMである可能性があります。


実際にあなたが getIntNTypeコールのビットの正確な数を提供するために、 CHAR_BITの使用に伴い sizeof演算子を使用することができ、あなたの整数型の作成を適応させるため。

これにより、モジュールパスが構築されているプラ​​ットフォーム上で整数型に適切なサイズを使用できるようになります。

パスが実行されているプラ​​ットフォームでタイプのサイズを「動的に」検出するために、何らかの設定ファイルでその情報を提供する以外の方法はありません。

しかし、これは自動化され、さまざまなビルドシステムの例(も使用されています)をコンパイルし、その生成を自動化できる簡単なプログラムを作ることができます。

これをできるだけ可搬性にし、車輪を改革しないようにするには、 cmakeCheckTypeSizeモジュールを使用できます。

+0

私は正しい答えではないかと疑います。適切な解決策には、TargetMachineなどを使用して型のサイズを調べる必要があります。 – arrowd

+0

@arrowdそれは本当であり、私は 'llvm :: DataLayout'を含む解決策を打ち出しましたが、' '' size_t'''はLLVM IRでは知られておらず、その時点で終わります。 – compor

+0

私はあなたがトリプルまたはポインタのサイズに基づいて推測すべきだと思います。 – arrowd

関連する問題