2017-08-11 60 views
3

我是LLVM的初學者。 當我經過LLVM的API,我有一個幼稚的問題:在llvm中「實現」意味着什麼GlobalValue.h

什麼是 「兌現」 在LLVM意味着GlobalValue.h

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

它說: 錯誤GlobalValue :: materialize()

確保此GlobalValue已完全讀取。

但是,這是什麼意思?這是否意味着此函數將使GlobalValue被完全讀取? 「完全閱讀」是什麼意思?

提前致謝!

+0

http://lists.llvm.org/pipermail/llvm-dev/2017-June/114670.html – arrowd

+0

我會冒險它意味着'意識到','水合物'或任何其他術語,以確保數據是不連貫(讀不完整)。 –

回答

3

當您從位碼或文本IR加載LLVM IR時,可以選擇使用「懶惰」加載程序(請參閱LLVM 4.0源中的include/llvm/IRReader/IRReader.hinclude/llvm/Bitcode/BitcodeReader.h),該程序只加載全局變量或函數的「聲明」。無論何時你需要「定義」,你都必須實現你需要的東西。

這是一種優化,避免從位碼或IR文件解析和加載不必要的代碼。

你仍然會得到一個llvm::Module,但全局(包括函數)不是「物化」,即你可以看看類型,但對於一個函數,直到您叫materialize你不能訪問實際的函數體。在將函數或模塊傳遞給需要代碼的LLVM API函數之前,您必須調用materialize()或模塊materializeAll()

如果你不需要這種行爲,你可以使用非懶惰版本的加載器,不必擔心這一點。特別是如果你通過API自己創建模塊,而不是從某個地方加載模塊,則不需要擔心maternalization。