Issue 120559
Summary [lld][MachO] llvm::upper_bound called on not correctly sorted input
Labels
Assignees
Reporter karka228
    When building llvm-project with -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON with a recent libstdc++ (e.g. from gcc 13.3.0) the testcases:
```
  lld :: MachO/local-alias-to-weak.s
  lld :: MachO/symtab.s
  lld :: MachO/weak-definition-gc.s
```
fail with the message:

```
.../include/c++/13.3.0/bits/stl_algo.h:2100:
In function:
 _ForwardIterator std::upper_bound(_ForwardIterator, _ForwardIterator, 
 const _Tp &, _Compare) [_ForwardIterator = lld::macho::Defined **, _Tp = 
 unsigned long, _Compare = (lambda at 
 ../../lld/MachO/SymbolTable.cpp:77:15)]

Error: elements in iterator range [first, last) are not partitioned by the 
predicate __comp and value __val.

Objects involved in the operation:
    iterator "first" @ 0x7ffc2bfd9af8 {
    }
    iterator "last" @ 0x7ffc2bfd9af0 {
 }
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /repo/llvm-project/llvm/build/bin/ld64.lld -arch x86_64 -platform_version macos 11.0 11.0 -syslibroot /repo/llvm-project/lld/test/MachO/Inputs/MacOSX.sdk -lSystem -fatal_warnings -lSystem -dylib /repo/llvm-project/llvm/build/tools/lld/test/MachO/Output/local-alias-to-weak.s.tmp/no-subsections.o /repo/llvm-project/llvm/build/tools/lld/test/MachO/Output/local-alias-to-weak.s.tmp/local-then-weak.o -o /repo/llvm-project/llvm/build/tools/lld/test/MachO/Output/local-alias-to-weak.s.tmp/nosub-sub
 #0 0x000055af1d9c8706 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x4d89706)
 #1 0x000055af1d9c60ce llvm::sys::RunSignalHandlers() (/repo/llvm-project/llvm/build/bin/ld64.lld+0x4d870ce)
 #2 0x000055af1d9c8f79 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007efebf8c7cf0 __restore_rt (/lib64/libpthread.so.0+0x12cf0)
 #4 0x00007efebe980acf raise (/lib64/libc.so.6+0x4eacf)
 #5 0x00007efebe953ea5 abort (/lib64/libc.so.6+0x21ea5)
 #6 0x000055af223cfa43 (/repo/llvm-project/llvm/build/bin/ld64.lld+0x9790a43)
 #7 0x000055af1df2aab1 transplantSymbolsAtOffset(lld::macho::InputSection*, lld::macho::InputSection*, lld::macho::Defined*, unsigned long, unsigned long) SymbolTable.cpp:0:0
 #8 0x000055af1df29519 lld::macho::SymbolTable::addDefined(llvm::StringRef, lld::macho::InputFile*, lld::macho::InputSection*, unsigned long, unsigned long, bool, bool, bool, bool, bool) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x52ea519)
 #9 0x000055af1de8a33e void lld::macho::ObjFile::parseSymbols<lld::macho::LP64>(llvm::ArrayRef<lld::macho::LP64::section>, llvm::ArrayRef<lld::macho::LP64::nlist>, char const*, bool) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x524b33e)
#10 0x000055af1de78214 void lld::macho::ObjFile::parse<lld::macho::LP64>() (/repo/llvm-project/llvm/build/bin/ld64.lld+0x5239214)
#11 0x000055af1de77cc8 lld::macho::ObjFile::ObjFile(llvm::MemoryBufferRef, unsigned int, llvm::StringRef, bool, bool, bool, bool) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x5238cc8)
#12 0x000055af1de492dc lld::macho::ObjFile* lld::make<lld::macho::ObjFile, llvm::MemoryBufferRef&, unsigned int, char const (&) [1], bool&>(llvm::MemoryBufferRef&, unsigned int&&, char const (&) [1], bool&) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x520a2dc)
#13 0x000055af1de43090 addFile(llvm::StringRef, LoadType, bool, bool, bool, bool) Driver.cpp:0:0
#14 0x000055af1de40cdd lld::macho::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x5201cdd)
#15 0x000055af1d9cafbe lld::unsafeLldMain(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, llvm::ArrayRef<lld::DriverDef>, bool) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x4d8bfbe)
#16 0x000055af1d8f6f1b lld_main(int, char**, llvm::ToolContext const&) (/repo/llvm-project/llvm/build/bin/ld64.lld+0x4cb7f1b)
#17 0x000055af1d8f76a6 main (/repo/llvm-project/llvm/build/bin/ld64.lld+0x4cb86a6)
#18 0x00007efebe96cd85 __libc_start_main (/lib64/libc.so.6+0x3ad85)
#19 0x000055af1d8f6cae _start (/repo/llvm-project/llvm/build/bin/ld64.lld+0x4cb7cae)
Aborted (core dumped)
```

The reason for this is that the requirement for calling llvm::upper_bound (std::upper_bound) in function transplantSymbolsAtOffset() in file lld/MachO/SymbolTable.cpp is not fulfilled. The input to std::upper_bound needs sorted vector because it implements binary search to find the value.

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to