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

ign*_*rer 4 llvm llvm-ir

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

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

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

它说:错误GlobalValue :: materialize()

确保已完全读取此GlobalValue。

但是,这到底意味着什么?这是否意味着该函数将使GlobalValue被完全读取?“完全阅读”是什么意思?

提前致谢!

Pau*_*ulR 6

从位码或文本IR加载LLVM IR时,可以选择使用仅加载全局/函数的“声明”的“惰性”加载器(请参阅include/llvm/IRReader/IRReader.hinclude/llvm/Bitcode/BitcodeReader.h在LLVM 4.0源中)。每当您需要“定义”时,就必须实现您所需要的。

此优化避免了从位码或IR文件中解析和加载不必要的代码。

您仍然会得到一个llvm::Module,但是全局变量(包括函数)不是“物化的”,即,您可以查看类型,但是对于一个函数,您必须先调用才能访问实际的函数体materialize。在将功能或模块传递给需要调用代码或模块的LLVM API函数之前,必须先调用该代码materialize()或模块materializeAll()

如果您不需要这种行为,则可以使用非延迟版本的加载程序,而不必为此担心。尤其是,如果您通过API自己创建模块,而不是从某个地方加载模块,则无需担心是否会泛化。