[llvm-dev] are the LLD libraries thread safe?

Andrew Kelley via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 24 18:10:16 PDT 2018


E.g. Is it intended to be allowed to call lld::elf::link in 2 different
threads at the same time?

Follows is an example Valgrind error I ran into when doing the above.

I'll try putting a global resource lock on invoking LLD and see if it
solves the problem.

==5467== Invalid write of size 8
==5467==    at 0x525509:
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::moveFromOldBuckets(llvm::detail::DenseMapPair<llvm::CachedHashStringRef,
int>*, llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*)
(DenseMap.h:375)
==5467==    by 0x524C7F: llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >::grow(unsigned
int) (DenseMap.h:739)
==5467==    by 0x524077:
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >::grow(unsigned
int) (DenseMap.h:502)
==5467==    by 0x522E54:
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::InsertIntoBucketImpl<llvm::CachedHashStringRef>(llvm::CachedHashStringRef
const&, llvm::CachedHashStringRef const&,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*)
(DenseMap.h:546)
==5467==    by 0x521258:
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::InsertIntoBucket<llvm::CachedHashStringRef,
int>(llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*,
llvm::CachedHashStringRef&&, int&&) (DenseMap.h:512)
==5467==    by 0x51DEC9:
std::pair<llvm::DenseMapIterator<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>, false>, bool>
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::try_emplace<int>(llvm::CachedHashStringRef&&, int&&) (DenseMap.h:215)
==5467==    by 0x51C52F:
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::insert(std::pair<llvm::CachedHashStringRef, int>&&) (DenseMap.h:199)
==5467==    by 0x516836: lld::elf::SymbolTable::insert(llvm::StringRef)
(SymbolTable.cpp:225)
==5467==    by 0x516A21: lld::elf::SymbolTable::insert(llvm::StringRef,
unsigned char, unsigned char, bool, lld::elf::InputFile*)
(SymbolTable.cpp:260)
==5467==    by 0x51B88C: void
lld::elf::SymbolTable::addShared<llvm::object::ELFType<(llvm::support::endianness)1,
true> >(llvm::StringRef,
lld::elf::SharedFile<llvm::object::ELFType<(llvm::support::endianness)1,
true> >&, llvm::object::ELFType<(llvm::support::endianness)1, true>::Sym
const&, unsigned int, unsigned int) (SymbolTable.cpp:483)
==5467==    by 0x4E762A:
lld::elf::SharedFile<llvm::object::ELFType<(llvm::support::endianness)1,
true> >::parseRest() (InputFiles.cpp:895)
==5467==    by 0x51F69F: void
lld::elf::SymbolTable::addFile<llvm::object::ELFType<(llvm::support::endianness)1,
true> >(lld::elf::InputFile*) (SymbolTable.cpp:99)
==5467==  Address 0xc6c7e80 is 53,568 bytes inside a block of size 98,304
free'd
==5467==    at 0x4C2E26B: operator delete(void*) (in
/nix/store/j7sf6f2i9gws7c5mn8jyi8wc08ab1zbp-valgrind-3.13.0/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5467==    by 0x4C714C: llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >::~DenseMap()
(DenseMap.h:681)
==5467==    by 0x4C9C7B: lld::elf::SymbolTable::~SymbolTable()
(SymbolTable.h:36)
==5467==    by 0x4C9BF1:
llvm::SpecificBumpPtrAllocator<lld::elf::SymbolTable>::DestroyAll()::{lambda(char*,
char*)#1}::operator()(char*, char*) const (Allocator.h:410)
==5467==    by 0x4C9D77:
llvm::SpecificBumpPtrAllocator<lld::elf::SymbolTable>::DestroyAll()
(Allocator.h:421)
==5467==    by 0x4D218F: lld::SpecificAlloc<lld::elf::SymbolTable>::reset()
(Memory.h:47)
==5467==    by 0x3EF68B: lld::freeArena() (Memory.cpp:21)
==5467==    by 0x4B3D41: lld::elf::link(llvm::ArrayRef<char const*>, bool,
llvm::raw_ostream&) (Driver.cpp:101)
==5467==    by 0x39FC06: ZigLLDLink (zig_llvm.cpp:840)
==5467==    by 0x38DE74: link.resume (link.zig:84)
==5467==    by 0x2475EB: Loop_workerRun (loop.zig:511)
==5467==    by 0x2495EC: MainFuncs_posixThreadMain (index.zig:2680)
==5467==  Block was alloc'd at
==5467==    at 0x4C2D1AF: operator new(unsigned long) (in
/nix/store/j7sf6f2i9gws7c5mn8jyi8wc08ab1zbp-valgrind-3.13.0/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5467==    by 0x4CD027: llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::allocateBuckets(unsigned int) (DenseMap.h:794)
==5467==    by 0x524C18: llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >::grow(unsigned
int) (DenseMap.h:732)
==5467==    by 0x524077:
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >::grow(unsigned
int) (DenseMap.h:502)
==5467==    by 0x522E54:
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::InsertIntoBucketImpl<llvm::CachedHashStringRef>(llvm::CachedHashStringRef
const&, llvm::CachedHashStringRef const&,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*)
(DenseMap.h:546)
==5467==    by 0x521258:
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::InsertIntoBucket<llvm::CachedHashStringRef,
int>(llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>*,
llvm::CachedHashStringRef&&, int&&) (DenseMap.h:512)
==5467==    by 0x51DEC9:
std::pair<llvm::DenseMapIterator<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>, false>, bool>
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::try_emplace<int>(llvm::CachedHashStringRef&&, int&&) (DenseMap.h:215)
==5467==    by 0x51C52F:
llvm::DenseMapBase<llvm::DenseMap<llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int> >,
llvm::CachedHashStringRef, int,
llvm::DenseMapInfo<llvm::CachedHashStringRef>,
llvm::detail::DenseMapPair<llvm::CachedHashStringRef, int>
>::insert(std::pair<llvm::CachedHashStringRef, int>&&) (DenseMap.h:199)
==5467==    by 0x516836: lld::elf::SymbolTable::insert(llvm::StringRef)
(SymbolTable.cpp:225)
==5467==    by 0x516A21: lld::elf::SymbolTable::insert(llvm::StringRef,
unsigned char, unsigned char, bool, lld::elf::InputFile*)
(SymbolTable.cpp:260)
==5467==    by 0x51B88C: void
lld::elf::SymbolTable::addShared<llvm::object::ELFType<(llvm::support::endianness)1,
true> >(llvm::StringRef,
lld::elf::SharedFile<llvm::object::ELFType<(llvm::support::endianness)1,
true> >&, llvm::object::ELFType<(llvm::support::endianness)1, true>::Sym
const&, unsigned int, unsigned int) (SymbolTable.cpp:483)
==5467==    by 0x4E762A:
lld::elf::SharedFile<llvm::object::ELFType<(llvm::support::endianness)1,
true> >::parseRest() (InputFiles.cpp:895)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180724/60b97235/attachment.html>


More information about the llvm-dev mailing list