我是 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.h
或 include/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/