Compilation 确保寄存器在函数入口被推送到堆栈

Compilation 确保寄存器在函数入口被推送到堆栈,compilation,clang,llvm,llvm-clang,Compilation,Clang,Llvm,Llvm Clang,通常,对于ARM体系结构,C函数通过clang进行转换,从而将LR寄存器推送到堆栈上。但是,如果函数本身不包含任何函数调用,则不会推送LR,即编译器假定不会修改LR 有没有办法让clang/llc始终在函数的开头推送LR,而不管它是否调用函数?从上面的注释复制而来 尝试粘贴asm volatile(“:”lr”)位于函数体的开头。这会告诉LLVM,lr被击倒。如果LLVM发现某个寄存器在函数中的任何位置被阻塞,它必须在函数的开头保存该寄存器 (这里记录了有点神秘的内联asm语法:)似乎不是一个编

通常,对于ARM体系结构,C函数通过clang进行转换,从而将LR寄存器推送到堆栈上。但是,如果函数本身不包含任何函数调用,则不会推送LR,即编译器假定不会修改LR


有没有办法让clang/llc始终在函数的开头推送LR,而不管它是否调用函数?

从上面的注释复制而来

尝试粘贴
asm volatile(“:”lr”)位于函数体的开头。这会告诉LLVM,
lr
被击倒。如果LLVM发现某个寄存器在函数中的任何位置被阻塞,它必须在函数的开头保存该寄存器


(这里记录了有点神秘的内联asm语法:)

似乎不是一个编译器标志来为您执行此操作。如果您愿意修改ARM后端,请从这里开始:我希望有一个属性、pragma或注释可以起到作用。一种可能是在函数的开头添加一个空的内联asm,将LR列为一个被删除的寄存器。这看起来像什么,即如何定义这样的内联asm语句的范围?未测试,但是尝试粘贴
asm volatile(“:”lr”)位于函数体的开头。这会告诉LLVM,
lr
被关闭,因此它必须在序言中推送寄存器。