2016-03-22 17 views
2

私は、DSLとC/C++を統合するためのプログラミング言語コンパイラを作成しています。そのために私はいくつかの理由からLLVMを決めました。LLVMのboolのデータ型IR

メインプログラムがあります。このメインプログラムでは、clangによってコンパイルされたビットコードファイルをロードします。ロード可能なビットコードファイルは、REPL、パーサー、リンカー、およびASTを使用して、短くて完全なプログラミング言語環境を表します。

これまでのところ、ブール型のデータ型はIRでi1として表されていました。私は-O3で私のコードを最適化していると私は(生成されたビットコードファイルからLLVM-DISを分解して)ブール以下のIRコードを取得する:

%"class.tl::contrib::toy::ToyREPL" = type <{ %"class.tl::contrib::toy::InitLanguage"*, i8, [7 x i8] }> 

クラスはToyREPLであり、それは別のクラスのInitLanguageを使用しています。奇妙なことに、ブール値はi8とi8の配列によって表されるようです。私は本当にそれを取得しません。

私はMakefileを定義しました。最初にファイルをコンパイルします。その後、それらをbcファイルにリンクし、最適化して他のライブラリとリンクします。

@cd $(BIN)/$(TARGET)/$(2); $(LINK) -o $(1).$(BITCODE_EXT) $(3) 

@cd $(BIN)/$(TARGET)/$(2); $(OPT) -O3 $(1).$(BITCODE_EXT) -o $(1).$(OPT_NAME).$(BITCODE_EXT) $(OPTIMIZER_FLAGS) 

@$(LINK) -o $(BIN)/$(TARGET)/$(2)/$(1).$(BITCODE_EXT) $(BIN)/$(TARGET)/$(2)/$(1).$(OPT_NAME).bc $(LINK_OPTION) $(4) 

コンパイラフラグは次のとおりです。

-v -g -emit-llvm -I$(BOOST_INC_DIR) -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS 

オプティマイザフラグ-std-link-opts

リンクフラグが-vです。

クラスToyREPLの関連部分はここにある:

class ToyREPL { 
private: 

    InitLanguage *initLang; 

    bool runs = false; 

今、私の質問:は私の仮定間違ったブール値I1にコンパイルビットコードする必要がありますか? i1にコンパイルするにはどのようなコンパイラスイッチが必要ですか?自分のビルドプロセスが何らかの形で間違っていると思ったら教えてください。生成ビットコードファイルは読み込み可能で、モジュールとクラスToyREPLをStructTypeとして取り出すことができます。

+0

引用符で囲まれた引用符は、コンピュータではなく人間が書くことを意図したものを引用するときに最も適しています。;) – Yakk

答えて

2

私が正しくあなたを理解していれば、あなたの質問は基本的にある - なぜC++クラスはtype <{ i8, [7 x i8], ... }>にクランでコンパイル

class ToyREPL { 
    bool runs = false; 
    ... 
}; 

でしたか?

ので簡単ですクランは、ブール型フィールドのi1i8を選んだ理由は、すべての最初の - the smallest C++ type takes one byte of memory、あなたはまた、構造体のフィールドに適用されるビットフィールドを、使用しない限り。また、this related question about why a whole byte is used for booleansを参照してください。 LLVM自体はブール値にi1を使用していますが、それはプラットフォームにはほとんど依存しないからです。下降段階では、再びバイト全体になる可能性があります。

[7 x i8]は、このタイプのすべてのオブジェクトが64ビット境界になっていることを保証するために作られたパディングで、他のオブジェクトとメモリを共有しません。これは64ビットシステムで非常に妥当なアプローチです。代わりに、次の構造体フィールドがある場合、フィールドが64ビットで整列されるように、埋め込みが挿入されている可能性があります。

The Wikipedia article on alignment and paddingは、もっと知りたい場合に便利な出発点です。

+0

これは明白な答えのようです...しかし、LLVMの面で例外はありませんか、それともほとんどがC++が指定された方法に起因していますか? – VermillionAzure

+0

ありがとうございます。私は64ビットマシンを持っているので、パディングは意味をなさない。しかし、これは整数値とブール値の間を決して識別できないことを意味します。 – repl

+0

@ VermillionAzureこれはC++が指定された方法とパフォーマンス上の理由から、私が知る限り、Clangのものです。たとえば、別の言語ではブール値に 'i1'を指定してスペースを節約することができますが、' i1'をバイトアドレッシングだけのマシンにロードして格納するには、 – Oak

関連する問題