我正在编写一种编程语言的编译器,以将DSL与C/C++集成。出于几个原因,我决定使用LLVM。
有一个主程序。在这个主程序中,我加载由clang编译的位码文件。可加载的位码文件代表了一个短小但完整的编程语言环境,包括REPL、解析器、链接器和AST。
迄今为止我的理解是布尔数据类型在IR中被表示为i1。我已经使用-O3对我的代码进行了优化,并且我得到了以下用于布尔的IR代码(通过从生成的位码文件中反汇编得到):
编译器标志是:
有一个主程序。在这个主程序中,我加载由clang编译的位码文件。可加载的位码文件代表了一个短小但完整的编程语言环境,包括REPL、解析器、链接器和AST。
迄今为止我的理解是布尔数据类型在IR中被表示为i1。我已经使用-O3对我的代码进行了优化,并且我得到了以下用于布尔的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;
现在我的问题是:我的假设是错误的,bool 应该被编译为 i1 吗?我需要考虑哪种编译器开关来编译为 i1?如果你认为我的构建过程有问题,请让我知道。生成的 bitcode 文件是可读的,我可以检索到模块和类 ToyREPL 作为 StructType。