<div dir="ltr"><div>Hi Andrew,</div><div><br></div><div>LLD relies on various bits of global state which are manipulated during the link, so I wouldn't expect it to be thread safe at that level, although it does attempt to reset that global state at the start of each call to link(), so it should be callable sequentially.</div><div><br></div><div>Regards,</div><div><br></div><div>James<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 25 July 2018 at 02:37, Andrew Kelley via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Follow-up -<br><br></div>Putting a global lock on running LLD indeed solved the issue, so I'm guessing that the LLD libraries do not in fact support being called from multiple threads simultaneously.<div><div class="h5"><br><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 24, 2018 at 9:10 PM, Andrew Kelley <span dir="ltr"><<a href="mailto:superjoe30@gmail.com" target="_blank">superjoe30@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>E.g. Is it intended to be allowed to call lld::elf::link in 2 different threads at the same time?<br><br></div>Follows is an example Valgrind error I ran into when doing the above.<br><br></div>I'll try putting a global resource lock on invoking LLD and see if it solves the problem.<br><div><div><div><br>==5467== Invalid write of size 8<br>==5467==    at 0x525509: llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::moveFromOldBuckets(llvm::de<wbr>tail::DenseMapPair<llvm::Cache<wbr>dHashStringRef, int>*, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>*) (DenseMap.h:375)<br>==5467==    by 0x524C7F: llvm::DenseMap<llvm::CachedHas<wbr>hStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:739)<br>==5467==    by 0x524077: llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:502)<br>==5467==    by 0x522E54: llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::InsertIntoBucketImpl<llvm::<wbr>CachedHashStringRef>(llvm::Cac<wbr>hedHashStringRef const&, llvm::CachedHashStringRef const&, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>*) (DenseMap.h:546)<br>==5467==    by 0x521258: llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::InsertIntoBucket<llvm::Cach<wbr>edHashStringRef, int>(llvm::detail::DenseMapPai<wbr>r<llvm::CachedHashStringRef, int>*, llvm::CachedHashStringRef&&, int&&) (DenseMap.h:512)<br>==5467==    by 0x51DEC9: std::pair<llvm::DenseMapIterat<wbr>or<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>, false>, bool> llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::try_emplace<int>(llvm::Cach<wbr>edHashStringRef&&, int&&) (DenseMap.h:215)<br>==5467==    by 0x51C52F: llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::insert(std::pair<llvm::Cach<wbr>edHashStringRef, int>&&) (DenseMap.h:199)<br>==5467==    by 0x516836: lld::elf::SymbolTable::insert(<wbr>llvm::StringRef) (SymbolTable.cpp:225)<br>==5467==    by 0x516A21: lld::elf::SymbolTable::insert(<wbr>llvm::StringRef, unsigned char, unsigned char, bool, lld::elf::InputFile*) (SymbolTable.cpp:260)<br>==5467==    by 0x51B88C: void lld::elf::SymbolTable::addShar<wbr>ed<llvm::object::ELFType<(<wbr>llvm::support::endianness)1, true> >(llvm::StringRef, lld::elf::SharedFile<llvm::obj<wbr>ect::ELFType<(llvm::support::<wbr>endianness)1, true> >&, llvm::object::ELFType<(llvm::s<wbr>upport::endianness)1, true>::Sym const&, unsigned int, unsigned int) (SymbolTable.cpp:483)<br>==5467==    by 0x4E762A: lld::elf::SharedFile<llvm::obj<wbr>ect::ELFType<(llvm::support::<wbr>endianness)1, true> >::parseRest() (InputFiles.cpp:895)<br>==5467==    by 0x51F69F: void lld::elf::SymbolTable::addFile<wbr><llvm::object::ELFType<(llvm::<wbr>support::endianness)1, true> >(lld::elf::InputFile*) (SymbolTable.cpp:99)<br>==5467==  Address 0xc6c7e80 is 53,568 bytes inside a block of size 98,304 free'd<br>==5467==    at 0x4C2E26B: operator delete(void*) (in /nix/store/j7sf6f2i9gws7c5mn8j<wbr>yi8wc08ab1zbp-valgrind-3.13.0/<wbr>lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>==5467==    by 0x4C714C: llvm::DenseMap<llvm::CachedHas<wbr>hStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::~DenseMap() (DenseMap.h:681)<br>==5467==    by 0x4C9C7B: lld::elf::SymbolTable::~Symbol<wbr>Table() (SymbolTable.h:36)<br>==5467==    by 0x4C9BF1: llvm::SpecificBumpPtrAllocator<wbr><lld::elf::SymbolTable>::<wbr>DestroyAll()::{lambda(char*, char*)#1}::operator()(char*, char*) const (Allocator.h:410)<br>==5467==    by 0x4C9D77: llvm::SpecificBumpPtrAllocator<wbr><lld::elf::SymbolTable>::<wbr>DestroyAll() (Allocator.h:421)<br>==5467==    by 0x4D218F: lld::SpecificAlloc<lld::elf::S<wbr>ymbolTable>::reset() (Memory.h:47)<br>==5467==    by 0x3EF68B: lld::freeArena() (Memory.cpp:21)<br>==5467==    by 0x4B3D41: lld::elf::link(llvm::ArrayRef<<wbr>char const*>, bool, llvm::raw_ostream&) (Driver.cpp:101)<br>==5467==    by 0x39FC06: ZigLLDLink (zig_llvm.cpp:840)<br>==5467==    by 0x38DE74: link.resume (link.zig:84)<br>==5467==    by 0x2475EB: Loop_workerRun (loop.zig:511)<br>==5467==    by 0x2495EC: MainFuncs_posixThreadMain (index.zig:2680)<br>==5467==  Block was alloc'd at<br>==5467==    at 0x4C2D1AF: operator new(unsigned long) (in /nix/store/j7sf6f2i9gws7c5mn8j<wbr>yi8wc08ab1zbp-valgrind-3.13.0/<wbr>lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>==5467==    by 0x4CD027: llvm::DenseMap<llvm::CachedHas<wbr>hStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::allocateBuckets(unsigned int) (DenseMap.h:794)<br>==5467==    by 0x524C18: llvm::DenseMap<llvm::CachedHas<wbr>hStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:732)<br>==5467==    by 0x524077: llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:502)<br>==5467==    by 0x522E54: llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::InsertIntoBucketImpl<llvm::<wbr>CachedHashStringRef>(llvm::Cac<wbr>hedHashStringRef const&, llvm::CachedHashStringRef const&, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>*) (DenseMap.h:546)<br>==5467==    by 0x521258: llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::InsertIntoBucket<llvm::Cach<wbr>edHashStringRef, int>(llvm::detail::DenseMapPai<wbr>r<llvm::CachedHashStringRef, int>*, llvm::CachedHashStringRef&&, int&&) (DenseMap.h:512)<br>==5467==    by 0x51DEC9: std::pair<llvm::DenseMapIterat<wbr>or<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int>, false>, bool> llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::try_emplace<int>(llvm::Cach<wbr>edHashStringRef&&, int&&) (DenseMap.h:215)<br>==5467==    by 0x51C52F: llvm::DenseMapBase<llvm::Dense<wbr>Map<llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::Cache<wbr>dHashStringRef>, llvm::detail::DenseMapPair<llv<wbr>m::CachedHashStringRef, int> >::insert(std::pair<llvm::Cach<wbr>edHashStringRef, int>&&) (DenseMap.h:199)<br>==5467==    by 0x516836: lld::elf::SymbolTable::insert(<wbr>llvm::StringRef) (SymbolTable.cpp:225)<br>==5467==    by 0x516A21: lld::elf::SymbolTable::insert(<wbr>llvm::StringRef, unsigned char, unsigned char, bool, lld::elf::InputFile*) (SymbolTable.cpp:260)<br>==5467==    by 0x51B88C: void lld::elf::SymbolTable::addShar<wbr>ed<llvm::object::ELFType<(<wbr>llvm::support::endianness)1, true> >(llvm::StringRef, lld::elf::SharedFile<llvm::obj<wbr>ect::ELFType<(llvm::support::<wbr>endianness)1, true> >&, llvm::object::ELFType<(llvm::s<wbr>upport::endianness)1, true>::Sym const&, unsigned int, unsigned int) (SymbolTable.cpp:483)<br>==5467==    by 0x4E762A: lld::elf::SharedFile<llvm::obj<wbr>ect::ELFType<(llvm::support::<wbr>endianness)1, true> >::parseRest() (InputFiles.cpp:895)<br><br></div></div></div></div>
</blockquote></div><br></div></div></div></div></div></div>
<br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>