【问题标题】:What is a clobber?什么是破坏者?
【发布时间】:2017-06-13 11:36:41
【问题描述】:

Clang TargetInfo 有一个方法叫getClobbers

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

那么,什么是破坏者?

【问题讨论】:

    标签: compiler-construction clang llvm inline-assembly


    【解决方案1】:

    一个被破坏的寄存器是一个被丢弃的寄存器,即被内联汇编器以不可预知的方式修改。这通常发生在您需要临时工时。注册或使用特定指令,该指令恰好将某些寄存器修改为副产品。

    通常程序员显式声明被他的内联汇编代码破坏的寄存器,但有些可能被认为默认被丢弃,这就是getClobbers发挥作用的地方。

    getClobbers 为大多数目标返回空结果。在 MIPS 上,GCC 历来没有在生成的代码中使用 $1,因此大多数程序员都懒得将其声明为已破坏。为了降低可移植性成本,LLVM 认为$1 总是在内联汇编中被破坏。另一个例子是算术标志寄存器 (cc),它是 GCC 在 i386 和 x86_64 目标上的 considered to be always clobbered by inline asm

    【讨论】:

    • 可能值得补充的是,这里的“垃圾”意味着汇编代码需要使用寄存器(寄存器可以被视为内置于 CPU 中的非常快速的临时变量,而不是位于单独的 RAM 芯片上如果您不熟悉汇编程序),因此不会保留调用者放入其中的值。
    • @uliwitness 谢谢,已添加。
    • i386 和 amd64 gcc(我很确定还有 clang)在 asm 语句中隐式破坏条件代码 "cc",因为许多整数指令不可避免地会写入它们。我知道您并不想列出详尽的清单,但这是针对主要 ISA 的清单。
    • @PeterCordes 谢谢,这是对答案的一个很好的补充。我还没有在 Clang 中找到只提到 GCC 的代码。
    猜你喜欢
    • 2013-05-16
    • 2012-03-30
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多