<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Daniil,</div><div class=""><br class=""></div><div class="">It looks like those asserts were added by Dan Albert.</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">225187  danalbert       assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg &&</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">225187  danalbert              "register range too large");</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">225187  danalbert       assert(lastReg <= (int)cieInfo.returnAddressRegister &&</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;" class="">225187  danalbert              "register range does not contain return address register");</div></div><div class=""><br class=""></div><div class="">The assert for the return register is complicated because stack based calling conventions (like x86[_64]) don’t have a register for the return value.  Instead the dwarf makes up a number (x86 uses 8) for the return address number.  This assert happens to work as-is for x86[_64] because the return register number == lastReg.  </div><div class=""><br class=""></div><div class="">-Nick</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Jul 14, 2015, at 4:45 AM, Daniil Troshkov <<a href="mailto:troshkovdanil@gmail.com" class="">troshkovdanil@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Hi Nick!</div><div class=""> </div><div class="">In r207467 you added code(libunwind: DwarfInstructions.hpp):</div><div class=""> </div><div class="">      assert(lastReg <= (int)cieInfo.returnAddressRegister<br class="">                 && "register range does not contain return address register");<br class="">      for (int i = 0; i <= lastReg; ++i) {</div><div class="">.....</div><div class="">          else if (i == (int)cieInfo.returnAddressRegister)<br class=""></div><div class=""> </div><div class="">There is misprint here: lastReg should be >= (int)cieInfo.returnAddressRegister in assert.</div><div class=""> </div><div class="">So patch is:</div><div class=""> </div><div class="">Index: DwarfInstructions.hpp<br class="">===================================================================<br class="">--- DwarfInstructions.hpp (revision 242137)<br class="">+++ DwarfInstructions.hpp (working copy)<br class="">@@ -170,7 +170,7 @@<br class="">       const int lastReg = R::lastDwarfRegNum();<br class="">       assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg &&<br class="">              "register range too large");<br class="">-      assert(lastReg <= (int)cieInfo.returnAddressRegister &&<br class="">+      assert(lastReg >= (int)cieInfo.returnAddressRegister &&<br class="">              "register range does not contain return address register");<br class="">       for (int i = 0; i <= lastReg; ++i) {<br class="">         if (prolog.savedRegisters[i].location !=<br class=""></div><div class="">If you agree, can you please commit it, because I have no commit access.<br class=""></div><div class=""> </div><div class="">Thank you!</div></div>
<span id="cid:057FF3B8-7809-468F-8CA2-B8A7E4D16862@apple.com"><DwarfInstructions.hpp.patch></span></div></blockquote></div><br class=""></body></html>