build: Use clang-cl to build on Windows natively #31507

pull hebasto wants to merge 14 commits into bitcoin:master from hebasto:241216-clang-cl changing 22 files +222 −241
  1. hebasto commented at 10:58 AM on December 16, 2024: member

    Building on Windows using Clang instead of the MS compiler may be beneficial, considering the issues with the latter, as outlined in #31456:

    • non-optimized codegen: [build: remove need to test for endianness #29852 (comment)](/github-metadata-backup-bitcoin-bitcoin/29852/#issuecomment-2049803970)

    • compile failure: [MSVC 17.12.0 internal compiler error #31303](https://github.com/bitcoin/bitcoin/issues/31303)

    • ~legal, but brittle stdlib: [util: Drop boost posix_time in ParseISO8601DateTime #31391 (comment)](/github-metadata-backup-bitcoin-bitcoin/31391/#issuecomment-2510762011)~

    • unspecified issue: [refactor: Check translatable format strings at compile-time #31061 (comment)](/github-metadata-backup-bitcoin-bitcoin/31061/#issuecomment-2531244463)

    Additionally, MSVC does not support inline assembly on the ARM and x64 processors.

    So this PR:

    1. Closes #31456 (and addresses #14118).
    2. Could be an alternative to #24773.
    3. Closes #36153.

    Additionally, clang-cl:

    1. Produces binaries with better performance. For example:
    MSVC, block/s clang-cl, block/s benchmark

    | 7.40 | 11.52 | ConnectBlockAllEcdsa | 7.32 | 11.81 | ConnectBlockAllSchnorr | 7.38 | 11.45 | ConnectBlockMixedEcdsaSchnorr | 91.86 | 143.12 | DeserializeAndCheckBlockTest | 121.46 | 189.04 | DeserializeBlockTest

    1. Builds faster on the CI:
  2. hebasto added the label Windows on Dec 16, 2024
  3. hebasto added the label Build system on Dec 16, 2024
  4. DrahtBot commented at 10:58 AM on December 16, 2024: contributor

    <!--e57a25ab6845829454e8d69fc972939a-->

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    <!--006a51241073e994b41acfe9ec718e94-->

    External sites

    <!--021abf342d371248e50ceaed478a90ca-->

    Reviews

    See the guideline and AI policy for information on the review process.

    Type Reviewers
    ACK hodlinator
    Concept ACK fanquake, sedited
    Stale ACK maflcko

    If your review is incorrectly listed, please copy-paste <code>&lt;!--meta-tag:bot-skip--&gt;</code> into the comment that the bot should ignore.

    <!--174a7506f384e20aa4161008e828411d-->

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #36623 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36623.svg"></sub> (build: enable -Wunreachable-code-aggressive by fanquake)
    • #36612 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36612.svg"></sub> (doc: Merge all BSD build docs back into build-unix.md by maflcko)
    • #36554 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36554.svg"></sub> (cmake: Reject warnings in check_cxx_source_compiles_with_flags(), use -msse4.1 for SHA-NI by hebasto)
    • #36268 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36268.svg"></sub> (refactor: prune unused semi-colons by fanquake)
    • #36167 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36167.svg"></sub> ([RFC] Enable -Wunused by fanquake)
    • #36033 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/36033.svg"></sub> ([wip,nomerge,rfc] build: Require C++23 compiler by maflcko)
    • #35932 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/35932.svg"></sub> (ipc: make ipc::disconnectIncoming wait for in-progress calls to complete by ryanofsky)
    • #35911 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/35911.svg"></sub> (Warn on and add missing [[noreturn]] by fanquake)
    • #32387 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/32387.svg"></sub> (ipc: add windows support by ryanofsky)
    • #29409 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/29409.svg"></sub> (ipc: Expose Chain interface to IPC clients by ryanofsky)
    • #10102 <sub><img src="https://drahtbot.space/ack_count/bitcoin/bitcoin/10102.svg"></sub> (Multiprocess bitcoin by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

    <!--5faf32d7da4f0f540f40219e4f7537a3-->

  5. DrahtBot added the label CI failed on Dec 16, 2024
  6. DrahtBot commented at 12:00 PM on December 16, 2024: contributor

    <!--85328a0da195eb286784d51f73fa0af9-->

    🚧 At least one of the CI tasks failed. <sub>Debug: https://github.com/bitcoin/bitcoin/runs/34465651629</sub>

    <details><summary>Hints</summary>

    Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:

    • Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.

    • A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.

    • An intermittent issue.

    Leave a comment here, if you need help tracking down a confusing failure.

    </details>

  7. maflcko commented at 12:52 PM on December 16, 2024: member

    Seems fine to add this, because it is easy to remove and can increase the build compatibly in the meantime.

    Also, it allows to evaluate the codegen, which could be substantially better than msvc, or detect more msvc bugs.

    If there are enough benefits to clang-cl, the docs could be updated to use it and msvc could be dropped from the docs and possibly CI.

  8. fanquake commented at 12:54 PM on December 16, 2024: member

    Also, it allows to evaluate the codegen, which could be substantially better than msvc, or detect more msvc bugs.

    Does it? My read of the docs was that clang just tries to internally work around all the MSVC bugs, so it seems like it will just continue to "hide" issues?

  9. hebasto commented at 1:33 PM on December 16, 2024: member

    From #31456#issue-2729797132:

    MSVC has many issues, for example:

    Added two commits that enable compiling fuzz/utxo_snapshot.cpp with clang-cl and switch "Win64 native, fuzz" job to clang-cl.

  10. in cmake/module/TryAppendCXXFlags.cmake:122 in 49cfcaf254 outdated
     119 | @@ -120,7 +120,11 @@ function(try_append_cxx_flags flags)
     120 |  endfunction()
     121 |  
     122 |  if(MSVC)
    


    theuni commented at 7:44 PM on December 16, 2024:

    Can't the if(MSVC) go away and we just rely on the CMAKE_CXX_COMPILER_ID test?


    hebasto commented at 12:08 PM on December 17, 2024:

    In this case, I think we do want to check MSVC, as it separates MSVC specific syntax /WX from GCC syntax -Werror.


    hodlinator commented at 9:16 AM on October 19, 2026:

    Could simplify to this when dropping support for MSVC?

    --- a/cmake/module/TryAppendCXXFlags.cmake
    +++ b/cmake/module/TryAppendCXXFlags.cmake
    @@ -119,8 +119,4 @@ function(try_append_cxx_flags flags)
       endif()
     endfunction()
    
    -if(MSVC)
    -  try_append_cxx_flags("/WX" VAR working_compiler_werror_flag SKIP_LINK)
    -else()
    -  try_append_cxx_flags("-Werror" VAR working_compiler_werror_flag SKIP_LINK)
    -endif()
    +try_append_cxx_flags("-Werror" VAR working_compiler_werror_flag SKIP_LINK)
    

    Diff succeeds with Clang-CL:

    -- Performing Test CXX_SUPPORTS__WERROR
    -- Performing Test CXX_SUPPORTS__WERROR - Success
    

    hebasto commented at 10:12 AM on October 24, 2026:

    Thanks! Reworked.


    hodlinator commented at 9:30 AM on October 26, 2026:

    thread #31507 (review):

    Seems unchanged in latest push?

  11. theuni commented at 7:46 PM on December 16, 2024: member

    At a high level.. seems to me we want to avoid doing if(MSVC) as much as possible and instead check against the compiler id, no? Except for the cases where we REALLY mean MSVC.

  12. theuni commented at 8:02 PM on December 16, 2024: member

    Hmm, actually, it seems like maybe CMAKE_CXX_COMPILER_FRONTEND_VARIANT is what we should be testing against?

  13. hebasto force-pushed on Dec 17, 2024
  14. fanquake commented at 11:49 AM on December 17, 2024: member

    < to be added >

    It'd be good if this could actually be filled in, so it's clear what the goals are / what's trying to be acheived here.

  15. hebasto commented at 12:11 PM on December 17, 2024: member

    Hmm, actually, it seems like maybe CMAKE_CXX_COMPILER_FRONTEND_VARIANT is what we should be testing against?

    It doesn't seem reliable, as it might not be set at all for CMake versions < 3.26.

  16. DrahtBot added the label Needs rebase on Jan 27, 2025
  17. hebasto force-pushed on Mar 10, 2025
  18. hebasto commented at 5:47 PM on March 10, 2025: member

    Rebased on #32028.

  19. hebasto force-pushed on Mar 10, 2025
  20. DrahtBot removed the label CI failed on Mar 10, 2025
  21. DrahtBot removed the label Needs rebase on Mar 10, 2025
  22. hebasto commented at 3:28 PM on March 11, 2025: member

    < to be added >

    It'd be good if this could actually be filled in, so it's clear what the goals are / what's trying to be acheived here.

    Done.

  23. hebasto force-pushed on Mar 11, 2025
  24. in cmake/leveldb.cmake:98 in 80e7e80a6d
      96 |      IF_CHECK_PASSED "-Wno-conditional-uninitialized"
      97 |    )
      98 |    try_append_cxx_flags("-Wsuggest-override" TARGET nowarn_leveldb_interface SKIP_LINK
      99 |      IF_CHECK_PASSED "-Wno-suggest-override"
     100 |    )
     101 | +  try_append_cxx_flags("-Wunused-member-function" TARGET nowarn_leveldb_interface SKIP_LINK
    


    fanquake commented at 3:39 AM on March 12, 2025:

    In 76659d92f1925f561736ffe0f070ed0b9fef8d23: It'd be good if commits like this could contain actual details, rather than just "Adjust diagnostic flags"; especially given this is touching non-Windows code. Also, any reason to not fix the issues in leveldb, rather than adding more suppressions?


    hebasto commented at 11:58 AM on May 17, 2025:

    More details have been added to the commit message.

    Also, any reason to not fix the issues in leveldb, rather than adding more suppressions?

    I'll consider this option.


    hebasto commented at 10:10 PM on May 17, 2025:

    Also, any reason to not fix the issues in leveldb, rather than adding more suppressions?

    I'll consider this option.

    Please see https://github.com/bitcoin-core/leveldb-subtree/pull/53.

  25. DrahtBot added the label Needs rebase on Mar 14, 2025
  26. hebasto force-pushed on Mar 17, 2025
  27. DrahtBot removed the label Needs rebase on Mar 17, 2025
  28. DrahtBot added the label Needs rebase on Mar 31, 2025
  29. hebasto force-pushed on May 13, 2025
  30. fanquake commented at 11:27 AM on May 13, 2025: member
       test_bitcoin.vcxproj -> D:\a\bitcoin\bitcoin\build\bin\Release\test_bitcoin.exe
    lld-link : warning : found both wWinMain and WinMain; using latter [D:\a\bitcoin\bitcoin\build\src\qt\bitcoin-qt.vcxproj]
    lld-link : error : undefined symbol: __declspec(dllimport) PathRemoveFileSpecW [D:\a\bitcoin\bitcoin\build\src\qt\bitcoin-qt.vcxproj]
      >>> referenced by bitcoinqt.lib(guiutil.obj):(bool __cdecl GUIUtil::SetStartOnSystemStartup(bool))
    lld-link : error : undefined symbol: __declspec(dllimport) PathRemoveFileSpecW [D:\a\bitcoin\bitcoin\build\src\qt\test\test_bitcoin-qt.vcxproj]
      >>> referenced by bitcoinqt.lib(guiutil.obj):(bool __cdecl GUIUtil::SetStartOnSystemStartup(bool))
    
      C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0\shared\ws2ipdef.h(251,33): note: expanded from macro 'IN6ADDR_LOOPBACK_INIT'
    lld-link : error : undefined symbol: __divti3 [D:\a\bitcoin\bitcoin\build\src\test\fuzz\fuzz.vcxproj]
      >>> referenced by fuzz.dir\Release\feefrac.obj:(void __cdecl feefrac_mul_div_fuzz_target(class std::span<unsigned char const, -1>))
      >>> referenced by fuzz.dir\Release\feefrac.obj:(?Div@FeeFrac@@SA_J_LH_N@Z)
    
  31. DrahtBot removed the label Needs rebase on May 13, 2025
  32. fanquake referenced this in commit 8309a9747a on May 13, 2025
  33. hebasto force-pushed on May 13, 2025
  34. hebasto force-pushed on May 15, 2025
  35. hebasto renamed this:
    [POC] build: Use clang-cl to build on Windows natively
    build: Use clang-cl to build on Windows natively
    on May 15, 2025
  36. DrahtBot added the label Needs rebase on May 16, 2025
  37. hebasto force-pushed on May 16, 2025
  38. DrahtBot removed the label Needs rebase on May 16, 2025
  39. DrahtBot added the label Needs rebase on May 17, 2025
  40. hebasto force-pushed on May 17, 2025
  41. hebasto marked this as ready for review on May 17, 2025
  42. DrahtBot removed the label Needs rebase on May 17, 2025
  43. hebasto force-pushed on May 18, 2025
  44. fanquake commented at 9:11 AM on May 21, 2025: member

    Reading the description, I'm still not really clear on the goals here. It seems like this is just adding even more ways to compile for Windows, which we have to add more CI / and more work arounds for, but doesn't actually improve the Windows binaries we are shipping to end users in any way. This might make more sense if we were actually going to switch to shipping Windows binaries using Clang.

  45. hebasto commented at 3:05 PM on October 16, 2025: member

    Reading the description, I'm still not really clear on the goals here. It seems like this is just adding even more ways to compile for Windows, which we have to add more CI / and more work arounds for, but doesn't actually improve the Windows binaries we are shipping to end users in any way.

    Building Bitcoin Core from source has always been considered one of the best practices. Not supporting an effective compiler, such as clang-cl on Windows, prevents users from achieving optimal performance, which negatively affects their experience.

    If adding one more CI job is an issue for the current framework, we could consider dropping MSVC support instead. And if another compiler exposes more source-level workarounds, that’s an indication the code could be made more portable.

    This might make more sense if we were actually going to switch to shipping Windows binaries using Clang.

    That’s already on the horizon.

  46. hebasto force-pushed on Oct 16, 2025
  47. hebasto commented at 3:12 PM on October 16, 2025: member

    Rebased to refresh the CI.

  48. fanquake commented at 3:21 PM on October 16, 2025: member

    prevents users from achieving optimal performance,

    Clang on Windows produces better performing binaries than MSVC?

  49. hebasto commented at 3:24 PM on October 16, 2025: member

    prevents users from achieving optimal performance,

    Clang on Windows produces better performing binaries than MSVC?

    Yes. I forgot to put this link into my previous comment: https://github.com/bitcoin-core/secp256k1/pull/1681.

  50. fanquake commented at 3:26 PM on October 16, 2025: member

    Yes. I forgot to put this link into my previous comment: https://github.com/bitcoin-core/secp256k1/pull/1681.

    Have you seen the same from actually running Core, or it's benchmarks, or an IBD?

  51. hebasto commented at 3:34 PM on October 16, 2025: member

    Yes. I forgot to put this link into my previous comment: bitcoin-core/secp256k1#1681.

    Have you seen the same from actually running Core, or it's benchmarks, or an IBD?

    I'll refresh my benchmarks and post them shortly.

  52. fanquake commented at 3:36 PM on October 16, 2025: member
    
    D:\a\bitcoin\bitcoin\src\script\interpreter.cpp(1531,33): warning : variable 'ext_flag' may be uninitialized when used here [-Wconditional-uninitialized] [D:\a\bitcoin\bitcoin\build\src\bitcoin_consensus.vcxproj]
      D:\a\bitcoin\bitcoin\src\script\interpreter.cpp(1733,10): note: in instantiation of function template specialization 'SignatureHashSchnorr<CTransaction>' requested here
      D:\a\bitcoin\bitcoin\src\script\interpreter.cpp(1481,21): note: initialize the variable 'ext_flag' to silence this warning
    D:\a\bitcoin\bitcoin\src\script\interpreter.cpp(1531,33): warning : variable 'ext_flag' may be uninitialized when used here [-Wconditional-uninitialized] [D:\a\bitcoin\bitcoin\build\src\bitcoin_consensus.vcxproj]
      D:\a\bitcoin\bitcoin\src\script\interpreter.cpp(1733,10): note: in instantiation of function template specialization 'SignatureHashSchnorr<CMutableTransaction>' requested here
      D:\a\bitcoin\bitcoin\src\script\interpreter.cpp(1481,21): note: initialize the variable 'ext_flag' to silence this warning
      bitcoin_clientversion.vcxproj -> D:\a\bitcoin\bitcoin\build\lib\Release\bitcoin_clientversion.lib
    
     D:\a\bitcoin\bitcoin\src\util/subprocess.h(759,10): error : private field 'parent_' is not used [-Werror,-Wunused-private-field] [D:\a\bitcoin\bitcoin\build\src\bitcoin_common.vcxproj]
    D:\a\bitcoin\bitcoin\src\util/subprocess.h(760,7): error : private field 'err_wr_pipe_' is not used [-Werror,-Wunused-private-field] [D:\a\bitcoin\bitcoin\build\src\bitcoin_common.vcxproj]
    D:\a\bitcoin\bitcoin\src\util/subprocess.h(1038,7): error : private field 'child_pid_' is not used [-Werror,-Wunused-private-field] [D:\a\bitcoin\bitcoin\build\src\bitcoin_common.vcxproj]
    
  53. hebasto force-pushed on Oct 16, 2025
  54. hebasto commented at 5:58 PM on October 25, 2025: member

    Yes. I forgot to put this link into my previous comment: bitcoin-core/secp256k1#1681.

    Have you seen the same from actually running Core, or it's benchmarks, or an IBD?

    I'll refresh my benchmarks and post them shortly.

    Below are benchmarks on my Windows machine:

    <details>

    <summary>Compiled with MSVC</summary>

    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |        1,179,325.00 |              847.94 |    6.9% |      0.15 | :wavy_dash: `AddAndRemoveDisconnectedBlockTransactions10` (Unstable with ~10.9 iters. Increase `minEpochIterations` to e.g. 109)
    |        1,260,020.00 |              793.64 |    5.0% |      0.16 | `AddAndRemoveDisconnectedBlockTransactions90`
    |        1,455,309.09 |              687.14 |    2.4% |      0.18 | `AddAndRemoveDisconnectedBlockTransactionsAll`
    |       71,612,900.00 |               13.96 |    1.1% |      0.79 | `AddrManAdd`
    |      187,231,800.00 |                5.34 |    0.5% |      2.07 | `AddrManAddThenGood`
    |          267,166.67 |            3,742.98 |    2.5% |      0.01 | `AddrManGetAddr`
    |              370.42 |        2,699,601.97 |    9.5% |      0.01 | :wavy_dash: `AddrManSelect` (Unstable with ~2,676.5 iters. Increase `minEpochIterations` to e.g. 26765)
    |        1,524,112.50 |              656.12 |   57.9% |      0.03 | :wavy_dash: `AddrManSelectByNetwork` (Unstable with ~1.6 iters. Increase `minEpochIterations` to e.g. 16)
    |          179,040.00 |            5,585.34 |   32.2% |      0.01 | :wavy_dash: `AddrManSelectFromAlmostEmpty` (Unstable with ~5.2 iters. Increase `minEpochIterations` to e.g. 52)
    |          698,000.00 |            1,432.66 |    1.2% |      0.01 | `AssembleBlock`
    
    |             ns/ecdh |              ecdh/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           72,300.00 |           13,831.26 |    0.3% |      0.01 | `BIP324_ECDH`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              118.70 |        8,424,277.24 |    0.2% |      0.01 | `Base58CheckEncode`
    |               28.09 |       35,600,546.52 |    0.5% |      0.01 | `Base58Decode`
    |               75.57 |       13,232,799.25 |    1.8% |      0.01 | `Base58Encode`
    |               12.29 |       81,346,439.17 |    1.5% |      0.01 | `Bech32Decode`
    |               18.92 |       52,852,519.65 |    0.5% |      0.01 | `Bech32Encode`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              204.06 |        4,900,466.95 |    6.4% |      0.01 | :wavy_dash: `BenchLockedPool` (Unstable with ~4,444.4 iters. Increase `minEpochIterations` to e.g. 44444)
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                2.60 |      384,098,329.17 |    2.6% |      0.03 | `BenchRIPEMD160`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               28.54 |       35,043,209.88 |    1.0% |      0.01 | `BenchTimeDeprecated`
    |               27.26 |       36,688,102.89 |    0.7% |      0.01 | `BenchTimeMillis`
    |               20.72 |       48,253,935.59 |    0.4% |      0.01 | `BenchTimeMillisSys`
    |                2.17 |      460,814,656.01 |    0.4% |      0.01 | `BenchTimeMock`
    |    1,162,030,600.00 |                0.86 |    0.1% |     12.83 | `BlockAssemblerAddPackageTxns`
    |        2,600,400.00 |              384.56 |    0.2% |      0.03 | `BlockEncodingLargeExtra`
    |        2,357,300.00 |              424.21 |    0.3% |      0.03 | `BlockEncodingNoExtra`
    |        2,368,000.00 |              422.30 |    0.5% |      0.03 | `BlockEncodingStdExtra`
    |    5,480,110,960.00 |                0.18 |    0.5% |    326.48 | `BlockFilterIndexSync`
    |       45,776,800.00 |               21.85 |    0.6% |      0.50 | `BlockToJsonVerboseWrite`
    |          484,450.00 |            2,064.20 |    1.1% |      0.01 | `BlockToJsonVerbosity1`
    |       93,670,700.00 |               10.68 |    0.6% |      1.05 | `BlockToJsonVerbosity2`
    |       97,989,500.00 |               10.21 |    1.3% |      1.09 | `BlockToJsonVerbosity3`
    |          724,300.00 |            1,380.64 |    5.6% |      0.01 | :wavy_dash: `BnBExhaustion` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    
    |              ns/job |               job/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              247.58 |        4,039,030.63 |   13.1% |      0.09 | :wavy_dash: `CCheckQueueSpeedPrevectorJob` (Unstable with ~10.9 iters. Increase `minEpochIterations` to e.g. 109)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              851.71 |        1,174,107.66 |    3.4% |      0.01 | `CCoinsCaching`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.88 |      531,597,465.15 |    0.7% |      0.02 | `CHACHA20_1MB`
    |                1.93 |      518,358,837.88 |    0.9% |      0.01 | `CHACHA20_256BYTES`
    |                2.14 |      468,040,540.54 |    2.8% |      0.01 | `CHACHA20_64BYTES`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |          101,433.33 |            9,858.69 |    0.9% |      0.01 | `CheckBlockIndex`
    |       18,427,900.00 |               54.27 |    0.9% |      0.21 | `CoinSelection`
    |      293,690,800.00 |                3.40 |    0.4% |      3.24 | `ComplexMemPool`
    
    |            ns/block |             block/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |      135,146,600.00 |                7.40 |    1.2% |      1.50 | `ConnectBlockAllEcdsa`
    |      136,611,800.00 |                7.32 |    3.1% |      1.51 | `ConnectBlockAllSchnorr`
    |      135,439,600.00 |                7.38 |    0.8% |      1.51 | `ConnectBlockMixedEcdsaSchnorr`
    |       10,885,800.00 |               91.86 |    2.2% |      0.12 | `DeserializeAndCheckBlockTest`
    |        8,232,900.00 |              121.46 |    4.8% |      0.09 | `DeserializeBlockTest`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |        8,377,400.00 |              119.37 |    1.1% |      0.09 | `DuplicateInputs`
    
    |           ns/pubkey |            pubkey/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           61,135.29 |           16,357.16 |    8.2% |      0.01 | :wavy_dash: `EllSwiftCreate` (Unstable with ~15.0 iters. Increase `minEpochIterations` to e.g. 150)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           17,842.00 |           56,047.53 |    1.7% |      0.01 | `EvictionProtection0Networks250Candidates`
    |           17,623.91 |           56,741.09 |    5.8% |      0.01 | :wavy_dash: `EvictionProtection1Networks250Candidates` (Unstable with ~52.2 iters. Increase `minEpochIterations` to e.g. 522)
    |           28,021.21 |           35,687.25 |   10.0% |      0.01 | :wavy_dash: `EvictionProtection2Networks250Candidates` (Unstable with ~34.6 iters. Increase `minEpochIterations` to e.g. 346)
    |            4,916.51 |          203,396.34 |    2.9% |      0.01 | `EvictionProtection3Networks050Candidates`
    |           14,537.70 |           68,786.65 |    0.6% |      0.01 | `EvictionProtection3Networks100Candidates`
    |           32,770.00 |           30,515.72 |    0.4% |      0.01 | `EvictionProtection3Networks250Candidates`
    |       27,257,200.00 |               36.69 |    1.4% |      0.31 | `ExpandDescriptor`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                2.98 |      336,049,738.81 |    2.3% |      0.04 | `FSCHACHA20POLY1305_1MB`
    |                3.69 |      270,753,844.23 |    1.5% |      0.01 | `FSCHACHA20POLY1305_256BYTES`
    |                6.29 |      159,062,436.86 |    4.2% |      0.01 | `FSCHACHA20POLY1305_64BYTES`
    
    |           ns/number |            number/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               13.51 |       74,002,603.32 |    0.8% |      0.01 | `FastRandom_rand32`
    |               21.52 |       46,475,091.77 |    2.0% |      0.01 | `FastRandom_rand64`
    |               17.89 |       55,886,030.54 |    0.5% |      0.01 | `FastRandom_randbits`
    |                2.03 |      492,182,923.46 |    1.0% |      0.01 | `FastRandom_randbool`
    |               12.01 |       83,255,086.07 |    0.7% |      0.01 | `FastRandom_randrange100`
    |               14.46 |       69,142,631.37 |    5.9% |      0.01 | :wavy_dash: `FastRandom_randrange1000` (Unstable with ~70.9 iters. Increase `minEpochIterations` to e.g. 709)
    |               19.40 |       51,540,546.95 |    0.2% |      0.22 | `FastRandom_randrange1000000`
    |               50.69 |       19,727,047.15 |   14.7% |      0.01 | :wavy_dash: `FastRandom_stdshuffle100` (Unstable with ~166.2 iters. Increase `minEpochIterations` to e.g. 1662)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               20.38 |       49,069,790.93 |    4.7% |      0.01 | `FindByte`
    |          843,000.00 |            1,186.24 |    1.0% |      0.01 | `GCSBlockFilterGetHash`
    |       15,844,200.00 |               63.11 |    0.7% |      0.17 | `GCSFilterConstruct`
    |        2,035,000.00 |              491.40 |    0.2% |      0.02 | `GCSFilterDecode`
    |            6,160.00 |          162,337.66 |    0.4% |      0.01 | `GCSFilterDecodeSkipCheck`
    |          252,466.67 |            3,960.92 |    1.3% |      0.01 | `GCSFilterMatch`
    
    |           ns/base16 |            base16/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                2.42 |      413,044,817.50 |    4.9% |      0.01 | `HexParse`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.37 |      729,258,989.13 |   24.9% |      0.02 | :wavy_dash: `HexStrBench` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    
    |           ns/number |            number/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                2.79 |      358,376,996.23 |    8.7% |      0.01 | :wavy_dash: `InsecureRandom_rand32` (Unstable with ~395,493.5 iters. Increase `minEpochIterations` to e.g. 3954935)
    |                2.10 |      475,354,929.88 |    2.2% |      0.01 | `InsecureRandom_rand64`
    |                3.26 |      306,422,541.39 |   17.8% |      0.01 | :wavy_dash: `InsecureRandom_randbits` (Unstable with ~4,377.0 iters. Increase `minEpochIterations` to e.g. 43770)
    |                1.66 |      602,926,829.27 |    2.9% |      0.01 | `InsecureRandom_randbool`
    |               11.62 |       86,084,142.39 |    9.8% |      0.01 | :wavy_dash: `InsecureRandom_randrange100` (Unstable with ~994.9 iters. Increase `minEpochIterations` to e.g. 9949)
    |                8.65 |      115,668,844.38 |    1.4% |      0.01 | `InsecureRandom_randrange1000`
    |                8.88 |      112,640,519.05 |    4.9% |      0.10 | `InsecureRandom_randrange1000000`
    |               23.36 |       42,813,765.18 |   10.7% |      0.01 | :wavy_dash: `InsecureRandom_stdshuffle100` (Unstable with ~352.1 iters. Increase `minEpochIterations` to e.g. 3521)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           19,800.00 |           50,505.05 |    8.0% |      0.00 | :wavy_dash: `Linearize16TxWorstCase120Iters` (Unstable with ~14.1 iters. Increase `minEpochIterations` to e.g. 141)
    |            4,152.94 |          240,793.20 |    7.3% |      0.01 | :wavy_dash: `Linearize16TxWorstCase20Iters` (Unstable with ~173.1 iters. Increase `minEpochIterations` to e.g. 1731)
    |        1,340,300.00 |              746.10 |    5.2% |      0.02 | :wavy_dash: `Linearize32TxWorstCase15000Iters` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |          458,800.00 |            2,179.60 |    1.8% |      0.01 | `Linearize32TxWorstCase5000Iters`
    |        1,283,800.00 |              778.94 |    3.1% |      0.01 | `Linearize48TxWorstCase15000Iters`
    |          507,900.00 |            1,968.89 |    7.7% |      0.01 | :wavy_dash: `Linearize48TxWorstCase5000Iters` (Unstable with ~2.0 iters. Increase `minEpochIterations` to e.g. 20)
    |        1,279,700.00 |              781.43 |    1.8% |      0.02 | `Linearize64TxWorstCase15000Iters`
    |          746,200.00 |            1,340.12 |   11.1% |      0.01 | :wavy_dash: `Linearize64TxWorstCase5000Iters` (Unstable with ~1.4 iters. Increase `minEpochIterations` to e.g. 14)
    |        3,503,200.00 |              285.45 |   14.3% |      0.04 | :wavy_dash: `Linearize75TxWorstCase15000Iters` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |        1,164,900.00 |              858.44 |   22.0% |      0.01 | :wavy_dash: `Linearize75TxWorstCase5000Iters` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |        2,219,000.00 |              450.65 |    4.9% |      0.03 | `Linearize99TxWorstCase15000Iters`
    |          812,600.00 |            1,230.62 |    2.1% |      0.01 | `Linearize99TxWorstCase5000Iters`
    |            2,276.16 |          439,337.25 |    2.2% |      0.01 | `LinearizeNoIters16TxWorstCaseAnc`
    |            3,408.36 |          293,395.92 |    1.2% |      0.01 | `LinearizeNoIters16TxWorstCaseLIMO`
    |            7,155.92 |          139,744.41 |    0.4% |      0.01 | `LinearizeNoIters32TxWorstCaseAnc`
    |           12,471.21 |           80,184.67 |    3.0% |      0.01 | `LinearizeNoIters32TxWorstCaseLIMO`
    |           16,783.33 |           59,582.92 |    9.0% |      0.01 | :wavy_dash: `LinearizeNoIters48TxWorstCaseAnc` (Unstable with ~51.6 iters. Increase `minEpochIterations` to e.g. 516)
    |           31,245.83 |           32,004.27 |   11.6% |      0.01 | :wavy_dash: `LinearizeNoIters48TxWorstCaseLIMO` (Unstable with ~30.4 iters. Increase `minEpochIterations` to e.g. 304)
    |           27,361.11 |           36,548.22 |    2.2% |      0.01 | `LinearizeNoIters64TxWorstCaseAnc`
    |           48,836.84 |           20,476.34 |    2.1% |      0.01 | `LinearizeNoIters64TxWorstCaseLIMO`
    |           53,081.25 |           18,839.04 |    1.7% |      0.01 | `LinearizeNoIters75TxWorstCaseAnc`
    |           77,928.57 |           12,832.26 |    8.7% |      0.01 | :wavy_dash: `LinearizeNoIters75TxWorstCaseLIMO` (Unstable with ~11.8 iters. Increase `minEpochIterations` to e.g. 118)
    |           65,180.00 |           15,342.13 |    4.9% |      0.01 | `LinearizeNoIters99TxWorstCaseAnc`
    |          126,387.50 |            7,912.17 |    0.7% |      0.01 | `LinearizeNoIters99TxWorstCaseLIMO`
    |          184,075.00 |            5,432.57 |    9.2% |      0.01 | :wavy_dash: `LinearizeOptimallyExample00` (Unstable with ~4.0 iters. Increase `minEpochIterations` to e.g. 40)
    |          344,650.00 |            2,901.49 |   25.9% |      0.01 | :wavy_dash: `LinearizeOptimallyExample01` (Unstable with ~2.8 iters. Increase `minEpochIterations` to e.g. 28)
    |          130,585.71 |            7,657.81 |    1.3% |      0.01 | `LinearizeOptimallyExample02`
    |          165,950.00 |            6,025.91 |    1.4% |      0.01 | `LinearizeOptimallyExample03`
    |            6,424.32 |          155,658.39 |    1.9% |      0.01 | `LinearizeOptimallyExample04`
    |           42,055.00 |           23,778.39 |    6.2% |      0.01 | :wavy_dash: `LinearizeOptimallyExample05` (Unstable with ~22.9 iters. Increase `minEpochIterations` to e.g. 229)
    |          110,590.00 |            9,042.41 |    1.7% |      0.01 | `LinearizeOptimallyExample06`
    |           25,597.56 |           39,066.22 |    0.5% |      0.01 | `LinearizeOptimallyExample07`
    |          187,075.00 |            5,345.45 |    1.3% |      0.01 | `LinearizeOptimallyExample08`
    |           40,508.33 |           24,686.28 |    3.8% |      0.01 | `LinearizeOptimallyExample09`
    |           28,385.29 |           35,229.51 |    2.1% |      0.01 | `LinearizeOptimallyExample10`
    |      719,994,100.00 |                1.39 |    1.3% |      7.99 | `LinearizeOptimallyExample11`
    |        1,006,700.00 |              993.34 |    0.9% |      0.01 | `LinearizeOptimallyExample12`
    |          176,500.00 |            5,665.72 |    2.4% |      0.01 | `LinearizeOptimallyExample13`
    |        1,143,000.00 |              874.89 |    2.1% |      0.01 | `LinearizeOptimallyExample14`
    |       29,272,700.00 |               34.16 |    0.5% |      0.33 | `LinearizeOptimallyExample15`
    |       20,853,100.00 |               47.95 |    0.3% |      0.23 | `LinearizeOptimallyExample16`
    |       26,201,500.00 |               38.17 |    0.3% |      0.30 | `LinearizeOptimallyExample17`
    |       26,541,500.00 |               37.68 |    0.7% |      0.30 | `LinearizeOptimallyExample18`
    |       32,764,400.00 |               30.52 |    3.9% |      0.37 | `LinearizeOptimallyExample19`
    |       39,456,100.00 |               25.34 |    4.0% |      0.50 | `LoadExternalBlockFile`
    |           13,837.88 |           72,265.41 |    1.1% |      0.01 | `LogWithDebug`
    |           22,309.09 |           44,824.78 |    1.1% |      0.01 | `LogWithThreadNames`
    |                5.11 |      195,635,694.57 |    0.6% |      0.01 | `LogWithoutDebug`
    |           21,524.39 |           46,458.92 |    1.0% |      0.01 | `LogWithoutThreadNames`
    |               84.59 |       11,822,331.46 |    0.6% |      0.01 | `LogWithoutWriteToFile`
    |      106,364,600.00 |                9.40 |    0.6% |      1.18 | `MempoolCheck`
    |           93,475.00 |           10,698.05 |    6.3% |      0.01 | :wavy_dash: `MempoolCheckEphemeralSpends` (Unstable with ~11.1 iters. Increase `minEpochIterations` to e.g. 111)
    |           78,840.00 |           12,683.92 |    3.3% |      0.01 | `MempoolEviction`
    |            1,662.86 |          601,372.26 |    1.2% |      0.01 | `MergeLinearizations16TxWorstCase`
    |            6,180.56 |          161,797.75 |    2.8% |      0.01 | `MergeLinearizations32TxWorstCase`
    |           13,255.38 |           75,441.04 |    0.4% |      0.01 | `MergeLinearizations48TxWorstCase`
    |           24,127.59 |           41,446.33 |    0.2% |      0.01 | `MergeLinearizations64TxWorstCase`
    |           41,200.00 |           24,271.84 |    4.2% |      0.01 | `MergeLinearizations75TxWorstCase`
    |           71,612.50 |           13,964.04 |    5.3% |      0.01 | :wavy_dash: `MergeLinearizations99TxWorstCase` (Unstable with ~13.7 iters. Increase `minEpochIterations` to e.g. 137)
    
    |             ns/leaf |              leaf/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              803.73 |        1,244,194.40 |    1.7% |      0.08 | `MerkleRoot`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           23,234.38 |           43,039.68 |    0.9% |      0.01 | `MuHash`
    |           22,334.04 |           44,774.70 |    1.5% |      0.01 | `MuHashDiv`
    |          118,775.00 |            8,419.28 |    0.4% |      0.01 | `MuHashFinalize`
    |           24,059.38 |           41,563.84 |    7.7% |      0.01 | :wavy_dash: `MuHashMul` (Unstable with ~39.3 iters. Increase `minEpochIterations` to e.g. 393)
    |            1,170.44 |          854,377.57 |    5.3% |      0.01 | :wavy_dash: `MuHashPrecompute` (Unstable with ~775.1 iters. Increase `minEpochIterations` to e.g. 7751)
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                0.08 |   13,208,359,679.74 |   15.8% |      0.01 | :wavy_dash: `ObfuscationBench` (Unstable with ~12,789.5 iters. Increase `minEpochIterations` to e.g. 127895)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |       25,839,500.00 |               38.70 |    0.0% |      0.03 | `OrphanageEraseForBlock`
    |        8,382,700.00 |              119.29 |    0.0% |      0.01 | `OrphanageEraseForPeer`
    |        8,739,700.00 |              114.42 |    0.0% |      0.01 | `OrphanageMultiPeerEviction`
    |          914,900.00 |            1,093.02 |    0.0% |      0.00 | `OrphanageSinglePeerEviction`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.01 |      987,731,725.70 |    1.0% |      0.01 | `POLY1305_1MB`
    |                1.05 |      950,234,981.39 |    1.1% |      0.01 | `POLY1305_256BYTES`
    |                1.23 |      810,674,540.92 |    0.2% |      0.01 | `POLY1305_64BYTES`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               73.26 |       13,650,324.20 |    2.8% |      0.06 | `PoolAllocator_StdUnorderedMap`
    |               20.40 |       49,028,347.30 |    0.3% |      0.02 | `PoolAllocator_StdUnorderedMapWithPoolResource`
    |            1,630.94 |          613,143.28 |    9.8% |      0.01 | :wavy_dash: `PostLinearize16TxWorstCase` (Unstable with ~583.2 iters. Increase `minEpochIterations` to e.g. 5832)
    |            5,243.22 |          190,722.64 |    4.4% |      0.01 | `PostLinearize32TxWorstCase`
    |           10,507.06 |           95,174.11 |    2.0% |      0.01 | `PostLinearize48TxWorstCase`
    |           17,806.78 |           56,158.39 |    0.2% |      0.01 | `PostLinearize64TxWorstCase`
    |           26,935.48 |           37,125.75 |    1.0% |      0.01 | `PostLinearize75TxWorstCase`
    |           45,540.00 |           21,958.72 |    0.9% |      0.01 | `PostLinearize99TxWorstCase`
    |              348.53 |        2,869,175.24 |    0.9% |      0.01 | `PrePadded`
    |               13.09 |       76,408,566.72 |    1.5% |      0.01 | `PrevectorClearNontrivial`
    |               13.10 |       76,340,252.71 |    1.9% |      0.01 | `PrevectorClearTrivial`
    |              513.70 |        1,946,661.48 |    0.9% |      0.01 | `PrevectorDeserializeNontrivial`
    |               25.56 |       39,116,185.64 |    1.7% |      0.01 | `PrevectorDeserializeTrivial`
    |               34.86 |       28,686,825.52 |    0.3% |      0.01 | `PrevectorDestructorNontrivial`
    |               34.30 |       29,158,158.35 |    0.4% |      0.01 | `PrevectorDestructorTrivial`
    |            2,955.97 |          338,298.76 |    0.5% |      0.01 | `PrevectorFillVectorDirectNontrivial`
    |            1,062.68 |          941,018.49 |   16.4% |      0.01 | :wavy_dash: `PrevectorFillVectorDirectTrivial` (Unstable with ~878.6 iters. Increase `minEpochIterations` to e.g. 8786)
    |           18,486.27 |           54,094.19 |    5.6% |      0.01 | :wavy_dash: `PrevectorFillVectorIndirectNontrivial` (Unstable with ~51.8 iters. Increase `minEpochIterations` to e.g. 518)
    |           14,531.25 |           68,817.20 |    1.2% |      0.01 | `PrevectorFillVectorIndirectTrivial`
    |                6.59 |      151,681,063.12 |    1.2% |      0.01 | `PrevectorResizeNontrivial`
    |                6.52 |      153,458,755.43 |    0.9% |      0.01 | `PrevectorResizeTrivial`
    |        9,865,300.00 |              101.37 |    5.8% |      0.12 | :wavy_dash: `ReadBlockBench` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |        1,411,200.00 |              708.62 |    3.2% |      0.02 | `ReadRawBlockBench`
    |              680.73 |        1,469,008.73 |    0.7% |      0.01 | `RegularPadded`
    |              497.44 |        2,010,294.54 |    1.0% |      0.01 | `RollingBloom`
    |           27,363.16 |           36,545.49 |    0.2% |      0.01 | `RollingBloomReset`
    |       16,691,500.00 |               59.91 |    1.0% |      0.19 | `RpcMempool`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.71 |      585,411,544.32 |    0.9% |      0.02 | `SHA1`
    |               12.23 |       81,756,487.03 |    0.4% |      0.01 | `SHA256D64_1024_AVX2 using the 'standard' SHA256 implementation`
    |               12.33 |       81,108,910.89 |    1.3% |      0.01 | `SHA256D64_1024_SHANI using the 'standard' SHA256 implementation`
    |               12.65 |       79,025,684.31 |    3.4% |      0.01 | `SHA256D64_1024_SSE4 using the 'standard' SHA256 implementation`
    |               12.27 |       81,512,437.81 |    0.6% |      0.01 | `SHA256D64_1024_STANDARD using the 'standard' SHA256 implementation`
    |               10.94 |       91,389,499.39 |    1.2% |      0.01 | `SHA256_32b_AVX2 using the 'standard' SHA256 implementation`
    |               11.19 |       89,345,293.33 |    3.5% |      0.01 | `SHA256_32b_SHANI using the 'standard' SHA256 implementation`
    |               11.50 |       86,973,470.49 |    6.3% |      0.01 | :wavy_dash: `SHA256_32b_SSE4 using the 'standard' SHA256 implementation` (Unstable with ~2,799.7 iters. Increase `minEpochIterations` to e.g. 27997)
    |               10.89 |       91,825,214.30 |    0.5% |      0.01 | `SHA256_32b_STANDARD using the 'standard' SHA256 implementation`
    |                4.93 |      203,037,440.10 |    0.8% |      0.06 | `SHA256_AVX2 using the 'standard' SHA256 implementation`
    |                5.06 |      197,526,962.43 |    3.1% |      0.06 | `SHA256_SHANI using the 'standard' SHA256 implementation`
    |                5.04 |      198,558,465.54 |    2.8% |      0.06 | `SHA256_SSE4 using the 'standard' SHA256 implementation`
    |                5.04 |      198,542,696.61 |    3.0% |      0.06 | `SHA256_STANDARD using the 'standard' SHA256 implementation`
    |                4.22 |      236,910,684.67 |    3.4% |      0.05 | `SHA3_256_1M`
    |                2.52 |      396,967,170.81 |    1.3% |      0.03 | `SHA512`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |          170,784.40 |            5,855.34 |    1.8% |      0.21 | `SignSchnorrWithMerkleRoot`
    |          171,072.81 |            5,845.46 |    2.3% |      0.21 | `SignSchnorrWithNullMerkleRoot`
    |          264,442.61 |            3,781.54 |    0.7% |      0.32 | `SignTransactionECDSA`
    |          211,025.22 |            4,738.77 |    0.9% |      0.26 | `SignTransactionSchnorr`
    |               30.11 |       33,210,919.73 |    1.6% |      0.01 | `SipHash_32b`
    |                9.23 |      108,313,013.40 |    5.9% |      0.02 | :wavy_dash: `Trig` (Unstable with ~188,576.0 iters. Increase `minEpochIterations` to e.g. 1885760)
    |       33,670,400.00 |               29.70 |    0.0% |      0.03 | `TxGraphTrim`
    |          106,750.00 |            9,367.68 |    0.6% |      0.01 | `VerifyNestedIfScript`
    |           67,992.31 |           14,707.55 |    1.3% |      0.01 | `VerifyScriptBench`
    |      120,327,800.00 |                8.31 |    0.2% |      1.33 | `WalletAvailableCoins`
    |            6,284.76 |          159,115.16 |    1.3% |      0.01 | `WalletBalanceClean`
    |            6,926.72 |          144,368.53 |    0.9% |      0.01 | `WalletBalanceDirty`
    |            6,308.93 |          158,505.52 |    1.1% |      0.01 | `WalletBalanceMine`
    |               78.53 |       12,734,112.86 |    1.0% |      0.01 | `WalletBalanceWatch`
    |    1,320,096,500.00 |                0.76 |    0.9% |     14.74 | `WalletCreateEncrypted`
    |    1,000,096,500.00 |                1.00 |    1.8% |     11.01 | `WalletCreatePlain`
    |        2,470,100.00 |              404.84 |    1.3% |      0.03 | `WalletCreateTxUseOnlyPresetInputs`
    |      129,672,200.00 |                7.71 |    1.3% |      1.44 | `WalletCreateTxUsePresetInputsAndCoinSelection`
    |              103.20 |        9,690,302.30 |    0.1% |      0.01 | `WalletIsMineDescriptors`
    |              103.40 |        9,671,102.46 |    0.4% |      0.01 | `WalletIsMineMigratedDescriptors`
    |      682,741,400.00 |                1.46 |    0.4% |      3.42 | `WalletLoadingDescriptors`
    |    9,446,679,300.00 |                0.11 |    0.0% |      9.45 | `WalletMigration`
    |       10,101,000.00 |               99.00 |    1.0% |      0.11 | `WriteBlockBench`
    
    

    </details>

    <details>

    <summary>Compiled with clang-cl</summary>

    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |        1,451,472.73 |              688.96 |    4.7% |      0.16 | `AddAndRemoveDisconnectedBlockTransactions10`
    |        1,147,027.27 |              871.82 |    0.5% |      0.14 | `AddAndRemoveDisconnectedBlockTransactions90`
    |        1,431,420.00 |              698.61 |    2.7% |      0.18 | `AddAndRemoveDisconnectedBlockTransactionsAll`
    |       53,722,500.00 |               18.61 |    0.5% |      0.60 | `AddrManAdd`
    |      136,084,600.00 |                7.35 |    1.3% |      1.51 | `AddrManAddThenGood`
    |          255,600.00 |            3,912.36 |    0.9% |      0.01 | `AddrManGetAddr`
    |              289.15 |        3,458,382.18 |    2.2% |      0.01 | `AddrManSelect`
    |        1,059,900.00 |              943.49 |   47.5% |      0.01 | :wavy_dash: `AddrManSelectByNetwork` (Unstable with ~1.1 iters. Increase `minEpochIterations` to e.g. 11)
    |           79,000.00 |           12,658.23 |   29.1% |      0.01 | :wavy_dash: `AddrManSelectFromAlmostEmpty` (Unstable with ~12.2 iters. Increase `minEpochIterations` to e.g. 122)
    |          581,250.00 |            1,720.43 |    4.1% |      0.01 | `AssembleBlock`
    
    |             ns/ecdh |              ecdh/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           46,791.30 |           21,371.49 |    0.5% |      0.01 | `BIP324_ECDH`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              113.44 |        8,815,521.49 |    0.5% |      0.01 | `Base58CheckEncode`
    |               26.41 |       37,868,835.99 |    0.6% |      0.01 | `Base58Decode`
    |               76.55 |       13,063,597.82 |    1.8% |      0.01 | `Base58Encode`
    |                9.45 |      105,876,049.29 |    3.7% |      0.01 | `Bech32Decode`
    |               17.65 |       56,659,019.81 |    0.6% |      0.01 | `Bech32Encode`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              188.81 |        5,296,396.75 |    1.0% |      0.01 | `BenchLockedPool`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                2.36 |      423,872,499.15 |    4.1% |      0.03 | `BenchRIPEMD160`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               28.55 |       35,026,548.67 |    1.2% |      0.01 | `BenchTimeDeprecated`
    |               27.32 |       36,609,274.56 |    0.9% |      0.01 | `BenchTimeMillis`
    |               20.66 |       48,396,462.22 |    0.4% |      0.01 | `BenchTimeMillisSys`
    |                2.17 |      460,582,963.96 |    1.0% |      0.01 | `BenchTimeMock`
    |    1,448,861,600.00 |                0.69 |    0.4% |     15.91 | `BlockAssemblerAddPackageTxns`
    |        2,555,100.00 |              391.37 |    1.1% |      0.03 | `BlockEncodingLargeExtra`
    |        2,314,600.00 |              432.04 |    0.7% |      0.03 | `BlockEncodingNoExtra`
    |        2,345,900.00 |              426.28 |    1.1% |      0.03 | `BlockEncodingStdExtra`
    |    5,455,197,200.00 |                0.18 |    0.2% |    322.09 | `BlockFilterIndexSync`
    |       45,462,500.00 |               22.00 |    1.0% |      0.51 | `BlockToJsonVerboseWrite`
    |          442,400.00 |            2,260.40 |    0.4% |      0.01 | `BlockToJsonVerbosity1`
    |       83,156,800.00 |               12.03 |    1.3% |      0.93 | `BlockToJsonVerbosity2`
    |       82,647,900.00 |               12.10 |    0.4% |      0.92 | `BlockToJsonVerbosity3`
    |          617,350.00 |            1,619.83 |    0.4% |      0.01 | `BnBExhaustion`
    
    |              ns/job |               job/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              230.93 |        4,330,272.61 |    7.0% |      0.09 | :wavy_dash: `CCheckQueueSpeedPrevectorJob` (Unstable with ~10.9 iters. Increase `minEpochIterations` to e.g. 109)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              683.83 |        1,462,358.04 |    3.1% |      0.01 | `CCoinsCaching`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.67 |      599,666,018.53 |    0.5% |      0.02 | `CHACHA20_1MB`
    |                1.73 |      577,714,344.81 |    0.8% |      0.01 | `CHACHA20_256BYTES`
    |                2.00 |      500,654,679.58 |    2.6% |      0.01 | `CHACHA20_64BYTES`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           91,781.82 |           10,895.40 |    1.7% |      0.01 | `CheckBlockIndex`
    |       16,983,800.00 |               58.88 |    0.8% |      0.19 | `CoinSelection`
    |      296,209,200.00 |                3.38 |    0.2% |      3.25 | `ComplexMemPool`
    
    |            ns/block |             block/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |       86,831,100.00 |               11.52 |    1.3% |      0.98 | `ConnectBlockAllEcdsa`
    |       84,704,400.00 |               11.81 |    1.0% |      0.94 | `ConnectBlockAllSchnorr`
    |       87,313,300.00 |               11.45 |    0.6% |      0.97 | `ConnectBlockMixedEcdsaSchnorr`
    |        6,986,900.00 |              143.12 |    2.2% |      0.08 | `DeserializeAndCheckBlockTest`
    |        5,289,800.00 |              189.04 |    6.4% |      0.06 | :wavy_dash: `DeserializeBlockTest` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |        7,979,700.00 |              125.32 |    0.5% |      0.09 | `DuplicateInputs`
    
    |           ns/pubkey |            pubkey/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           42,715.79 |           23,410.55 |    2.3% |      0.01 | `EllSwiftCreate`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           17,945.28 |           55,724.95 |   13.8% |      0.01 | :wavy_dash: `EvictionProtection0Networks250Candidates` (Unstable with ~41.4 iters. Increase `minEpochIterations` to e.g. 414)
    |           15,346.00 |           65,163.56 |   12.5% |      0.01 | :wavy_dash: `EvictionProtection1Networks250Candidates` (Unstable with ~60.7 iters. Increase `minEpochIterations` to e.g. 607)
    |           21,886.36 |           45,690.55 |    9.2% |      0.01 | :wavy_dash: `EvictionProtection2Networks250Candidates` (Unstable with ~45.9 iters. Increase `minEpochIterations` to e.g. 459)
    |            4,370.44 |          228,809.74 |    9.7% |      0.01 | :wavy_dash: `EvictionProtection3Networks050Candidates` (Unstable with ~222.7 iters. Increase `minEpochIterations` to e.g. 2227)
    |           11,346.24 |           88,134.95 |    0.6% |      0.01 | `EvictionProtection3Networks100Candidates`
    |           27,344.12 |           36,570.94 |    5.2% |      0.01 | :wavy_dash: `EvictionProtection3Networks250Candidates` (Unstable with ~36.3 iters. Increase `minEpochIterations` to e.g. 363)
    |       21,228,500.00 |               47.11 |    1.2% |      0.23 | `ExpandDescriptor`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                2.37 |      421,182,519.28 |    1.9% |      0.03 | `FSCHACHA20POLY1305_1MB`
    |                3.20 |      312,461,857.68 |    2.6% |      0.01 | `FSCHACHA20POLY1305_256BYTES`
    |                5.63 |      177,559,854.43 |    1.6% |      0.01 | `FSCHACHA20POLY1305_64BYTES`
    
    |           ns/number |            number/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               10.98 |       91,078,985.96 |    0.4% |      0.01 | `FastRandom_rand32`
    |               19.82 |       50,464,399.95 |    0.9% |      0.01 | `FastRandom_rand64`
    |               12.52 |       79,874,882.70 |    2.2% |      0.01 | `FastRandom_randbits`
    |                1.84 |      543,283,597.77 |    1.1% |      0.01 | `FastRandom_randbool`
    |               11.42 |       87,556,632.60 |    0.8% |      0.01 | `FastRandom_randrange100`
    |               12.19 |       82,008,200.82 |    1.4% |      0.01 | `FastRandom_randrange1000`
    |               16.76 |       59,662,311.32 |    1.1% |      0.19 | `FastRandom_randrange1000000`
    |               34.60 |       28,900,930.94 |    0.5% |      0.01 | `FastRandom_stdshuffle100`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               15.03 |       66,527,760.60 |    2.1% |      0.01 | `FindByte`
    |          499,850.00 |            2,000.60 |    0.7% |      0.01 | `GCSBlockFilterGetHash`
    |       14,975,200.00 |               66.78 |    0.7% |      0.17 | `GCSFilterConstruct`
    |        1,859,900.00 |              537.66 |    2.4% |      0.02 | `GCSFilterDecode`
    |            5,623.89 |          177,812.90 |    0.9% |      0.01 | `GCSFilterDecodeSkipCheck`
    |          212,120.00 |            4,714.31 |    0.5% |      0.01 | `GCSFilterMatch`
    
    |           ns/base16 |            base16/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                3.24 |      308,399,366.09 |    0.3% |      0.01 | `HexParse`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                0.94 |    1,064,388,971.68 |   12.4% |      0.01 | :wavy_dash: `HexStrBench` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    
    |           ns/number |            number/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.76 |      567,551,949.57 |    1.1% |      0.01 | `InsecureRandom_rand32`
    |                2.10 |      477,100,915.78 |    3.0% |      0.01 | `InsecureRandom_rand64`
    |                2.17 |      460,846,145.69 |    0.9% |      0.01 | `InsecureRandom_randbits`
    |                1.47 |      680,678,296.67 |    0.8% |      0.01 | `InsecureRandom_randbool`
    |                7.20 |      138,831,042.62 |    2.6% |      0.01 | `InsecureRandom_randrange100`
    |                6.88 |      145,243,282.50 |    1.5% |      0.01 | `InsecureRandom_randrange1000`
    |                7.39 |      135,382,116.02 |    0.9% |      0.08 | `InsecureRandom_randrange1000000`
    |               16.31 |       61,325,847.55 |    0.5% |      0.01 | `InsecureRandom_stdshuffle100`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |            9,683.87 |          103,264.49 |    0.6% |      0.01 | `Linearize16TxWorstCase120Iters`
    |            3,162.66 |          316,189.30 |    7.0% |      0.01 | :wavy_dash: `Linearize16TxWorstCase20Iters` (Unstable with ~278.6 iters. Increase `minEpochIterations` to e.g. 2786)
    |        1,031,700.00 |              969.27 |   12.3% |      0.01 | :wavy_dash: `Linearize32TxWorstCase15000Iters` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |          351,066.67 |            2,848.46 |    0.6% |      0.01 | `Linearize32TxWorstCase5000Iters`
    |          874,500.00 |            1,143.51 |    0.3% |      0.01 | `Linearize48TxWorstCase15000Iters`
    |          321,950.00 |            3,106.07 |    1.6% |      0.01 | `Linearize48TxWorstCase5000Iters`
    |          939,900.00 |            1,063.94 |    5.9% |      0.01 | :wavy_dash: `Linearize64TxWorstCase15000Iters` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |          370,600.00 |            2,698.33 |    1.3% |      0.01 | `Linearize64TxWorstCase5000Iters`
    |        1,365,800.00 |              732.17 |    2.5% |      0.02 | `Linearize75TxWorstCase15000Iters`
    |          538,750.00 |            1,856.15 |    1.2% |      0.01 | `Linearize75TxWorstCase5000Iters`
    |        1,392,900.00 |              717.93 |    5.3% |      0.02 | :wavy_dash: `Linearize99TxWorstCase15000Iters` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |          541,400.00 |            1,847.06 |    3.0% |      0.01 | `Linearize99TxWorstCase5000Iters`
    |            1,451.48 |          688,953.18 |    0.6% |      0.01 | `LinearizeNoIters16TxWorstCaseAnc`
    |            2,159.19 |          463,135.79 |    0.2% |      0.01 | `LinearizeNoIters16TxWorstCaseLIMO`
    |            4,901.71 |          204,010.26 |    3.4% |      0.01 | `LinearizeNoIters32TxWorstCaseAnc`
    |            8,484.00 |          117,868.93 |    8.8% |      0.01 | :wavy_dash: `LinearizeNoIters32TxWorstCaseLIMO` (Unstable with ~118.3 iters. Increase `minEpochIterations` to e.g. 1183)
    |            8,153.04 |          122,653.58 |    1.5% |      0.01 | `LinearizeNoIters48TxWorstCaseAnc`
    |           17,206.90 |           58,116.23 |    3.9% |      0.01 | `LinearizeNoIters48TxWorstCaseLIMO`
    |           14,300.00 |           69,930.07 |    3.0% |      0.01 | `LinearizeNoIters64TxWorstCaseAnc`
    |           30,121.87 |           33,198.46 |    1.8% |      0.01 | `LinearizeNoIters64TxWorstCaseLIMO`
    |           21,540.00 |           46,425.26 |    0.5% |      0.01 | `LinearizeNoIters75TxWorstCaseAnc`
    |           46,038.10 |           21,721.14 |    0.7% |      0.01 | `LinearizeNoIters75TxWorstCaseLIMO`
    |           37,370.59 |           26,759.01 |    4.7% |      0.01 | `LinearizeNoIters99TxWorstCaseAnc`
    |           80,030.00 |           12,495.31 |    1.9% |      0.01 | `LinearizeNoIters99TxWorstCaseLIMO`
    |          117,644.44 |            8,500.19 |    1.1% |      0.01 | `LinearizeOptimallyExample00`
    |          182,060.00 |            5,492.69 |    0.3% |      0.01 | `LinearizeOptimallyExample01`
    |           88,050.00 |           11,357.18 |    1.8% |      0.01 | `LinearizeOptimallyExample02`
    |          106,620.00 |            9,379.10 |    2.9% |      0.01 | `LinearizeOptimallyExample03`
    |            4,921.03 |          203,209.67 |    0.6% |      0.01 | `LinearizeOptimallyExample04`
    |           25,166.67 |           39,735.10 |    0.2% |      0.01 | `LinearizeOptimallyExample05`
    |           70,709.09 |           14,142.45 |    1.2% |      0.01 | `LinearizeOptimallyExample06`
    |           16,685.71 |           59,931.51 |    1.7% |      0.01 | `LinearizeOptimallyExample07`
    |          138,250.00 |            7,233.27 |    1.5% |      0.01 | `LinearizeOptimallyExample08`
    |           25,919.44 |           38,581.07 |    0.6% |      0.01 | `LinearizeOptimallyExample09`
    |           18,258.18 |           54,769.97 |    0.5% |      0.01 | `LinearizeOptimallyExample10`
    |      496,799,900.00 |                2.01 |    0.6% |      5.46 | `LinearizeOptimallyExample11`
    |          787,500.00 |            1,269.84 |    1.5% |      0.01 | `LinearizeOptimallyExample12`
    |          116,711.11 |            8,568.16 |    1.1% |      0.01 | `LinearizeOptimallyExample13`
    |          718,800.00 |            1,391.21 |    3.8% |      0.01 | `LinearizeOptimallyExample14`
    |       21,523,300.00 |               46.46 |    0.6% |      0.24 | `LinearizeOptimallyExample15`
    |       14,895,300.00 |               67.14 |    1.1% |      0.17 | `LinearizeOptimallyExample16`
    |       18,399,200.00 |               54.35 |    0.3% |      0.20 | `LinearizeOptimallyExample17`
    |       18,561,100.00 |               53.88 |    0.3% |      0.21 | `LinearizeOptimallyExample18`
    |       22,151,600.00 |               45.14 |    3.1% |      0.25 | `LinearizeOptimallyExample19`
    |       38,314,200.00 |               26.10 |    3.5% |      0.43 | `LoadExternalBlockFile`
    |           13,187.50 |           75,829.38 |    1.0% |      0.01 | `LogWithDebug`
    |           21,370.21 |           46,794.11 |    6.2% |      0.01 | :wavy_dash: `LogWithThreadNames` (Unstable with ~45.1 iters. Increase `minEpochIterations` to e.g. 451)
    |                5.64 |      177,250,274.97 |    1.9% |      0.01 | `LogWithoutDebug`
    |           21,744.00 |           45,989.70 |    3.9% |      0.01 | `LogWithoutThreadNames`
    |               82.91 |       12,061,834.77 |    0.3% |      0.01 | `LogWithoutWriteToFile`
    |      127,724,700.00 |                7.83 |    0.3% |      1.41 | `MempoolCheck`
    |           91,550.00 |           10,922.99 |    8.6% |      0.01 | :wavy_dash: `MempoolCheckEphemeralSpends` (Unstable with ~11.0 iters. Increase `minEpochIterations` to e.g. 110)
    |          117,588.89 |            8,504.20 |    3.1% |      0.01 | `MempoolEviction`
    |            1,328.90 |          752,501.92 |    1.3% |      0.01 | `MergeLinearizations16TxWorstCase`
    |            4,865.80 |          205,515.92 |    1.8% |      0.01 | `MergeLinearizations32TxWorstCase`
    |            9,940.95 |          100,593.98 |    0.4% |      0.01 | `MergeLinearizations48TxWorstCase`
    |           18,200.00 |           54,945.05 |    0.9% |      0.01 | `MergeLinearizations64TxWorstCase`
    |           29,572.73 |           33,814.94 |    4.4% |      0.01 | `MergeLinearizations75TxWorstCase`
    |           50,065.00 |           19,974.03 |    1.4% |      0.01 | `MergeLinearizations99TxWorstCase`
    
    |             ns/leaf |              leaf/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |              613.15 |        1,630,911.40 |    2.6% |      0.06 | `MerkleRoot`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |           19,535.42 |           51,189.08 |    0.5% |      0.01 | `MuHash`
    |           18,587.50 |           53,799.60 |    0.6% |      0.01 | `MuHashDiv`
    |          104,680.00 |            9,552.92 |    0.2% |      0.01 | `MuHashFinalize`
    |           19,165.12 |           52,178.13 |    4.1% |      0.01 | `MuHashMul`
    |              932.36 |        1,072,542.51 |    4.9% |      0.01 | `MuHashPrecompute`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                0.02 |   44,499,578,618.09 |    0.4% |      0.01 | `ObfuscationBench`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |       24,853,800.00 |               40.24 |    0.0% |      0.02 | `OrphanageEraseForBlock`
    |        8,055,900.00 |              124.13 |    0.0% |      0.01 | `OrphanageEraseForPeer`
    |        8,103,300.00 |              123.41 |    0.0% |      0.01 | `OrphanageMultiPeerEviction`
    |          741,700.00 |            1,348.25 |    0.0% |      0.00 | `OrphanageSinglePeerEviction`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                0.70 |    1,436,012,051.49 |    3.9% |      0.01 | `POLY1305_1MB`
    |                0.75 |    1,337,172,194.27 |    1.5% |      0.01 | `POLY1305_256BYTES`
    |                0.99 |    1,012,746,607.99 |    0.8% |      0.01 | `POLY1305_64BYTES`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |               74.43 |       13,435,935.02 |    2.8% |      0.05 | `PoolAllocator_StdUnorderedMap`
    |               23.94 |       41,774,002.65 |    2.7% |      0.02 | `PoolAllocator_StdUnorderedMapWithPoolResource`
    |              837.66 |        1,193,799.94 |    1.0% |      0.01 | `PostLinearize16TxWorstCase`
    |            2,793.77 |          357,939.06 |    4.1% |      0.01 | `PostLinearize32TxWorstCase`
    |            6,151.00 |          162,575.19 |    4.4% |      0.01 | `PostLinearize48TxWorstCase`
    |           10,197.59 |           98,062.38 |    3.3% |      0.01 | `PostLinearize64TxWorstCase`
    |           13,336.62 |           74,981.52 |    1.4% |      0.01 | `PostLinearize75TxWorstCase`
    |           21,982.50 |           45,490.73 |    0.6% |      0.01 | `PostLinearize99TxWorstCase`
    |              233.80 |        4,277,164.38 |    8.7% |      0.01 | :wavy_dash: `PrePadded` (Unstable with ~4,344.4 iters. Increase `minEpochIterations` to e.g. 43444)
    |                8.78 |      113,914,290.53 |   12.8% |      0.01 | :wavy_dash: `PrevectorClearNontrivial` (Unstable with ~59,749.5 iters. Increase `minEpochIterations` to e.g. 597495)
    |                6.34 |      157,752,831.72 |    3.6% |      0.01 | `PrevectorClearTrivial`
    |              151.85 |        6,585,446.16 |    1.1% |      0.01 | `PrevectorDeserializeNontrivial`
    |               12.26 |       81,573,896.35 |    1.7% |      0.01 | `PrevectorDeserializeTrivial`
    |                   - |                   - |       - |         - | :boom: `PrevectorDestructorNontrivial` (iterations overflow. Maybe your code got optimized away?)
    |                   - |                   - |       - |         - | :boom: `PrevectorDestructorTrivial` (iterations overflow. Maybe your code got optimized away?)
    |            3,030.00 |          330,033.00 |    0.6% |      0.01 | `PrevectorFillVectorDirectNontrivial`
    |              892.58 |        1,120,346.95 |    0.3% |      0.01 | `PrevectorFillVectorDirectTrivial`
    |           15,746.00 |           63,508.19 |    1.3% |      0.01 | `PrevectorFillVectorIndirectNontrivial`
    |           14,486.15 |           69,031.44 |    2.9% |      0.01 | `PrevectorFillVectorIndirectTrivial`
    |                3.80 |      263,020,209.20 |    1.4% |      0.01 | `PrevectorResizeNontrivial`
    |                3.09 |      323,837,259.10 |    0.7% |      0.01 | `PrevectorResizeTrivial`
    |        6,568,900.00 |              152.23 |    1.1% |      0.08 | `ReadBlockBench`
    |        1,615,300.00 |              619.08 |    9.6% |      0.02 | :wavy_dash: `ReadRawBlockBench` (Unstable with ~1.0 iters. Increase `minEpochIterations` to e.g. 10)
    |              420.26 |        2,379,495.03 |    4.2% |      0.01 | `RegularPadded`
    |              449.27 |        2,225,845.02 |    0.6% |      0.01 | `RollingBloom`
    |           28,907.89 |           34,592.63 |    0.2% |      0.01 | `RollingBloomReset`
    |       15,066,000.00 |               66.37 |    0.7% |      0.17 | `RpcMempool`
    
    |             ns/byte |              byte/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |                1.74 |      574,415,532.20 |    1.2% |      0.02 | `SHA1`
    |                9.15 |      109,308,648.15 |    1.7% |      0.01 | `SHA256D64_1024_AVX2 using the 'sse4(1way)' SHA256 implementation`
    |                9.16 |      109,117,549.12 |    2.1% |      0.01 | `SHA256D64_1024_SHANI using the 'sse4(1way)' SHA256 implementation`
    |                9.04 |      110,618,617.60 |    0.8% |      0.01 | `SHA256D64_1024_SSE4 using the 'sse4(1way)' SHA256 implementation`
    |               11.32 |       88,359,174.87 |    0.6% |      0.01 | `SHA256D64_1024_STANDARD using the 'standard' SHA256 implementation`
    |                6.86 |      145,720,281.45 |    6.1% |      0.01 | :wavy_dash: `SHA256_32b_AVX2 using the 'sse4(1way)' SHA256 implementation` (Unstable with ~4,179.5 iters. Increase `minEpochIterations` to e.g. 41795)
    |                6.75 |      148,211,720.90 |    3.9% |      0.01 | `SHA256_32b_SHANI using the 'sse4(1way)' SHA256 implementation`
    |                6.50 |      153,826,170.01 |    0.3% |      0.01 | `SHA256_32b_SSE4 using the 'sse4(1way)' SHA256 implementation`
    |                9.35 |      106,922,385.38 |    0.2% |      0.01 | `SHA256_32b_STANDARD using the 'standard' SHA256 implementation`
    |                2.92 |      342,348,510.78 |    1.4% |      0.03 | `SHA256_AVX2 using the 'sse4(1way)' SHA256 implementation`
    |                2.96 |      337,541,348.82 |    2.8% |      0.03 | `SHA256_SHANI using the 'sse4(1way)' SHA256 implementation`
    |                2.95 |      339,523,987.37 |    1.7% |      0.03 | `SHA256_SSE4 using the 'sse4(1way)' SHA256 implementation`
    |                4.36 |      229,247,380.85 |    1.1% |      0.05 | `SHA256_STANDARD using the 'standard' SHA256 implementation`
    |                3.92 |      255,063,000.56 |    2.4% |      0.05 | `SHA3_256_1M`
    |                2.60 |      385,015,208.10 |    2.6% |      0.03 | `SHA512`
    
    |               ns/op |                op/s |    err% |     total | benchmark
    |--------------------:|--------------------:|--------:|----------:|:----------
    |          108,296.49 |            9,233.91 |    0.4% |      0.13 | `SignSchnorrWithMerkleRoot`
    |          108,620.59 |            9,206.36 |    0.8% |      0.13 | `SignSchnorrWithNullMerkleRoot`
    |          190,794.39 |            5,241.24 |    3.0% |      0.23 | `SignTransactionECDSA`
    |          137,775.24 |            7,258.20 |    0.5% |      0.17 | `SignTransactionSchnorr`
    |               31.14 |       32,113,941.55 |    6.5% |      0.01 | :wavy_dash: `SipHash_32b` (Unstable with ~30,618.5 iters. Increase `minEpochIterations` to e.g. 306185)
    |                9.23 |      108,384,801.58 |    6.0% |      0.02 | :wavy_dash: `Trig` (Unstable with ~187,765.5 iters. Increase `minEpochIterations` to e.g. 1877655)
    |       28,278,000.00 |               35.36 |    0.0% |      0.03 | `TxGraphTrim`
    |          102,250.00 |            9,779.95 |    0.5% |      0.01 | `VerifyNestedIfScript`
    |           41,344.44 |           24,187.05 |    1.7% |      0.01 | `VerifyScriptBench`
    |       72,342,700.00 |               13.82 |    0.3% |      0.80 | `WalletAvailableCoins`
    |            6,493.75 |          153,994.23 |    4.4% |      0.01 | `WalletBalanceClean`
    |            6,882.52 |          145,295.67 |    1.4% |      0.01 | `WalletBalanceDirty`
    |            7,061.03 |          141,622.41 |   10.3% |      0.01 | :wavy_dash: `WalletBalanceMine` (Unstable with ~108.5 iters. Increase `minEpochIterations` to e.g. 1085)
    |               78.27 |       12,776,287.80 |    0.7% |      0.01 | `WalletBalanceWatch`
    |    1,101,592,500.00 |                0.91 |    0.3% |     12.15 | `WalletCreateEncrypted`
    |      780,882,100.00 |                1.28 |    1.9% |      8.53 | `WalletCreatePlain`
    |        1,724,300.00 |              579.95 |    1.5% |      0.02 | `WalletCreateTxUseOnlyPresetInputs`
    |      125,178,300.00 |                7.99 |    2.7% |      1.40 | `WalletCreateTxUsePresetInputsAndCoinSelection`
    |              104.93 |        9,529,737.21 |    0.3% |      0.01 | `WalletIsMineDescriptors`
    |              104.95 |        9,527,988.87 |    0.3% |      0.01 | `WalletIsMineMigratedDescriptors`
    |      445,204,800.00 |                2.25 |    0.5% |      2.22 | `WalletLoadingDescriptors`
    |    7,056,696,700.00 |                0.14 |    0.0% |      7.06 | `WalletMigration`
    |       10,330,300.00 |               96.80 |    2.1% |      0.11 | `WriteBlockBench`
    
    

    </details>

  55. DrahtBot added the label Needs rebase on Nov 4, 2025
  56. hebasto force-pushed on Nov 4, 2025
  57. hebasto commented at 5:52 PM on November 4, 2025: member

    Rebased to resolve the conflict with the merged bitcoin/bitcoin#30595.

  58. DrahtBot removed the label Needs rebase on Nov 4, 2025
  59. DrahtBot added the label Needs rebase on Dec 1, 2025
  60. hebasto force-pushed on Dec 1, 2025
  61. hebasto commented at 11:04 AM on December 1, 2025: member

    Rebased to resolve conflicts.

  62. in src/qt/CMakeLists.txt:156 in c8feaeeee8
     152 | @@ -153,7 +153,7 @@ target_link_libraries(bitcoinqt
     153 |      Boost::headers
     154 |      $<TARGET_NAME_IF_EXISTS:QRencode::QRencode>
     155 |      $<$<PLATFORM_ID:Darwin>:-framework\ AppKit>
     156 | -    $<$<CXX_COMPILER_ID:MSVC>:shlwapi>
     157 | +    $<$<PLATFORM_ID:Windows>:shlwapi>
    


    fanquake commented at 11:08 AM on December 1, 2025:

    Is this going to be overlinking now?


    hebasto commented at 1:19 PM on January 22, 2026:

    Thanks! Reworked.

  63. in CMakeLists.txt:283 in c8feaeeee8
     279 | @@ -280,6 +280,8 @@ if(WIN32)
     280 |        /Zc:preprocessor
     281 |        /Zc:__cplusplus
     282 |        /sdl
     283 | +      # TODO: __int128 division when using clang-cl requires the builtins library.
    


    fanquake commented at 11:09 AM on December 1, 2025:

    Why not use the builtins? Not sure I understand the TODO.


    hebasto commented at 4:10 PM on January 22, 2026:

    Reworked.

  64. in .github/workflows/ci.yml:225 in c8feaeeee8
     217 | @@ -218,11 +218,17 @@ jobs:
     218 |          job-type: [standard, fuzz]
     219 |          include:
     220 |            - job-type: standard
     221 | +            env_vars: {}
     222 |              generate-options: '-DBUILD_BENCH=ON -DBUILD_KERNEL_LIB=ON -DBUILD_UTIL_CHAINSTATE=ON -DWERROR=ON'
     223 | -            job-name: 'Windows native, VS 2022'
     224 | +            job-name: 'Windows native, MSVC'
     225 | +          - job-type: clang-cl
     226 | +            env_vars: { CXXFLAGS: '-Wno-return-type -Wno-unused-private-field -Wno-error=conditional-uninitialized -Wno-error=missing-braces' }
    


    fanquake commented at 11:10 AM on December 1, 2025:

    -Wno-error=missing-braces -Wno-unused-private-field

    Why are these needed/are they being fixed?


    hebasto commented at 11:51 AM on December 1, 2025:

    -Wno-error=missing-braces

    From https://github.com/bitcoin/bitcoin/actions/runs/19820405203/job/56781245720:

    D:\a\bitcoin\bitcoin\src\test\i2p_tests.cpp(116,34): warning : suggest braces around initialization of subobject [-Wmissing-braces] [D:\a\bitcoin\bitcoin\build\src\test\test_bitcoin.vcxproj]
      C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared\ws2ipdef.h(251,33): note: expanded from macro 'IN6ADDR_LOOPBACK_INIT'
    D:\a\bitcoin\bitcoin\src\test\i2p_tests.cpp(159,38): warning : suggest braces around initialization of subobject [-Wmissing-braces] [D:\a\bitcoin\bitcoin\build\src\test\test_bitcoin.vcxproj]
      C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared\ws2ipdef.h(251,33): note: expanded from macro 'IN6ADDR_LOOPBACK_INIT'
    D:\a\bitcoin\bitcoin\src\test\netbase_tests.cpp(502,36): warning : suggest braces around initialization of subobject [-Wmissing-braces] [D:\a\bitcoin\bitcoin\build\src\test\test_bitcoin.vcxproj]
      C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared\ws2ipdef.h(251,33): note: expanded from macro 'IN6ADDR_LOOPBACK_INIT'
    D:\a\bitcoin\bitcoin\src\test\netbase_tests.cpp(507,36): warning : suggest braces around initialization of subobject [-Wmissing-braces] [D:\a\bitcoin\bitcoin\build\src\test\test_bitcoin.vcxproj]
      C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared\ws2ipdef.h(251,33): note: expanded from macro 'IN6ADDR_LOOPBACK_INIT'
    D:\a\bitcoin\bitcoin\src\test\netbase_tests.cpp(512,36): warning : suggest braces around initialization of subobject [-Wmissing-braces] [D:\a\bitcoin\bitcoin\build\src\test\test_bitcoin.vcxproj]
      C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared\ws2ipdef.h(251,33): note: expanded from macro 'IN6ADDR_LOOPBACK_INIT'
    

    -Wno-unused-private-field

    D:\a\bitcoin\bitcoin\src\util/subprocess.h(759,10): warning : private field 'parent_' is not used [-Wunused-private-field] [D:\a\bitcoin\bitcoin\build\src\util\bitcoin_util.vcxproj]
    D:\a\bitcoin\bitcoin\src\util/subprocess.h(760,7): warning : private field 'err_wr_pipe_' is not used [-Wunused-private-field] [D:\a\bitcoin\bitcoin\build\src\util\bitcoin_util.vcxproj]
    D:\a\bitcoin\bitcoin\src\util/subprocess.h(1038,7): warning : private field 'child_pid_' is not used [-Wunused-private-field] [D:\a\bitcoin\bitcoin\build\src\util\bitcoin_util.vcxproj]
    

    Why are these needed/are they being fixed?

    I'm going to work on the fixes.


    maflcko commented at 5:33 PM on January 20, 2026:

    Would be good to make them -Wno-error, instead of a full -Wno-


    hebasto commented at 1:19 PM on January 22, 2026:

    Would be good to make them -Wno-error, instead of a full -Wno-

    Switched to -Wno-error=unused-private-field.


    hebasto commented at 10:38 PM on January 22, 2026:

    -Wno-unused-private-field

    A fix has been proposed in #34385.

  65. bitcoin deleted a comment on Dec 1, 2025
  66. bitcoin deleted a comment on Dec 1, 2025
  67. DrahtBot removed the label Needs rebase on Dec 1, 2025
  68. in src/netaddress.h:276 in 751f3b91d0
     271 | @@ -272,6 +272,13 @@ class CNetAddr
     272 |  
     273 |      friend class CSubNet;
     274 |  
     275 | +// Windows and POSIX provide differently braced forms of IN6ADDR_LOOPBACK_INIT.
     276 | +#ifdef _MSC_VER
    


    fanquake commented at 10:26 AM on December 2, 2025:

    Should be in compat.h?


    hebasto commented at 12:15 PM on December 2, 2025:

    Thanks! Reworked.

  69. hebasto force-pushed on Dec 2, 2025
  70. sedited referenced this in commit d7fd8c6952 on Jan 22, 2026
  71. hebasto force-pushed on Jan 22, 2026
  72. hebasto force-pushed on Jan 22, 2026
  73. DrahtBot added the label CI failed on Jan 22, 2026
  74. DrahtBot removed the label CI failed on Jan 22, 2026
  75. hebasto force-pushed on Jan 22, 2026
  76. in CMakeLists.txt:287 in af37ba9839
     280 | @@ -281,6 +281,11 @@ if(WIN32)
     281 |        /Zc:__cplusplus
     282 |        /sdl
     283 |      )
     284 | +    target_link_libraries(core_interface INTERFACE
     285 | +      # __int128 division when using clang-cl requires the builtins library.
     286 | +      # See https://clang.llvm.org/docs/UsersManual.html#finding-clang-runtime-libraries.
     287 | +      $<$<CXX_COMPILER_ID:Clang>:clang_rt.builtins-x86_64>
    


    fanquake commented at 2:57 PM on January 22, 2026:

    Hardcoded architecture?


    hebasto commented at 4:10 PM on January 22, 2026:

    Thanks! Fixed.

  77. hebasto force-pushed on Jan 22, 2026
  78. DrahtBot added the label CI failed on Jan 22, 2026
  79. in .github/workflows/ci.yml:225 in 48521e9419
     217 | @@ -218,11 +218,17 @@ jobs:
     218 |          job-type: [standard, fuzz]
     219 |          include:
     220 |            - job-type: standard
     221 | +            env_vars: {}
     222 |              generate-options: '-DBUILD_BENCH=ON -DBUILD_KERNEL_LIB=ON -DBUILD_UTIL_CHAINSTATE=ON -DWERROR=ON'
     223 | -            job-name: 'Windows native, VS 2022'
     224 | +            job-name: 'Windows native, MSVC'
     225 | +          - job-type: clang-cl
     226 | +            env_vars: { CXXFLAGS: '-Wno-return-type -Wno-error=unused-private-field -Wno-error=conditional-uninitialized' }
    


    maflcko commented at 5:36 PM on January 22, 2026:

    What is the return type issue? All i can see in the logs is:

        ACTIONS_ORCHESTRATION_ID: 1fe30250-b534-498c-9285-7256c1d1e411.windows-native-dll.clang-cl_-Wno-return-type
    

    which seems a bit odd, but is probably just an upstream Github actions bug


    hebasto commented at 6:18 PM on January 22, 2026:

    This warning is very noisy on Windows, so the -Wno-return-type flag is used.

    All cases are highlighted here: https://github.com/hebasto/bitcoin/actions/runs/21259251206/job/61182273662.


    maflcko commented at 7:55 PM on January 22, 2026:

    It doesn't look too verbose. Also, I wonder if this is a compiler bug, or a real warning.

    Someone on Windows should test if an assert(false) without a return at runtime causes UB, or a crash.

    If UB, then there is a bug to fix

    If a crash, then this is something to report upstream, or maybe assert can be replaced by Assert?



    maflcko commented at 3:39 PM on February 5, 2026:

    Right. I think it would be good to look into this. At least, to confirm there is no hidden UB


    maflcko commented at 1:44 PM on February 6, 2026:

    to clarify what needs to be done here:

    • Remove a case from a switch
    • Set -Wno-error=switch
    • Check the assert is hit, not a no-return UB

    hebasto commented at 9:59 PM on February 14, 2026:

    On Windows 11 Pro:

    > cat test.cpp
    #include <iostream>
    #include <cassert>
    
    enum TestEnum {
        CASE_A,
        CASE_B,
        CASE_C
    };
    
    int test_no_return_ub(TestEnum e) {
        switch (e) {
            case CASE_A:
                    return 1;
            case CASE_B:
                    return 2;
        // CASE_C is intentionally missing
        } // no default case, so the compiler can warn about missing cases
        assert(false);
    }
    
    int main() {
        int result = test_no_return_ub(CASE_C);
        std::cout << "Result: " << result << std::endl;
        return 0;
    }
    > clang-cl.exe /std:c++20 -O2 test.cpp -o test.exe
    test.cpp(11,13): warning: enumeration value 'CASE_C' not handled in switch [-Wswitch]
       11 |     switch (e) {
          |             ^
    test.cpp(19,1): warning: non-void function does not return a value in all control paths [-Wreturn-type]
       19 | }
          | ^
    2 warnings generated.
    > .\test.exe
    Assertion failed: false, file test.cpp, line 18
    

    maflcko commented at 7:45 AM on February 16, 2026:

    Thx. So I guess it is fine to proceed here. Would still be nice to report and fix this upstream and/or pick up #26504 again.

  80. DrahtBot removed the label CI failed on Jan 22, 2026
  81. hebasto force-pushed on Jan 22, 2026
  82. hebasto commented at 10:36 PM on January 22, 2026: member

    Rebased on top of #34385.

  83. DrahtBot added the label Needs rebase on Feb 5, 2026
  84. fanquake commented at 1:41 PM on February 6, 2026: member

    I think I'd be more concept-ACK here, if it included removing support for MSVC, at the same time.

  85. hebasto force-pushed on Feb 12, 2026
  86. DrahtBot removed the label Needs rebase on Feb 12, 2026
  87. DrahtBot added the label CI failed on Feb 12, 2026
  88. hebasto force-pushed on Feb 12, 2026
  89. DrahtBot removed the label CI failed on Feb 12, 2026
  90. in src/util/subprocess.h:741 in e3a1b1d927 outdated
     737 | @@ -738,6 +738,7 @@ struct ArgumentDeducer
     738 |    Popen* popen_ = nullptr;
     739 |  };
     740 |  
     741 | +#ifndef __USING_WINDOWS__
    


    maflcko commented at 12:37 PM on February 17, 2026:

    in theory, this could be sumbitted upstream?


    hebasto commented at 1:02 PM on February 17, 2026:

    I see you has already left a comment in https://github.com/arun11299/cpp-subprocess/pull/127 :)

  91. in CMakeLists.txt:440 in e3a1b1d927 outdated
     460 | -  target_compile_definitions(warn_interface INTERFACE
     461 | -    _CRT_SECURE_NO_WARNINGS
     462 | -    _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING
     463 | -  )
     464 |  else()
     465 | -  try_append_cxx_flags("-Wall" TARGET warn_interface SKIP_LINK)
    


    fanquake commented at 1:32 PM on February 17, 2026:

    Why is this being moved?


    hebasto commented at 5:16 PM on February 19, 2026:

    According to the docs: clang-cl treats -Wall as -Weverything. /W3 above brings -Wall.

    And this is specific to the MSVC-style options (covered by the MSVC variable), which includes MSVC and clang-cl.


    fanquake commented at 5:20 PM on February 19, 2026:

    I can see this getting very fragile and confusing, if flags are now being moved between various else branches of if(MSVC) and if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") calls, and sometimes that means "stuff for Clang" and sometimes it doesn't.


    fanquake commented at 5:21 PM on February 19, 2026:

    (especially given nothing is being documented here)


    hebasto commented at 5:48 PM on February 19, 2026:

    (especially given nothing is being documented here)

    It's a bit above: https://github.com/bitcoin/bitcoin/blob/a5a8b9a315f7e9ebb984ece3e940382095b7ffee/CMakeLists.txt#L445-L447


    fanquake commented at 5:50 PM on February 19, 2026:

    It's a bit above:

    Yes, that is somewhat of an issue (documentation isn't near where it's needed/isn't clear what it applies to), but the point of:

    I can see this getting very fragile and confusing, if flags are now being moved between various else branches of if(MSVC) and if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") calls, and sometimes that means "stuff for Clang" and sometimes it doesn't.

    still stands regardless.


    hebasto commented at 7:04 PM on February 19, 2026:

    if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") is no longer used.


    fanquake commented at 12:54 AM on October 15, 2026:

    Looks like its back again?


    hebasto commented at 1:51 PM on October 16, 2026:
    $ git grep CMAKE_CXX_COMPILER_ID -- ':!src/crc32c' ':!src/ipc/libmultiprocess' ':!src/leveldb' ':!src/minisketch'
    CMakeLists.txt:message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
    cmake/script/CoverageInclude.cmake.in:if("@CMAKE_CXX_COMPILER_ID@" STREQUAL "Clang")
    
  92. sedited referenced this in commit 097c18239b on Feb 19, 2026
  93. hebasto force-pushed on Feb 19, 2026
  94. maflcko commented at 6:02 PM on February 19, 2026: member

    I think I'd be more concept-ACK here, if it included removing support for MSVC, at the same time.

    What is the status on this? If MSVC is kept, and MSVC ICEs are a motivation for this pull, it seems there is not much gain, because the ICEs still have to be dealt with. Though maybe I am missing a reason to keep MSVC?

  95. hebasto commented at 6:08 PM on February 19, 2026: member

    Though maybe I am missing a reason to keep MSVC?

    No, you are not. I'm working on it.

  96. hebasto force-pushed on Feb 19, 2026
  97. hebasto commented at 7:03 PM on February 19, 2026: member

    I think I'd be more concept-ACK here, if it included removing support for MSVC, at the same time.

    What is the status on this? If MSVC is kept, and MSVC ICEs are a motivation for this pull, it seems there is not much gain, because the ICEs still have to be dealt with. Though maybe I am missing a reason to keep MSVC?

    The support for MSVC has been removed.

  98. DrahtBot added the label CI failed on Feb 19, 2026
  99. in CMakeLists.txt:316 in 4f265f43d8 outdated
     328 |  
     329 | -  # Workaround producing large object files, which cannot be handled by the assembler.
     330 | -  # More likely to happen with no, or lower levels of optimisation.
     331 | -  # See discussion in https://github.com/bitcoin/bitcoin/issues/28109.
     332 | -  if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
     333 | -    try_append_cxx_flags("/bigobj" TARGET core_interface_debug SKIP_LINK)
    


    fanquake commented at 12:33 PM on February 20, 2026:

    Is this no-longer needed with Clang?


    hebasto commented at 11:44 AM on February 23, 2026:

    Here are the logs for building with the "Debug" build configuration:

    The error from before is no longer present.


    fanquake commented at 10:40 AM on February 24, 2026:

    Ok. Is that because it's not needed with Clang, or the code was refactored, or something else?


    hebasto commented at 11:43 AM on February 24, 2026:

    I couldn't reproduce the issue when ~cross-compiling on Fedora 43 (using GCC 15.2.1) or~ compiling on Windows (using the older VS 17.x or the new VS 18.3). ~It's probably safe to assume that recent code refactoring has rendered this workaround in the master branch obsolete:~ https://github.com/bitcoin/bitcoin/blob/ab8a7af74209e5d58203af14d9133d14de6a5776/CMakeLists.txt#L313-L321


    maflcko commented at 12:01 PM on February 24, 2026:

    May as well revert commit 1251a23642025e0440d85bb0d584be0e05d05699 for master then?


    hebasto commented at 2:11 PM on February 24, 2026:

    Apologies for the confusion, but the issue is still reproducible when cross-compiling on Fedora 43 (using GCC 15.2.1.


    maflcko commented at 9:27 AM on October 14, 2026:

    Is this still reproducible even after removing boost signals2, ref comment from the issue: #28109 (comment)


    hebasto commented at 3:35 AM on October 15, 2026:

    Is this still reproducible even after removing boost signals2, ref comment from the issue: #28109 (comment)

    It is:

    $ cmake --build build
    [453/617] Building CXX object src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj
    FAILED: [code=1] src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj 
    /bin/ccache /bin/x86_64-w64-mingw32-g++ -DABORT_ON_FAILED_ASSUME -DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DDEBUG -DDEBUG_LOCKCONTENTION -DDEBUG_LOCKORDER -DNOMINMAX -DRPC_DOC_CHECK -DWIN32 -DWIN32_LEAN_AND_MEAN -D_MT -D_WIN32_IE=0x0A00 -D_WIN32_WINNT=0x0A00 -D_WINDOWS -I/home/hebasto/dev/bitcoin/build/src -I/home/hebasto/dev/bitcoin/src -I/home/hebasto/dev/bitcoin/src/univalue/include -isystem /home/hebasto/dev/bitcoin/depends/x86_64-w64-mingw32/include -isystem /home/hebasto/dev/bitcoin/depends/x86_64-w64-mingw32/boost/include -O0 -ftrapv -g3 -std=c++20 -Wa,-muse-unaligned-vector-move -fno-extended-identifiers -fmacro-prefix-map=/home/hebasto/dev/bitcoin/src=. -fstack-reuse=none -Wstack-protector -fstack-protector-all -fcf-protection=full -Wall -Wextra -Wformat -Wformat-security -Wvla -Wredundant-decls -Wunused-const-variable -Wdate-time -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Woverloaded-virtual -Wsuggest-override -Wimplicit-fallthrough -Wunreachable-code -Wbidi-chars=any -Wundef -Wleading-whitespace=spaces -Wtrailing-whitespace=any -Wno-unused-parameter -MD -MT src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj -MF src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj.d -o src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj -c /home/hebasto/dev/bitcoin/src/wallet/wallet.cpp 
    /usr/lib/gcc/x86_64-w64-mingw32/16.2.1/../../../../x86_64-w64-mingw32/bin/as: src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj: too many sections (34047)
    /tmp/ccnCxYPg.s: Assembler messages:
    /tmp/ccnCxYPg.s: Fatal error: can't write 200 bytes to section .text of src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj: 'file too big'
    /usr/lib/gcc/x86_64-w64-mingw32/16.2.1/../../../../x86_64-w64-mingw32/bin/as: src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj: too many sections (34047)
    /tmp/ccnCxYPg.s: Fatal error: src/wallet/CMakeFiles/bitcoin_wallet.dir/wallet.cpp.obj: file too big
    [470/617] Building C object src/secp256k1/src/CMakeFiles/noverify_tests.dir/tests.c.obj
    ninja: build stopped: subcommand failed.
    
  100. fanquake commented at 12:34 PM on February 20, 2026: member

    The support for MSVC has been removed.

    Should probably add a release note, to state that only building with Clang is supported?

  101. maflcko commented at 12:41 PM on February 20, 2026: member

    and update doc/build-windows-msvc.md ?

    Maybe it seems better to merge this early for 32.0, than late for 31.0?

  102. hebasto commented at 12:43 PM on February 20, 2026: member

    Maybe it seems better to merge this early for 32.0, than late for 31.0?

    Yes, this seems prudent.

  103. DrahtBot added this to the milestone 32.0 on Feb 20, 2026
  104. fanquake added the label Needs release note on Feb 20, 2026
  105. hebasto force-pushed on Feb 23, 2026
  106. hebasto commented at 11:47 AM on February 23, 2026: member

    The support for MSVC has been removed.

    Should probably add a release note, to state that only building with Clang is supported?

    Done.

    and update doc/build-windows-msvc.md ?

    Done as well.

  107. hebasto force-pushed on Feb 23, 2026
  108. fanquake removed the label Needs release note on Feb 24, 2026
  109. DrahtBot removed the label CI failed on Feb 24, 2026
  110. hebasto commented at 10:30 AM on March 13, 2026: member

    Friendly ping @davidgumberg @hodlinator :)

  111. hebasto force-pushed on Mar 13, 2026
  112. hebasto commented at 10:34 AM on March 13, 2026: member

    Rebased.

  113. DrahtBot added the label Needs rebase on Mar 19, 2026
  114. hebasto force-pushed on Mar 20, 2026
  115. DrahtBot added the label CI failed on Mar 20, 2026
  116. DrahtBot removed the label Needs rebase on Mar 20, 2026
  117. DrahtBot removed the label CI failed on Mar 20, 2026
  118. DrahtBot added the label Needs rebase on Mar 25, 2026
  119. hebasto force-pushed on Mar 25, 2026
  120. hebasto commented at 11:20 PM on March 25, 2026: member

    Rebased to resolve a conflict with the merged bitcoin/bitcoin#34883.

  121. DrahtBot removed the label Needs rebase on Mar 26, 2026
  122. DrahtBot added the label Needs rebase on Apr 9, 2026
  123. hebasto force-pushed on Apr 9, 2026
  124. hebasto commented at 1:38 PM on April 9, 2026: member

    Rebased to resolve a conflict with the merged bitcoin/bitcoin#35031.

  125. DrahtBot removed the label Needs rebase on Apr 9, 2026
  126. in CMakePresets.json:22 in 6cfa80e20b
      17 | @@ -19,15 +18,14 @@
      18 |        }
      19 |      },
      20 |      {
      21 | -      "name": "vs2026-static",
      22 | -      "displayName": "Build using 'Visual Studio 18 2026' generator and 'x64-windows-static' triplet",
      23 | +      "name": "windows-static",
      24 | +      "displayName": "Build using clang-cl and and 'x64-windows-static' triplet",
    


    maflcko commented at 2:11 PM on April 9, 2026:

    “Build using clang-cl and and 'x64-windows-static' triplet” -> “Build using clang-cl and 'x64-windows-static' triplet [Duplicated “and” makes the sentence grammatically wrong and slightly confusing.]


    hebasto commented at 2:14 PM on April 9, 2026:

    Thanks! Fixed.

  127. hebasto force-pushed on Apr 9, 2026
  128. DrahtBot added the label CI failed on Apr 9, 2026
  129. DrahtBot removed the label CI failed on Apr 9, 2026
  130. fanquake referenced this in commit c274b50867 on May 18, 2026
  131. hebasto force-pushed on May 28, 2026
  132. fanquake commented at 4:08 PM on May 28, 2026: member

    Are code / comments like still correct, if we are dropping support for MSVC?

    https://github.com/bitcoin/bitcoin/blob/master/src/compat/byteswap.h#L18-L42

    Will Clang now take the __has_builtin branch, and in the fallback case, you'd want constexpr?

  133. Kino1994 referenced this in commit 57d7c78468 on Jun 28, 2026
  134. Kino1994 referenced this in commit ebf8b66a6f on Jun 28, 2026
  135. Kino1994 referenced this in commit f286fd0f18 on Jun 28, 2026
  136. BigcoinBGC referenced this in commit 9dc096e777 on Jun 30, 2026
  137. BigcoinBGC referenced this in commit 7b380b5d61 on Jun 30, 2026
  138. BigcoinBGC referenced this in commit 818b17046e on Jun 30, 2026
  139. DrahtBot added the label Needs rebase on Aug 11, 2026
  140. bitcoin deleted a comment on Aug 12, 2026
  141. fanquake commented at 10:54 AM on August 12, 2026: member

    What's the status here? This is tagged for 32.0, but needs rebase and review addressed. I think it could also be good to expand the release note to mention why we are dropping support for MSVC, in favour of Clang.

  142. hebasto force-pushed on Aug 12, 2026
  143. hebasto commented at 3:41 PM on August 12, 2026: member

    Are code / comments like still correct, if we are dropping support for MSVC?

    https://github.com/bitcoin/bitcoin/blob/master/src/compat/byteswap.h#L18-L42

    Will Clang now take the __has_builtin branch, and in the fallback case, you'd want constexpr?

    Reworked.

    I think it could also be good to expand the release note to mention why we are dropping support for MSVC, in favour of Clang.

    Done.

  144. hebasto force-pushed on Aug 12, 2026
  145. DrahtBot added the label CI failed on Aug 12, 2026
  146. DrahtBot removed the label Needs rebase on Aug 12, 2026
  147. hebasto removed this from the milestone 32.0 on Aug 12, 2026
  148. DrahtBot removed the label CI failed on Aug 12, 2026
  149. in cmake/module/TryAppendCXXFlags.cmake:124 in 725178f365
     119 | @@ -120,7 +120,11 @@ function(try_append_cxx_flags flags)
     120 |  endfunction()
     121 |  
     122 |  if(MSVC)
     123 | -  try_append_cxx_flags("/WX /options:strict" VAR working_compiler_werror_flag SKIP_LINK)
     124 | +  if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
     125 | +    try_append_cxx_flags("/WX /options:strict" VAR working_compiler_werror_flag SKIP_LINK)
    


    hodlinator commented at 11:46 AM on August 13, 2026:

    725178f cmake: Adjust diagnostic flags for clang-cl:

    Tried re-adding /options:strict on top of the tip commit using clang-cl and got:

    -- Performing Test CXX_SUPPORTS__WX__OPTIONS_STRICT
    -- Performing Test CXX_SUPPORTS__WX__OPTIONS_STRICT - Failed
    

    👍

  150. in CMakeLists.txt:477 in 725178f365 outdated
     472 | @@ -473,18 +473,22 @@ include(cmake/ccache.cmake)
     473 |  add_library(warn_interface INTERFACE)
     474 |  target_link_libraries(core_interface INTERFACE warn_interface)
     475 |  if(MSVC)
     476 | -  try_append_cxx_flags("/W3" TARGET warn_interface SKIP_LINK)
     477 | +  # For both MSVC's cl.exe and clang-cl compilers.
     478 | +  try_append_cxx_flags("/W3" TARGET warn_interface SKIP_LINK)  # Enables -Wall Clang's core option.
    


    hodlinator commented at 11:50 AM on August 13, 2026:

    725178f cmake: Adjust diagnostic flags for clang-cl:

    More natural ordering (+ replace "core" with "internal")?

    -# Enables -Wall Clang's core option.
    +# Enables Clang-CL's internal -Wall option.
    

    hebasto commented at 6:12 AM on October 14, 2026:

    Reworked.

  151. in src/compat/byteswap.h:34 in a630d623f3 outdated
      29 | @@ -30,15 +30,13 @@
      30 |  #      define bitcoin_builtin_bswap16(x) _byteswap_ushort(x)
      31 |  #      define bitcoin_builtin_bswap32(x) _byteswap_ulong(x)
      32 |  #      define bitcoin_builtin_bswap64(x) _byteswap_uint64(x)
      33 | +       // MSVC's _byteswap_* functions are not constexpr
      34 | +#      define BSWAP_CONSTEXPR
    


    hodlinator commented at 12:02 PM on August 13, 2026:

    a630d62 Couple BSWAP_CONSTEXPR definition to bswap implementation:

    Should this #elif-branch be removed in the commit dropping support for MSVC?


    hebasto commented at 6:12 AM on October 14, 2026:

    Thanks! Removed.

  152. in .github/ci-windows.py:34 in ec347d1108 outdated
      29 | +        "cmake", "-E", "env",
      30 | +        "CXXFLAGS=-Wno-return-type -Wno-error=conditional-uninitialized",
      31 | +    ],
      32 | +    "fuzz": [
      33 | +        "cmake", "-E", "env",
      34 | +        "CXXFLAGS=-Wno-return-type -Wno-error=conditional-uninitialized",
    


    maflcko commented at 7:10 AM on August 18, 2026:

    Is this a violation of the C++26 standard? Ref: https://github.com/hebasto/bitcoin-core-nightly/pull/313#discussion_r3726748425 .

    If yes, it should be reported/fixed upstream.

    If not, it should not be hidden, to be able to confirm it. See also https://github.com/hebasto/bitcoin-core-nightly/pull/325


    maflcko commented at 5:52 AM on October 14, 2026:

    forgot to address this?


    hebasto commented at 8:16 AM on October 14, 2026:

    Thanks for the reminder! Reworked.


    maflcko commented at 8:49 AM on October 14, 2026:

    Interesting it looks like there are only a few places according to the last ci run....

    <details><summary>ai slop list of the places</summary>

      All return-type warnings end with assert(false) but no explicit return; clang-cl does not treat that as terminating on every path.
    
      1. src/script/interpreter.cpp:415 (src/script/interpreter.cpp:415) — EvalChecksig
    
      case SigVersion::TAPROOT:
          // Key path spending in Taproot has no script, so this is unreachable.
          break;
      }
      assert(false);
      }
    
      2. src/script/interpreter.cpp:1490 (src/script/interpreter.cpp:1490) — HandleMissingData
    
      case MissingDataBehavior::ASSERT_FAIL:
          assert(!"Missing data");
          break;
      case MissingDataBehavior::FAIL:
          return false;
      }
      assert(!"Unknown MissingDataBehavior value");
      }
    
      3. src/netaddress.cpp:47 (src/netaddress.cpp:47) — CNetAddr::GetBIP155Network
    
      case NET_INTERNAL:
      case NET_UNROUTABLE:
      case NET_MAX:
          assert(false);
      }
      assert(false);
      }
    
      4. src/netaddress.cpp:500 (src/netaddress.cpp:500) — CNetAddr::IsAddrV1Compatible
    
      case NET_UNROUTABLE:
      case NET_MAX:
          assert(false);
      }
      assert(false);
      }
    
      5. src/netaddress.cpp:607 (src/netaddress.cpp:607) — CNetAddr::ToStringAddr
    
      case NET_UNROUTABLE:
      case NET_MAX:
          assert(false);
      }
      assert(false);
      }
    
      6. src/netaddress.cpp:678 (src/netaddress.cpp:678) — CNetAddr::GetLinkedIPv4
    
      } else if (IsRFC4380()) {
          return ~ReadBE32(std::span{m_addr}.last(ADDR_IPV4_SIZE).data());
      }
      assert(false);
      }
    
      7. src/netbase.cpp:128 (src/netbase.cpp:128) — GetNetworkName
    
      case NET_INTERNAL: return "internal";
      case NET_MAX: assert(false);
      }
      assert(false);
      }
    
      8. src/outputtype.cpp:78 (src/outputtype.cpp:78) — script-destination helper
    
      case OutputType::BECH32M:
      case OutputType::UNKNOWN: {}
      }
      assert(false);
      }
    
      9. src/script/miniscript.h:998 (src/script/miniscript.h:998) — Node::ToString’s upfn lambda
    
      case Fragment::THRESH: {
          // ... builds and returns the string ...
          return std::move(str) + ")";
      }
      default: break;
      }
      assert(false);
      };
    
      This is emitted twice: once for StringMaker, once for KeyParser.
    
      10. src/qt/bitcoin.cpp:171 (src/qt/bitcoin.cpp:171) — ErrorSettingsRead
    
      case QMessageBox::Reset:
          return false;
      case QMessageBox::Abort:
          return true;
      default:
          assert(false);
      }
      }
    
      11. src/qt/bitcoinunits.cpp:252 (src/qt/bitcoinunits.cpp:252) — FromQint8
    
      case 2: return BitcoinUnit::uBTC;
      case 3: return BitcoinUnit::SAT;
      }
      assert(false);
      }
    

    </details>

    The godbolt is: https://godbolt.org/z/TE8b8bs8v

    Seeing the int3 after the assert still makes me wonder if this is just a false-positive or if this is a violation of the C++26 standard.

    C++26 says: https://en.cppreference.com/cpp/error/assert:

    If the evaluation yields true, there are no further effects.
    Otherwise, assert creates a diagnostic on the standard error stream and calls std::abort().
    (since C++26)

    And std::abort() says: https://en.cppreference.com/cpp/utility/program/abort:

    [[noreturn]] void abort() noexcept;
    (since C++11)

    But not a blocker. Seems fine to progress here.

    <!--- self note: • You ran cat reproduce_int3.cpp └ // Minimal stand-in for the MSVC CRT's debug assert expansion. The installed // clang-cl does not have the Windows SDK/UCRT headers, so declare _wassert // directly. The macro form matches the CRT's assertion expression. #if defined(ASSERT_NORETURN) #define ASSERT_NORETURN_SPEC , noreturn #else #define ASSERT_NORETURN_SPEC #endif extern "C" __declspec(dllimport ASSERT_NORETURN_SPEC) void __cdecl _wassert( const wchar_t*, const wchar_t*, unsigned); #define WIDEN_1(x) L##x #define WIDEN(x) WIDEN_1(x) #define assert(expr) ((void)(!!(expr) || (_wassert(WIDEN(#expr), WIDEN(__FILE__), __LINE__), 0))) bool f(signed char n) { switch (n) { case 0: return false; case 1: return true; } assert(false); } Worked for <1s • 11:30 AM • You ran clang-cl /nologo /std:c++17 /Od /c /UASSERT_NORETURN /FA /Fareproduce_int3.asm reproduce_int3.cpp && grep -C1 _wassert reproduce_int3.asm └ mov r8d, 23 call qword ptr [rip + __imp__wassert] ud2 reproduce_int3.cpp(24,1): warning: non-void function does not return a value in all control paths [-Wreturn-type] 24 | } | ^ 1 warning generated. Worked for <1s • 11:31 AM • You ran clang-cl /nologo /std:c++17 /O1 /c /UASSERT_NORETURN /FA /Fareproduce_int3.asm reproduce_int3.cpp && grep -C1 _wassert reproduce_int3.asm └ mov r8d, 23 call qword ptr [rip + __imp__wassert] int3 reproduce_int3.cpp(24,1): warning: non-void function does not return a value in all control paths [-Wreturn-type] 24 | } | ^ 1 warning generated. Worked for <1s • 11:31 AM • You ran clang-cl /nologo /std:c++17 /Od /c /DASSERT_NORETURN /FA /Fareproduce_int3.asm reproduce_int3.cpp && grep -C1 _wassert reproduce_int3.asm └ mov r8d, 23 call qword ptr [rip + __imp__wassert] .LBB0_4: Worked for <1s • 11:31 AM • You ran clang-cl /nologo /std:c++17 /O1 /c /DASSERT_NORETURN /FA /Fareproduce_int3.asm reproduce_int3.cpp && grep -C1 _wassert reproduce_int3.asm └ mov r8d, 23 call qword ptr [rip + __imp__wassert] int3


    hebasto commented at 10:27 AM on October 25, 2026:

    Some more notes:

    https://en.cppreference.com/cpp/error/assert explicitly states:

    The implementation of assert in Microsoft CRT does not conform to C++11 and later revisions...

    Microsoft's std::abort doesn't conform to C++11 and later revisions either. Its Remarks include a whole "Microsoft Specific" section.

    But not a blocker. Seems fine to progress here.

    Right, because these are MS CRT peculiarities, unrelated to the compiler switch.


    fanquake commented at 11:12 AM on October 25, 2026:

    because these are MS CRT peculiarities, unrelated to the compiler switch.

    If these additions are unrelated to the compiler switch, can you drop them from the PR? Otherwise, it would seem like they are related, and we could document why they are needed?


    hebasto commented at 11:52 AM on October 25, 2026:

    I mean, MS CRT peculiarities, such as the absence of the [[noreturn]] attribute on std::abort(), predate this PR.

    However, the compiler diagnostics they trigger differ. For example, the master branch passes /wd4715, which disables C4715 on Windows. In this PR, we use -Wno-return-type only in CI.

  153. in CMakeLists.txt:344 in ec347d1108 outdated
     339 | +      set(system_arch_suffix aarch64)
     340 | +    else()
     341 | +      message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}")
     342 | +    endif()
     343 | +    # __int128 division when using clang-cl requires the builtins library.
     344 | +    # See https://clang.llvm.org/docs/UsersManual.html#finding-clang-runtime-libraries.
    


    hodlinator commented at 9:09 AM on August 18, 2026:

    (Confirmed that https://clang.llvm.org/docs/UsersManual.html#finding-clang-runtime-libraries is required for int128 division).

  154. in doc/build-windows-native.md:1 in ec347d1108 outdated


    hodlinator commented at 7:18 PM on August 18, 2026:

    build-windows-msvc.md could be renamed to build-windows-native.md?


    hebasto commented at 5:47 AM on October 14, 2026:

    Renamed.


    hodlinator commented at 12:36 PM on October 14, 2026:

    nit:

    -# Windows / MSVC Build Guide
    +# Windows / VS Build Guide
    

    hebasto commented at 1:35 PM on October 16, 2026:

    Taken.

  155. in doc/build-windows-native.md:22 in ec347d1108 outdated
      20 | -
      21 |  To install Visual Studio Community Edition with the necessary components, run:
      22 |  
      23 |  ```powershell
      24 | -winget install --id Microsoft.VisualStudio.Community --override "--wait --quiet --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.Git --includeRecommended"
      25 | +winget install --id Microsoft.VisualStudio.Community --override "--wait --quiet --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.Git --includeRecommended"
    


    hodlinator commented at 8:47 PM on August 18, 2026:

    Repeatedly had output such as:

    PS C:\Users\hodlinator> winget install --verbose --id Microsoft.VisualStudio.Community --override "--wait --quiet --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.Git --includeRecommended"
    Found an existing package already installed. Trying to upgrade the installed package...
    Found Visual Studio Community 2026 [Microsoft.VisualStudio.Community] Version 18.9.0
    This application is licensed to you by its owner.
    Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
    Downloading https://download.visualstudio.microsoft.com/download/pr/b1ea2f6c-5e55-49bc-81e8-7623cc5a6743/4699cc0139951d64dec28a8007fff73dbac262ca6160d62cbc430bdc15b539dd/vs_Community.exe
      ██████████████████████████████  5.42 MB / 5.42 MB
    Successfully verified installer hash
    Starting package install...
    Installer failed with exit code: 1
    

    Removing --wait and --quiet had me able to complete it. It was probably the --quiet one that helped, got shown some modal dialogs.

  156. Kino1994 referenced this in commit 9c63781dcb on Aug 19, 2026
  157. Kino1994 referenced this in commit 6caece5cf8 on Aug 19, 2026
  158. Kino1994 referenced this in commit c2b0b43252 on Aug 19, 2026
  159. in .github/ci-windows.py:81 in ec347d1108 outdated
      75 | @@ -64,12 +76,12 @@ def github_import_vs_env(_ci_type):
      76 |  
      77 |  
      78 |  def generate(ci_type):
      79 | -    command = [
      80 | +    command = ENV_VARS[ci_type] + [
      81 |          "cmake",
      82 |          "-B",
    


    hodlinator commented at 7:49 AM on August 20, 2026:

    This results in "cmake -E ... cmake -B ..." in the command array: ['cmake', '-E', 'env', 'CXXFLAGS=-Wno-return-type -Wno-error=conditional-uninitialized', 'cmake', '-B', 'build', '-Werror=dev', '--preset=windows', '-DVCPKG_HOST_TRIPLET=x64-windows-release', '-DVCPKG_TARGET_TRIPLET=x64-windows-release', '-DBUILD_BENCH=ON', '-DBUILD_KERNEL_LIB=ON', '-DBUILD_UTIL_CHAINSTATE=ON', '-DCMAKE_COMPILE_WARNING_AS_ERROR=ON']

    Seems to work though.


    hebasto commented at 5:52 AM on October 14, 2026:

    cmake -E env is a CMake's multi-platform analogue of Linux's env.

  160. hodlinator commented at 8:40 AM on August 20, 2026: contributor

    Concept ACK ec347d1108d57d682bdc239558b8ca2660be6a3a

  161. DrahtBot added the label Needs rebase on Sep 29, 2026
  162. maflcko commented at 4:54 PM on September 29, 2026: member

    Missing "closes #36153" in pull description?

  163. maflcko added this to the milestone 33.0 on Oct 6, 2026
  164. sedited commented at 12:08 PM on October 7, 2026: contributor

    Concept ACK

  165. maflcko commented at 12:55 PM on October 7, 2026: member

    Also, could remove on the next rebase:

    
    #if !defined(_MSC_VER)
        // MSVC does not reject this failed constant evaluation in a requires-expression.
    
  166. hebasto force-pushed on Oct 14, 2026
  167. hebasto commented at 5:53 AM on October 14, 2026: member

    Missing "closes #36153" in pull description?

    Thanks! Added.

    Also, could remove on the next rebase:

    #if !defined(_MSC_VER)
        // MSVC does not reject this failed constant evaluation in a requires-expression.
    

    Removed.

  168. DrahtBot removed the label Needs rebase on Oct 14, 2026
  169. hebasto force-pushed on Oct 14, 2026
  170. DrahtBot added the label CI failed on Oct 14, 2026
  171. DrahtBot commented at 5:55 AM on October 14, 2026: contributor

    <!--85328a0da195eb286784d51f73fa0af9-->

    🚧 At least one of the CI tasks failed. <sub>Task lint: https://github.com/bitcoin/bitcoin/actions/runs/38518528632/job/115702690336</sub> <sub>LLM reason (✨ experimental): CI failed the markdown lint because four documentation links point to the missing doc/build-windows-native.md file.</sub>

    <details><summary>Hints</summary>

    Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:

    • Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.

    • A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.

    • An intermittent issue.

    Leave a comment here, if you need help tracking down a confusing failure.

    </details>

  172. hebasto force-pushed on Oct 14, 2026
  173. hebasto force-pushed on Oct 14, 2026
  174. DrahtBot removed the label CI failed on Oct 14, 2026
  175. in cmake/leveldb.cmake:88 in e0a2429ee0
      90 | +    target_compile_options(nowarn_leveldb_interface INTERFACE
      91 | +      /wd4722
      92 | +    )
      93 | +  endif()
      94 |  endif()
      95 | +try_append_cxx_flags("-Wconditional-uninitialized" TARGET nowarn_leveldb_interface SKIP_LINK
    


    maflcko commented at 9:03 AM on October 14, 2026:

    e0a2429ee007122e61238953c15ecdeddda2e42d: This is wrong, see 4d58c3271c0500a1294237e4d099ed769a59f7c0


    hebasto commented at 3:54 AM on October 15, 2026:

    Thanks! Fixed.

  176. in .github/ci-windows.py:79 in a93d450fb3
      75 | @@ -64,12 +76,12 @@ def github_import_vs_env(_ci_type):
      76 |  
      77 |  
      78 |  def generate(ci_type):
      79 | -    command = [
      80 | +    command = ENV_VARS[ci_type] + [
    


    maflcko commented at 9:20 AM on October 14, 2026:

    a93d450fb39b4e701103d8523584d284ba9ae1ce: Is there value in having different env vars here? They look the same, so maybe just inline them once here? Or at least flatten the map to a single array?


    hebasto commented at 3:54 AM on October 15, 2026:

    Thanks! Reworked.

  177. in CMakeLists.txt:301 in a93d450fb3
     303 | +     This case is handled when the MSVC variable is true.
     304 | +     Implementation notes:
     305 | +     - /DWIN32 and /D_WINDOWS definitions are included in the CMAKE_C_FLAGS_INIT
     306 | +       and CMAKE_CXX_FLAGS_INIT variables by default.
     307 | +     - The run-time library is selected using the CMAKE_MSVC_RUNTIME_LIBRARY variable.
     308 | +     - MSVC-specific options (e.g., /Zc:__cplusplus) are required for standard compliance.
    


    maflcko commented at 9:35 AM on October 14, 2026:

    a93d450fb39b4e701103d8523584d284ba9ae1ce: I don't understand this comment. It works fine locally with clang-cl, so this can be removed?


    hebasto commented at 3:54 AM on October 15, 2026:

    Reworked.

  178. in doc/dependencies.md:16 in 9ad9186387 outdated
      12 | @@ -13,7 +13,7 @@ Bitcoin Core requires one of the following compilers.
      13 |  | [Clang](https://clang.llvm.org) | [17.0](https://github.com/bitcoin/bitcoin/pull/33555) |
      14 |  | [GCC](https://gcc.gnu.org) | [12.1](https://github.com/bitcoin/bitcoin/pull/33842) |
      15 |  | [Xcode CLT](/doc/build-osx.md) | [16.2](https://github.com/bitcoin/bitcoin/pull/33932) |
      16 | -| [MSVC](/doc/build-windows-msvc.md) | [18.3](https://github.com/bitcoin/bitcoin/pull/33861) |
      17 | +| [MSVC](/doc/build-windows-native.md) | [18.3](https://github.com/bitcoin/bitcoin/pull/33861) |
    


    maflcko commented at 9:45 AM on October 14, 2026:

    is the rename 9ad9186387c6f9db8559966abcc7d32d5cef4c8e commit really needed? MSVC seems the internal name in cmake and is still used in the docs here. Either drop the commit or adjust this line?


    hodlinator commented at 11:43 AM on October 14, 2026:

    Think it's good to use more concrete terms, rather than the now somewhat virtual "MSVC". (I suggested the rename in #31507 (review)).

    #33861's title is "build: Bump VS minimum supported version to 18.3" and this is the "Compiler" section, so would combine them like so:

    | [VS (+ Clang-CL)](/doc/build-windows-native.md) | [18.3](https://github.com/bitcoin/bitcoin/pull/33861) |
    

    maflcko commented at 6:57 AM on October 15, 2026:

    I don't feel strongly, but maybe it would be good to either drop this commit or take the suggested change?

  179. maflcko approved
  180. maflcko commented at 9:46 AM on October 14, 2026: member

    review ACK 9ad9186387c6f9db8559966abcc7d32d5cef4c8e 🦃

    <details><summary>Show signature</summary>

    Signature:

    untrusted comment: signature from minisign secret key on empty file; verify via: minisign -Vm "${path_to_any_empty_file}" -P RWTRmVTMeKV5noAMqVlsMugDDCyyTSbA3Re5AkUrhvLVln0tSaFWglOw -x "${path_to_this_whole_four_line_signature_blob}"
    RUTRmVTMeKV5npGrKx1nqXCw5zeVHdtdYURB/KlyA/LMFgpNCs+SkW9a8N95d+U4AP1RJMi+krxU1A3Yux4bpwZNLvVBKy0wLgM=
    trusted comment: review ACK 9ad9186387c6f9db8559966abcc7d32d5cef4c8e 🦃
    8itgJwG8auSyAzNEstiSzsXnVu3UJQhnZkIVWx8leoJMWc7fUVzaD3ZfGYEl6yImTITXTgYrSUM1ygDbVooWBw==
    

    </details>

    <sub>self-note: #31507 (review)</sub>

  181. DrahtBot requested review from fanquake on Oct 14, 2026
  182. DrahtBot requested review from sedited on Oct 14, 2026
  183. DrahtBot requested review from hodlinator on Oct 14, 2026
  184. maflcko commented at 9:56 AM on October 14, 2026: member

    Also, I haven't tested this, but I presume it is still possible to compile with cl.exe and only a minimally modified repo: Basically only the in128 target_link_libraries(core_interface INTERFACE clang_rt.builtins-${system_arch_suffix} ) needs to be removed? (Would be nice to test for fun, but not a blocker)

  185. hebasto force-pushed on Oct 15, 2026
  186. DrahtBot added the label CI failed on Oct 15, 2026
  187. DrahtBot removed the label CI failed on Oct 15, 2026
  188. maflcko commented at 5:58 AM on October 15, 2026: member

    lgtm. Only change is addressing the small nits.

    review ACK f0b38b15f2d02c886afc4266c27468622bdc4f64 🎈

    <details><summary>Show signature</summary>

    Signature:

    untrusted comment: signature from minisign secret key on empty file; verify via: minisign -Vm "${path_to_any_empty_file}" -P RWTRmVTMeKV5noAMqVlsMugDDCyyTSbA3Re5AkUrhvLVln0tSaFWglOw -x "${path_to_this_whole_four_line_signature_blob}"
    RUTRmVTMeKV5npGrKx1nqXCw5zeVHdtdYURB/KlyA/LMFgpNCs+SkW9a8N95d+U4AP1RJMi+krxU1A3Yux4bpwZNLvVBKy0wLgM=
    trusted comment: review ACK f0b38b15f2d02c886afc4266c27468622bdc4f64 🎈
    B7t9vga7cted7KUYwaY2eWhlkGYd/Qfo1Kf+tTcRghaXal/LuVxcmcN2AKSidPrUTUQJyj+nbia16uNLvVL/Dw==
    

    </details>

  189. in CMakeLists.txt:364 in f0b38b15f2
     366 | -  # More likely to happen with no, or lower levels of optimisation.
     367 | -  # See discussion in https://github.com/bitcoin/bitcoin/issues/28109.
     368 | -  if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
     369 | -    try_append_cxx_flags("/bigobj" TARGET core_interface_debug SKIP_LINK)
     370 | -  else()
     371 | +    # Workaround producing large object files, which cannot be handled by the assembler.
    


    maflcko commented at 6:01 AM on October 15, 2026:

    llm nit (only if you re-touch):

    CMakeLists.txt: Workaround producing large object files, which cannot be handled by the assembler. → Workaround for large object files, which cannot be handled by the assembler. [The original phrasing makes it unclear what the workaround addresses.]


    hebasto commented at 1:53 PM on October 16, 2026:

    Thanks! Fixed.

  190. maflcko commented at 6:10 AM on October 15, 2026: member

    Ralph LLM left a nit in minisketch cmake, but I haven't looked myself, because this is dead and unreachable right now.

    <details><summary>Ralph LLM (experimental)</summary>

    clang-cl can miss Minisketch's CLMUL fast path (CMakePresets.json:12, head)

    Selecting ClangCL puts clang-cl under the MSVC CMake branch, but cmake/minisketch.cmake uses that variable to leave CLMUL_CXXFLAGS empty and probes _mm_clmulepi64_si128 without -mpclmul. The vendored Minisketch CMake check adds -mpclmul for non-MSVC compiler IDs, and the Bitcoin build includes the CLMUL sources only when the probe succeeds. As a result, clang-cl's default x64 target can fall back to generic Minisketch code even on CPUs with PCLMUL. Pass the feature flag to the probe and specialized sources while retaining runtime CPU dispatch. No production callers of MakeMinisketch32 were identified, so production impact is unconfirmed.

    </details>

  191. hebasto commented at 6:47 AM on October 15, 2026: member

    Ralph LLM left a nit in minisketch cmake, but I haven't looked myself, because this is dead and unreachable right now. Ralph LLM (experimental)

    This is a bug:

    -- Performing Test HAVE_CLMUL
    -- Performing Test HAVE_CLMUL - Failed
    

    It will be fixed in the next push.

  192. hodlinator commented at 8:41 AM on October 15, 2026: contributor

    /cmake/ccache.cmake has if(NOT MSVC) - Maybe we can enable ccache on Windows with clang-cl? :)

    /cmake/crc32c.cmake still uses if(MSVC) to vary SSE42_CXXFLAGS, is that still required with clang-cl?

    /cmake/introspection.cmake still guards intrinsic use behind if(NOT MSVC).

    /cmake/minisketch.cmake both has intrinsics and compiler warnings affected by MSVC. This is repeated again in /src/minisketch/cmake/SystemIntrospection.cmake. Same as found by Ralph above.

    /src/kernel/CMakeLists.txt has an MSVC guard against -Wunique-object-duplication

  193. DrahtBot requested review from hodlinator on Oct 15, 2026
  194. hebasto force-pushed on Oct 16, 2026
  195. DrahtBot added the label CI failed on Oct 16, 2026
  196. hebasto force-pushed on Oct 16, 2026
  197. hebasto commented at 1:35 PM on October 16, 2026: member

    Most of the recent feedback has been addressed.

    The first ~two~ commits have been split out into #36554, so please review that one first.

    /cmake/ccache.cmake has if(NOT MSVC) - Maybe we can enable ccache on Windows with clang-cl? :)

    In my experience, this can have non-obvious pitfalls and requires extensive testing, so I'd rather leave it for a follow-up.

  198. DrahtBot removed the label CI failed on Oct 16, 2026
  199. in src/compat/byteswap.h:32 in 9036044d63 outdated
      34 |  #endif
      35 |  
      36 | -// MSVC's _byteswap_* functions are not constexpr
      37 | -
      38 | -#ifndef _MSC_VER
      39 | +#ifndef BSWAP_CONSTEXPR
    


    hodlinator commented at 9:35 AM on October 19, 2026:

    Seems like we can remove BSWAP_CONSTEXPR from the code entirely in the commit "cmake: Drop support for MSVC" since it's never defined above?


    hebasto commented at 10:09 AM on October 24, 2026:

    Thanks! Reworked.


    hodlinator commented at 9:28 AM on October 26, 2026:

    thread #31507 (review):

    Meant that something like this could be done in that commit, replacing inline BSWAP_CONSTEXPR with constexpr:

    --- a/src/compat/byteswap.h
    +++ b/src/compat/byteswap.h
    @@ -29,11 +29,7 @@
     #  endif
     #endif
    
    -#ifndef BSWAP_CONSTEXPR
    -#define BSWAP_CONSTEXPR constexpr
    -#endif
    -
    -inline BSWAP_CONSTEXPR uint16_t internal_bswap_16(uint16_t x)
    +constexpr uint16_t internal_bswap_16(uint16_t x)
     {
     #ifdef bitcoin_builtin_bswap16
         return bitcoin_builtin_bswap16(x);
    @@ -42,7 +38,7 @@ inline BSWAP_CONSTEXPR uint16_t internal_bswap_16(uint16_t x)
     #endif
     }
    
    -inline BSWAP_CONSTEXPR uint32_t internal_bswap_32(uint32_t x)
    +constexpr uint32_t internal_bswap_32(uint32_t x)
     {
     #ifdef bitcoin_builtin_bswap32
         return bitcoin_builtin_bswap32(x);
    @@ -52,7 +48,7 @@ inline BSWAP_CONSTEXPR uint32_t internal_bswap_32(uint32_t x)
     #endif
     }
    
    -inline BSWAP_CONSTEXPR uint64_t internal_bswap_64(uint64_t x)
    +constexpr uint64_t internal_bswap_64(uint64_t x)
     {
     #ifdef bitcoin_builtin_bswap64
         return bitcoin_builtin_bswap64(x);
    
  200. in doc/dependencies.md:16 in 9036044d63 outdated
      12 | @@ -13,7 +13,7 @@ Bitcoin Core requires one of the following compilers.
      13 |  | [Clang](https://clang.llvm.org) | [17.0](https://github.com/bitcoin/bitcoin/pull/33555) |
      14 |  | [GCC](https://gcc.gnu.org) | [12.1](https://github.com/bitcoin/bitcoin/pull/33842) |
      15 |  | [Xcode CLT](/doc/build-osx.md) | [16.2](https://github.com/bitcoin/bitcoin/pull/33932) |
      16 | -| [MSVC](/doc/build-windows-msvc.md) | [18.3](https://github.com/bitcoin/bitcoin/pull/33861) |
      17 | +| [Visual Studio (with clang-cl)](/doc/build-windows-native.md) | [17.14](https://github.com/bitcoin/bitcoin/pull/31507) |
    


    hodlinator commented at 12:21 PM on October 19, 2026:

    I'm not sure Visual Studio 17.14 is sufficient. This PR seems to require something fairly recent. VS 18.11.0 October 2026 Feature update (Clang-CL 22.1.3) worked for me. Maybe this was intermittently broken and then fixed again? Below is my experience with a February 2026 release (Clang-CL 20.1.8), not sure about the exact VS version.

    <details><summary>Details on VS February 2026 issue</summary>

    C:\Users\hodlinator\bitcoin>.\build\bin\Release\bitcoind.exe
    The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail.
    

    Windows Event Viewer shows: Activation context generation failed for "C:\Users\hodlinator\bitcoin\build\bin\Release\bitcoind.exe".Error in manifest or policy file "C:\Users\hodlinator\bitcoin\build\bin\Release\bitcoind.exe" on line 6. The required attribute level is missing from element requestedExecutionLevel.

    PR manifest:

    mt -inputresource:build\bin\Release\bitcoin.exe;#1 -out:foo.manifest
    
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <ms_asmv1:trustInfo xmlns="urn:schemas-microsoft-com:asm.v3" xmlns:ms_asmv1="urn:schemas-microsoft-com:asm.v1">
        <ms_asmv1:security>
          <ms_asmv1:requestedPrivileges>
            <ms_asmv1:requestedExecutionLevel ms_asmv1:level="asInvoker" ms_asmv1:uiAccess="false"></ms_asmv1:requestedExecutionLevel>
          </ms_asmv1:requestedPrivileges>
        </ms_asmv1:security>
      </ms_asmv1:trustInfo>
      <assemblyIdentity type="win32" name="org.bitcoincore.bitcoin" version="32.99.0.0"></assemblyIdentity>
      <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
          <activeCodePage>UTF-8</activeCodePage>
        </asmv3:windowsSettings>
      </asmv3:application>
    </assembly>
    

    PR base manifest (with some extra whitespace):

    mt -inputresource:build-base\bin\Release\bitcoin.exe;#1 -out:foo-base.manifest
    
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
      <assemblyIdentity type="win32" name="org.bitcoincore.bitcoin" version="32.99.0.0"></assemblyIdentity>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
          <activeCodePage>UTF-8</activeCodePage>
        </asmv3:windowsSettings>
      </asmv3:application>
    </assembly>
    

    This issue was pointed out in https://github.com/llvm/llvm-project/issues/120394 and fixed in https://github.com/llvm/llvm-project/pull/165285 in October 2025.

    C:\Users\hodlinator\bitcoin>clang-cl --version
    clang version 20.1.8
    

    Looking at https://releases.llvm.org/, it only has clang 20.1.0 which was released in March 2025.

    The latest commit in the https://github.com/llvm/llvm-project/tree/release/20.x branch is from July 2025.

    </details>


    hebasto commented at 4:30 PM on October 22, 2026:

    VS 18.11.0 October 2026 Feature update (Clang-CL 22.1.3) worked for me.

    ~Yes. It seems to be the first Clang version that adopts the manifest fix and shipped in VS.~

    UPDATE. 18.7.0 was the first one. See https://walbourn.github.io/vs-2026-update-10/.


    maflcko commented at 5:05 PM on October 22, 2026:
    | [Visual Studio (with clang-cl)](/doc/build-windows-native.md) | [18.11](https://github.com/bitcoin/bitcoin/pull/31507) |
    

    If 18.11 is known to work, and prior versions are know to not work, the docs should say so? Unless someone has tested a prior version and it is known to work, the docs shouldn't claim so?


    hebasto commented at 11:08 AM on October 24, 2026:

    PR manifest:

    mt -inputresource:build\bin\Release\bitcoin.exe;#1 -out:foo.manifest
    

    Related to #33585.


    hebasto commented at 11:08 AM on October 24, 2026:

    The docs have been updated.


    hodlinator commented at 9:45 AM on October 26, 2026:

    If 18.11 is known to work, and prior versions are know to not work, the docs should say so? Unless someone has tested a prior version and it is known to work, the docs shouldn't claim so?

    I've been looking but it seems Visual Studio only has a "back-catalogue" of versions for Professional and Enterprise editions, and I'm on Community. As per https://learn.microsoft.com/en-us/visualstudio/releases/2026/release-history:

    The Visual Studio Community edition is only supported on the Stable channel using the latest version of Visual Studio.

    I've been looking for a version table including clang-cl version but the best I could come up with was the same https://walbourn.github.io/ site referenced in #31507 (review).

    I'm okay with trusting that for now. If a user is running an older version it's trivial for them to upgrade and report an issue.

    Maybe the commit message could be amended to specify that 18.7 was not confirmed to work during review, but 18.11 was.


    hebasto commented at 11:11 AM on October 26, 2026:

    Maybe the commit message could be amended to specify that 18.7 was not confirmed to work during review, but 18.11 was.

    It seems possible for reviewers to reinstall VS 18.7 as follows:

    winget install --id Microsoft.VisualStudio.Community --exact --version 18.7.0 --override "--wait --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.Git --includeRecommended"
    

    hodlinator commented at 7:42 PM on October 26, 2026:

    Thanks for the help in being able to get older VS Community versions!

    • Uninstalled VS.
    • Installed VS 18.6.0, confirmed Clang-CL 20.1.8.
    • Rebuilt Bitcoin Core binaries & confirmed they had broken manifests, preventing them from executing. ✅
    • Upgraded VS 18.7.0, confirmed Clang-CL 22.1.3.
    • Rebuilt Bitcoin Core binaries & confirmed they had functioning manifests, allowing them to execute. ✅
  201. hebasto force-pushed on Oct 19, 2026
  202. hodlinator commented at 6:48 AM on October 20, 2026: contributor

    Reviewed 9036044d63bf8c6f43cb8c1f9a159e3e230dee06

    Largest remaining concern is version in dependencies.md, maybe we should switch to specifying the Clang-CL version rather than VS version, or both?

  203. DrahtBot added the label Needs rebase on Oct 21, 2026
  204. hebasto force-pushed on Oct 22, 2026
  205. hebasto commented at 4:32 PM on October 22, 2026: member

    @hodlinator

    Largest remaining concern is version in dependencies.md, maybe we should switch to specifying the Clang-CL version rather than VS version, or both?

    Any concrete suggestion in your mind? I'm all ears!

  206. DrahtBot added the label CI failed on Oct 22, 2026
  207. cmake: Add `[[maybe_unused]]` annotation to atomic library check
    The check fails when `-Wall -Werror` are provided by the user as the
    unused `d1` variable triggers `-Wunused-variable`. Since the fallback
    check with `LINK_LIBRARIES atomic` compiles the same source, it fails
    too, and configuration aborts with "Cannot figure out how to use
    std::atomic."
    aba0ec3f42
  208. cmake: Initialize variables in ARMv8 SHA-NI check
    The check fails when `-Wall -Werror` are provided by the user as
    uninitialized `uint32x4_t` arguments trigger `-Wuninitialized`. This
    results in disabling the ARMv8 SHA-NI code path.
    
    This is also a prerequisite for the following commit.
    9b77227fec
  209. cmake, crc32c: Make SSE4.2 check warning-free
    The check fails when `-Wconversion -Werror` (GCC and Clang) or
    `-Weverything -Werror` (Clang) are provided by the user. This results
    in disabling the SSE4.2-based CRC32C implementation.
    54f8380beb
  210. cmake, minisketch: Make CLMUL check warning-free
    The check fails when `-Wsign-conversion -Werror` (GCC and Clang) or
    `-Weverything -Werror` (Clang) are provided by the user. This results
    in disabling the CLMUL-based implementation.
    2675565690
  211. cmake: Make sanitizer and fuzzer checks warning-free
    Both checks fail when `-Wextra -Werror` (GCC and Clang), or
    `-Wmissing-declarations -Werror` (GCC) / `-Weverything -Werror` (Clang),
    are provided by the user.
    6b43006932
  212. cmake: Treat warnings as errors in `CheckSourceCompilesWithFlags`
    We expect that neither the compiler flags nor the test source triggers
    any warnings, such as `-Wunknown-argument`. Therefore, append
    `working_compiler_werror_flag`, as done in `try_append_cxx_flags`.
    f1a92017f4
  213. cmake, crypto: Use `-msse4.1` instead of `-msse4` for x86 SHA-NI
    `-msse4` is merely a synonym for `-msse4.2` in both GCC and Clang, but
    it is not accepted by the clang-cl frontend. Furthermore, the x86
    SHA-NI code uses only SSE4.1 intrinsics and no SSE4.2 ones.
    
    Replace `-msse4` with `-msse4.1` to resolve both issues.
    
    The absence of SSE4.2 usage can be verified by building with
    `-DAPPEND_CXXFLAGS=-mno-sse4.2`.
    b471c3f70d
  214. cmake: Always link `bitcoinqt` to `shlwapi` when building on Windows bac235f23c
  215. cmake: Link to clang-cl builtins library on Windows 78200d7edc
  216. hebasto force-pushed on Oct 24, 2026
  217. hebasto commented at 11:16 AM on October 24, 2026: member

    Thanks to all reviewers!

    I believe all your feedback has been addressed now. Please let me know if I've missed anything.

  218. DrahtBot removed the label CI failed on Oct 24, 2026
  219. DrahtBot removed the label Needs rebase on Oct 24, 2026
  220. hebasto commented at 5:34 PM on October 24, 2026: member

    Successfully built using the minimum required VS 18.7.0:

    >"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -all -property catalog_productDisplayVersion
    18.7.0
    
    >build\bin\Release\bitcoin.exe --version
    Bitcoin Core version v32.99.0-b80fae42149d
    Copyright (C) 2009-2026 The Bitcoin Core developers
    
    Please contribute if you find Bitcoin Core useful. Visit
    <https://bitcoincore.org/> for further information about the software.
    The source code is available from <https://github.com/bitcoin/bitcoin>.
    
    This is experimental software.
    Distributed under the MIT software license, see the accompanying file COPYING
    or <https://opensource.org/license/MIT>
    
    

    UPDATE. The previous version 18.6.3 with Clang 20.1.8 produces binaries with broken manifests, which confirms @hodlinator's comment:

    >"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -all -property catalog_productDisplayVersion
    18.6.3
    
    >.\build\bin\Release\bitcoin.exe --version
    The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail.
    
    
  221. hodlinator commented at 9:37 AM on October 26, 2026: contributor

    Reviewed b80fae42149daeb581acee864a41783f84957eb1

  222. cmake: Adjust diagnostic flags for clang-cl
    Being compatible with cl.exe, clang-cl supports most of the same
    command-line options. These options are typically guarded by the `MSVC`
    CMake variable.
    
    Options not supported by clang-cl, such as `/wdNNN`, are now guarded by
    `CMAKE_CXX_COMPILER_ID STREQUAL "MSVC"`.
    d51c54a3f0
  223. Couple `BSWAP_CONSTEXPR` definition to bswap implementation
    Previously `BSWAP_CONSTEXPR` was defined empty whenever `_MSC_VER` was
    defined. However, clang-cl also defines `_MSC_VER` while it selects
    Clang's `__builtin_bswap*` builtins, which are `constexpr`.
    70ccc70f11
  224. cmake: Drop support for the MSVC compiler (cl.exe)
    Native Windows builds now require clang-cl.exe, which Visual Studio
    provides as an optional component ("C++ Clang tools for Windows").
    
    The minimum Visual Studio version therefore rises from 2026 18.3
    (required for cl.exe) to 2026 18.7, the first release whose bundled
    LLVM (22.1.3) includes the following bugfix:
    https://github.com/llvm/llvm-project/pull/165285
    2a93c9e8f7
  225. doc: Add clang-cl release notes afc753659a
  226. doc: Rename `build-windows-msvc.md` to `build-windows-native.md` dc230de70c
  227. hebasto force-pushed on Oct 26, 2026
  228. hebasto commented at 11:22 AM on October 26, 2026: member

    @hodlinator

    Thank you for the feedback.

    All the changes you requested were already done locally but somehow didn’t make it into my previous push. Should be fine now.

  229. hodlinator approved
  230. hodlinator commented at 7:44 PM on October 26, 2026: contributor

    ACK dc230de70c88c2be1d9b828cdcf64f1dff738d7b

    Performed range-diff to confirm initial 7 commits match #36554, only rebased (git range-diff 5bb7c564...b471c3f7, already ACKed).

  231. DrahtBot requested review from maflcko on Oct 26, 2026

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-10-30 09:41 UTC