<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.<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::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::moveFromOldBuckets(llvm::<wbr>detail::DenseMapPair<llvm::<wbr>CachedHashStringRef, int>*, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>*) (DenseMap.h:375)<br>==5467==    by 0x524C7F: llvm::DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:739)<br>==5467==    by 0x524077: llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:502)<br>==5467==    by 0x522E54: llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::InsertIntoBucketImpl<llvm::<wbr>CachedHashStringRef>(llvm::<wbr>CachedHashStringRef const&, llvm::CachedHashStringRef const&, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>*) (DenseMap.h:546)<br>==5467==    by 0x521258: llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::InsertIntoBucket<llvm::<wbr>CachedHashStringRef, int>(llvm::detail::<wbr>DenseMapPair<llvm::<wbr>CachedHashStringRef, int>*, llvm::CachedHashStringRef&&, int&&) (DenseMap.h:512)<br>==5467==    by 0x51DEC9: std::pair<llvm::<wbr>DenseMapIterator<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>, false>, bool> llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::try_emplace<int>(llvm::<wbr>CachedHashStringRef&&, int&&) (DenseMap.h:215)<br>==5467==    by 0x51C52F: llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::insert(std::pair<llvm::<wbr>CachedHashStringRef, 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::<wbr>addShared<llvm::object::<wbr>ELFType<(llvm::support::<wbr>endianness)1, true> >(llvm::StringRef, lld::elf::SharedFile<llvm::<wbr>object::ELFType<(llvm::<wbr>support::endianness)1, true> >&, llvm::object::ELFType<(llvm::<wbr>support::endianness)1, true>::Sym const&, unsigned int, unsigned int) (SymbolTable.cpp:483)<br>==5467==    by 0x4E762A: lld::elf::SharedFile<llvm::<wbr>object::ELFType<(llvm::<wbr>support::endianness)1, true> >::parseRest() (InputFiles.cpp:895)<br>==5467==    by 0x51F69F: void lld::elf::SymbolTable::<wbr>addFile<llvm::object::ELFType<<wbr>(llvm::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/<wbr>j7sf6f2i9gws7c5mn8jyi8wc08ab1z<wbr>bp-valgrind-3.13.0/lib/<wbr>valgrind/vgpreload_memcheck-<wbr>amd64-linux.so)<br>==5467==    by 0x4C714C: llvm::DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::~DenseMap() (DenseMap.h:681)<br>==5467==    by 0x4C9C7B: lld::elf::SymbolTable::~<wbr>SymbolTable() (SymbolTable.h:36)<br>==5467==    by 0x4C9BF1: llvm::<wbr>SpecificBumpPtrAllocator<lld::<wbr>elf::SymbolTable>::DestroyAll(<wbr>)::{lambda(char*, char*)#1}::operator()(char*, char*) const (Allocator.h:410)<br>==5467==    by 0x4C9D77: llvm::<wbr>SpecificBumpPtrAllocator<lld::<wbr>elf::SymbolTable>::DestroyAll(<wbr>) (Allocator.h:421)<br>==5467==    by 0x4D218F: lld::SpecificAlloc<lld::elf::<wbr>SymbolTable>::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/<wbr>j7sf6f2i9gws7c5mn8jyi8wc08ab1z<wbr>bp-valgrind-3.13.0/lib/<wbr>valgrind/vgpreload_memcheck-<wbr>amd64-linux.so)<br>==5467==    by 0x4CD027: llvm::DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::allocateBuckets(unsigned int) (DenseMap.h:794)<br>==5467==    by 0x524C18: llvm::DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:732)<br>==5467==    by 0x524077: llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::grow(unsigned int) (DenseMap.h:502)<br>==5467==    by 0x522E54: llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::InsertIntoBucketImpl<llvm::<wbr>CachedHashStringRef>(llvm::<wbr>CachedHashStringRef const&, llvm::CachedHashStringRef const&, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>*) (DenseMap.h:546)<br>==5467==    by 0x521258: llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>* llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::InsertIntoBucket<llvm::<wbr>CachedHashStringRef, int>(llvm::detail::<wbr>DenseMapPair<llvm::<wbr>CachedHashStringRef, int>*, llvm::CachedHashStringRef&&, int&&) (DenseMap.h:512)<br>==5467==    by 0x51DEC9: std::pair<llvm::<wbr>DenseMapIterator<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int>, false>, bool> llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::try_emplace<int>(llvm::<wbr>CachedHashStringRef&&, int&&) (DenseMap.h:215)<br>==5467==    by 0x51C52F: llvm::DenseMapBase<llvm::<wbr>DenseMap<llvm::<wbr>CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >, llvm::CachedHashStringRef, int, llvm::DenseMapInfo<llvm::<wbr>CachedHashStringRef>, llvm::detail::DenseMapPair<<wbr>llvm::CachedHashStringRef, int> >::insert(std::pair<llvm::<wbr>CachedHashStringRef, 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::<wbr>addShared<llvm::object::<wbr>ELFType<(llvm::support::<wbr>endianness)1, true> >(llvm::StringRef, lld::elf::SharedFile<llvm::<wbr>object::ELFType<(llvm::<wbr>support::endianness)1, true> >&, llvm::object::ELFType<(llvm::<wbr>support::endianness)1, true>::Sym const&, unsigned int, unsigned int) (SymbolTable.cpp:483)<br>==5467==    by 0x4E762A: lld::elf::SharedFile<llvm::<wbr>object::ELFType<(llvm::<wbr>support::endianness)1, true> >::parseRest() (InputFiles.cpp:895)<br><br></div></div></div></div>
</blockquote></div><br></div></div></div></div>