<div dir="ltr">That'd be a bug - we should finish adding attributes to it at some point. If we can detect that it's never going to be handled (that it's been entirely optimized away) by the other codepaths, we should do it up-front. Otherwise we may need to add it to a list somewhere to be handled.<br><br>Ah, this probably regressed when we switched the direction of the link in subprograms (from CU->subprogram to subprogram->CU). Adrian?</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, May 8, 2016 at 1:13 AM, Aboud, Amjad <span dir="ltr"><<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@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"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">That happens because we create the subprogram below as a context to the “DW_TAG_typedef” that was created as a type to “DW_TAG_pointer_type” that was added to
 the retained type list because of the explicit cast to (T*).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">This is the code that creates DW_TAG_subprogram:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DIE</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
 *</span><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DwarfUnit</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">::getOrCreateSubprogramDIE(</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">const</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DISubprogram</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> *</span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">SP</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">,
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">bool</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">Minimal</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">) {<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">...<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:green;background:white">// DW_TAG_inlined_subroutine may refer to this DIE.</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DIE</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> &SPDie = createAndAddDIE(dwarf::</span><span style="font-size:9.5pt;font-family:Consolas;color:darkslategray;background:white">DW_TAG_subprogram</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">,
 *ContextDIE, </span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">SP</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">);<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:green;background:white">// Stop here and fill this in later, depending on whether or not this</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:green;background:white">// subprogram turns out to have inlined instances or not.</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">if</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> (</span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">SP</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">->isDefinition())<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">   
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">return</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> &SPDie;                               
</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><-------------  In our case the function returns here, and does not apply attributes</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">.<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">  applySubprogramAttributes(</span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">SP</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">,
 SPDie);<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">return</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> &SPDie;<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">}</span><span style="font-size:9.5pt;font-family:Consolas;color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">It assumes that later when the function is finalized the attributes will be applied, which is called from this code:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">void</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DwarfDebug</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">::finishSubprogramDefinitions()
 {<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> 
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">for</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> (</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">auto</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
 &F : MMI->getModule()->functions())<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">   
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">if</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> (</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">auto</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
 *SP = F.getSubprogram())<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">     
</span><span style="font-size:9.5pt;font-family:Consolas;color:blue;background:white">if</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"> (ProcessedSPNodes.count(SP) &&<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">          SP->getUnit()->getEmissionKind() !=
</span><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DICompileUnit</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">::</span><span style="font-size:9.5pt;font-family:Consolas;color:darkslategray;background:white">NoDebug</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">)<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">        forBothCUs(*CUMap.lookup(SP->getUnit()), [&](</span><span style="font-size:9.5pt;font-family:Consolas;color:#2b91af;background:white">DwarfCompileUnit</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">
 &</span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">CU</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">) {<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">         
</span><span style="font-size:9.5pt;font-family:Consolas;color:gray;background:white">CU</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">.finishSubprogramDefinition(SP);
</span><span style="font-size:9.5pt;font-family:Consolas;color:black">         </span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><-------------  In our case, this code will not be reached for the above subprogram.</span><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white"><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">        });<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">...<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:9.5pt;font-family:Consolas;color:black;background:white">}</span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">However, the function was optimized out and the code will not call “finishSubprogramDefinition” for it, and attributes will not be added.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Regards,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Amjad<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><a name="m_3997492950246121290__MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></a></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><a name="m_3997492950246121290______replyseparator"></a><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> David Blaikie [mailto:<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>]
<br>
<b>Sent:</b> Saturday, May 07, 2016 21:38</span></p><div><div class="h5"><br>
<b>To:</b> Aboud, Amjad <<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@intel.com</a>><br>
<b>Cc:</b> Adrian Prantl <<a href="mailto:aprantl@apple.com" target="_blank">aprantl@apple.com</a>>; llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>; Clang Dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: Debug info scope of explicit casting type does not seem correct<u></u><u></u></div></div><p></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">Under what conditions do we produce a subprogram with no attributes? At first glance that certainly seems not useful, but perhaps there's a reason for it.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Sat, May 7, 2016 at 3:02 AM, Aboud, Amjad <<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@intel.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Hi David,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">OK, I got that DIE in Compile Unit scope may point to a DIE in subprogram scope.</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">But how about that we are emitting a subprogram entry that has no attributes?</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal">0x0000002b:   DW_TAG_subprogram [3] *<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">0x0000002c:     DW_TAG_typedef [4]<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_type [DW_FORM_ref4]     (cu + 0x0040 => {0x00000040})<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_name [DW_FORM_strp]     ( .debug_str[0x00000060] = "T")<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_decl_file [DW_FORM_data1]       ("c:\temp\ICL\LB\retain.cpp")<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_decl_line [DW_FORM_data1]       (16)<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span><u></u><u></u></p>
<p class="MsoNormal"><a name="m_3997492950246121290_m_-8895677126796975561__MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"> </span></a><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Regards,</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Amjad</span><u></u><u></u></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><a name="m_3997492950246121290_m_-8895677126796975561______replyseparat"></a><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">
 David Blaikie [mailto:<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>]
<br>
<b>Sent:</b> Saturday, April 30, 2016 17:59<br>
<b>To:</b> Aboud, Amjad <<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@intel.com</a>><br>
<b>Cc:</b> Adrian Prantl <<a href="mailto:aprantl@apple.com" target="_blank">aprantl@apple.com</a>>; llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>; Clang Dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: Debug info scope of explicit casting type does not seem correct</span><u></u><u></u></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Yep, seems fine/reasonable to me. The pointer type has no logical scope so it doesn't really matter where its DIE goes.<br>
<br>
GCC does put the pointer type in the function scope in basic cases, but it can also end up in other places. For example:<u></u><u></u></p>
<pre><span style="color:black">blaikie@blaikie-linux:~/dev$ cat func.cpp</span><u></u><u></u></pre>
<pre><span style="color:black">void sink(void*);</span><u></u><u></u></pre>
<pre><span style="color:black">template<typename T></span><u></u><u></u></pre>
<pre><span style="color:black">void f1() {</span><u></u><u></u></pre>
<pre><span style="color:black">  T *t;</span><u></u><u></u></pre>
<pre><span style="color:black">  sink(&t);</span><u></u><u></u></pre>
<pre><span style="color:black">}</span><u></u><u></u></pre>
<pre><span style="color:black">void f2() {</span><u></u><u></u></pre>
<pre><span style="color:black">  struct foo { };</span><u></u><u></u></pre>
<pre><span style="color:black">  f1<foo>();</span><u></u><u></u></pre>
<pre><span style="color:black">}</span><u></u><u></u></pre>
<pre><span style="color:black">blaikie@blaikie-linux:~/dev$ g++-4.7 -std=c++11 func.cpp -g -c && llvm-dwarfdump-tot -debug-dump=info func.o | grep DW_TAG</span><u></u><u></u></pre>
<pre><span style="color:black">0x0000000b: DW_TAG_compile_unit [1] *</span><u></u><u></u></pre>
<pre><span style="color:black">0x0000002d:   DW_TAG_subprogram [2] * // f2</span><u></u><u></u></pre>
<pre><span style="color:black">0x00000051:     DW_TAG_lexical_block [3]  </span><u></u><u></u></pre>
<pre><span style="color:black">0x00000062:     DW_TAG_structure_type [4]  </span><u></u><u></u></pre>
<pre><span style="color:black">0x0000006b:   DW_TAG_subprogram [5] * // f1</span><u></u><u></u></pre>
<pre><span style="color:black">0x00000087:     DW_TAG_template_type_parameter [6]  </span><u></u><u></u></pre>
<pre><span style="color:black">0x0000008e:     DW_TAG_lexical_block [7] *</span><u></u><u></u></pre>
<pre><span style="color:black">0x0000009f:       DW_TAG_variable [8]  </span><u></u><u></u></pre>
<pre><span style="color:black">0x000000ab:       DW_TAG_pointer_type [9]  // foo*</span><u></u><u></u></pre>
<pre><span style="color:black"> </span><u></u><u></u></pre>
<pre><span style="color:black">& in fact, if you introduce another template that's similar to f1, its variable's type is 0x00ab - so it points into f1's children. Seems GCC puts it in whatever scope first references the pointer type.</span><u></u><u></u></pre>
<pre><span style="color:black"> </span><u></u><u></u></pre>
<pre><span style="color:black">I think it's probably as sensible, and a bit simpler, to put any such basic types in the CU scope.</span><u></u><u></u></pre>
<pre><span style="color:black"> </span><u></u><u></u></pre>
<pre><span style="color:black">(granted, if GCC and Clang were really smart, the pointer type in f1 could be pointer to 0x0087 - but that would really bloat the debug info (now every different way of writing foo* in every different template would be a separate type description... - that would probably be not good))</span><u></u><u></u></pre>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">On Sat, Apr 30, 2016 at 3:32 AM, Aboud, Amjad <<a href="mailto:amjad.aboud@intel.com" target="_blank">amjad.aboud@intel.com</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal">Hi,<u></u><u></u></p>
<p class="MsoNormal">I am wondering if this behavior of creating debug info is correct.<u></u><u></u></p>
<p class="MsoNormal">A type in compile unit entry is pointing to a type under subprogram entry?!<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">This is the root cause of
<a href="https://llvm.org/bugs/show_bug.cgi?id=27579" target="_blank">https://llvm.org/bugs/show_bug.cgi?id=27579</a><u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">0x0000000b: DW_TAG_compile_unit [1] *<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">0x00000026:   DW_TAG_pointer_type [2]<u></u><u></u></p>
<p class="MsoNormal">                            DW_AT_type [DW_FORM_ref4]       (cu + 0x002c => {<span style="background:yellow">0x0000002c</span>})<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">0x0000002b:   DW_TAG_subprogram [3] *<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="background:yellow">0x0000002c</span>:     DW_TAG_typedef [4]<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_type [DW_FORM_ref4]     (cu + 0x0040 => {0x00000040})<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_name [DW_FORM_strp]     ( .debug_str[0x00000060] = "T")<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_decl_file [DW_FORM_data1]       ("c:\temp\ICL\LB\retain.cpp")<u></u><u></u></p>
<p class="MsoNormal">                               DW_AT_decl_line [DW_FORM_data1]       (16)<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">0x00000037:     NULL<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">command line:<u></u><u></u></p>
<p class="MsoNormal">clang -cc1 -triple i386-apple-ios9.0.0 -emit-obj -debug-info-kind=limited -O2 test.cpp –o - | llvm-dwarfdump -debug-dump=info -<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">> cat test.cpp<u></u><u></u></p>
<p class="MsoNormal">class A {<u></u><u></u></p>
<p class="MsoNormal">public:<u></u><u></u></p>
<p class="MsoNormal">  int x;<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>
<p class="MsoNormal">class B {<u></u><u></u></p>
<p class="MsoNormal">public:<u></u><u></u></p>
<p class="MsoNormal">  typedef A type;<u></u><u></u></p>
<p class="MsoNormal">};<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">template<typename X><u></u><u></u></p>
<p class="MsoNormal">int foo(void* in) {<u></u><u></u></p>
<p class="MsoNormal">  typedef typename X::type T;<u></u><u></u></p>
<p class="MsoNormal">  const T* p = (T*) in;<u></u><u></u></p>
<p class="MsoNormal">  return p->x;
<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">int bar() {<u></u><u></u></p>
<p class="MsoNormal">A a;<u></u><u></u></p>
<p class="MsoNormal">  return foo<B>(&a);<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Reason for this behavior is the explicit cast “(T*)“, which leads into the following IR:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 (trunk 267335)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug,
 enums: !2, retainedTypes: <span style="background:yellow">!3</span>)<u></u><u></u></p>
<p class="MsoNormal"><span style="background:yellow">!3</span> = !{<span style="background:yellow">!4</span>}<u></u><u></u></p>
<p class="MsoNormal"><span style="background:yellow">!4</span> = !DIDerivedType(tag: DW_TAG_pointer_type, baseType:
<span style="background:yellow">!5</span>, size: 32, align: 32)  <----------------- No Scope, leads to compile unit scope!!<u></u><u></u></p>
<p class="MsoNormal"><span style="background:yellow">!5</span> = !DIDerivedType(tag: DW_TAG_typedef, name: "T", scope:
<span style="background:yellow">!7</span>, file: !6, line: 16, baseType: !20)<u></u><u></u></p>
<p class="MsoNormal"><span style="background:yellow">!7</span> = distinct !<span style="background:yellow">DISubprogram</span>(name: "foo<B>", linkageName: "_Z3fooI1BEiPv", scope: !6, file: !6, line:
 15, type: !8, isLocal: false, isDefinition: true, scopeLine: 15, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !12, variables: !15)<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Amjad<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited<u></u><u></u></p>
<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.<u></u><u></u></p>
</div>
</blockquote>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
<div>
<div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited<u></u><u></u></p>
<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.<u></u><u></u></p>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div></div></div>
</div><div><div class="h5">
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></div></div></div>

</blockquote></div><br></div>