我是LLVM的初学者。 当我浏览LLVM的API时,我有一个天真的问题:
"实现了什么"在llvm GlobalValue.h中意思是
在doxygen中: http://llvm.org/doxygen/classllvm_1_1GlobalValue.html#ac1b5643f40dd3c7b92a548027eb13de0
它说: 错误GlobalValue :: materialize()确保完全阅读此GlobalValue。
但是,它究竟意味着什么?这是否意味着此函数将使GlobalValue被完全读取?什么"完全阅读"意思?
提前致谢!
答案 0 :(得分:4)
从bitcode或文本IR加载LLVM IR时,您可以选择使用只加载“声明”的“懒惰”加载器(请参阅LLVM 4.0源中的include/llvm/IRReader/IRReader.h
或include/llvm/Bitcode/BitcodeReader.h
)全局/函数。无论什么时候需要“定义”,你都必须实现你需要的东西。
这是一种优化,可以避免从bitcode或IR文件中解析和加载不必要的代码。
你仍然会得到llvm::Module
,但是全局(包括函数)不是“物化”的,即你可以查看类型,但是对于一个函数,你不能访问实际的函数体,直到你调用materialize
。在将函数或模块传递给需要代码的LLVM API函数之前,您必须调用materialize()
或模块materializeAll()
。
如果您不需要此行为,您也可以使用非延迟版本的加载器,而不必担心这一点。特别是如果您通过API自己创建模块而不是从某处加载模块,则无需担心材料化。