[PATCH] D117976: [SmallVector] Optimize move assignment operator for N==0 case

Nathan Lanza via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 14:57:18 PDT 2022


lanza added a comment.
Herald added a subscriber: StephenFan.
Herald added a project: All.

@maskray I haven't quite figured why yet, but I'm hitting a runtime assert failure due to this diff in our internal CI builds. I'll try to reduce this, but it's failing on our internal codebase so I can't share right away. But, to summarize:

  (gdb) bt
  #0  __pthread_kill_internal (signo=6, threadid=<optimized out>) at third-party2/glibc/2.34/src/glibc-2.34/nptl/pthread_kill.c:45
  #1  __GI___pthread_kill (threadid=<optimized out>, signo=6) at third-party2/glibc/2.34/src/glibc-2.34/nptl/pthread_kill.c:62
  #2  0x00007ffff7a6b4ed in __GI_raise (sig=6) at third-party2/glibc/2.34/src/glibc-2.34/signal/../sysdeps/posix/raise.c:26
  #3  0x00007ffff7a53433 in __GI_abort () at third-party2/glibc/2.34/src/glibc-2.34/stdlib/abort.c:79
  #4  0x00007ffff7a62c28 in __assert_fail_base (fmt=0x7ffff7c091d8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x5555561efe21 "N <= capacity()", file=0x5555560be0c1 "/data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallVector.h", line=81, function=<optimized out>) at third-party2/glibc/2.34/src/glibc-2.34/assert/assert.c:92
  #5  0x00007ffff7a62c93 in __GI___assert_fail (assertion=0x5555561efe21 "N <= capacity()", file=0x5555560be0c1 "/data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallVector.h", line=81, function=0x555555e58ffb "void llvm::SmallVectorBase<unsigned long>::set_size(size_t) [Size_T = unsigned long]") at third-party2/glibc/2.34/src/glibc-2.34/assert/assert.c:101
  #6  0x00005555578f9bc2 in llvm::SmallVectorBase<unsigned long>::set_size (this=0x55555a6b6798, N=14) at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallVector.h:81
  #7  llvm::SmallVectorImpl<char>::append<char const*, void> (this=0x55555a6b6798, in_start=0x5555564aea8f "lto.tmp", in_end=0x5555564aea96 "") at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallVector.h:672
  #8  0x0000555557a93032 in llvm::SmallVectorImpl<char>::assign<char const*, void> (this=0x55555a6b6798, in_start=0x11816b <error: Cannot access memory at address 0x11816b>, in_end=<optimized out>) at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallVector.h:714
  #9  llvm::SmallString<0u>::assign (this=0x55555a6b6798, RHS="") at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallString.h:52
  #10 llvm::SmallString<0u>::operator= (this=0x55555a6b6798, RHS="") at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/SmallString.h:278
  #11 lld::toString[abi:cxx11](lld::elf::InputFile const*) (f=0x55555a6b6720) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/InputFiles.cpp:55
  #12 0x0000555557ad3fec in lld::elf::InputSectionBase::getLocation[abi:cxx11](unsigned long) (this=0x55555af734a0, this at entry=0x7fffffff4a58, offset=offset at entry=0) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/InputSection.cpp:251
  #13 0x0000555557ae0f5d in lld::elf::InputSection::relocateNonAlloc<llvm::object::ELFType<(llvm::support::endianness)1, false>, llvm::object::Elf_Rel_Impl<llvm::object::ELFType<(llvm::support::endianness)1, false>, false> > (this=this at entry=0x55555af734a0, buf=buf at entry=0x7fffe5ebec6c "", rels=...) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/InputSection.cpp:910
  #14 0x0000555557ad9066 in lld::elf::InputSectionBase::relocate<llvm::object::ELFType<(llvm::support::endianness)1, false> > (this=0x55555af734a0, buf=0x7fffe5ebec6c "", bufEnd=<optimized out>) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/InputSection.cpp:973
  #15 0x0000555557b180ad in lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::support::endianness)1, false> >(unsigned char*)::{lambda(unsigned long)#2}::operator()(unsigned long) const (this=0x7fffffff4c58, i=3) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/OutputSections.cpp:434
  #16 0x00005555579c66ab in llvm::function_ref<void (unsigned long)>::operator()(unsigned long) const (this=0x7fffffff4b50, params=3) at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68
  #17 llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>) (Begin=3, Begin at entry=0, End=End at entry=4, Fn=...) at /data/users/lanza/toolchain-15.x/external/llvm-project/llvm/lib/Support/Parallel.cpp:201
  #18 0x0000555557b1190d in lld::elf::OutputSection::writeTo<llvm::object::ELFType<(llvm::support::endianness)1, false> > (this=0x55555afc0078, buf=<optimized out>) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/OutputSections.cpp:429
  #19 0x0000555557bcb296 in (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, false> >::writeSections (this=<optimized out>) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/Writer.cpp:2920
  #20 (anonymous namespace)::Writer<llvm::object::ELFType<(llvm::support::endianness)1, false> >::run (this=0x7fffffff4df0) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/Writer.cpp:598
  #21 lld::elf::writeResult<llvm::object::ELFType<(llvm::support::endianness)1, false> > () at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/Writer.cpp:99
  #22 0x0000555557a5ad05 in lld::elf::LinkerDriver::link (this=this at entry=0x55555a5664e0, args=...) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/Driver.cpp:2843
  #23 0x0000555557a4eb2c in lld::elf::LinkerDriver::linkerMain (this=0x55555a5664e0, argsArr=...) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/Driver.cpp:596
  #24 0x0000555557a4da0b in lld::elf::link (args=llvm::ArrayRef of length 1086 = {...}, stdoutOS=..., stderrOS=..., exitEarly=<optimized out>, disableOutput=<optimized out>) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/ELF/Driver.cpp:128
  #25 0x00005555578f5532 in lldMain (argc=argc at entry=1086, argv=argv at entry=0x7fffffff5f58, stdoutOS=..., stderrOS=..., exitEarly=true) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/tools/lld/lld.cpp:1
  64
  #26 0x00005555578f4e0a in main (argc=1086, argv=0x7fffffff5f58) at /data/users/lanza/toolchain-15.x/external/llvm-project/lld/tools/lld/lld.cpp:226

We have an `InputFile` with `toStringCache.emtpy()` being true and `f->getName()` yielding `lto.tmp`. `f->toStringCache = f->getName()` ends up causing `f->toStringCache` to be `garbagelto.tmp` with size = 7 and capacity = 7 and then `set_size(7 + 7)` called which we crash on `assert(N <= capacity()` where `N` is `14`.

This is while linking an armv7 so with FullLTO.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D117976/new/

https://reviews.llvm.org/D117976



More information about the llvm-commits mailing list