<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Clarification: According to the link provided earlier,<o:p></o:p></p>
<p class="MsoNormal"><a href="https://urldefense.com/v3/__https:/www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/__;!!JmoZiZGBv3RvKRSx!paBsrfUr-uf55wvDrS1ZhpJyGUWkUvK3z1VJ0TJpsN40LC2e5h7vMT7ROvhd9mOxyQ$" target="_blank">https://www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/</a><br>
you need (exactly one) extern _<i>declaration</i>_ of the inline function, to keep it from vanishing.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">inline int foo() { stuff; }<o:p></o:p></p>
<p class="MsoNormal">extern inline int foo(); // not a definition<o:p></o:p></p>
<p class="MsoNormal">int bar() { return foo(); }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">--paulr<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></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"><b>From:</b> llvm-dev <llvm-dev-bounces@lists.llvm.org> <b>On Behalf Of
</b>David Blaikie via llvm-dev<br>
<b>Sent:</b> Monday, August 2, 2021 3:18 PM<br>
<b>To:</b> Mariusz Sikora <msikora87@gmail.com><br>
<b>Cc:</b> llvm-dev <llvm-dev@lists.llvm.org><br>
<b>Subject:</b> Re: [llvm-dev] Inline function not eventually inlined is removed<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Looks like both Clang and GCC discard the inline function definition even if the function is not inlined and the definition is needed (because C requires there be a separate non-inline definition for correctness): <a href="https://urldefense.com/v3/__https:/godbolt.org/z/hPjv1d1db__;!!JmoZiZGBv3RvKRSx!paBsrfUr-uf55wvDrS1ZhpJyGUWkUvK3z1VJ0TJpsN40LC2e5h7vMT7ROvhjMD0L0A$">https://godbolt.org/z/hPjv1d1db</a><br>
<br>
This code is probably (in C++ standard terminology, I'm not sure what terminology the C standard uses) "invalid, no diagnostic required" - that's usually the language for stuff that can cause linker errors like this.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Mon, Aug 2, 2021 at 10:05 AM Mariusz Sikora <<a href="mailto:msikora87@gmail.com">msikora87@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">I'm just trying to understand is this _Code_ undefined behavior or this is a bug in LLVM? Because why LLVM is removing functions without inlining it? For example GCC is not removing function event after inlining it.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Fri, Jul 30, 2021 at 7:16 PM Fangrui Song <<a href="mailto:maskray@google.com" target="_blank">maskray@google.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal" style="margin-bottom:12.0pt">On 2021-07-30, David Blaikie via llvm-dev wrote:<br>
>You're probably looking for some documentation about C inline semantics:<br>
><a href="https://urldefense.com/v3/__https:/www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/__;!!JmoZiZGBv3RvKRSx!paBsrfUr-uf55wvDrS1ZhpJyGUWkUvK3z1VJ0TJpsN40LC2e5h7vMT7ROvhd9mOxyQ$" target="_blank">https://www.iar.com/knowledge/support/technical-notes/compiler/linker-error-undefined-external-for-inline-functions/</a><br>
<br>
Additional notes: I think the -fgnu89-inline & C99 inline semantics were<br>
designed explicitly the way so that vague linkage<br>
(<a href="https://urldefense.com/v3/__https:/itanium-cxx-abi.github.io/cxx-abi/abi/prop-72-comdat.html__;!!JmoZiZGBv3RvKRSx!paBsrfUr-uf55wvDrS1ZhpJyGUWkUvK3z1VJ0TJpsN40LC2e5h7vMT7ROvga_9S8Zw$" target="_blank">https://itanium-cxx-abi.github.io/cxx-abi/abi/prop-72-comdat.html</a>)
 can<br>
be avoided. The C inline behaviors are like always explicit<br>
instantiation in C++.<br>
<br>
(Seems that GNU has extensions for weak symbols on the a.out binary<br>
format. Otherwise, if a binary format has neither weak symbol nor<br>
COMDAT, vague linkage is not representable.)<br>
<br>
>On Fri, Jul 30, 2021 at 9:16 AM Mariusz Sikora via llvm-dev <<br>
><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
>> Hello,<br>
>><br>
>> I'm trying to understand why LLVM-12 is removing function which is marked<br>
>> inline despite the fact it was not inlined inside caller. Caller function<br>
>> still has a call to inline function and compilation is failing because of a<br>
>> lack of the symbol.<br>
>><br>
>> Looking at debug logs I see:<br>
>><br>
>> Inliner visiting SCC: sort: 1 call sites.<br>
>>       Analyzing call of calculate... (caller:sort)<br>
>>       .<br>
>>       Cost: 960<br>
>>       Threshold: 487<br>
>>     NOT Inlining (cost=960, threshold=487), Call:   call void<br>
>> @calculate(i32* %a, i32* %b)<br>
>><br>
>> Code:<br>
>> int global = 0;<br>
>> void inline calculate(int a[100], int b[100]) {<br>
>>     int i;<br>
>> #pragma unroll<br>
>>     for (i = 0; i < 50; i++) {<br>
>>         a[i] = b[i] + a[i];<br>
>>     }<br>
>> }<br>
>><br>
>> int sort(int a[100], int b[100]) {<br>
>>     calculate(a, b);<br>
>>     return a[20] + b[30] + global;<br>
>> }<br>
>><br>
>> cli: clang -O3 -c inline1.c -o inline1_clang.o<br>
>><br>
>> ll file:<br>
>> ; Function Attrs: nounwind uwtable<br>
>>  define dso_local i32 @sort(i32* %a, i32* %b) local_unnamed_addr #0 {<br>
>> entry:<br>
>>    tail call void @calculate(i32* %a, i32* %b)<br>
>>    %arrayidx = getelementptr inbounds i32, i32* %a, i64 20<br>
>>    %0 = load i32, i32* %arrayidx, align 4, !tbaa !2<br>
>>    %arrayidx1 = getelementptr inbounds i32, i32* %b, i64 30<br>
>>    %1 = load i32, i32* %arrayidx1, align 4, !tbaa !2<br>
>>    %add = add nsw i32 %1, %0<br>
>>    %2 = load i32, i32* @global, align 4, !tbaa !2<br>
>>    %add2 = add nsw i32 %add, %2<br>
>>    ret i32 %add2<br>
>> }<br>
>><br>
>> ; Function Attrs: inlinehint nounwind uwtable<br>
>>  declare dso_local void @calculate(i32*, i32*) local_unnamed_addr #1<br>
>><br>
>> Thanks<br>
>> Mariusz Sikora<br>
>> _______________________________________________<br>
>> LLVM Developers mailing list<br>
>> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
>> <a href="https://urldefense.com/v3/__https:/lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev__;!!JmoZiZGBv3RvKRSx!paBsrfUr-uf55wvDrS1ZhpJyGUWkUvK3z1VJ0TJpsN40LC2e5h7vMT7ROviIkV2iRA$" target="_blank">
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>><br>
<br>
>_______________________________________________<br>
>LLVM Developers mailing list<br>
><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
><a href="https://urldefense.com/v3/__https:/lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev__;!!JmoZiZGBv3RvKRSx!paBsrfUr-uf55wvDrS1ZhpJyGUWkUvK3z1VJ0TJpsN40LC2e5h7vMT7ROviIkV2iRA$" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<p class="MsoNormal">Pozdrawiam<o:p></o:p></p>
<div>
<p class="MsoNormal">Mariusz Sikora<o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</body>
</html>