<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/163755>163755</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            "comparator is not a valid strict-weak ordering" in lld pdb writing codepath w/ libc++ debug hardening mode
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            lld:COFF
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          zmodem
      </td>
    </tr>
</table>

<pre>
    This was raised in https://github.com/llvm/llvm-project/pull/156250#issuecomment-3403845361 but I don't think it's related to the new lldb test, but rather to pdb writing in general.

Local repro on Linux with today's head (e764b6df4b8fe73bce53673565a9e9a8d0641527).

Build clang and libc++ (stage0)

```
$ cmake -GNinja -Bstage0 -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang -DLLVM_ENABLE_RUNTIMES='compiler-rt;libcxx;libcxxabi;libunwind' -DLLVM_TARGETS_TO_BUILD=X86 -DLIBCXX_HARDENING_MODE=debug llvm/
$ ninja -C stage0
```

Use that to build lld with libc++ in debug hardening mode (stage1)

```
$ CC=$PWD/stage0/bin/clang CXX=$PWD/stage0/bin/clang++ CXXFLAGS=-stdlib=libc++ cmake -GNinja -Bstage1 -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS=lld -DLLVM_TARGETS_TO_BUILD=X86 llvm/
$ mkdir -p stage1/lib && cp stage0/lib/x86_64-unknown-linux-gnu/*.so* stage1/lib/
$ ninja -C stage1 lld
```

Use that to compile and link the test file:

```
$ stage0/bin/clang-cl --target=x86_64-windows-msvc -Od -Z7 -std:c++20 -c /Fo/tmp/a.obj lldb/test/Shell/SymbolFile/NativePDB/simple-types.cpp
$ stage1/bin/lld-link -debug:full -nodefaultlib -entry:main /tmp/a.obj -out:/tmp/a.exe -pdb:/tmp/a.pdb
/work/llvm-project/stage0/bin/../include/c++/v1/__debug_utils/strict_weak_ordering_check.h:50: libc++ Hardening assertion !__comp(*(__first + __a), *(__first + __b)) failed: Your comparator is not a valid strict-weak ordering
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
/work/llvm-project/stage0/bin/../include/c++/v1/__debug_utils/strict_weak_ordering_check.h:50: libc++ Hardening assertion !__comp(*(__first + __a), *(__first + __b)) failed: Your comparator is not a valid strict-weak ordering
Aborted (core dumped)
```

---

Stack trace:

```
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at ./nptl/pthread_kill.c:44
#1  0x00007ffff79609ff in __pthread_kill_internal (threadid=<optimized out>, signo=6) at ./nptl/pthread_kill.c:89
#2 0x00007ffff790bcc2 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3  0x00007ffff78f44ac in __GI_abort () at ./stdlib/abort.c:73
#4  0x00007ffff7bb742d in std::__1::__libcpp_verbose_abort(char const*, ...) () from /work/llvm-project/stage1/bin/../lib/libc++.so.1
#5  0x0000555559f88c73 in std::__1::__check_strict_weak_ordering_sorted[abi:dn220000]<llvm::pdb::PSHashRecord*, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}>(llvm::pdb::PSHashRecord*, llvm::pdb::PSHashRecord*, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}&) (__first=0x55555d8f0200, __last=0x55555d8f0208, __comp=...)
 at /work/llvm-project/stage0/bin/../include/c++/v1/__debug_utils/strict_weak_ordering_check.h:49
#6 0x0000555559f88a6d in std::__1::__sort_impl[abi:dn220000]<std::__1::_ClassicAlgPolicy, std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}>(std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}&) (__first=..., __last=..., 
    __comp=...) at /work/llvm-project/stage0/bin/../include/c++/v1/__algorithm/sort.h:939
#7 0x0000555559f889c9 in std::__1::sort[abi:dn220000]<std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}>(std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}) (__first=..., __last=..., __comp=...)
    at /work/llvm-project/stage0/bin/../include/c++/v1/__algorithm/sort.h:945
#8 0x0000555559f8897d in llvm::sort<std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}>(std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, std::__1::__wrap_iter<llvm::pdb::PSHashRecord*>, llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const::{lambda(llvm::pdb::PSHashRecord const&, llvm::pdb::PSHashRecord const&)#1}) (Start=..., End=..., Comp=...)
    at /work/llvm-project/llvm/include/llvm/ADT/STLExtras.h:1644
#9 0x0000555559f88848 in llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1::operator()(unsigned long) const (
    this=0x7ffffffefb30, I=226) at /work/llvm-project/llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp:255
#10 0x0000555559f8873d in llvm::function_ref<void(unsigned long)>::callback_fn<llvm::pdb::GSIHashStreamBuilder::finalizeBuckets(unsigned int, llvm::MutableArrayRef<llvm::pdb::BulkPublic>)::$_1> (callable=140737488288560, params=226) at /work/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46
#11 0x000055555aaa73d1 in llvm::function_ref<void(unsigned long)>::operator() (this=0x7ffffffefac0, params=226)
    at /work/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69
#12 0x000055555aaa6fa2 in llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0::operator()() const (this=0x55555d8f0bd8)
    at /work/llvm-project/llvm/lib/Support/Parallel.cpp:302
#13 0x000055555aaa6f55 in std::__1::__invoke[abi:dn220000]<llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0&>(llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0&) (__args=...) at /work/llvm-project/stage0/bin/../include/c++/v1/__type_traits/invoke.h:90
#14 0x000055555aaa6f35 in std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:dn220000]<llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0&>(llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0&) (__args=...)
    at /work/llvm-project/stage0/bin/../include/c++/v1/__type_traits/invoke.h:350
#15 0x000055555aaa6f15 in std::__1::__invoke_r[abi:dn220000]<void, llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0&>(llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)>)::$_0&) (__args=...) at /work/llvm-project/stage0/bin/../include/c++/v1/__type_traits/invoke.h:356
#16 0x000055555aaa6ea9 in std::__1::__function::__func<llvm::parallelFor(unsigned long, unsigned long, llvm::function_ref<void(unsigned long)>)::$_0, void()>::operator() (
    this=0x55555d8f0bd0) at /work/llvm-project/stage0/bin/../include/c++/v1/__functional/function.h:172
#17 0x0000555555e8c59e in std::__1::__function::__value_func<void ()>::operator()[abi:dn220000]() const (this=0x55555d8f0bd0)
    at /work/llvm-project/stage0/bin/../include/c++/v1/__functional/function.h:273
#18 0x0000555555e8b5c5 in std::__1::function<void()>::operator() (this=0x55555d8f0bd0) at /work/llvm-project/stage0/bin/../include/c++/v1/__functional/function.h:754
#19 0x000055555aaa6ccd in llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0::operator()() const (this=0x55555d8f0bd0)
    at /work/llvm-project/llvm/lib/Support/Parallel.cpp:275
#20 0x000055555aaa6ca5 in std::__1::__invoke[abi:dn220000]<llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0&>(llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0&) (__args=...) at /work/llvm-project/stage0/bin/../include/c++/v1/__type_traits/invoke.h:90
#21 0x000055555aaa6c85 in std::__1::__invoke_void_return_wrapper<void, true>::__call[abi:dn220000]<llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0&>(llvm::parallel::TaskGroup::spawn(std::__1::function<void ()>)::$_0&) (__args=...) at /work/llvm-project/stage0/bin/../include/c++/v1/__type_traits/invoke.h:350
```

So I suppose this is https://github.com/llvm/llvm-project/blob/e764b6df4b8fe73bce53673565a9e9a8d0641527/llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp#L242-L255
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsW11zo7jS_jXKjQoXiO-LXOAPMnnfzEwqzp6T3RtKgLC1liVKEvnYX39KAie2Y0-S3cxmz6lsbdUYBFL383Q_3QiClaILTsgpCMcgnJ7gTi-FPP1jLWqyPilF_XB6vaQK3mEFJaaK1JByuNS6VcDPAMoByhdUL7tyVIk1QDljt5t_nFaK30mlAcrbjjGAci-MUOgC5FOlOlKJ9Zpw7fiB6ydB6EceLDsNz2EtOECxhnpJ-QpSDVCsoCQMa1JDLaBeEsjJHWSsLqEmSgM0sbdKrJdEmkvauoR3kmrKF8bgBeFEYjYCbgbc7EJUmEFJWimg4PCC8u4e3lG9hFrU-MEutyS4hgAlJI6CMqqboEwaEvtlRUI_iv0wCnFKUpzUbhR4IYoBSofZxx1lNawY5guIeQ0ZLSuAxgCNzXxK4wVxAUr7i0HkDv-7GUABrNZ4RaBz9o3y3zF0xv3l0JlOvmb_PyvGv5xfTIvrXy9nwJ9eEUawItCZXlz862sx-5aNL2bF5dX3_5tNrufAn_Y27A5f_fLt-vzrzAwDFFdi3VJGpCM18MfG0vv7xx-4pP3vjt9RXgMUb-a6zq7OZtfz4vp7bxHwpzdJZEbPx5Obm-JLdjWdfTv_dlZ8_T41ptak7BZwiI3BVd67OIEDJHtguNkvikC9xNrwWVpQGat7nrYwpRz2sy-xrAk3hJvgfcTaO4r1ZGJBCC7_PQUo3xCTl5QDlPfYTW5uXrpmMGNyc5NfZGcGV0fpmtES-NMtMw8S6x0mdmr9OUqrQeHHROwCvV7VVEKnhRs8ckZLCFAEUASrFj56ZYxG-X0SFVHgdHzFxR13mMkOZ8E7m-zZSAmAsp2pjlHqGb5-TOsQf0Oe8JVNbZPRsKGMGIU5yNwhHpyKQcfRWC6IBv508MIErrhTzlrdVtD5XkPntxgagoCfDdQgFzoVBCjPBUC5XrcA5Xgkyt-tvphTVmHy-ZJYEZs_rEvBcmMfyr9hTW_J5XRsooOuW0Yc_dASNaradttY79FYxmrHuurYsAV-1nSMQYeLmjS4Y9qQ4xCu5QPwszWmHO6Z5YhO9-K7OUvuCXTautw9a04YE_I7IVfPNXkPxNEIoJzyinW1cWwAB6D81theFNbaotOUKXuzpJUu7gheFULWRFK-KKolqVajJfCz0AV-tp2lXx6TEytFpKbCuOUVhYkAgBKAMoCSomioVBqaO4oCm8xFE3horLRjKWwwZcSQCX8VnbTxhCXWQkKqIBcaYniLGa1hb7BjDIYbg4GbXV7MsvkMqq5cU3OxSTxJWiFteL65ztm6ZvCxET2gaYO6klgtYYmrlZa4IsO40rKrDBjKLGcrUt1V_R1ltzAVZa5xtYJ1t26t9IlOQ2UjEHK8JsrWKK46SeCD6OAS3xKb_k5_Ef2DSCORDwady-z6CxQSKqLtCoTfUim4KcLwFksIIteqyvzXr-PvF-e_za4KcwuIXFtSBeUWFVOQ0yE3P4PrB8GVlUKalgWgpBKSWBJJPdSjXVF0HKf_0dNtY-SI_PkuhEXR6qUkuC5WlLHCCo-hEQ--J_0orU318iei1XRN_yA1tNIxM46bvk8Af9r_G7iD4kwjM8hFoe3Nw4-nYdO6QKyhIZS32gjitimjCvhZEPSGehC6967runHTNE2cRm7aNCYa983nmkiO2dsMj15hSZL2lqBdQ9yyqlBvyNl5Yfta2y_QRQ_ILhz9KmYZ9aBq0poQbYWi9wDl9l67FIr6pfxdp5MmCHD1uBY2IQFtTD4aP7QLKLeDdrLY7ycLdicryzhAtgPvKxjws6LwNj9MRrRtcUtkKRTplzKht8QmdrkpYpkBcGR8STdGNFKs4Y_z2NvN497Yp_wbKTHyenvDjb2h-S9tkqSK_WP22owuDia7sokDwrHtQbOaI2RmBaEJCiu9do6h5PnZ5fwLVssrUglZD14euOpsfm4um2tJ8Nq26UT2Iw3l2GjluKtWRCuAko7bByMDtt6d7muncclIJiV-uCLNYYPGHVtddiWjlY3atD8LULBxX7TESknPwvaCTJimMh0o6--LxwyvyxoDlLzg_Ybp6AgGR65NTbqCeGqtfWmN4wh_8vBePNgD-FSajPTe26yqk8ZFrmvmLQqGnw8l_ZAtfv60z3bgZkZuPqReB4MIR_vagKOjWmYEwJa1Ixpw4J4Jw0rRKmOLS8Fo9WBrxYGp7yRuC6pNyL1GSvqi8xnFf15N3o2ETzb_cZpk1WVLiIZjIzcQ7ovQeyoQZgshqV6ahzAjFlZpUn-QmnhfatIqPSw15t7Xa8xnuH2Kxyebf048XqccB_oWCH--cARhLxzJM-GIbY_y5LAVjE9x-Ohw-hSH_yU2e3GYayy3pGDG66eDyRtVYdiffRKC4UQ2vQYon19fzO61xMpmvxdtdqzS_fRPgmQ3_f-babVbPj10ekmVfW60G0tNQ5rSt4-U58CfIhS91K1ttr_tVpB9X3XOGwFQ3r8K6V-LAJSfzc93ELLvRfwMhYPeeu4-4rG_J7hNx-0WeSEtPreC1gc8NMjYyyvMWImrVdHww2j-U4ib2X1hzJiZB_hTL3BjPw6SBCVJGFkyWizxWr2JkeMBnw84YrYV-sGwa-l52zxgjGO_9v4SD7sx2W_t7sccrg65-R7ZfdDZaHg68NCes1GD0V6aY4kZIyy3Duw5OYHPTvwQJngEp-2AcI9k8k7yPiL4uNtT1smbEOsTdt61rd0czi8HP4e89F00QOQ_gygMj23WUH4rVuTl3dq_H1MUPdvQ_BAjNs0vlgv1Ux6H9UNLCi0xNbKV94T0ne3w0sgLnhHqv0BoYVwsJNGd5LYbam0v1Cf-BGrZkcdsLwqjZJ8h8MYQeP_Hm6OB4IebSAifRYL3UiTII8xuYuGjwf3nMvw3cbsp49E-twQf2fgqio2v28c_L1tfh-IEDtf-uJXY72K36qH7zqA3j50EQPnmoH9siDfFcme7MSRJFabktajfYtaRDfabeDvu_cFEfEWb4P4UtTkODtq8wvaSPXDKsDoiN0_QTF4VBR9LfxxuPnNI95OuqurD7WR_dI3V6kyKrh12lFp8xw_uZuwBshUZ79I6vjImXtc6onh4pEPuMzjwe7WOPwm_4xXk5y348S0h2n_mi6rk41rCT2rfr8nb_bZsLuA5VCZv7Ze3VEGq3v5pY8mEyf_Xfw__1_aIkH-BAuRcoDA8qU_9OvVTfEJOvThyIy_00vBkeYrqEnuYEDfB2EsIdmsvLqu0iuomKiOvPKGnyEWh53qR5wWRH45K1y0rlyQhKVNSIRcELlljykbG1pGQixP7BeepF_lxGJ4wXBKm7N9GIMSYCYnJ9zwHCIFweiJPLURlt1AgcBlVWj3No6lm5BQg9MavBtGwEVHv_AlDJWrSYr2EdwDl258-Hvr0_aST7PTPf7o6-H57iv4TAAD__4FWOh8">