- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个编程语言编译器来集成 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 为什么选择 i8
在 i1
对于 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!