为什么LLVM ARC在抛出对象之前会反复保留它们?

时间:2019-04-07 01:14:15

标签: objective-c exception automatic-ref-counting

请考虑以下简单功能:

shape

我最初认为这两个函数都应编译为同一程序集,并且两者都应等效于仅调用void simple_throw(id object) { @throw object; } void extra_throw(id object) { id tmp0 = object; id tmp1 = tmp0; id tmp2 = tmp1; @throw tmp2; } (自function arguments are autorelease by default in ARC起),也许添加一个objc_exception_throw(object) (自ARC isn't exception safe起,默认为泄漏)。

但事实并非如此。这是程序集(除去一些多余的绒毛和objc_retain(object)指令;;参数:.cfi_*):

-fobjc-arc -Ofast -fomit-frame-pointer -S

_simple_throw: pushq %rax callq *_objc_retain@GOTPCREL(%rip) movq %rax, %rdi callq _objc_retainAutorelease movq %rax, %rdi callq _objc_exception_throw _extra_throw: pushq %rbx movq _objc_retain@GOTPCREL(%rip), %rbx callq *%rbx movq %rax, %rdi callq *%rbx movq %rax, %rdi callq *%rbx movq %rax, %rdi callq *%rbx movq %rax, %rdi callq _objc_retainAutorelease movq %rax, %rdi callq _objc_exception_throw 保留simple_throw 两次,而object保留extra_throw 5次!

这导致两个问题:

  1. 编译器应生成object的最佳程序集(就保留和自动释放而言)(假设我们希望生成的代码与ARC兼容)是什么?
  2. 为什么simple_throw中对局部变量的赋值会导致额外的保留?我倾向于认为这是一个编译器错误。

0 个答案:

没有答案