[LLVMdev] LTO and Optimized libraries don't mix

Daniel Stewart stewartd at codeaurora.org
Mon Jun 9 13:26:18 PDT 2014


When using the ARM cross compiler we've run into an issue with LTO and
optimized libraries.

 

Consider you have an optimized library opt.a, which contains a version of
memcpy.

 

Compiling with LTO (something like),

clang myTest.c opt.a -flto -o myTest

 

causes myTest.c to get compiled to bitcode.

 

Then the bitcode gets passed to the linker. The linker looks through the
bitcode (via the gold plugin) searching for symbols it needs to resolve. But
any memcpy() calls in myTest.c got converted to llvm.memcpy() calls in the
bitcode. Any symbols that start with 'llvm.' get ignored in LTOModule.cpp.
So the linker doesn't know that it needs memcpy. Now once the linker
processes opt.a it doesn't know that it needs memcpy, so the linker doesn't
keep the definition of memcpy from opt.a. 

 

After the (full) compilation of myTest is complete, the linker winds up
trying to pull memcpy from libc. But once it hits opt.a to process again, it
sees a multiple definition issue. 

 

It appears that optimized libraries and LTO don't currently mix well. Does
anyone have any insight about how this should be accomplished?

 

Daniel

 

--

Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by
The Linux Foundation

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140609/85389d85/attachment.html>


More information about the llvm-dev mailing list