我試圖修改LLVM,以便它在內存中保持某些常量和函數連續。
換句話說,我需要確保某些函數的機器代碼是總是,前面加上一些~4字節的常量。 函數體本身不能被修改。如何在LLVM IR中控制全局變量的位置?
我可以簡單地通過修改LLVM IR來實現嗎?
如果是: 我怎麼會在LLVM IR狀態保持變量和函數連續的內存?
如果不是: 代碼生成過程的哪個部分(即哪個過程)應該修改以實現此目的?任何鏈接到我應該看的項目/文件都會有所幫助,因爲我不確定從哪裏開始。
我試圖修改LLVM,以便它在內存中保持某些常量和函數連續。
換句話說,我需要確保某些函數的機器代碼是總是,前面加上一些~4字節的常量。 函數體本身不能被修改。如何在LLVM IR中控制全局變量的位置?
我可以簡單地通過修改LLVM IR來實現嗎?
如果是: 我怎麼會在LLVM IR狀態保持變量和函數連續的內存?
如果不是: 代碼生成過程的哪個部分(即哪個過程)應該修改以實現此目的?任何鏈接到我應該看的項目/文件都會有所幫助,因爲我不確定從哪裏開始。
據我所知,我不認爲你可以通過修改IR來做到這一點;你必須自己寫一些東西來處理它。它不應該是合格的 - 它太低級了,它應該在target-specific code generation期間運行。您可以搭載現有目標並修改此方面,當然,您不必從頭開始編寫新的目標。儘管如此,我不知道哪個位置對此會有好處。
我認爲在代碼生成過程中將這些信息從IR級別傳遞給DAG的一種好方法是使用元數據:將元數據附加到函數或關聯的常量上,然後將它們相互鏈接起來使用該鏈接將它們放在一起。見this thread on llvm-dev for information how to transfer the metadata。
這顯然適用於諸如x86之類的非哈佛架構,但是在像Atmel這樣的哈佛架構中,這是沒有意義的。前面的代碼也是代碼;數據後面的字節也是數據。我認爲LLVM足夠便攜以支持哈佛架構。 – MSalters
@ MSalters:是的......但這並不意味着它*無法爲非哈佛體系結構提供這種功能。這並不是說它畢竟沒有特定於平臺的功能(SSE等)。 :)但如果你知道它不支持這個事實,那麼請張貼它作爲答案! – Mehrdad
它與GHC的TNTC優化有關嗎? – arrowd