<div dir="ltr">Looks like my change to that line was just a drive-by reformatting from r225187. The assert was added in r207467.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 15, 2015 at 2:22 PM, Nick Kledzik <span dir="ltr"><<a href="mailto:kledzik@apple.com" target="_blank">kledzik@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Daniil,</div><div><br></div><div>It looks like those asserts were added by Dan Albert.</div><div><br></div><div><div style="margin:0px;font-size:11px;font-family:Menlo">225187  danalbert       assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg &&</div><div style="margin:0px;font-size:11px;font-family:Menlo">225187  danalbert              "register range too large");</div><div style="margin:0px;font-size:11px;font-family:Menlo">225187  danalbert       assert(lastReg <= (int)cieInfo.returnAddressRegister &&</div><div style="margin:0px;font-size:11px;font-family:Menlo">225187  danalbert              "register range does not contain return address register");</div></div><div><br></div><div>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><br></div><div>-Nick</div><div><br></div><br><div><blockquote type="cite"><div><div class="h5"><div>On Jul 14, 2015, at 4:45 AM, Daniil Troshkov <<a href="mailto:troshkovdanil@gmail.com" target="_blank">troshkovdanil@gmail.com</a>> wrote:</div><br></div></div><div><div><div class="h5"><div dir="ltr"><div>Hi Nick!</div><div> </div><div>In r207467 you added code(libunwind: DwarfInstructions.hpp):</div><div> </div><div>      assert(lastReg <= (int)cieInfo.returnAddressRegister<br>                 && "register range does not contain return address register");<br>      for (int i = 0; i <= lastReg; ++i) {</div><div>.....</div><div>          else if (i == (int)cieInfo.returnAddressRegister)<br></div><div> </div><div>There is misprint here: lastReg should be >= (int)cieInfo.returnAddressRegister in assert.</div><div> </div><div>So patch is:</div><div> </div><div>Index: DwarfInstructions.hpp<br>===================================================================<br>--- DwarfInstructions.hpp (revision 242137)<br>+++ DwarfInstructions.hpp (working copy)<br>@@ -170,7 +170,7 @@<br>       const int lastReg = R::lastDwarfRegNum();<br>       assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg &&<br>              "register range too large");<br>-      assert(lastReg <= (int)cieInfo.returnAddressRegister &&<br>+      assert(lastReg >= (int)cieInfo.returnAddressRegister &&<br>              "register range does not contain return address register");<br>       for (int i = 0; i <= lastReg; ++i) {<br>         if (prolog.savedRegisters[i].location !=<br></div><div>If you agree, can you please commit it, because I have no commit access.<br></div><div> </div><div>Thank you!</div></div>
</div></div><span><DwarfInstructions.hpp.patch></span></div></blockquote></div><br></div></blockquote></div><br></div>