什么是clobber?

sdg*_*sdh 4 compiler-construction llvm clang

Clang TargetInfo有一个叫做的方法getClobbers:

以LLVM格式返回一组特定于目标的clobber.

那么,什么是咒语呢?

yug*_*ugr 11

被破坏的寄存器是一个被删除的寄存器,即由内联汇编程序以不可预测的方式进行修改.这通常发生在需要温度时.注册或使用特定指令,恰好将某些寄存器修改为副产品.

程序员通常会明确声明由其内联asm代码破坏的寄存器,但有些可能会被认为是默认情况下被破坏的,而这正是getClobbers发挥作用的地方.

getClobbers返回大多数目标的空结果.在MIPS上,GCC历来不会$1在生成的代码中使用,因此大多数程序员都不愿意将其声明为破坏.为了降低可移植性成本,LLVM认为$1总是在内联asm中被破坏.

  • 可能值得补充的是,"trashed"在这里意味着汇编程序代码需要使用寄存器(如果您不熟悉汇编程序,寄存器可以被视为内置在CPU中的非常快速的临时变量,而不是在单独的RAM芯片上) ,因此不会保留调用者放入其中的值. (4认同)
  • i386 和 amd64 gcc(我很确定还有 clang)在 asm 语句中隐式破坏条件代码“cc”,因为许多整数指令不可避免地会写入它们。我知道您并不是想列出一份详尽的清单,但这是一个主要 ISA 的清单。 (2认同)