http://llvm.org/docs/LangRef.html#linkage-types says: Globals with “linkonce” linkage are merged with other globals of the same name when linkage occurs. This can be used to implement some forms of inline functions, templates, or other code which must be generated in each translation unit that uses it, but where the body may be overridden with a more definitive definition later. Unreferenced linkonce globals are allowed to be discarded. Note that linkonce linkage does not actually allow the optimizer to inline the body of this function into callers because it doesn’t know if this definition of the function is the definitive definition within the program or whether it will be overridden by a stronger definition. To enable inlining and other optimizations, use “linkonce_odr” linkage. This makes me think that linkonce globals will not be optimized out of an .o file, but they can be deleted by the linker. Here's some IR I have: define linkonce i128 @__udivmodti4(i128, i128, i128*) local_unnamed_addr #0 !dbg !264 { .... } When I run: opt -O3 -S compiler_rt.ll It deletes the function. Is this expected behavior? Is there a linkage type that lets the linker merge functions of the same name but does not let the optimizer delete the function? (let me know if providing the entire .ll file would be helpful) Regards, Andrew Kelley -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171024/ee652e8c/attachment.html>
> Unreferenced linkonce globals are allowed to be discarded.Is __udivmodti4 referenced? vedant> On Oct 24, 2017, at 6:09 PM, Andrew Kelley via llvm-dev <llvm-dev at lists.llvm.org> wrote: > > http://llvm.org/docs/LangRef.html#linkage-types <http://llvm.org/docs/LangRef.html#linkage-types> says: > > Globals with “linkonce” linkage are merged with other globals of the same name when linkage occurs. This can be used to implement some forms of inline functions, templates, or other code which must be generated in each translation unit that uses it, but where the body may be overridden with a more definitive definition later. Unreferenced linkonce globals are allowed to be discarded. Note that linkonce linkage does not actually allow the optimizer to inline the body of this function into callers because it doesn’t know if this definition of the function is the definitive definition within the program or whether it will be overridden by a stronger definition. To enable inlining and other optimizations, use “linkonce_odr” linkage. > > This makes me think that linkonce globals will not be optimized out of an .o file, but they can be deleted by the linker. Here's some IR I have: > > define linkonce i128 @__udivmodti4(i128, i128, i128*) local_unnamed_addr #0 !dbg !264 { > .... > } > > When I run: > > opt -O3 -S compiler_rt.ll > > It deletes the function. Is this expected behavior? > > Is there a linkage type that lets the linker merge functions of the same name but does not let the optimizer delete the function? > > (let me know if providing the entire .ll file would be helpful) > > Regards, > Andrew Kelley > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171024/1fec9db8/attachment.html>
On Tue, Oct 24, 2017 at 9:27 PM, Vedant Kumar <vsk at apple.com> wrote:> Unreferenced linkonce globals are allowed to be discarded. > > > Is __udivmodti4 referenced? >It's referenced by a different .o file, but nothing within the module. My confusion comes from the missing direct object in the sentence. Referenced by a function local to the module? Referenced by any object in the linker job?> > vedant > > On Oct 24, 2017, at 6:09 PM, Andrew Kelley via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > > http://llvm.org/docs/LangRef.html#linkage-types says: > > Globals with “linkonce” linkage are merged with other globals of the same > name when linkage occurs. This can be used to implement some forms of > inline functions, templates, or other code which must be generated in each > translation unit that uses it, but where the body may be overridden with a > more definitive definition later. Unreferenced linkonce globals are allowed > to be discarded. Note that linkonce linkage does not actually allow the > optimizer to inline the body of this function into callers because it > doesn’t know if this definition of the function is the definitive > definition within the program or whether it will be overridden by a > stronger definition. To enable inlining and other optimizations, use > “linkonce_odr” linkage. > > This makes me think that linkonce globals will not be optimized out of an > .o file, but they can be deleted by the linker. Here's some IR I have: > > define linkonce i128 @__udivmodti4(i128, i128, i128*) local_unnamed_addr > #0 !dbg !264 { > .... > } > > When I run: > > opt -O3 -S compiler_rt.ll > > It deletes the function. Is this expected behavior? > > Is there a linkage type that lets the linker merge functions of the same > name but does not let the optimizer delete the function? > > (let me know if providing the entire .ll file would be helpful) > > Regards, > Andrew Kelley > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171024/891f66df/attachment.html>