<div dir="auto">For my example, I see that LLVM IR is printed in cgmain.cpp:build_routine_and_parameter_entries. However, what I'm looking for is the place where function linkage is *decided*. I see internal linkage for some of the functions in large Fortran modules but the pattern seems completely random to me.<div dir="auto"><br></div><div dir="auto">Best,</div><div dir="auto">Alexey</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed., Dec. 4, 2019, 8:40 p.m. Stephen Scalpone, <<a href="mailto:sscalpone@nvidia.com">sscalpone@nvidia.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="m_5306711279454907502WordSection1">
<p class="MsoNormal">This looks promising:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">ll_write.cpp:  fprintf(out, "define %s %s %s ", ll_get_linkage_string(function->linkage),<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">flang-dev <<a href="mailto:flang-dev-bounces@lists.llvm.org" target="_blank" rel="noreferrer">flang-dev-bounces@lists.llvm.org</a>> on behalf of Alexey Zhikhartsev via flang-dev <<a href="mailto:flang-dev@lists.llvm.org" target="_blank" rel="noreferrer">flang-dev@lists.llvm.org</a>><br>
<b>Reply-To: </b>Alexey Zhikhartsev <<a href="mailto:alexey.zhikhar@gmail.com" target="_blank" rel="noreferrer">alexey.zhikhar@gmail.com</a>><br>
<b>Date: </b>Wednesday, December 4, 2019 at 4:49 PM<br>
<b>To: </b>"<a href="mailto:flang-dev@lists.llvm.org" target="_blank" rel="noreferrer">flang-dev@lists.llvm.org</a>" <<a href="mailto:flang-dev@lists.llvm.org" target="_blank" rel="noreferrer">flang-dev@lists.llvm.org</a>><br>
<b>Subject: </b>[flang-dev] Fwd: Internal linkage for private subroutines<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">Hi all,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">In the code below, every function in module m is private by default, and only bar() is declared public:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">module m</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">implicit none</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">private</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">public :: bar</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">integer :: arr1(42)</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">contains</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  subroutine foo(a)</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  integer :: a</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  arr1(1) = 2</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  end subroutine foo</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  subroutine bar(a)</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  integer :: a</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call foo(a)</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  end subroutine bar</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">end module m</span><u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">However, in the resulting LLVM IR, no function is declared with an attribute “internal”:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">define void @m_foo_(i64* %a) !dbg !5 {</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">L.entry:</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br label %L.LB2_313</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> 
</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">L.LB2_313:                                        ; preds = %L.entry</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %0 = bitcast %struct_m_4_* @_m_4_ to i32*, !dbg !10                              
</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  store i32 2, i32* %0, align 4, !dbg !10, !tbaa !12</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  ret void, !dbg !16</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}
</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">define void @m_bar_(i64* %a) !dbg !17 {</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">L.entry:</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br label %L.LB3_314</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> </span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">L.LB3_314:                                        ; preds = %L.entry</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @m_foo_(i64* %a), !dbg !18</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  ret void, !dbg !20</span><u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}</span><u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Am I missing something? I tried to find where it might be implemented in flang by grepping the flang codebase for SC_STATIC but there’s just too many places. Any pointers would
 be much appreciated.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Alexey<u></u><u></u></p>
<table border="0" cellspacing="0" cellpadding="0" width="643" style="width:6.7in;border-collapse:collapse">
<tbody>
<tr style="height:28.5pt">
<td width="384" valign="top" style="width:4.0in;padding:0in 5.4pt 0in 5.4pt;height:28.5pt">
</td>
<td width="259" valign="top" style="width:2.7in;padding:0in 5.4pt 0in 5.4pt;height:28.5pt">
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>
</div>

<div>
<hr>
</div>
<div>This email message is for the sole use of the intended recipient(s) and may 
contain confidential information.  Any unauthorized review, use, disclosure 
or distribution is prohibited.  If you are not the intended recipient, 
please contact the sender by reply email and destroy all copies of the original 
message. </div>
<div>
<hr>
</div>
</div>

</blockquote></div>