<div dir="ltr">I'm suspicious of a bug here. At least at first, I don't see why the code as-is wouldn't work.<div><br></div><div>My best guess is that (either way) it stems from the oddities of PassInfo and it being included *after* other headers weirdly. The technique in the patch to delay instantiation until the .cpp file seems a reasonable way to work around the problem, whatever it is...</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Jun 29, 2014 at 2:19 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I was able to reproduce this. Checking if it is a bug in gcc 4.9 or in our code.<br>
<div class="HOEnZb"><div class="h5"><br>
On 25 June 2014 23:22, Sanjoy Das <<a href="mailto:sanjoy@playingwithpointers.com">sanjoy@playingwithpointers.com</a>> wrote:<br>
> Hi Rafael,<br>
><br>
> I get the build failure when building with g++ 4.9.0.  This is how I build:<br>
><br>
> "CXX=g++  ../configure --enable-optimized --enable-shared<br>
> --enable-targets=host && make -j60"<br>
><br>
> I haven't tried building with clang yet -- if you can successfully<br>
> build with clang then it could be an issue specific to gcc.  This is<br>
> the failure I get:<br>
><br>
> [snip]<br>
><br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-nm'<br>
> llvm[2]: Linking Release+Asserts executable llvm-symbolizer (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable<br>
> llvm-symbolizer (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-symbolizer'<br>
> llvm[2]: Linking Release+Asserts executable llvm-size (without symbols)<br>
> llvm[2]: Linking Release+Asserts executable obj2yaml (without symbols)<br>
> llvm[2]: Linking Release+Asserts executable llvm-stress (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable llvm-size<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-size'<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable obj2yaml<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/obj2yaml'<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable<br>
> llvm-stress (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-stress'<br>
> llvm[2]: Linking Release+Asserts executable llvm-diff (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable llvm-diff<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-diff'<br>
> llvm[2]: Linking Release+Asserts executable llvm-mc (without symbols)<br>
> llvm[2]: Linking Release+Asserts Shared Library libLTO.so<br>
> llvm[2]: Building Release+Asserts Archive Library libLTO.a<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable llvm-mc<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-mc'<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/lto'<br>
> llvm[2]: Linking Release+Asserts executable lli (without symbols)<br>
> llvm[2]: Linking Release+Asserts executable llc (without symbols)<br>
> make[2]: Entering directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-lto'<br>
> llvm[2]: Compiling llvm-lto.cpp for Release+Asserts build<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable llc<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llc'<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable lli<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/lli'<br>
> llvm[2]: Linking Release+Asserts executable bugpoint (without symbols)<br>
> /home/sanjoy/work/llvm.git/build.fastdebug/tools/bugpoint/Release+Asserts/bugpoint.o:<br>
> In function `llvm::cl::list<llvm::PassInfo const*, bool,<br>
> llvm::PassNameParser>::getExtraOptionNames(llvm::SmallVectorImpl<char<br>
> const*>&)':<br>
> bugpoint.cpp:(.text._ZN4llvm2cl4listIPKNS_8PassInfoEbNS_14PassNameParserEE19getExtraOptionNamesERNS_15SmallVectorImplIPKcEE[_ZN4llvm2cl4listIPKNS_8PassInfoEbNS_14PassNameParserEE19getExtraOptionNamesERNS_15SmallVectorImplIPKcEE]+0x76):<br>

> undefined reference to `llvm::cl::parser<llvm::PassInfo<br>
> const*>::getOption(unsigned int) const'<br>
> collect2: error: ld returned 1 exit status<br>
> make[2]: *** [/home/sanjoy/work/llvm.git/build.fastdebug/Release+Asserts/bin/bugpoint]<br>
> Error 1<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/bugpoint'<br>
> make[1]: *** [bugpoint/.makeall] Error 2<br>
> make[1]: *** Waiting for unfinished jobs....<br>
> llvm[2]: Linking Release+Asserts executable llvm-objdump (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable<br>
> llvm-objdump (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-objdump'<br>
> llvm[2]: Linking Release+Asserts executable yaml2obj (without symbols)<br>
> llvm[2]: Linking Release+Asserts executable opt (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable yaml2obj<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/yaml2obj'<br>
> /home/sanjoy/work/llvm.git/build.fastdebug/tools/opt/Release+Asserts/opt.o:<br>
> In function `llvm::cl::list<llvm::PassInfo const*, bool,<br>
> llvm::PassNameParser>::getExtraOptionNames(llvm::SmallVectorImpl<char<br>
> const*>&)':<br>
> opt.cpp:(.text._ZN4llvm2cl4listIPKNS_8PassInfoEbNS_14PassNameParserEE19getExtraOptionNamesERNS_15SmallVectorImplIPKcEE[_ZN4llvm2cl4listIPKNS_8PassInfoEbNS_14PassNameParserEE19getExtraOptionNamesERNS_15SmallVectorImplIPKcEE]+0x56):<br>

> undefined reference to `llvm::cl::parser<llvm::PassInfo<br>
> const*>::getOption(unsigned int) const'<br>
> collect2: error: ld returned 1 exit status<br>
> make[2]: *** [/home/sanjoy/work/llvm.git/build.fastdebug/Release+Asserts/bin/opt]<br>
> Error 1<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/opt'<br>
> make[1]: *** [opt/.makeall] Error 2<br>
> llvm[2]: Linking Release+Asserts executable llvm-readobj (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable<br>
> llvm-readobj (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-readobj'<br>
> llvm[2]: Linking Release+Asserts executable llvm-lto (without symbols)<br>
> llvm[2]: ======= Finished Linking Release+Asserts Executable llvm-lto<br>
> (without symbols)<br>
> make[2]: Leaving directory<br>
> `/home/sanjoy/work/llvm.git/build.fastdebug/tools/llvm-lto'<br>
> make[1]: Leaving directory `/home/sanjoy/work/llvm.git/build.fastdebug/tools'<br>
> make: *** [all] Error 1<br>
><br>
><br>
> On Tue, Jun 24, 2014 at 7:29 AM, Rafael Espíndola<br>
> <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br>
>> I can't reproduce the problem. Which file has the undefined symbol?<br>
>> Maybe it is just missing an include?<br>
>><br>
>> On 19 June 2014 19:00, Sanjoy Das <<a href="mailto:sanjoy@playingwithpointers.com">sanjoy@playingwithpointers.com</a>> wrote:<br>
>>> The shared-object build for llvm (i.e. <a href="http://libLLVM-3.5svn.so" target="_blank">libLLVM-3.5svn.so</a> + tools)<br>
>>> currently breaks on linux when linking opt.  This patch is an attempt<br>
>>> to fix that.<br>
>>><br>
>>> -- Sanjoy<br>
>>><br>
>>> _______________________________________________<br>
>>> llvm-commits mailing list<br>
>>> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
>>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
>>><br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>