2016-04-19 18 views
7

現在、私は生成されたIRでvoidポインタを表現するためにi8 *を使用していますが、void *をchar *と区別することは非常に困難です。これを解決するための共通のアプローチはありますか?私は運のないかなりの場所を探しました。voidポインタ型をllvm irで表現する

タイプごとにllvm :: Type *を直接使用することができるため、特殊なボイドポインタの場合にはこれ以上行うことはできません。

void型としてi8を含む名前付き構造体(たとえば%void = type {i8})を使用し、その代わりにポインタをとることが考えられますが、clangが生成するIRでは、 voidポインタ型であるため、それぞれの長所と短所が分かりません。

+1

一般的な型は、コンパイラのフロントエンドに属します。 LLVMタイプのシステムがあなたのものに似ているかもしれませんが、あなたのもとから自由に変更することができます(一例:[不透明なポインタタイプ](http://llvm.org/devmtg/2015-10/slides/Blaikie -OpaquePointerTypes.pdf)が来ています)。タイプをLLVMレベルで区別する必要はありません。 –

+0

ソースから開始し、デバッグ情報を有効にしている場合は、それらを解析して、ポインタが本当に何であるかを知ることができます(uint *、void *、...)。 あなたが自分のllvmIRを書く(または生成する)場合、なぜそれが必要なのかわかりません。 –

+0

@IsmailBadawiはすべて意味があります。ありがとうございました。私のコンパイラのためのより完全な型システムを書く時が来たようです。ところで、もしあなたがそれを答えたら私はそれを受け入れます。 – Lane

答えて

5

通常、型はコンパイラのフロントエンドに属します。 LLVMタイプのシステムはあなたのものと似ているかもしれませんが、あなたのもとから自由に変更することができます(例:opaque pointer typesが来ています)。 LLVMレベルでタイプを区別する必要はありません。タイプ・システムとLLVMタイプ・システムの間に1対1の対応を強制しようとすると、おそらく誤っています。

関連する問題