システムが提供するものに関数宣言を追加しようとしていました。
ただし、関数プロトタイプはを返しますsize_t
。これは、32ビットプラットフォームではint32、64ビットプラットフォームではint64です。
ターゲットプラットフォームを検出し、それに応じて宣言を追加する方法があるかどうか知りたいですか?
少し調べてLLVM IR
みると、ターゲットの中立言語はターゲット固有のタイプサイズを知ることができない可能性があります。クリス・ラトナーがこの主題についてコメントしているこの関連する議論を見てください。また、この関連するSOの質問で。
したがって、これはフロントエンドの仕事であり、これにより、フロントエンドがターゲットとそのABIを「知る」必要がある追加の簿記情報が発生します。したがって、たとえば、Lociプログラミング言語の場合、このようなプロジェクトが必要になる可能性があります。
今、特に用size_t
によると、この:
[...]
std::size_t
は、非メンバーポインタの値を安全に格納できstd::uintptr_t
ます。この場合、それは。と同義です。
したがって、クラスのgetIntPtrType
メソッドを使用できますDataLayout
。
他のデータ型については、「推測」でどこまで到達できるかわかりません(おそらく、以前の参照から判断するとそれほど遠くはありません)。
最後に、別の代替手段は、カスタム組み込み(たとえばを参照)で拡張 LLVM
することもできますmemcpy
。これは、必然的にターゲットごとに特定の定義を通過します。
整数型の作成を実際に適応させるには、呼び出しで正しいビット数を提供するために sizeof
、の使用とともに演算子を 使用できます 。 CHAR_BIT
getIntNType
これにより、モジュールパスが構築されているプラットフォームで整数型に適切なサイズを使用できるようになります。
パスが実行されているプラットフォームでタイプのサイズを「動的に」検出するために、ある種の構成ファイルでその情報を提供する以外に方法はありません。
ただし、これは自動化でき、さまざまなビルドシステムの例(たとえば、cmake
によっても使用されますLLVM
)を使用して、コンパイルしてその生成を自動化できる単純なプログラムを作成できます。
そのために、そしてこれを可能な限りポータブルにし、車輪の再発明を回避するために、 cmake
の CheckTypeSize
モジュールを使用でき ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加