2015-10-08 44 views
0

通常,C函數由clang轉換爲ARM架構,使得LR寄存器被壓入堆棧。但是,如果函數本身不包含任何函數調用,則不會推送LR,即編譯器假定LR不會被修改。確保將寄存器推入堆棧的功能條目

有沒有辦法讓clang/llc總是在函數的開頭推LR?無論它是否調用函數?

+0

似乎並沒有成爲一個編譯器標誌爲你做的。如果您願意修改ARM後端,請從以下位置開始:http://llvm.org/docs/doxygen/html/ARMFrameLowering_8cpp_source.html#l01630 –

+0

我希望有一個屬性,編譯指示或註釋可以實現。 –

+0

一種可能性是在函數的開頭添加一個空的內聯asm,該函數將LR列爲一個破碎的寄存器。 –

回答

0

從上面的評論複製。

嘗試粘貼​​在函數體的開頭。這告訴LLVM lr被破壞。如果LLVM發現某個寄存器在函數中的任何地方被破壞,它必須在該函數的開頭保存該寄存器。

(該略帶神祕的內聯彙編語法如下記載:https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html