什么是clobber?

17

Clang的TargetInfo类有一个名为getClobbers的方法:

返回一个LLVM格式的特定目标的clobber字符串。

那么,什么是clobber呢?

1个回答

26
一个被破坏的寄存器是指在内联汇编中以不可预测的方式被修改的寄存器。这通常发生在需要临时寄存器或使用特定指令的情况下,该指令恰好会作为副产品修改某些寄存器。
通常,程序员会明确声明由他的内联asm代码破坏的寄存器,但有些寄存器可能默认被认为是无用的,这就是“getClobbers”的作用所在。
对于大多数目标,getClobbers返回空结果。在MIPS上,GCC历史上没有在生成的代码中使用$1,因此大多数程序员没有费心将其声明为被破坏的。为了减少可移植性成本,LLVM认为$1始终在内联asm中被破坏。另一个例子是算术标志寄存器(cc),在i386和x86_64目标上,GCC 被认为总是被内联asm破坏

9
可能值得补充的是,“trashed”在这里的意思是汇编代码需要使用寄存器(如果您不熟悉汇编语言,寄存器可以被视为内置于CPU中而不是在单独的RAM芯片上的非常快速的临时变量),因此不会保留调用者放入其中的值。 - uliwitness
@uliwitness 谢谢,已添加。 - yugr
1
i386和amd64的gcc(我相信clang也是)在asm语句中隐式破坏条件码“cc”,因为许多整数指令不可避免地会写入它们。我知道你不是在尝试列出详尽的清单,但这是一个主要ISA的例子。 - Peter Cordes
@PeterCordes 谢谢,这是对答案的很好补充。我还没有在Clang中找到这样做的代码,只提到了GCC。 - yugr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接