<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">On Dec 14, 2013, at 12:25 PM, Nico Weber <<a href="mailto:thakis@chromium.org">thakis@chromium.org</a>> wrote:<br><div><blockquote type="cite"><div dir="ltr">Hi Nick,<div><br></div><div>I just realized we didn't cc you on our replies here:</div><div>Albert: <a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131202/095019.html">http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131202/095019.html</a></div>
<div>Me: <a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131209/095089.html">http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131209/095089.html</a><br></div><div><br></div><div>Sorry!</div>
<div><br></div><div>Adding Albert to this branch of the thread, to hopefully bring us all on the same page again. I'm also attaching a new version of the patch, with the following changes:</div><div><br></div><div>* Add an assembly.h file, use that to hide the leading '_' difference in the two .S files</div></div></blockquote><div>Looks good.  Thanks for fixing the other arches too.</div><br><blockquote type="cite"><div dir="ltr">
<div>* Change the arm 32bit register enum in libunwind.h</div><div>* Change the float register stuff in Registers_arm</div></div></blockquote><div><br></div><div>There are a couple of typos in comments.  If you open the patch in a word processor, you’ll see them in red underlines.</div><div><br></div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 6, 2013 at 11:37 AM, 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im"><br>
On Dec 5, 2013, at 10:32 PM, Nico Weber <<a href="mailto:thakis@chromium.org">thakis@chromium.org</a>> wrote:<br>
<br>
> Hi,<br>
><br>
> the attached patch adds Registers_arm and assembly for unw_getcontext. VFP support is still missing. The class isn't used by anything yet.<br>
<br>
<br>
</div>> +// 32-bit ARM64 registers<br>
> +enum {<br>
> +  UNW_ARM_R0  = 0,<br>
> +  UNW_ARM_R1  = 1,<br>
> ...<br>
> +  UNW_ARM_D0  = 64,<br>
> +  UNW_ARM_D1  = 65,<br>
This register numbering needs some comments.  I’m not even sure what the right numbering should be.  The numbers do need to match what the compiler thinks the numbering is (e.g. the dwarf register numbering).  I’ve heard that for arm dwarf, 64+ is legacy for single precision registers, and that when they were widened to double, new register numbers (256+) were used.<br>
</blockquote><div><br></div><div>Albert: """Hmm...section 3.1 of the DWARF for ARM spec seems to agree with you.</div><div><br></div><div><a href="http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf">http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf</a></div>
<div><br></div><div>I think that implies that the ARM64 enum constants are also incorrect.</div><div> AFAICT though, these enums aren't actually evaluated for their integer</div><div>representation in either libc++abi or libc++. Is the need to match the</div>
<div>DWARF register numbering just part of the libunwind.h API or am I missing</div><div>some usage somewhere?</div></div></div></div></blockquote><div>The 64-bit arm (aka AArch64 or arm64) dwarf register numbers are define at:</div><div>  <a href="http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf">http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf</a></div><div>and look correct to me. </div><div><br></div></div><blockquote type="cite">+inline Registers_arm::Registers_arm(const void *registers) {<br>+  static_assert(sizeof(Registers_arm) < sizeof(unw_context_t),<br>+                    "arm registers do not fit into unw_context_t");<br>+  // See unw_getcontext() note about data.<br>+  memcpy(&_registers, registers, sizeof(_registers));<br>+  bzero(_vfpRegisterData, sizeof(_vfpRegisterData));<br>+  bzero(_wmmxData, sizeof(_wmmxData));<br>+  bzero(_wmmxControl, sizeof(_wmmxControl));<br><div><div>+}</div></div></blockquote><div></div><div><div>I don’t see how this is supposed to work. There is no comment at the arm version of unw_getcontext().  </div><div>How are float registers saved? </div><div><br></div><div>I have not investigated deeply how _Unwind_VRS_Get() and friends work.  I thought part of the model was that arm could ship one static library that worked with all processors, and it did so via runtime checks for what registers the processor supported, and the core unwinder was always compiled to only use integer registers.  Meaning the float/vector registers where never saved/restored to the unwind buffer.  That is, calling a setFloatRegister() would change the real processor register and not something in the register set struct.  </div><div><br></div><div>How do you want to reconcile that model with how libunwind does it for other architectures?  </div><div><br></div></div><div>-Nick</div><div><br></div></body></html>