<div dir="ltr">On Fri, Mar 22, 2013 at 1:46 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><br>
On Mar 22, 2013, at 12:02 PM, Reid Kleckner <<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>> wrote:<br>
<br>
> Author: rnk<br>
> Date: Fri Mar 22 14:02:54 2013<br>
> New Revision: 177753<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=177753&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=177753&view=rev</a><br>
> Log:<br>
> [ms-cxxabi] Implement member data pointers for non-dynamic classes<br>
><br>
> Summary:<br>
> For non-dynamic classes (no virtual bases), member data pointers are<br>
> simple offsets from the base of the record.  Dynamic classes use an<br>
> aggregate for member data pointers and are therefore currently<br>
> unsupported.<br>
><br>
> Unlike Itanium, the ms ABI uses 0 to represent null for polymorphic<br>
> classes.  Non-polymorphic classes use -1 like Itanium, since 0 is a<br>
> valid field offset.<br>
<br>
</div>Oh, you should also implement isZeroInitializable.</blockquote><div><br></div><div>I looked into this, and MSVC seems to zero-initialize most things regardless of the null representation.<br></div><div><br></div><div style>
For example:</div><div style>struct POD { int a; };</div><div style>int POD::*pod_memptr;  // should be -1, but goes into .bss and becomes 0</div><div style>int POD::*null_memptr = 0;  // gets -1 and goes into .data as expected</div>
<div style><br></div><div style>But we probably don't have to be bug-for-bug compatible here.  IMO the right thing is to use -1 and .data for this case.</div></div></div></div>