<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hello,</div><div><br></div><div>I'm working on a simple unwinder for Android that relies on common C++ exception handling tables (.ARM.exidx / .eh_frame) and recently I found out that for armeabi-v7a  it is impossible to unwind stack for abort that happens when someone's destructor throws (seems like it is the case for any nothrow function). In that case std::terminate() is called via shim function __clang_call_terminate() which is emitted by compiler and has EXIDX_CANTUNWIND associated entry that prevents unwinder to pass through this function:</div><div><br></div><div><div>$ readelf --unwind test.o | grep __clang_call_terminate</div><div>Unwind section '.ARM.exidx.text.__clang_call_terminate' at offset 0x98 contains 1 entry:</div><div>0x0 <__clang_call_terminate>: 0x1 [cantunwind]</div></div><div><br></div><div>Here is mentioned shim generated with -funwind-tables -O3 (source code is trivial so I omitted it):</div><div><div>__clang_call_terminate:</div><div><span style="white-space:pre"> </span>.fnstart</div><div><span style="white-space:pre">      </span>.save<span style="white-space:pre">        </span>{r7, lr}</div><div><span style="white-space:pre">      </span>push<span style="white-space:pre"> </span>{r7, lr}</div><div><span style="white-space:pre">      </span>bl<span style="white-space:pre">   </span>__cxa_begin_catch</div><div><span style="white-space:pre">     </span>bl<span style="white-space:pre">   </span>_ZSt9terminatev</div><div>.Lfunc_end1:</div><div><span style="white-space:pre">    </span>.size<span style="white-space:pre">        </span>__clang_call_terminate, .Lfunc_end1-__clang_call_terminate</div><div><span style="white-space:pre">    </span>.cantunwind</div><div><span style="white-space:pre">   </span>.fnend</div></div><div><br></div><div>At the same time unwinder passes through it on arm64-v8a. I failed to find any explanations of this difference. So asking here seems to be the last resort.</div><div><br></div><div>My question is: why for 32-bit ARM clang emits .cantunwind for __clang_call_terminate() instead of normal unwind instructions?</div><div><br></div><div>Thanks.<br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr">Best regards<div>Serhii</div></div></div></div></div></div>