Teresa Johnson via llvm-dev
2018-May-09 17:06 UTC
[llvm-dev] lld + ThinLTO + fprofile-generate causes duplicate symbol errors
Adding Peter to comment on the linker resolution issue.>From adding save-temps, it looks like lld and gold are giving differentresolutions to the symbols, which is presumably creating this issue: (first file is with lld and second is with gold) $ diff a.out.resolution.txt gold/ 4c4 < -r=a.o,__llvm_profile_raw_version,plx ---> -r=a.o,__llvm_profile_raw_version,l8,9c8,9 < -r=b.o,__llvm_profile_raw_version,x < -r=b.o,__llvm_profile_filename,x ---> -r=b.o,__llvm_profile_raw_version,l > -r=b.o,__llvm_profile_filename,lI.e. with lld they are all marked as exported. Peter, any ideas? Teresa On Wed, May 9, 2018 at 9:52 AM Teresa Johnson <tejohnson at google.com> wrote:> Sorry, operator error. I can reproduce now. Interestingly, this does not > reproduce using gold, and they utilize the same underlying LTO API. Let me > dig a little using save-temps and see where they diverge. > Teresa > > On Wed, May 9, 2018 at 9:28 AM Pirama Arumuga Nainar <pirama at google.com> > wrote: > >> LLD revision is r331862. To add, I had initially tried it on r328903, >> which also reproduced the issue. >> >> On Wed, May 9, 2018 at 9:26 AM Pirama Arumuga Nainar <pirama at google.com> >> wrote: >> >>> Hi Teresa, >>> >>> Thanks for looking into this. I hadn't initially tried ToT, but it >>> reproduces in ToT as well when I tried. >>> >>> $ ./clang --version >>> >>> clang version 7.0.0 (trunk 331879) (llvm/trunk 331888) >>> Target: x86_64-unknown-linux-gnu >>> Thread model: posix >>> InstalledDir: /ssd2/pirama/llvm-upstream/llvm-release/bin/. >>> >>> $ ./ld.lld --version >>> LLD 7.0.0 (https://git.llvm.org/git/lld.git dc4977e104c7f33758ac6119d1528aafcd8a94dc) (compatible with GNU linkers) >>> >>> >>> On Wed, May 9, 2018 at 6:44 AM Teresa Johnson <tejohnson at google.com> >>> wrote: >>> >>>> >>>> >>>> On Wed, May 9, 2018 at 6:43 AM Teresa Johnson <tejohnson at google.com> >>>> wrote: >>>> >>>>> Hi Pirama, >>>>> >>>>> I can't reproduce with either lld or gold, using a compiler built from >>>>> head. What version is your clang? >>>>> >>>> (and your lld) >>>> >>>> >>>>> >>>>> Thanks, >>>>> Teresa >>>>> >>>>> On Tue, May 8, 2018 at 7:50 PM Pirama Arumuga Nainar via llvm-dev < >>>>> llvm-dev at lists.llvm.org> wrote: >>>>> >>>>>> The duplicate symbol errors are for __llvm_profile_filename and __llvm_profile_raw_version. >>>>>> IIUC, these are supposed to be weak symbols but Thin LTO seems to break >>>>>> this in some way. This does't happen with gold or no LTO or full >>>>>> LTO. >>>>>> >>>>>> $ cat > a.c >>>>>> extern int foo(); >>>>>> >>>>>> int main() { >>>>>> return foo(); >>>>>> } >>>>>> >>>>>> $ cat > b.c >>>>>> int foo() { >>>>>> return 0; >>>>>> } >>>>>> >>>>>> $ clang a.c -fprofile-generate -flto=thin -c >>>>>> $ clang b.c -fprofile-generate -flto=thin -c >>>>>> $ clang a.o b.o -fprofile-generate -flto=thin -fuse-ld=lld >>>>>> ld.lld: error: duplicate symbol: __llvm_profile_filename >>>>>> >>> defined at a.c >>>>>> >>> lto.tmp:(__llvm_profile_filename) >>>>>> >>> defined at b.c >>>>>> >>> lto.tmp:(.rodata.__llvm_profile_filename+0x0) >>>>>> >>>>>> ld.lld: error: duplicate symbol: __llvm_profile_raw_version >>>>>> >>> defined at a.c >>>>>> >>> lto.tmp:(__llvm_profile_raw_version) >>>>>> >>> defined at b.c >>>>>> >>> lto.tmp:(.rodata.__llvm_profile_raw_version+0x0) >>>>>> clang-7: error: linker command failed with exit code 1 (use -v to see >>>>>> invocation) >>>>>> Makefile:10: recipe for target 'a.out' failed >>>>>> make: *** [a.out] Error 1 >>>>>> _______________________________________________ >>>>>> LLVM Developers mailing list >>>>>> llvm-dev at lists.llvm.org >>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>>> >>>>> >>>>> >>>>> -- >>>>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>>>> 408-460-2413 >>>>> >>>> >>>> >>>> -- >>>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>>> 408-460-2413 >>>> >>> > > -- > Teresa Johnson | Software Engineer | tejohnson at google.com | > 408-460-2413 >-- Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180509/91a82219/attachment.html>
Peter Collingbourne via llvm-dev
2018-May-09 18:26 UTC
[llvm-dev] lld + ThinLTO + fprofile-generate causes duplicate symbol errors
The problem is that ThinLTO is not dropping the non-prevailing definitions, and they end up being emitted into the object file for b.o. $ ../ra/bin/llvm-dis -o - b.o0.0.preopt.bc | grep __llvm_prof $__llvm_profile_raw_version = comdat any $__llvm_profile_filename = comdat any @__llvm_profile_raw_version = constant i64 72057594037927940, comdat @__llvm_profile_filename = constant [19 x i8] c"default_%m.profraw\00", comdat lld ignores comdats in LTO object files because it expects all comdats to have already been resolved. So we see this error. We are supposed to drop non-prevailing symbols here, but for some reason we do it only for weak symbols. That's not correct in ELF where comdat symbols can be both strong and non-prevailing. http://llvm-cs.pcc.me.uk/lib/LTO/LTO.cpp#290 This patch fixes the reproducer but it leads to other test failures that would need to be looked at. diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index 7e8b9b3c6390..ee11d07d6b8e 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -287,7 +287,7 @@ static void thinLTOResolveWeakForLinkerGUID( recordNewLinkage) { for (auto &S : GVSummaryList) { GlobalValue::LinkageTypes OriginalLinkage = S->linkage(); - if (!GlobalValue::isWeakForLinker(OriginalLinkage)) + if (GlobalValue::isLocalLinkage(OriginalLinkage)) continue; // We need to emit only one of these. The prevailing module will keep it, // but turned into a weak, while the others will drop it when possible. diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp index 246d75caefa2..61790c9fc435 100644 --- a/llvm/lib/Transforms/IPO/FunctionImport.cpp +++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -765,7 +765,7 @@ void llvm::thinLTOResolveWeakForLinkerModule( return; } - if (!GlobalValue::isWeakForLinker(GV.getLinkage())) + if (GlobalValue::isLocalLinkage(GV.getLinkage())) return; // Check for a non-prevailing def that has interposable linkage // (e.g. non-odr weak or linkonce). In that case we can't simply Peter On Wed, May 9, 2018 at 10:06 AM, Teresa Johnson <tejohnson at google.com> wrote:> Adding Peter to comment on the linker resolution issue. > > From adding save-temps, it looks like lld and gold are giving different > resolutions to the symbols, which is presumably creating this issue: > > (first file is with lld and second is with gold) > > $ diff a.out.resolution.txt gold/ > 4c4 > < -r=a.o,__llvm_profile_raw_version,plx > --- > > -r=a.o,__llvm_profile_raw_version,l > 8,9c8,9 > < -r=b.o,__llvm_profile_raw_version,x > < -r=b.o,__llvm_profile_filename,x > --- > > -r=b.o,__llvm_profile_raw_version,l > > -r=b.o,__llvm_profile_filename,l > > I.e. with lld they are all marked as exported. > > Peter, any ideas? > > Teresa > > > On Wed, May 9, 2018 at 9:52 AM Teresa Johnson <tejohnson at google.com> > wrote: > >> Sorry, operator error. I can reproduce now. Interestingly, this does not >> reproduce using gold, and they utilize the same underlying LTO API. Let me >> dig a little using save-temps and see where they diverge. >> Teresa >> >> On Wed, May 9, 2018 at 9:28 AM Pirama Arumuga Nainar <pirama at google.com> >> wrote: >> >>> LLD revision is r331862. To add, I had initially tried it on r328903, >>> which also reproduced the issue. >>> >>> On Wed, May 9, 2018 at 9:26 AM Pirama Arumuga Nainar <pirama at google.com> >>> wrote: >>> >>>> Hi Teresa, >>>> >>>> Thanks for looking into this. I hadn't initially tried ToT, but it >>>> reproduces in ToT as well when I tried. >>>> >>>> $ ./clang --version >>>> >>>> clang version 7.0.0 (trunk 331879) (llvm/trunk 331888) >>>> Target: x86_64-unknown-linux-gnu >>>> Thread model: posix >>>> InstalledDir: /ssd2/pirama/llvm-upstream/llvm-release/bin/. >>>> >>>> $ ./ld.lld --version >>>> LLD 7.0.0 (https://git.llvm.org/git/lld.git dc4977e104c7f33758ac6119d1528aafcd8a94dc) (compatible with GNU linkers) >>>> >>>> >>>> On Wed, May 9, 2018 at 6:44 AM Teresa Johnson <tejohnson at google.com> >>>> wrote: >>>> >>>>> >>>>> >>>>> On Wed, May 9, 2018 at 6:43 AM Teresa Johnson <tejohnson at google.com> >>>>> wrote: >>>>> >>>>>> Hi Pirama, >>>>>> >>>>>> I can't reproduce with either lld or gold, using a compiler built >>>>>> from head. What version is your clang? >>>>>> >>>>> (and your lld) >>>>> >>>>> >>>>>> >>>>>> Thanks, >>>>>> Teresa >>>>>> >>>>>> On Tue, May 8, 2018 at 7:50 PM Pirama Arumuga Nainar via llvm-dev < >>>>>> llvm-dev at lists.llvm.org> wrote: >>>>>> >>>>>>> The duplicate symbol errors are for __llvm_profile_filename and >>>>>>> __llvm_profile_raw_version. IIUC, these are supposed to be weak >>>>>>> symbols but Thin LTO seems to break this in some way. This does't >>>>>>> happen with gold or no LTO or full LTO. >>>>>>> >>>>>>> $ cat > a.c >>>>>>> extern int foo(); >>>>>>> >>>>>>> int main() { >>>>>>> return foo(); >>>>>>> } >>>>>>> >>>>>>> $ cat > b.c >>>>>>> int foo() { >>>>>>> return 0; >>>>>>> } >>>>>>> >>>>>>> $ clang a.c -fprofile-generate -flto=thin -c >>>>>>> $ clang b.c -fprofile-generate -flto=thin -c >>>>>>> $ clang a.o b.o -fprofile-generate -flto=thin -fuse-ld=lld >>>>>>> ld.lld: error: duplicate symbol: __llvm_profile_filename >>>>>>> >>> defined at a.c >>>>>>> >>> lto.tmp:(__llvm_profile_filename) >>>>>>> >>> defined at b.c >>>>>>> >>> lto.tmp:(.rodata.__llvm_profile_filename+0x0) >>>>>>> >>>>>>> ld.lld: error: duplicate symbol: __llvm_profile_raw_version >>>>>>> >>> defined at a.c >>>>>>> >>> lto.tmp:(__llvm_profile_raw_version) >>>>>>> >>> defined at b.c >>>>>>> >>> lto.tmp:(.rodata.__llvm_profile_raw_version+0x0) >>>>>>> clang-7: error: linker command failed with exit code 1 (use -v to >>>>>>> see invocation) >>>>>>> Makefile:10: recipe for target 'a.out' failed >>>>>>> make: *** [a.out] Error 1 >>>>>>> _______________________________________________ >>>>>>> LLVM Developers mailing list >>>>>>> llvm-dev at lists.llvm.org >>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>>>>> 408-460-2413 >>>>>> >>>>> >>>>> >>>>> -- >>>>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>>>> 408-460-2413 >>>>> >>>> >> >> -- >> Teresa Johnson | Software Engineer | tejohnson at google.com | >> 408-460-2413 >> > > > -- > Teresa Johnson | Software Engineer | tejohnson at google.com | > 408-460-2413 >-- -- Peter -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180509/e31a57b0/attachment.html>
Pirama Arumuga Nainar via llvm-dev
2018-May-11 19:24 UTC
[llvm-dev] lld + ThinLTO + fprofile-generate causes duplicate symbol errors
Thanks Peter, your patch does fix the reproducer. I filed https://bugs.llvm.org/show_bug.cgi?id=37422 to track this bug. I have no clue on how to resolve the tests - whether further cleanup is required in the code or in the tests. But if Teresa or you cannot get to it, I can, with some help, take a crack at fixing the tests. On Wed, May 9, 2018 at 11:26 AM Peter Collingbourne <peter at pcc.me.uk> wrote:> The problem is that ThinLTO is not dropping the non-prevailing > definitions, and they end up being emitted into the object file for b.o. > > $ ../ra/bin/llvm-dis -o - b.o0.0.preopt.bc | grep __llvm_prof > $__llvm_profile_raw_version = comdat any > $__llvm_profile_filename = comdat any > @__llvm_profile_raw_version = constant i64 72057594037927940, comdat > @__llvm_profile_filename = constant [19 x i8] c"default_%m.profraw\00", > comdat > > lld ignores comdats in LTO object files because it expects all comdats to > have already been resolved. So we see this error. > > We are supposed to drop non-prevailing symbols here, but for some reason > we do it only for weak symbols. That's not correct in ELF where comdat > symbols can be both strong and non-prevailing. > http://llvm-cs.pcc.me.uk/lib/LTO/LTO.cpp#290 > > This patch fixes the reproducer but it leads to other test failures that > would need to be looked at. > > diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp > index 7e8b9b3c6390..ee11d07d6b8e 100644 > --- a/llvm/lib/LTO/LTO.cpp > +++ b/llvm/lib/LTO/LTO.cpp > @@ -287,7 +287,7 @@ static void thinLTOResolveWeakForLinkerGUID( > recordNewLinkage) { > for (auto &S : GVSummaryList) { > GlobalValue::LinkageTypes OriginalLinkage = S->linkage(); > - if (!GlobalValue::isWeakForLinker(OriginalLinkage)) > + if (GlobalValue::isLocalLinkage(OriginalLinkage)) > continue; > // We need to emit only one of these. The prevailing module will keep > it, > // but turned into a weak, while the others will drop it when > possible. > diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp > b/llvm/lib/Transforms/IPO/FunctionImport.cpp > index 246d75caefa2..61790c9fc435 100644 > --- a/llvm/lib/Transforms/IPO/FunctionImport.cpp > +++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp > @@ -765,7 +765,7 @@ void llvm::thinLTOResolveWeakForLinkerModule( > return; > } > > - if (!GlobalValue::isWeakForLinker(GV.getLinkage())) > + if (GlobalValue::isLocalLinkage(GV.getLinkage())) > return; > // Check for a non-prevailing def that has interposable linkage > // (e.g. non-odr weak or linkonce). In that case we can't simply > > Peter > > On Wed, May 9, 2018 at 10:06 AM, Teresa Johnson <tejohnson at google.com> > wrote: > >> Adding Peter to comment on the linker resolution issue. >> >> From adding save-temps, it looks like lld and gold are giving different >> resolutions to the symbols, which is presumably creating this issue: >> >> (first file is with lld and second is with gold) >> >> $ diff a.out.resolution.txt gold/ >> 4c4 >> < -r=a.o,__llvm_profile_raw_version,plx >> --- >> > -r=a.o,__llvm_profile_raw_version,l >> 8,9c8,9 >> < -r=b.o,__llvm_profile_raw_version,x >> < -r=b.o,__llvm_profile_filename,x >> --- >> > -r=b.o,__llvm_profile_raw_version,l >> > -r=b.o,__llvm_profile_filename,l >> >> I.e. with lld they are all marked as exported. >> >> Peter, any ideas? >> >> Teresa >> >> >> On Wed, May 9, 2018 at 9:52 AM Teresa Johnson <tejohnson at google.com> >> wrote: >> >>> Sorry, operator error. I can reproduce now. Interestingly, this does not >>> reproduce using gold, and they utilize the same underlying LTO API. Let me >>> dig a little using save-temps and see where they diverge. >>> Teresa >>> >>> On Wed, May 9, 2018 at 9:28 AM Pirama Arumuga Nainar <pirama at google.com> >>> wrote: >>> >>>> LLD revision is r331862. To add, I had initially tried it on r328903, >>>> which also reproduced the issue. >>>> >>>> On Wed, May 9, 2018 at 9:26 AM Pirama Arumuga Nainar <pirama at google.com> >>>> wrote: >>>> >>>>> Hi Teresa, >>>>> >>>>> Thanks for looking into this. I hadn't initially tried ToT, but it >>>>> reproduces in ToT as well when I tried. >>>>> >>>>> $ ./clang --version >>>>> >>>>> clang version 7.0.0 (trunk 331879) (llvm/trunk 331888) >>>>> Target: x86_64-unknown-linux-gnu >>>>> Thread model: posix >>>>> InstalledDir: /ssd2/pirama/llvm-upstream/llvm-release/bin/. >>>>> >>>>> $ ./ld.lld --version >>>>> LLD 7.0.0 (https://git.llvm.org/git/lld.git dc4977e104c7f33758ac6119d1528aafcd8a94dc) (compatible with GNU linkers) >>>>> >>>>> >>>>> On Wed, May 9, 2018 at 6:44 AM Teresa Johnson <tejohnson at google.com> >>>>> wrote: >>>>> >>>>>> >>>>>> >>>>>> On Wed, May 9, 2018 at 6:43 AM Teresa Johnson <tejohnson at google.com> >>>>>> wrote: >>>>>> >>>>>>> Hi Pirama, >>>>>>> >>>>>>> I can't reproduce with either lld or gold, using a compiler built >>>>>>> from head. What version is your clang? >>>>>>> >>>>>> (and your lld) >>>>>> >>>>>> >>>>>>> >>>>>>> Thanks, >>>>>>> Teresa >>>>>>> >>>>>>> On Tue, May 8, 2018 at 7:50 PM Pirama Arumuga Nainar via llvm-dev < >>>>>>> llvm-dev at lists.llvm.org> wrote: >>>>>>> >>>>>>>> The duplicate symbol errors are for __llvm_profile_filename and __llvm_profile_raw_version. >>>>>>>> IIUC, these are supposed to be weak symbols but Thin LTO seems to break >>>>>>>> this in some way. This does't happen with gold or no LTO or full >>>>>>>> LTO. >>>>>>>> >>>>>>>> $ cat > a.c >>>>>>>> extern int foo(); >>>>>>>> >>>>>>>> int main() { >>>>>>>> return foo(); >>>>>>>> } >>>>>>>> >>>>>>>> $ cat > b.c >>>>>>>> int foo() { >>>>>>>> return 0; >>>>>>>> } >>>>>>>> >>>>>>>> $ clang a.c -fprofile-generate -flto=thin -c >>>>>>>> $ clang b.c -fprofile-generate -flto=thin -c >>>>>>>> $ clang a.o b.o -fprofile-generate -flto=thin -fuse-ld=lld >>>>>>>> ld.lld: error: duplicate symbol: __llvm_profile_filename >>>>>>>> >>> defined at a.c >>>>>>>> >>> lto.tmp:(__llvm_profile_filename) >>>>>>>> >>> defined at b.c >>>>>>>> >>> lto.tmp:(.rodata.__llvm_profile_filename+0x0) >>>>>>>> >>>>>>>> ld.lld: error: duplicate symbol: __llvm_profile_raw_version >>>>>>>> >>> defined at a.c >>>>>>>> >>> lto.tmp:(__llvm_profile_raw_version) >>>>>>>> >>> defined at b.c >>>>>>>> >>> lto.tmp:(.rodata.__llvm_profile_raw_version+0x0) >>>>>>>> clang-7: error: linker command failed with exit code 1 (use -v to >>>>>>>> see invocation) >>>>>>>> Makefile:10: recipe for target 'a.out' failed >>>>>>>> make: *** [a.out] Error 1 >>>>>>>> _______________________________________________ >>>>>>>> LLVM Developers mailing list >>>>>>>> llvm-dev at lists.llvm.org >>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>>>>>> 408-460-2413 >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>>>>> 408-460-2413 >>>>>> >>>>> >>> >>> -- >>> Teresa Johnson | Software Engineer | tejohnson at google.com | >>> 408-460-2413 >>> >> >> >> -- >> Teresa Johnson | Software Engineer | tejohnson at google.com | >> 408-460-2413 >> > > > > -- > -- > Peter >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180511/88359e5e/attachment.html>
Possibly Parallel Threads
- lld + ThinLTO + fprofile-generate causes duplicate symbol errors
- lld + ThinLTO + fprofile-generate causes duplicate symbol errors
- lld + ThinLTO + fprofile-generate causes duplicate symbol errors
- lld + ThinLTO + fprofile-generate causes duplicate symbol errors
- lld + ThinLTO + fprofile-generate causes duplicate symbol errors