[llvm-dev] [ThinLTO] static library failure with object files with the same name

Johan Engelen via llvm-dev llvm-dev at lists.llvm.org
Tue Sep 5 13:09:32 PDT 2017


Hi all,
  I have a static library with object files with the same name (not the
same full path, but the archive made with llvm-ar does not store the full
path). The library contains object files that have been compiled with
`-flto=thin` (compiled with LDC, not clang, but that shouldn't matter).
When linking to that static library, I get the error:
Assertion failed: (ModuleMap.find(ModuleBuffer.getBufferIdentifier()) ==
ModuleMap.end() && "Expect unique Buffer Identifier"), function
generateModuleMap, file ../lib/LTO/ThinLTOCodeGenerator.cpp, line 138.

The error occurs because the buffer identifier uses the filename of the
objects inside the archive, and those are identical for the two files with
different source path.

This problem appears to be fixed for LLD here:
https://reviews.llvm.org/D25495
https://bugs.llvm.org/show_bug.cgi?id=30665

But it persists for linking with the system linker on OSX (while manually
passing libLTO.dylib to the linker).

If I modify lib/LTO/ThinLTOCodeGenerator.cpp to do a poor-man's uniquefying
of the buffer identifier:
```
void ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) {
-  ThinLTOBuffer Buffer(Data, Identifier.str()));
+  ThinLTOBuffer Buffer(Data, Identifier.str() + utostr(Data.size()));
```
then the problem is solved.

What would be a proper way to fix this issue?
Can it be fixed in lib/LTO, or should I not create an (afaict valid)
archive containing duplicate object file names?

(Note: this issue makes it impossible to use an LTO version of the standard
library with LDC)

Thanks,
  Johan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170905/046c18b2/attachment.html>


More information about the llvm-dev mailing list