llvm - llvm GlobalValue.h 中的 "materialize"是什么意思

标签 llvm llvm-ir

我是 LLVM 的初学者。
当我浏览 LLVM 的 API 时,我有一个天真的问题:

llvm GlobalValue.h 中的“物化”是什么意思

在 doxygen 中:
http://llvm.org/doxygen/classllvm_1_1GlobalValue.html#ac1b5643f40dd3c7b92a548027eb13de0

它说:
错误 GlobalValue::materialize ()

Make sure this GlobalValue is fully read.



但是,它的真正含义是什么?是不是意味着这个函数会让 GlobalValue 被完全读取? “完全阅读”是什么意思?

提前致谢!

最佳答案

当您从位码或文本 IR 加载 LLVM IR 时,您可以选择使用仅加载全局/函数的“声明”的“惰性”加载器(参见 LLVM 4.0 源代码中的 include/llvm/IRReader/IRReader.hinclude/llvm/Bitcode/BitcodeReader.h)。每当您需要“定义”时,您都必须具体化您的需求。
这是一种优化,可避免从位码或 IR 文件中解析和加载不必要的代码。
您仍然会收到 llvm::Module ,但全局变量(包括函数)不是“物化的”,即您可以查看类型,但对于函数,您无法访问实际的函数体,直到您调用 materialize .在将函数或模块传递给需要代码的 LLVM API 函数之前,您必须调用 materialize()或模块 materializeAll() .
如果您不需要这种行为,您也可以使用加载器的非惰性版本,而不必担心这一点。特别是如果您通过 API 自己创建模块而不是从某个地方加载它,则无需担心物化。

关于llvm - llvm GlobalValue.h 中的 "materialize"是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642228/

相关文章:

llvm - 如何将llvm IR转换为c代码?

llvm - 使用LLVM作为虚拟机——多平台和多架构编码

llvm - lli 不会善待 rust 的 LLVM IR

llvm - 区分 LLVM IR 中的 float 和 double

c++ - IR LLVM 形式与汇编

ios - libc++abi.dylib : handler threw exception -- but no stack trace in XCode

c++ - 使用 clang 编译时出现正则表达式段错误,可能是编译器错误?

llvm - 从联合中提取值

c - 插入 getelementptr 指令

c++ - 如何使用 llvm-10 库在 C++ 中定义 LLVM GlobalValue 变量?