<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jan 31, 2011, at 7:26 AM, Douglas Gregor wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jan 28, 2011, at 3:42 PM, Fariborz Jahanian wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Author: fjahanian<br>Date: Fri Jan 28 17:42:29 2011<br>New Revision: 124507<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=124507&view=rev">http://llvm.org/viewvc/llvm-project?rev=124507&view=rev</a><br>Log:<br>More work to support -fapple-kext regarding <br>indirect vf calls and addition of extra entry<br>at bottom of vtbls.<br><br>Added:<br>    cfe/trunk/test/CodeGenCXX/apple-kext-indirect-call-2.C<br>Modified:<br>    cfe/trunk/lib/CodeGen/CGCXX.cpp<br>    cfe/trunk/lib/CodeGen/CGExprCXX.cpp<br>    cfe/trunk/lib/CodeGen/CGVTables.cpp<br><br>Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=124507&r1=124506&r2=124507&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=124507&r1=124506&r2=124507&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)<br>+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Fri Jan 28 17:42:29 2011<br>@@ -329,7 +329,9 @@<br>   assert(VTable && "BuildVirtualCall = kext vtbl pointer is null");<br>   MD = MD->getCanonicalDecl();<br>   uint64_t VTableIndex = CGM.getVTables().getMethodVTableIndex(MD);<br>-  VTableIndex += 2;<br>+  uint64_t AddressPoint = <br>+    CGM.getVTables().getAddressPoint(BaseSubobject(RD, 0), RD);<br>+  VTableIndex += AddressPoint;<br>   llvm::Value *VFuncPtr = <br>     CGF.Builder.CreateConstInBoundsGEP1_64(VTable, VTableIndex, "vfnkxt");<br>   return CGF.Builder.CreateLoad(VFuncPtr);<br></div></blockquote><div><br></div><div>Ah, I think I understand this now. We'll want to document what we're doing somewhere.</div></div></div></blockquote><div><br></div>Yes. We have have the documentation of what -fapple-kext does after al pieces are known and are in place.</div><div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div><br></div><blockquote type="cite"><div>Modified: cfe/trunk/lib/CodeGen/CGVTables.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.cpp?rev=124507&r1=124506&r2=124507&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.cpp?rev=124507&r1=124506&r2=124507&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/CodeGen/CGVTables.cpp (original)<br>+++ cfe/trunk/lib/CodeGen/CGVTables.cpp Fri Jan 28 17:42:29 2011<br>@@ -2758,7 +2758,14 @@<br><br>   // Add the VTable layout.<br>   uint64_t NumVTableComponents = Builder.getNumVTableComponents();<br>+  // -fapple-kext adds an extra entry at end of vtbl.<br>+  bool IsAppleKext = CGM.getContext().getLangOptions().AppleKext;<br>+  if (IsAppleKext)<br>+    NumVTableComponents += 1;<br>+<br>   uint64_t *LayoutData = new uint64_t[NumVTableComponents + 1];<br>+  if (IsAppleKext)<br>+    LayoutData[NumVTableComponents] = 0;<br>   Entry.setPointer(LayoutData);<br></div></blockquote><div><br></div>NumVTableComponents-1?</div></div></blockquote><div><br></div>We are adding a null entry after all other entries. So, last entry is nullified.</div><div><br></div><div>- Fariborz<br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>- Doug</div><br></div></blockquote></div><br></body></html>