【发布时间】:2016-07-09 21:18:35
【问题描述】:
我正在编写一个编程语言编译器来集成 DSL 和 C/C++。为此,我决定使用 LLVM 有几个原因。
有一个主程序。在这个主程序中,我加载了由 clang 编译的 bitcode 文件。可加载的位码文件代表一个简短但完整的编程语言环境,包括 REPL、解析器、链接器和 AST。
到目前为止,我的理解是布尔数据类型在 IR 中表示为 i1。我已经用 -O3 优化了我的代码,我得到了一个布尔值跟随 IR 代码(通过使用 llvm-dis 从生成的位码文件中反汇编):
%"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?如果您认为我的构建过程在某些方面是错误的,请告诉我。生成的位码文件是可读的,我可以将模块和类 ToyREPL 作为 StructType 检索。
【问题讨论】:
-
用代码替换引号——在引用供人类而非计算机编写的内容时,引号通常是最好的。 ;)
标签: c++ c++11 llvm llvm-clang