gpt4 book ai didi

c++ - LLVM IR 中 bool 的数据类型

转载 作者:太空狗 更新时间:2023-10-29 21:16:05 24 4
gpt4 key购买 nike

我正在编写一个编程语言编译器来集成 DSL 和 C/C++。为此,出于几个原因,我决定使用 LLVM。

有一个主程序。在这个主程序中,我加载了由 clang 编译的位码文件。可加载的位码文件代表一个简短但完整的编程语言环境,包括 REPL、解析器、链接器和 AST。

到目前为止,我的理解是 bool 数据类型在 IR 中表示为 i1。我已经使用 -O3 优化了我的代码,并且在 IR 代码之后得到了一个 bool 值(通过从生成的位码文件中使用 llvm-dis 进行反汇编):

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

该类是 ToyREPL,它正在使用另一个类 InitLanguage。奇怪的是, bool 值似乎是由一个 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++ 类

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

由 Clang 编译成 type <{ i8, [7 x i8], ... }>

那么首先,Clang 为什么选择 i8i1对于 bool 字段很简单 - the smallest C++ type takes one byte of memory ,除非您使用位字段,否则这也适用于结构中的字段。另见 this related question about why a whole byte is used for booleans . LLVM 本身使用 i1对于 bool 值,但那是因为它大致与平台无关——在降低阶段,它们可能再次变成完整的字节。

至于[7 x i8] ,这是填充,用于确保此类型的每个对象都是 64 位对齐的并且不与任何其他对象共享其内存 - 在 64 位系统上非常合理的方法。或者,如果有以下结构字段,则可能已插入填充以确保该字段是 64 位对齐的。

The Wikipedia article on alignment and padding如果您想了解更多信息,这是一个有用的起点。

关于c++ - LLVM IR 中 bool 的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36163668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com