<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 13px; font-family: Arial, sans-serif; ">
<div>
<div>
<div>John,</div>
<div><br>
</div>
<div>I'm trying to use this warning to check the vtable problem. Here's an example</div>
<div><br>
</div>
<div>In mem.hpp </div>
<div><br>
</div>
<div>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span style="color: #bb2d9d">class</span><span class="Apple-tab-span" style="white-space:pre">
</span>AA {</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008425"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"></span></span>// Construction / destruction:</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2d9d">protected<span style="color: #000000">:</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre"></span>AA ();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008425"><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre"></span>AA (</span><span style="color: #bb2d9d">const</span><span style="color: #000000">
</span><span style="color: #4e8186">AA</span><span style="color: #000000">&); </span>
// Disabled</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2d9d">public<span style="color: #000000">:</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span class="Apple-tab-span" style="white-space:pre"></span><span style="color: #bb2d9d">virtual</span> ~AA ();</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">};</p>
</div>
<div><br>
</div>
<div>In mem.cpp</div>
<div><br>
</div>
<div>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #78482f">#include
<span style="color: #d12c26">"mem.hpp"</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px">
<br>
</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"><span style="color: #4e8186">AA</span>::~AA()</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">{</p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo">}</p>
</div>
<div><br>
</div>
<div>And I still get the following warning:</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>warning: 'AA' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables,3]</div>
<div><br>
</div>
<div>What am I doing wrong? Shall I declare the destructor to be pure virtual (then the warning goes away)? This is not always an option, because not all of these classes are ABCs.</div>
<div><br>
</div>
<div>Thanks,</div>
<div><br>
</div>
<div>Akos</div>
<div><br>
</div>
</div>
</div>
<span id="OLK_SRC_BODY_SECTION">
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>Ákos Somorjai <<a href="mailto:asomorjai@graphisoft.com">asomorjai@graphisoft.com</a>><br>
<span style="font-weight:bold">Date: </span>Fri, 30 Sep 2011 23:35:32 +0000<br>
<span style="font-weight:bold">To: </span>John McCall <<a href="mailto:rjmccall@apple.com">rjmccall@apple.com</a>><br>
<span style="font-weight:bold">Cc: </span>"<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>" <<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>><br>
<span style="font-weight:bold">Subject: </span>Re: [LLVMdev] RTTI handling<br>
</div>
<div><br>
</div>
<div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); ">
<div>
<div>
<div style="font-family: Arial, sans-serif; font-size: 13px; ">Thanks, John. I'll experiment with both the warning and the nm-weak external tool, and let you know the results.</div>
<div style="font-family: Arial, sans-serif; font-size: 13px; "><br>
</div>
<div style="font-family: Arial, sans-serif; font-size: 13px; ">Best, Akos</div>
<div>
<div>
<p><font class="Apple-style-span" face="Arial,sans-serif" size="4"><b><br>
</b></font></p>
</div>
</div>
</div>
</div>
<span id="OLK_SRC_BODY_SECTION" style="font-size: 13px; font-family: Arial, sans-serif; ">
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>John McCall <<a href="mailto:rjmccall@apple.com">rjmccall@apple.com</a>><br>
<span style="font-weight:bold">Date: </span>Fri, 30 Sep 2011 15:24:33 -0700<br>
<span style="font-weight:bold">To: </span>Ákos Somorjai <<a href="mailto:asomorjai@graphisoft.com">asomorjai@graphisoft.com</a>><br>
<span style="font-weight:bold">Cc: </span>"<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>" <<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>><br>
<span style="font-weight:bold">Subject: </span>Re: [LLVMdev] RTTI handling<br>
</div>
<div><br>
</div>
<div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>
<div>On Sep 30, 2011, at 3:04 PM, Somorjai, Akos wrote:</div>
<blockquote type="cite">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); ">
<div>
<div>
<div style="font-family: Arial, sans-serif; font-size: 13px; ">Thanks! Yes, we are trying to avoid that situation as much as possible.</div>
<div style="font-family: Arial, sans-serif; font-size: 13px; "><br>
</div>
<div style="font-family: Arial, sans-serif; font-size: 13px; ">Is there any compiler/linker/static analyzer option that would point out those problems (in 13 million lines, large part of that being legacy code)?</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>There's a -Wweak-vtables which will point out a lot of these cases.  I have to warn you that in previous releases, it's still pretty experimental;  Doug Gregor has done a lot of work on it on ToT.</div>
<div><br>
</div>
<div>Another option is to run 'nm' on the objects/executables you're interested in.  For example, this file:</div>
<div><br>
</div>
<div>daysthatwere clang$ cat red.cpp</div>
<div>
<div>  #include <typeinfo></div>
<div><br>
</div>
<div>  struct A {};</div>
<div>  struct B { virtual ~B(); };</div>
<div>  struct C { virtual ~C(); };</div>
<div>  C::~C() {}</div>
<div><br>
</div>
<div>  const std::type_info &test0() { return typeid(const char*); }</div>
<div>  const std::type_info &test1() { return typeid(const char**); }</div>
<div>  const std::type_info &test2() { return typeid(A); }</div>
<div>  const std::type_info &test3() { return typeid(B); }</div>
<div>  const std::type_info &test4() { return typeid(C); }</div>
<div><br>
</div>
<div>daysthatwere clang$ clang /tmp/red.cpp -c -o red.o</div>
<div>daysthatwere clang$ nm -m red.o | grep __ZTI | c++filt</div>
<div>0000000000000120 (__DATA,__datacoal_nt) weak external typeinfo for A</div>
</div>
<div>
<div>
<div>
<div>                 (undefined) external typeinfo for B</div>
<div>0000000000000150 (__DATA,__const) external typeinfo for C</div>
<div>                 (undefined) external typeinfo for char const*</div>
<div>0000000000000100 (__DATA,__datacoal_nt) weak external typeinfo for char const**</div>
</div>
</div>
<div><br>
</div>
<div>The "external" symbols are strong symbols provided by this object; these aren't a problem.</div>
<div>The "undefined external" symbols are expected to appear in a different object; these also aren't a problem.</div>
<div>The "weak external" symbols are the ones with vague linkage that you care about.</div>
<div><br>
</div>
<div>Otherwise, I don't have any magic bullets for you, sorry.</div>
<div><br>
</div>
<div>John.</div>
</div>
</div>
</div>
</div>
</span></div>
</div>
_______________________________________________ LLVM Developers mailing list <a href="mailto:LLVMdev@cs.uiuc.edu">
LLVMdev@cs.uiuc.edu</a> <a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</span>
</body>
</html>