<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_extra"><br><div class="gmail_quote">2018-01-16 21:03 GMT+08:00 Tim Northover <span dir="ltr"><<a href="mailto:t.p.northover@gmail.com" target="_blank">t.p.northover@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On 16 January 2018 at 12:23, 陳韋任 <<a href="mailto:chenwj.cs97g@g2.nctu.edu.tw">chenwj.cs97g@g2.nctu.edu.tw</a>> wrote:<br>
> Do we have to emit directives in the epilogue, too? One of my test case fail<br>
> due to the directives in the epilogue have been executed. After removing<br>
>  them from epilogue, the exception is caught as expected.<br>
<br>
</span>Emitting directives in the epilogue is hard because the directives<br>
apply to all instructions after in program-counter order. So if you<br>
have an epilogue in the middle of a function and emit CFI directives<br>
saying the registers are back where they were then the unwinder will<br>
think that applies to the rest of the function too.<br>
<br>
To fix that you'd have to emit yet more directives in the basic block<br>
immeditately following the epilogue. Most people don't bother with<br>
either because you'd only really need it if you expected to have to<br>
catch an exception in the epilogue (which is impossible on most<br>
platforms).</blockquote><div><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">​My test case is:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">void foo() {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  throw 0;</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">}</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">void bar() {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  try {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    foo();</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  } catch (...) {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    throw 0;</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  }</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">}</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">int main() {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  try {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    bar();</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  } catch (...) {</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    return 0;      // fail to catch exception thrown by bar</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  }</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  return 0;</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">}</div></div></div></blockquote><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">, and the assembly of bar looks like</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">bar:</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    </div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    .cfi_def_cfa_offset 16</div></div></div><div class="gmail_extra"><div class="gmail_quote"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    epilogue​</div></div></div><div class="gmail_extra"><div class="gmail_extra"><br></div></div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">​    _Unwind_Resume​</div></div></div></blockquote><div class="gmail_extra"><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">The lookup phase of exception handling ​is fine. However, something goes wrong in cleanup phase. The reason is the unwinder evaluates CFI directives until _Unwind_Resume, and `.cfi_def_cfa_offset 16` is the culprit. I think this is what you were saying "<span style="font-family:arial,sans-serif">have an epilogue in the middle of a </span><span style="font-family:arial,sans-serif">function</span>", right?</div><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>Wei-Ren Chen (陳韋任)<br>Homepage: <a href="https://people.cs.nctu.edu.tw/~chenwj" target="_blank">https://people.cs.nctu.edu.tw/~chenwj</a></div></div></div>
</div></div>