<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 15, 2015 at 4:48 PM, Panning, Benjamin J <span dir="ltr"><<a href="mailto:benjamin.j.panning@intel.com" target="_blank">benjamin.j.panning@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal">Hi All,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I have a question on the type definitions that Clang generates when compiling for x86-64.  Here is the C++ code that I compile:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">                class TestClass1 {<u></u><u></u></p>
<p class="MsoNormal">                                int X;<u></u><u></u></p>
<p class="MsoNormal">                public:<u></u><u></u></p>
<p class="MsoNormal">                                virtual int Foo() { return 1; }<u></u><u></u></p>
<p class="MsoNormal">                };<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">                class TestClass2 : public TestClass1 {<u></u><u></u></p>
<p class="MsoNormal">                                int X;<u></u><u></u></p>
<p class="MsoNormal">                public:<u></u><u></u></p>
<p class="MsoNormal">                                virtual int Foo() { return 1; }<u></u><u></u></p>
<p class="MsoNormal">                };<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">                class TestClass3 : public TestClass2 {<u></u><u></u></p>
<p class="MsoNormal">                                int X;<u></u><u></u></p>
<p class="MsoNormal">                public:<u></u><u></u></p>
<p class="MsoNormal">                                virtual int Foo() { return 1; }<u></u><u></u></p>
<p class="MsoNormal">                };<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Here is the command lines that I am using, for 32-bit and 64-bit mode respectively:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">                clang.exe -S -emit-llvm -O0 test.cpp -o test.ll<u></u><u></u></p>
<p class="MsoNormal">                clang.exe -S -emit-llvm -O0 test.cpp -o test.ll -march=x86-64<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The 32-bit compile produces this, which I understand:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">                %class.TestClass3 = type { %class.TestClass2, i32 }<u></u><u></u></p>
<p class="MsoNormal">                %class.TestClass2 = type { %class.TestClass1, i32 }<u></u><u></u></p>
<p class="MsoNormal">                %class.TestClass1 = type { i32 (...)**, i32 }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The 64-bit compile produces this:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">                %class.TestClass3 = type { %class.TestClass2, i32, [4 x i8] }<u></u><u></u></p>
<p class="MsoNormal">                %class.TestClass2 = type { [12 x i8], i32 }<u></u><u></u></p>
<p class="MsoNormal">                %class.TestClass1 = type { i32 (...)**, i32 }<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">A few basic questions: (1) Why does TestClass2 have a [12 x i8] array instead of a reference to TestClass1? </p></div></div></blockquote><div><br></div><div>What triple are you using? I cannot reproduce your %class.TestClass2 type.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal">(2) What is the [4 x i8] array at the end of TestClass3?</p></div></div></blockquote><div><br></div><div>The record is eight byte aligned because of the vptr at offset 0. Those 32-bytes are for padding to align the record's size to a multiple of the alignment (8 bytes in this example).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal">(3) Is it safe to use a bitcast instead of a getelementptr constant expression
 for casting a TestClass3* to a TestClass1* in this case (I see no other way of doing it…)?</p></div></div></blockquote><div><br></div><div>Yes, it is perfectly safe to use bitcast instead of gep here.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I’m not very knowledgeable about Clang, and I greatly appreciate your help.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<br>
Ben<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br></div></div>