【问题标题】:Why is Clang's assembler output conditionally jumping to an unconditional jump?为什么 Clang 的汇编输出有条件跳转到无条件跳转?
【发布时间】:2017-06-03 06:28:07
【问题描述】:

在调试程序在被取消引用的错位指针上崩溃的问题时,我运行了lldb 并对崩溃函数进行了反汇编。在仔细阅读反汇编代码时,我注意到这种看起来很奇怪的指令选择:

0x100002b06 <+86>:   cmpl   $0x0, %eax
0x100002b09 <+89>:   je     0x100002b14
0x100002b0f <+95>:   jmp    0x10000330e
0x100002b14 <+100>:  jmp    0x100002c1d

我希望代码看起来像这样:

0x100002b06 <+86>:   cmpl   $0x0, %eax
0x100002b09 <+89>:   je     0x100002c1d
0x100002b0f <+95>:   jmp    0x10000330e

我很好奇 Clang 做出这个选择的原因。是不是某种分支预测优化,因为这是一个不太可能匹配的 NULL 指针检查?

编辑: This is the originating C code, 特别是带有 NULL 指针检查的行。

traverse = travdone_head;
while (1) {
  if (traverse == NULL) nullptr("grokdir() traverse");
  /* Don't re-traverse directories we've already seen */
  if (inode == traverse->inode && device == traverse->device) {

【问题讨论】:

  • 你的代码是在调试模式下编译的吗?如果是这样,那就可以解释为什么汇编代码是以这种方式编写的。
  • 它是用-O0 -g3 编译的。它产生了一个跳转到一个跳转似乎仍然有点奇怪,但这可能可以解释它。
  • 既然您也添加了标签 C:导致此代码的源代码行是什么?
  • @RadLexus 如果有兴趣,我已经添加了带有一点额外上下文的原始代码和指向 Github 上原始 C 文件的链接。

标签: c macos clang code-generation compiler-optimization


【解决方案1】:

-O0 用于

减少编译时间并使调试产生预期的结果 结果。这是默认设置。

与相应的源代码进行比较可能会很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多