_Z6Paramsv:
  105|  45.2k|const CChainParams &Params() {
  106|  45.2k|    assert(globalChainParams);
  107|  45.2k|    return *globalChainParams;
  108|  45.2k|}

_ZN11ArgsManagerD2Ev:
  134|      2|ArgsManager::~ArgsManager() = default;
_ZNK11ArgsManager7GetArgsERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  363|  86.3k|{
  364|  86.3k|    std::vector<std::string> result;
  365|  86.3k|    for (const common::SettingsValue& value : GetSettingsList(strArg)) {
  ------------------
  |  Branch (365:45): [True: 0, False: 86.3k]
  ------------------
  366|      0|        result.push_back(value.isFalse() ? "0" : value.isTrue() ? "1" : value.get_str());
  ------------------
  |  Branch (366:26): [True: 0, False: 0]
  |  Branch (366:50): [True: 0, False: 0]
  ------------------
  367|      0|    }
  368|  86.3k|    return result;
  369|  86.3k|}
_ZNK11ArgsManager9GetIntArgERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEl:
  483|  43.1k|{
  484|  43.1k|    return GetIntArg(strArg).value_or(nDefault);
  485|  43.1k|}
_ZNK11ArgsManager9GetIntArgERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  488|  43.1k|{
  489|  43.1k|    const common::SettingsValue value = GetSetting(strArg);
  490|  43.1k|    return SettingToInt(value);
  491|  43.1k|}
_Z12SettingToIntRK8UniValue:
  494|  43.1k|{
  495|  43.1k|    if (value.isNull()) return std::nullopt;
  ------------------
  |  Branch (495:9): [True: 43.1k, False: 0]
  ------------------
  496|      0|    if (value.isFalse()) return 0;
  ------------------
  |  Branch (496:9): [True: 0, False: 0]
  ------------------
  497|      0|    if (value.isTrue()) return 1;
  ------------------
  |  Branch (497:9): [True: 0, False: 0]
  ------------------
  498|      0|    if (value.isNum()) return value.getInt<int64_t>();
  ------------------
  |  Branch (498:9): [True: 0, False: 0]
  ------------------
  499|      0|    return LocaleIndependentAtoi<int64_t>(value.get_str());
  500|      0|}
_ZNK11ArgsManager17UseDefaultSectionERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  821|   129k|{
  822|   129k|    return m_network == ChainTypeToString(ChainType::MAIN) || m_network_only_args.count(arg) == 0;
  ------------------
  |  Branch (822:12): [True: 129k, False: 0]
  |  Branch (822:63): [True: 0, False: 0]
  ------------------
  823|   129k|}
_ZNK11ArgsManager10GetSettingERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  826|  43.1k|{
  827|  43.1k|    LOCK(cs_args);
  ------------------
  |  |  257|  43.1k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|  43.1k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|  43.1k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|  43.1k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  828|  43.1k|    return common::GetSetting(
  829|  43.1k|        m_settings, m_network, SettingName(arg), !UseDefaultSection(arg),
  830|  43.1k|        /*ignore_nonpersistent=*/false, /*get_chain_type=*/false);
  831|  43.1k|}
_ZNK11ArgsManager15GetSettingsListERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  834|  86.3k|{
  835|  86.3k|    LOCK(cs_args);
  ------------------
  |  |  257|  86.3k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|  86.3k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|  86.3k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|  86.3k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  836|  86.3k|    return common::GetSettingsList(m_settings, m_network, SettingName(arg), !UseDefaultSection(arg));
  837|  86.3k|}
args.cpp:_ZL11SettingNameRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
   67|   129k|{
   68|   129k|    return arg.size() > 0 && arg[0] == '-' ? arg.substr(1) : arg;
  ------------------
  |  Branch (68:12): [True: 129k, False: 0]
  |  Branch (68:30): [True: 129k, False: 0]
  ------------------
   69|   129k|}

_ZN11ArgsManager9ClearArgsEv:
  362|      2|    void ClearArgs() {
  363|      2|        LOCK(cs_args);
  ------------------
  |  |  257|      2|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|      2|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|      2|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|      2|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  364|      2|        m_available_args.clear();
  365|      2|        m_network_only_args.clear();
  366|      2|    }

_ZN6common10GetSettingERKNS_8SettingsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_bbb:
  152|  43.1k|{
  153|  43.1k|    SettingsValue result;
  154|  43.1k|    bool done = false; // Done merging any more settings sources.
  155|  43.1k|    MergeSettings(settings, section, name, [&](SettingsSpan span, Source source) {
  156|       |        // Weird behavior preserved for backwards compatibility: Apply negated
  157|       |        // setting even if non-negated setting would be ignored. A negated
  158|       |        // value in the default section is applied to network specific options,
  159|       |        // even though normal non-negated values there would be ignored.
  160|  43.1k|        const bool never_ignore_negated_setting = span.last_negated();
  161|       |
  162|       |        // Weird behavior preserved for backwards compatibility: Take first
  163|       |        // assigned value instead of last. In general, later settings take
  164|       |        // precedence over early settings, but for backwards compatibility in
  165|       |        // the config file the precedence is reversed for all settings except
  166|       |        // chain type settings.
  167|  43.1k|        const bool reverse_precedence =
  168|  43.1k|            (source == Source::CONFIG_FILE_NETWORK_SECTION || source == Source::CONFIG_FILE_DEFAULT_SECTION) &&
  169|  43.1k|            !get_chain_type;
  170|       |
  171|       |        // Weird behavior preserved for backwards compatibility: Negated
  172|       |        // -regtest and -testnet arguments which you would expect to override
  173|       |        // values set in the configuration file are currently accepted but
  174|       |        // silently ignored. It would be better to apply these just like other
  175|       |        // negated values, or at least warn they are ignored.
  176|  43.1k|        const bool skip_negated_command_line = get_chain_type;
  177|       |
  178|  43.1k|        if (done) return;
  179|       |
  180|       |        // Ignore settings in default config section if requested.
  181|  43.1k|        if (ignore_default_section_config && source == Source::CONFIG_FILE_DEFAULT_SECTION &&
  182|  43.1k|            !never_ignore_negated_setting) {
  183|  43.1k|            return;
  184|  43.1k|        }
  185|       |
  186|       |        // Ignore nonpersistent settings if requested.
  187|  43.1k|        if (ignore_nonpersistent && (source == Source::COMMAND_LINE || source == Source::FORCED)) return;
  188|       |
  189|       |        // Skip negated command line settings.
  190|  43.1k|        if (skip_negated_command_line && span.last_negated()) return;
  191|       |
  192|  43.1k|        if (!span.empty()) {
  193|  43.1k|            result = reverse_precedence ? span.begin()[0] : span.end()[-1];
  194|  43.1k|            done = true;
  195|  43.1k|        } else if (span.last_negated()) {
  196|  43.1k|            result = false;
  197|  43.1k|            done = true;
  198|  43.1k|        }
  199|  43.1k|    });
  200|  43.1k|    return result;
  201|  43.1k|}
_ZN6common15GetSettingsListERKNS_8SettingsERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEESB_b:
  207|  86.3k|{
  208|  86.3k|    std::vector<SettingsValue> result;
  209|  86.3k|    bool done = false; // Done merging any more settings sources.
  210|  86.3k|    bool prev_negated_empty = false;
  211|  86.3k|    MergeSettings(settings, section, name, [&](SettingsSpan span, Source source) {
  212|       |        // Weird behavior preserved for backwards compatibility: Apply config
  213|       |        // file settings even if negated on command line. Negating a setting on
  214|       |        // command line will ignore earlier settings on the command line and
  215|       |        // ignore settings in the config file, unless the negated command line
  216|       |        // value is followed by non-negated value, in which case config file
  217|       |        // settings will be brought back from the dead (but earlier command
  218|       |        // line settings will still be ignored).
  219|  86.3k|        const bool add_zombie_config_values =
  220|  86.3k|            (source == Source::CONFIG_FILE_NETWORK_SECTION || source == Source::CONFIG_FILE_DEFAULT_SECTION) &&
  221|  86.3k|            !prev_negated_empty;
  222|       |
  223|       |        // Ignore settings in default config section if requested.
  224|  86.3k|        if (ignore_default_section_config && source == Source::CONFIG_FILE_DEFAULT_SECTION) return;
  225|       |
  226|       |        // Add new settings to the result if isn't already complete, or if the
  227|       |        // values are zombies.
  228|  86.3k|        if (!done || add_zombie_config_values) {
  229|  86.3k|            for (const auto& value : span) {
  230|  86.3k|                if (value.isArray()) {
  231|  86.3k|                    result.insert(result.end(), value.getValues().begin(), value.getValues().end());
  232|  86.3k|                } else {
  233|  86.3k|                    result.push_back(value);
  234|  86.3k|                }
  235|  86.3k|            }
  236|  86.3k|        }
  237|       |
  238|       |        // If a setting was negated, or if a setting was forced, set
  239|       |        // done to true to ignore any later lower priority settings.
  240|  86.3k|        done |= span.negated() > 0 || source == Source::FORCED;
  241|       |
  242|       |        // Update the negated and empty state used for the zombie values check.
  243|  86.3k|        prev_negated_empty |= span.last_negated() && result.empty();
  244|  86.3k|    });
  245|  86.3k|    return result;
  246|  86.3k|}
settings.cpp:_ZN6common12_GLOBAL__N_113MergeSettingsIZNS_10GetSettingERKNS_8SettingsERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_bbbE3$_0EEvS4_SD_SD_OT_:
   42|  43.1k|{
   43|       |    // Merge in the forced settings
   44|  43.1k|    if (auto* value = FindKey(settings.forced_settings, name)) {
  ------------------
  |  Branch (44:15): [True: 0, False: 43.1k]
  ------------------
   45|      0|        fn(SettingsSpan(*value), Source::FORCED);
   46|      0|    }
   47|       |    // Merge in the command-line options
   48|  43.1k|    if (auto* values = FindKey(settings.command_line_options, name)) {
  ------------------
  |  Branch (48:15): [True: 0, False: 43.1k]
  ------------------
   49|      0|        fn(SettingsSpan(*values), Source::COMMAND_LINE);
   50|      0|    }
   51|       |    // Merge in the read-write settings
   52|  43.1k|    if (const SettingsValue* value = FindKey(settings.rw_settings, name)) {
  ------------------
  |  Branch (52:30): [True: 0, False: 43.1k]
  ------------------
   53|      0|        fn(SettingsSpan(*value), Source::RW_SETTINGS);
   54|      0|    }
   55|       |    // Merge in the network-specific section of the config file
   56|  43.1k|    if (!section.empty()) {
  ------------------
  |  Branch (56:9): [True: 43.1k, False: 0]
  ------------------
   57|  43.1k|        if (auto* map = FindKey(settings.ro_config, section)) {
  ------------------
  |  Branch (57:19): [True: 0, False: 43.1k]
  ------------------
   58|      0|            if (auto* values = FindKey(*map, name)) {
  ------------------
  |  Branch (58:23): [True: 0, False: 0]
  ------------------
   59|      0|                fn(SettingsSpan(*values), Source::CONFIG_FILE_NETWORK_SECTION);
   60|      0|            }
   61|      0|        }
   62|  43.1k|    }
   63|       |    // Merge in the default section of the config file
   64|  43.1k|    if (auto* map = FindKey(settings.ro_config, "")) {
  ------------------
  |  Branch (64:15): [True: 0, False: 43.1k]
  ------------------
   65|      0|        if (auto* values = FindKey(*map, name)) {
  ------------------
  |  Branch (65:19): [True: 0, False: 0]
  ------------------
   66|      0|            fn(SettingsSpan(*values), Source::CONFIG_FILE_DEFAULT_SECTION);
   67|      0|        }
   68|      0|    }
   69|  43.1k|}
settings.cpp:_ZN6common12_GLOBAL__N_113MergeSettingsIZNS_15GetSettingsListERKNS_8SettingsERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_bE3$_0EEvS4_SD_SD_OT_:
   42|  86.3k|{
   43|       |    // Merge in the forced settings
   44|  86.3k|    if (auto* value = FindKey(settings.forced_settings, name)) {
  ------------------
  |  Branch (44:15): [True: 0, False: 86.3k]
  ------------------
   45|      0|        fn(SettingsSpan(*value), Source::FORCED);
   46|      0|    }
   47|       |    // Merge in the command-line options
   48|  86.3k|    if (auto* values = FindKey(settings.command_line_options, name)) {
  ------------------
  |  Branch (48:15): [True: 0, False: 86.3k]
  ------------------
   49|      0|        fn(SettingsSpan(*values), Source::COMMAND_LINE);
   50|      0|    }
   51|       |    // Merge in the read-write settings
   52|  86.3k|    if (const SettingsValue* value = FindKey(settings.rw_settings, name)) {
  ------------------
  |  Branch (52:30): [True: 0, False: 86.3k]
  ------------------
   53|      0|        fn(SettingsSpan(*value), Source::RW_SETTINGS);
   54|      0|    }
   55|       |    // Merge in the network-specific section of the config file
   56|  86.3k|    if (!section.empty()) {
  ------------------
  |  Branch (56:9): [True: 86.3k, False: 0]
  ------------------
   57|  86.3k|        if (auto* map = FindKey(settings.ro_config, section)) {
  ------------------
  |  Branch (57:19): [True: 0, False: 86.3k]
  ------------------
   58|      0|            if (auto* values = FindKey(*map, name)) {
  ------------------
  |  Branch (58:23): [True: 0, False: 0]
  ------------------
   59|      0|                fn(SettingsSpan(*values), Source::CONFIG_FILE_NETWORK_SECTION);
   60|      0|            }
   61|      0|        }
   62|  86.3k|    }
   63|       |    // Merge in the default section of the config file
   64|  86.3k|    if (auto* map = FindKey(settings.ro_config, "")) {
  ------------------
  |  Branch (64:15): [True: 0, False: 86.3k]
  ------------------
   65|      0|        if (auto* values = FindKey(*map, name)) {
  ------------------
  |  Branch (65:19): [True: 0, False: 0]
  ------------------
   66|      0|            fn(SettingsSpan(*values), Source::CONFIG_FILE_DEFAULT_SECTION);
   67|      0|        }
   68|      0|    }
   69|  86.3k|}

_ZN6common7FindKeyIRKNSt3__13mapINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE8UniValueNS1_4lessIS8_EENS6_INS1_4pairIKS8_S9_EEEEEERSD_EEDTadcldtfp_2atfp0_EEOT_OT0_:
  108|   259k|{
  109|   259k|    auto it = map.find(key);
  110|   259k|    return it == map.end() ? nullptr : &it->second;
  ------------------
  |  Branch (110:12): [True: 259k, False: 0]
  ------------------
  111|   259k|}
_ZN6common7FindKeyIRKNSt3__13mapINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_6vectorI8UniValueNS6_ISA_EEEENS1_4lessIS8_EENS6_INS1_4pairIKS8_SC_EEEEEERSG_EEDTadcldtfp_2atfp0_EEOT_OT0_:
  108|   129k|{
  109|   129k|    auto it = map.find(key);
  110|   129k|    return it == map.end() ? nullptr : &it->second;
  ------------------
  |  Branch (110:12): [True: 129k, False: 0]
  ------------------
  111|   129k|}
_ZN6common7FindKeyIRKNSt3__13mapINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS2_IS8_NS1_6vectorI8UniValueNS6_ISA_EEEENS1_4lessIS8_EENS6_INS1_4pairIKS8_SC_EEEEEESE_NS6_INSF_ISG_SJ_EEEEEERSG_EEDTadcldtfp_2atfp0_EEOT_OT0_:
  108|   129k|{
  109|   129k|    auto it = map.find(key);
  110|   129k|    return it == map.end() ? nullptr : &it->second;
  ------------------
  |  Branch (110:12): [True: 129k, False: 0]
  ------------------
  111|   129k|}
_ZN6common7FindKeyIRKNSt3__13mapINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS2_IS8_NS1_6vectorI8UniValueNS6_ISA_EEEENS1_4lessIS8_EENS6_INS1_4pairIKS8_SC_EEEEEESE_NS6_INSF_ISG_SJ_EEEEEERA1_KcEEDTadcldtfp_2atfp0_EEOT_OT0_:
  108|   129k|{
  109|   129k|    auto it = map.find(key);
  110|   129k|    return it == map.end() ? nullptr : &it->second;
  ------------------
  |  Branch (110:12): [True: 129k, False: 0]
  ------------------
  111|   129k|}

_Z17internal_bswap_16t:
   45|   735k|{
   46|   735k|#ifdef bitcoin_builtin_bswap16
   47|   735k|    return bitcoin_builtin_bswap16(x);
  ------------------
  |  |   21|   735k|#      define bitcoin_builtin_bswap16(x) __builtin_bswap16(x)
  ------------------
   48|       |#else
   49|       |    return (x >> 8) | (x << 8);
   50|       |#endif
   51|   735k|}
_Z17internal_bswap_32j:
   54|  4.27M|{
   55|  4.27M|#ifdef bitcoin_builtin_bswap32
   56|  4.27M|    return bitcoin_builtin_bswap32(x);
  ------------------
  |  |   24|  4.27M|#      define bitcoin_builtin_bswap32(x) __builtin_bswap32(x)
  ------------------
   57|       |#else
   58|       |    return (((x & 0xff000000U) >> 24) | ((x & 0x00ff0000U) >>  8) |
   59|       |            ((x & 0x0000ff00U) <<  8) | ((x & 0x000000ffU) << 24));
   60|       |#endif
   61|  4.27M|}
_Z17internal_bswap_64m:
   64|  1.26k|{
   65|  1.26k|#ifdef bitcoin_builtin_bswap64
   66|  1.26k|    return bitcoin_builtin_bswap64(x);
  ------------------
  |  |   27|  1.26k|#      define bitcoin_builtin_bswap64(x) __builtin_bswap64(x)
  ------------------
   67|       |#else
   68|       |     return (((x & 0xff00000000000000ull) >> 56)
   69|       |          | ((x & 0x00ff000000000000ull) >> 40)
   70|       |          | ((x & 0x0000ff0000000000ull) >> 24)
   71|       |          | ((x & 0x000000ff00000000ull) >> 8)
   72|       |          | ((x & 0x00000000ff000000ull) << 8)
   73|       |          | ((x & 0x0000000000ff0000ull) << 24)
   74|       |          | ((x & 0x000000000000ff00ull) << 40)
   75|       |          | ((x & 0x00000000000000ffull) << 56));
   76|       |#endif
   77|  1.26k|}

_Z16be16toh_internalt:
   24|   735k|{
   25|   735k|    if constexpr (std::endian::native == std::endian::little) return internal_bswap_16(big_endian_16bits);
   26|       |        else return big_endian_16bits;
   27|   735k|}
_Z16htobe32_internalj:
   34|  10.1k|{
   35|  10.1k|    if constexpr (std::endian::native == std::endian::little) return internal_bswap_32(host_32bits);
   36|       |        else return host_32bits;
   37|  10.1k|}
_Z16be32toh_internalj:
   44|  4.26M|{
   45|  4.26M|    if constexpr (std::endian::native == std::endian::little) return internal_bswap_32(big_endian_32bits);
   46|       |        else return big_endian_32bits;
   47|  4.26M|}
_Z16htobe64_internalm:
   54|  1.26k|{
   55|  1.26k|    if constexpr (std::endian::native == std::endian::little) return internal_bswap_64(host_64bits);
   56|       |        else return host_64bits;
   57|  1.26k|}
_Z16htole64_internalm:
   59|   158k|{
   60|       |    if constexpr (std::endian::native == std::endian::big) return internal_bswap_64(host_64bits);
   61|   158k|        else return host_64bits;
   62|   158k|}
_Z16le64toh_internalm:
   69|   277k|{
   70|       |    if constexpr (std::endian::native == std::endian::big) return internal_bswap_64(little_endian_64bits);
   71|   277k|        else return little_endian_64bits;
   72|   277k|}

_ZN15ChaCha20AlignedD2Ev:
   43|      2|{
   44|      2|    memory_cleanse(input, sizeof(input));
   45|      2|}
_ZN8ChaCha20D2Ev:
  333|      2|{
  334|      2|    memory_cleanse(m_buffer.data(), m_buffer.size());
  335|      2|}

_Z8ReadLE64ITk8ByteTypehEmPKT_:
   36|   277k|{
   37|   277k|    uint64_t x;
   38|   277k|    memcpy(&x, ptr, 8);
   39|   277k|    return le64toh_internal(x);
   40|   277k|}
_Z9WriteLE64ITk8ByteTypehEvPT_m:
   58|   158k|{
   59|   158k|    uint64_t v = htole64_internal(x);
   60|   158k|    memcpy(ptr, &v, 8);
   61|   158k|}
_Z8ReadBE16ITk8ByteTypehEtPKT_:
   65|   735k|{
   66|   735k|    uint16_t x;
   67|   735k|    memcpy(&x, ptr, 2);
   68|   735k|    return be16toh_internal(x);
   69|   735k|}
_Z9WriteBE32ITk8ByteTypehEvPT_j:
   96|  10.1k|{
   97|  10.1k|    uint32_t v = htobe32_internal(x);
   98|  10.1k|    memcpy(ptr, &v, 4);
   99|  10.1k|}
_Z8ReadBE32ITk8ByteTypehEjPKT_:
   73|  4.26M|{
   74|  4.26M|    uint32_t x;
   75|  4.26M|    memcpy(&x, ptr, 4);
   76|  4.26M|    return be32toh_internal(x);
   77|  4.26M|}
_Z9WriteBE64ITk8ByteTypehEvPT_m:
  103|  1.26k|{
  104|  1.26k|    uint64_t v = htobe64_internal(x);
  105|  1.26k|    memcpy(ptr, &v, 8);
  106|  1.26k|}

_ZN7CSHA256C2Ev:
  697|  3.37k|{
  698|  3.37k|    sha256::Initialize(s);
  699|  3.37k|}
_ZN7CSHA2565WriteEPKhm:
  702|  3.79k|{
  703|  3.79k|    const unsigned char* end = data + len;
  704|  3.79k|    size_t bufsize = bytes % 64;
  705|  3.79k|    if (bufsize && bufsize + len >= 64) {
  ------------------
  |  Branch (705:9): [True: 2.53k, False: 1.26k]
  |  Branch (705:20): [True: 1.26k, False: 1.26k]
  ------------------
  706|       |        // Fill the buffer, and process it.
  707|  1.26k|        memcpy(buf + bufsize, data, 64 - bufsize);
  708|  1.26k|        bytes += 64 - bufsize;
  709|  1.26k|        data += 64 - bufsize;
  710|  1.26k|        Transform(s, buf, 1);
  711|  1.26k|        bufsize = 0;
  712|  1.26k|    }
  713|  3.79k|    if (end - data >= 64) {
  ------------------
  |  Branch (713:9): [True: 0, False: 3.79k]
  ------------------
  714|      0|        size_t blocks = (end - data) / 64;
  715|      0|        Transform(s, data, blocks);
  716|      0|        data += 64 * blocks;
  717|      0|        bytes += 64 * blocks;
  718|      0|    }
  719|  3.79k|    if (end > data) {
  ------------------
  |  Branch (719:9): [True: 2.53k, False: 1.26k]
  ------------------
  720|       |        // Fill the buffer with what remains.
  721|  2.53k|        memcpy(buf + bufsize, data, end - data);
  722|  2.53k|        bytes += end - data;
  723|  2.53k|    }
  724|  3.79k|    return *this;
  725|  3.79k|}
_ZN7CSHA2568FinalizeEPh:
  728|  1.26k|{
  729|  1.26k|    static const unsigned char pad[64] = {0x80};
  730|  1.26k|    unsigned char sizedesc[8];
  731|  1.26k|    WriteBE64(sizedesc, bytes << 3);
  732|  1.26k|    Write(pad, 1 + ((119 - (bytes % 64)) % 64));
  733|  1.26k|    Write(sizedesc, 8);
  734|  1.26k|    WriteBE32(hash, s[0]);
  735|  1.26k|    WriteBE32(hash + 4, s[1]);
  736|  1.26k|    WriteBE32(hash + 8, s[2]);
  737|  1.26k|    WriteBE32(hash + 12, s[3]);
  738|  1.26k|    WriteBE32(hash + 16, s[4]);
  739|  1.26k|    WriteBE32(hash + 20, s[5]);
  740|  1.26k|    WriteBE32(hash + 24, s[6]);
  741|  1.26k|    WriteBE32(hash + 28, s[7]);
  742|  1.26k|}
_ZN7CSHA2565ResetEv:
  745|  2.10k|{
  746|  2.10k|    bytes = 0;
  747|  2.10k|    sha256::Initialize(s);
  748|  2.10k|    return *this;
  749|  2.10k|}
sha256.cpp:_ZN12_GLOBAL__N_16sha25610InitializeEPj:
   89|  5.47k|{
   90|  5.47k|    s[0] = 0x6a09e667ul;
   91|  5.47k|    s[1] = 0xbb67ae85ul;
   92|  5.47k|    s[2] = 0x3c6ef372ul;
   93|  5.47k|    s[3] = 0xa54ff53aul;
   94|  5.47k|    s[4] = 0x510e527ful;
   95|  5.47k|    s[5] = 0x9b05688cul;
   96|  5.47k|    s[6] = 0x1f83d9abul;
   97|  5.47k|    s[7] = 0x5be0cd19ul;
   98|  5.47k|}

_ZN11sha256_sse49TransformEPjPKhm:
   23|  1.26k|{
   24|  1.26k|    static const uint32_t K256 alignas(16) [] = {
   25|  1.26k|        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
   26|  1.26k|        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
   27|  1.26k|        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
   28|  1.26k|        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
   29|  1.26k|        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
   30|  1.26k|        0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
   31|  1.26k|        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
   32|  1.26k|        0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
   33|  1.26k|        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
   34|  1.26k|        0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
   35|  1.26k|        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
   36|  1.26k|        0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
   37|  1.26k|        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
   38|  1.26k|        0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
   39|  1.26k|        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
   40|  1.26k|        0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
   41|  1.26k|    };
   42|  1.26k|    static const uint32_t FLIP_MASK alignas(16) [] = {0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f};
   43|  1.26k|    static const uint32_t SHUF_00BA alignas(16) [] = {0x03020100, 0x0b0a0908, 0xffffffff, 0xffffffff};
   44|  1.26k|    static const uint32_t SHUF_DC00 alignas(16) [] = {0xffffffff, 0xffffffff, 0x03020100, 0x0b0a0908};
   45|  1.26k|    uint32_t a, b, c, d, f, g, h, y0, y1, y2;
   46|  1.26k|    uint64_t tbl;
   47|  1.26k|    uint64_t inp_end, inp;
   48|  1.26k|    uint32_t xfer alignas(16) [4];
   49|       |
   50|  1.26k|    __asm__ __volatile__(
   51|  1.26k|        "shl    $0x6,%2;"
   52|  1.26k|        "je     Ldone_hash_%=;"
   53|  1.26k|        "add    %1,%2;"
   54|  1.26k|        "mov    %2,%14;"
   55|  1.26k|        "mov    (%0),%3;"
   56|  1.26k|        "mov    0x4(%0),%4;"
   57|  1.26k|        "mov    0x8(%0),%5;"
   58|  1.26k|        "mov    0xc(%0),%6;"
   59|  1.26k|        "mov    0x10(%0),%k2;"
   60|  1.26k|        "mov    0x14(%0),%7;"
   61|  1.26k|        "mov    0x18(%0),%8;"
   62|  1.26k|        "mov    0x1c(%0),%9;"
   63|  1.26k|        "movdqa %18,%%xmm12;"
   64|  1.26k|        "movdqa %19,%%xmm10;"
   65|  1.26k|        "movdqa %20,%%xmm11;"
   66|       |
   67|  1.26k|        "Lloop0_%=:"
   68|  1.26k|        "lea    %17,%13;"
   69|  1.26k|        "movdqu (%1),%%xmm4;"
   70|  1.26k|        "pshufb %%xmm12,%%xmm4;"
   71|  1.26k|        "movdqu 0x10(%1),%%xmm5;"
   72|  1.26k|        "pshufb %%xmm12,%%xmm5;"
   73|  1.26k|        "movdqu 0x20(%1),%%xmm6;"
   74|  1.26k|        "pshufb %%xmm12,%%xmm6;"
   75|  1.26k|        "movdqu 0x30(%1),%%xmm7;"
   76|  1.26k|        "pshufb %%xmm12,%%xmm7;"
   77|  1.26k|        "mov    %1,%15;"
   78|  1.26k|        "mov    $3,%1;"
   79|       |
   80|  1.26k|        "Lloop1_%=:"
   81|  1.26k|        "movdqa 0x0(%13),%%xmm9;"
   82|  1.26k|        "paddd  %%xmm4,%%xmm9;"
   83|  1.26k|        "movdqa %%xmm9,%16;"
   84|  1.26k|        "movdqa %%xmm7,%%xmm0;"
   85|  1.26k|        "mov    %k2,%10;"
   86|  1.26k|        "ror    $0xe,%10;"
   87|  1.26k|        "mov    %3,%11;"
   88|  1.26k|        "palignr $0x4,%%xmm6,%%xmm0;"
   89|  1.26k|        "ror    $0x9,%11;"
   90|  1.26k|        "xor    %k2,%10;"
   91|  1.26k|        "mov    %7,%12;"
   92|  1.26k|        "ror    $0x5,%10;"
   93|  1.26k|        "movdqa %%xmm5,%%xmm1;"
   94|  1.26k|        "xor    %3,%11;"
   95|  1.26k|        "xor    %8,%12;"
   96|  1.26k|        "paddd  %%xmm4,%%xmm0;"
   97|  1.26k|        "xor    %k2,%10;"
   98|  1.26k|        "and    %k2,%12;"
   99|  1.26k|        "ror    $0xb,%11;"
  100|  1.26k|        "palignr $0x4,%%xmm4,%%xmm1;"
  101|  1.26k|        "xor    %3,%11;"
  102|  1.26k|        "ror    $0x6,%10;"
  103|  1.26k|        "xor    %8,%12;"
  104|  1.26k|        "movdqa %%xmm1,%%xmm2;"
  105|  1.26k|        "ror    $0x2,%11;"
  106|  1.26k|        "add    %10,%12;"
  107|  1.26k|        "add    %16,%12;"
  108|  1.26k|        "movdqa %%xmm1,%%xmm3;"
  109|  1.26k|        "mov    %3,%10;"
  110|  1.26k|        "add    %12,%9;"
  111|  1.26k|        "mov    %3,%12;"
  112|  1.26k|        "pslld  $0x19,%%xmm1;"
  113|  1.26k|        "or     %5,%10;"
  114|  1.26k|        "add    %9,%6;"
  115|  1.26k|        "and    %5,%12;"
  116|  1.26k|        "psrld  $0x7,%%xmm2;"
  117|  1.26k|        "and    %4,%10;"
  118|  1.26k|        "add    %11,%9;"
  119|  1.26k|        "por    %%xmm2,%%xmm1;"
  120|  1.26k|        "or     %12,%10;"
  121|  1.26k|        "add    %10,%9;"
  122|  1.26k|        "movdqa %%xmm3,%%xmm2;"
  123|  1.26k|        "mov    %6,%10;"
  124|  1.26k|        "mov    %9,%11;"
  125|  1.26k|        "movdqa %%xmm3,%%xmm8;"
  126|  1.26k|        "ror    $0xe,%10;"
  127|  1.26k|        "xor    %6,%10;"
  128|  1.26k|        "mov    %k2,%12;"
  129|  1.26k|        "ror    $0x9,%11;"
  130|  1.26k|        "pslld  $0xe,%%xmm3;"
  131|  1.26k|        "xor    %9,%11;"
  132|  1.26k|        "ror    $0x5,%10;"
  133|  1.26k|        "xor    %7,%12;"
  134|  1.26k|        "psrld  $0x12,%%xmm2;"
  135|  1.26k|        "ror    $0xb,%11;"
  136|  1.26k|        "xor    %6,%10;"
  137|  1.26k|        "and    %6,%12;"
  138|  1.26k|        "ror    $0x6,%10;"
  139|  1.26k|        "pxor   %%xmm3,%%xmm1;"
  140|  1.26k|        "xor    %9,%11;"
  141|  1.26k|        "xor    %7,%12;"
  142|  1.26k|        "psrld  $0x3,%%xmm8;"
  143|  1.26k|        "add    %10,%12;"
  144|  1.26k|        "add    4+%16,%12;"
  145|  1.26k|        "ror    $0x2,%11;"
  146|  1.26k|        "pxor   %%xmm2,%%xmm1;"
  147|  1.26k|        "mov    %9,%10;"
  148|  1.26k|        "add    %12,%8;"
  149|  1.26k|        "mov    %9,%12;"
  150|  1.26k|        "pxor   %%xmm8,%%xmm1;"
  151|  1.26k|        "or     %4,%10;"
  152|  1.26k|        "add    %8,%5;"
  153|  1.26k|        "and    %4,%12;"
  154|  1.26k|        "pshufd $0xfa,%%xmm7,%%xmm2;"
  155|  1.26k|        "and    %3,%10;"
  156|  1.26k|        "add    %11,%8;"
  157|  1.26k|        "paddd  %%xmm1,%%xmm0;"
  158|  1.26k|        "or     %12,%10;"
  159|  1.26k|        "add    %10,%8;"
  160|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  161|  1.26k|        "mov    %5,%10;"
  162|  1.26k|        "mov    %8,%11;"
  163|  1.26k|        "ror    $0xe,%10;"
  164|  1.26k|        "movdqa %%xmm2,%%xmm8;"
  165|  1.26k|        "xor    %5,%10;"
  166|  1.26k|        "ror    $0x9,%11;"
  167|  1.26k|        "mov    %6,%12;"
  168|  1.26k|        "xor    %8,%11;"
  169|  1.26k|        "ror    $0x5,%10;"
  170|  1.26k|        "psrlq  $0x11,%%xmm2;"
  171|  1.26k|        "xor    %k2,%12;"
  172|  1.26k|        "psrlq  $0x13,%%xmm3;"
  173|  1.26k|        "xor    %5,%10;"
  174|  1.26k|        "and    %5,%12;"
  175|  1.26k|        "psrld  $0xa,%%xmm8;"
  176|  1.26k|        "ror    $0xb,%11;"
  177|  1.26k|        "xor    %8,%11;"
  178|  1.26k|        "xor    %k2,%12;"
  179|  1.26k|        "ror    $0x6,%10;"
  180|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  181|  1.26k|        "add    %10,%12;"
  182|  1.26k|        "ror    $0x2,%11;"
  183|  1.26k|        "add    8+%16,%12;"
  184|  1.26k|        "pxor   %%xmm2,%%xmm8;"
  185|  1.26k|        "mov    %8,%10;"
  186|  1.26k|        "add    %12,%7;"
  187|  1.26k|        "mov    %8,%12;"
  188|  1.26k|        "pshufb %%xmm10,%%xmm8;"
  189|  1.26k|        "or     %3,%10;"
  190|  1.26k|        "add    %7,%4;"
  191|  1.26k|        "and    %3,%12;"
  192|  1.26k|        "paddd  %%xmm8,%%xmm0;"
  193|  1.26k|        "and    %9,%10;"
  194|  1.26k|        "add    %11,%7;"
  195|  1.26k|        "pshufd $0x50,%%xmm0,%%xmm2;"
  196|  1.26k|        "or     %12,%10;"
  197|  1.26k|        "add    %10,%7;"
  198|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  199|  1.26k|        "mov    %4,%10;"
  200|  1.26k|        "ror    $0xe,%10;"
  201|  1.26k|        "mov    %7,%11;"
  202|  1.26k|        "movdqa %%xmm2,%%xmm4;"
  203|  1.26k|        "ror    $0x9,%11;"
  204|  1.26k|        "xor    %4,%10;"
  205|  1.26k|        "mov    %5,%12;"
  206|  1.26k|        "ror    $0x5,%10;"
  207|  1.26k|        "psrlq  $0x11,%%xmm2;"
  208|  1.26k|        "xor    %7,%11;"
  209|  1.26k|        "xor    %6,%12;"
  210|  1.26k|        "psrlq  $0x13,%%xmm3;"
  211|  1.26k|        "xor    %4,%10;"
  212|  1.26k|        "and    %4,%12;"
  213|  1.26k|        "ror    $0xb,%11;"
  214|  1.26k|        "psrld  $0xa,%%xmm4;"
  215|  1.26k|        "xor    %7,%11;"
  216|  1.26k|        "ror    $0x6,%10;"
  217|  1.26k|        "xor    %6,%12;"
  218|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  219|  1.26k|        "ror    $0x2,%11;"
  220|  1.26k|        "add    %10,%12;"
  221|  1.26k|        "add    12+%16,%12;"
  222|  1.26k|        "pxor   %%xmm2,%%xmm4;"
  223|  1.26k|        "mov    %7,%10;"
  224|  1.26k|        "add    %12,%k2;"
  225|  1.26k|        "mov    %7,%12;"
  226|  1.26k|        "pshufb %%xmm11,%%xmm4;"
  227|  1.26k|        "or     %9,%10;"
  228|  1.26k|        "add    %k2,%3;"
  229|  1.26k|        "and    %9,%12;"
  230|  1.26k|        "paddd  %%xmm0,%%xmm4;"
  231|  1.26k|        "and    %8,%10;"
  232|  1.26k|        "add    %11,%k2;"
  233|  1.26k|        "or     %12,%10;"
  234|  1.26k|        "add    %10,%k2;"
  235|  1.26k|        "movdqa 0x10(%13),%%xmm9;"
  236|  1.26k|        "paddd  %%xmm5,%%xmm9;"
  237|  1.26k|        "movdqa %%xmm9,%16;"
  238|  1.26k|        "movdqa %%xmm4,%%xmm0;"
  239|  1.26k|        "mov    %3,%10;"
  240|  1.26k|        "ror    $0xe,%10;"
  241|  1.26k|        "mov    %k2,%11;"
  242|  1.26k|        "palignr $0x4,%%xmm7,%%xmm0;"
  243|  1.26k|        "ror    $0x9,%11;"
  244|  1.26k|        "xor    %3,%10;"
  245|  1.26k|        "mov    %4,%12;"
  246|  1.26k|        "ror    $0x5,%10;"
  247|  1.26k|        "movdqa %%xmm6,%%xmm1;"
  248|  1.26k|        "xor    %k2,%11;"
  249|  1.26k|        "xor    %5,%12;"
  250|  1.26k|        "paddd  %%xmm5,%%xmm0;"
  251|  1.26k|        "xor    %3,%10;"
  252|  1.26k|        "and    %3,%12;"
  253|  1.26k|        "ror    $0xb,%11;"
  254|  1.26k|        "palignr $0x4,%%xmm5,%%xmm1;"
  255|  1.26k|        "xor    %k2,%11;"
  256|  1.26k|        "ror    $0x6,%10;"
  257|  1.26k|        "xor    %5,%12;"
  258|  1.26k|        "movdqa %%xmm1,%%xmm2;"
  259|  1.26k|        "ror    $0x2,%11;"
  260|  1.26k|        "add    %10,%12;"
  261|  1.26k|        "add    %16,%12;"
  262|  1.26k|        "movdqa %%xmm1,%%xmm3;"
  263|  1.26k|        "mov    %k2,%10;"
  264|  1.26k|        "add    %12,%6;"
  265|  1.26k|        "mov    %k2,%12;"
  266|  1.26k|        "pslld  $0x19,%%xmm1;"
  267|  1.26k|        "or     %8,%10;"
  268|  1.26k|        "add    %6,%9;"
  269|  1.26k|        "and    %8,%12;"
  270|  1.26k|        "psrld  $0x7,%%xmm2;"
  271|  1.26k|        "and    %7,%10;"
  272|  1.26k|        "add    %11,%6;"
  273|  1.26k|        "por    %%xmm2,%%xmm1;"
  274|  1.26k|        "or     %12,%10;"
  275|  1.26k|        "add    %10,%6;"
  276|  1.26k|        "movdqa %%xmm3,%%xmm2;"
  277|  1.26k|        "mov    %9,%10;"
  278|  1.26k|        "mov    %6,%11;"
  279|  1.26k|        "movdqa %%xmm3,%%xmm8;"
  280|  1.26k|        "ror    $0xe,%10;"
  281|  1.26k|        "xor    %9,%10;"
  282|  1.26k|        "mov    %3,%12;"
  283|  1.26k|        "ror    $0x9,%11;"
  284|  1.26k|        "pslld  $0xe,%%xmm3;"
  285|  1.26k|        "xor    %6,%11;"
  286|  1.26k|        "ror    $0x5,%10;"
  287|  1.26k|        "xor    %4,%12;"
  288|  1.26k|        "psrld  $0x12,%%xmm2;"
  289|  1.26k|        "ror    $0xb,%11;"
  290|  1.26k|        "xor    %9,%10;"
  291|  1.26k|        "and    %9,%12;"
  292|  1.26k|        "ror    $0x6,%10;"
  293|  1.26k|        "pxor   %%xmm3,%%xmm1;"
  294|  1.26k|        "xor    %6,%11;"
  295|  1.26k|        "xor    %4,%12;"
  296|  1.26k|        "psrld  $0x3,%%xmm8;"
  297|  1.26k|        "add    %10,%12;"
  298|  1.26k|        "add    4+%16,%12;"
  299|  1.26k|        "ror    $0x2,%11;"
  300|  1.26k|        "pxor   %%xmm2,%%xmm1;"
  301|  1.26k|        "mov    %6,%10;"
  302|  1.26k|        "add    %12,%5;"
  303|  1.26k|        "mov    %6,%12;"
  304|  1.26k|        "pxor   %%xmm8,%%xmm1;"
  305|  1.26k|        "or     %7,%10;"
  306|  1.26k|        "add    %5,%8;"
  307|  1.26k|        "and    %7,%12;"
  308|  1.26k|        "pshufd $0xfa,%%xmm4,%%xmm2;"
  309|  1.26k|        "and    %k2,%10;"
  310|  1.26k|        "add    %11,%5;"
  311|  1.26k|        "paddd  %%xmm1,%%xmm0;"
  312|  1.26k|        "or     %12,%10;"
  313|  1.26k|        "add    %10,%5;"
  314|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  315|  1.26k|        "mov    %8,%10;"
  316|  1.26k|        "mov    %5,%11;"
  317|  1.26k|        "ror    $0xe,%10;"
  318|  1.26k|        "movdqa %%xmm2,%%xmm8;"
  319|  1.26k|        "xor    %8,%10;"
  320|  1.26k|        "ror    $0x9,%11;"
  321|  1.26k|        "mov    %9,%12;"
  322|  1.26k|        "xor    %5,%11;"
  323|  1.26k|        "ror    $0x5,%10;"
  324|  1.26k|        "psrlq  $0x11,%%xmm2;"
  325|  1.26k|        "xor    %3,%12;"
  326|  1.26k|        "psrlq  $0x13,%%xmm3;"
  327|  1.26k|        "xor    %8,%10;"
  328|  1.26k|        "and    %8,%12;"
  329|  1.26k|        "psrld  $0xa,%%xmm8;"
  330|  1.26k|        "ror    $0xb,%11;"
  331|  1.26k|        "xor    %5,%11;"
  332|  1.26k|        "xor    %3,%12;"
  333|  1.26k|        "ror    $0x6,%10;"
  334|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  335|  1.26k|        "add    %10,%12;"
  336|  1.26k|        "ror    $0x2,%11;"
  337|  1.26k|        "add    8+%16,%12;"
  338|  1.26k|        "pxor   %%xmm2,%%xmm8;"
  339|  1.26k|        "mov    %5,%10;"
  340|  1.26k|        "add    %12,%4;"
  341|  1.26k|        "mov    %5,%12;"
  342|  1.26k|        "pshufb %%xmm10,%%xmm8;"
  343|  1.26k|        "or     %k2,%10;"
  344|  1.26k|        "add    %4,%7;"
  345|  1.26k|        "and    %k2,%12;"
  346|  1.26k|        "paddd  %%xmm8,%%xmm0;"
  347|  1.26k|        "and    %6,%10;"
  348|  1.26k|        "add    %11,%4;"
  349|  1.26k|        "pshufd $0x50,%%xmm0,%%xmm2;"
  350|  1.26k|        "or     %12,%10;"
  351|  1.26k|        "add    %10,%4;"
  352|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  353|  1.26k|        "mov    %7,%10;"
  354|  1.26k|        "ror    $0xe,%10;"
  355|  1.26k|        "mov    %4,%11;"
  356|  1.26k|        "movdqa %%xmm2,%%xmm5;"
  357|  1.26k|        "ror    $0x9,%11;"
  358|  1.26k|        "xor    %7,%10;"
  359|  1.26k|        "mov    %8,%12;"
  360|  1.26k|        "ror    $0x5,%10;"
  361|  1.26k|        "psrlq  $0x11,%%xmm2;"
  362|  1.26k|        "xor    %4,%11;"
  363|  1.26k|        "xor    %9,%12;"
  364|  1.26k|        "psrlq  $0x13,%%xmm3;"
  365|  1.26k|        "xor    %7,%10;"
  366|  1.26k|        "and    %7,%12;"
  367|  1.26k|        "ror    $0xb,%11;"
  368|  1.26k|        "psrld  $0xa,%%xmm5;"
  369|  1.26k|        "xor    %4,%11;"
  370|  1.26k|        "ror    $0x6,%10;"
  371|  1.26k|        "xor    %9,%12;"
  372|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  373|  1.26k|        "ror    $0x2,%11;"
  374|  1.26k|        "add    %10,%12;"
  375|  1.26k|        "add    12+%16,%12;"
  376|  1.26k|        "pxor   %%xmm2,%%xmm5;"
  377|  1.26k|        "mov    %4,%10;"
  378|  1.26k|        "add    %12,%3;"
  379|  1.26k|        "mov    %4,%12;"
  380|  1.26k|        "pshufb %%xmm11,%%xmm5;"
  381|  1.26k|        "or     %6,%10;"
  382|  1.26k|        "add    %3,%k2;"
  383|  1.26k|        "and    %6,%12;"
  384|  1.26k|        "paddd  %%xmm0,%%xmm5;"
  385|  1.26k|        "and    %5,%10;"
  386|  1.26k|        "add    %11,%3;"
  387|  1.26k|        "or     %12,%10;"
  388|  1.26k|        "add    %10,%3;"
  389|  1.26k|        "movdqa 0x20(%13),%%xmm9;"
  390|  1.26k|        "paddd  %%xmm6,%%xmm9;"
  391|  1.26k|        "movdqa %%xmm9,%16;"
  392|  1.26k|        "movdqa %%xmm5,%%xmm0;"
  393|  1.26k|        "mov    %k2,%10;"
  394|  1.26k|        "ror    $0xe,%10;"
  395|  1.26k|        "mov    %3,%11;"
  396|  1.26k|        "palignr $0x4,%%xmm4,%%xmm0;"
  397|  1.26k|        "ror    $0x9,%11;"
  398|  1.26k|        "xor    %k2,%10;"
  399|  1.26k|        "mov    %7,%12;"
  400|  1.26k|        "ror    $0x5,%10;"
  401|  1.26k|        "movdqa %%xmm7,%%xmm1;"
  402|  1.26k|        "xor    %3,%11;"
  403|  1.26k|        "xor    %8,%12;"
  404|  1.26k|        "paddd  %%xmm6,%%xmm0;"
  405|  1.26k|        "xor    %k2,%10;"
  406|  1.26k|        "and    %k2,%12;"
  407|  1.26k|        "ror    $0xb,%11;"
  408|  1.26k|        "palignr $0x4,%%xmm6,%%xmm1;"
  409|  1.26k|        "xor    %3,%11;"
  410|  1.26k|        "ror    $0x6,%10;"
  411|  1.26k|        "xor    %8,%12;"
  412|  1.26k|        "movdqa %%xmm1,%%xmm2;"
  413|  1.26k|        "ror    $0x2,%11;"
  414|  1.26k|        "add    %10,%12;"
  415|  1.26k|        "add    %16,%12;"
  416|  1.26k|        "movdqa %%xmm1,%%xmm3;"
  417|  1.26k|        "mov    %3,%10;"
  418|  1.26k|        "add    %12,%9;"
  419|  1.26k|        "mov    %3,%12;"
  420|  1.26k|        "pslld  $0x19,%%xmm1;"
  421|  1.26k|        "or     %5,%10;"
  422|  1.26k|        "add    %9,%6;"
  423|  1.26k|        "and    %5,%12;"
  424|  1.26k|        "psrld  $0x7,%%xmm2;"
  425|  1.26k|        "and    %4,%10;"
  426|  1.26k|        "add    %11,%9;"
  427|  1.26k|        "por    %%xmm2,%%xmm1;"
  428|  1.26k|        "or     %12,%10;"
  429|  1.26k|        "add    %10,%9;"
  430|  1.26k|        "movdqa %%xmm3,%%xmm2;"
  431|  1.26k|        "mov    %6,%10;"
  432|  1.26k|        "mov    %9,%11;"
  433|  1.26k|        "movdqa %%xmm3,%%xmm8;"
  434|  1.26k|        "ror    $0xe,%10;"
  435|  1.26k|        "xor    %6,%10;"
  436|  1.26k|        "mov    %k2,%12;"
  437|  1.26k|        "ror    $0x9,%11;"
  438|  1.26k|        "pslld  $0xe,%%xmm3;"
  439|  1.26k|        "xor    %9,%11;"
  440|  1.26k|        "ror    $0x5,%10;"
  441|  1.26k|        "xor    %7,%12;"
  442|  1.26k|        "psrld  $0x12,%%xmm2;"
  443|  1.26k|        "ror    $0xb,%11;"
  444|  1.26k|        "xor    %6,%10;"
  445|  1.26k|        "and    %6,%12;"
  446|  1.26k|        "ror    $0x6,%10;"
  447|  1.26k|        "pxor   %%xmm3,%%xmm1;"
  448|  1.26k|        "xor    %9,%11;"
  449|  1.26k|        "xor    %7,%12;"
  450|  1.26k|        "psrld  $0x3,%%xmm8;"
  451|  1.26k|        "add    %10,%12;"
  452|  1.26k|        "add    4+%16,%12;"
  453|  1.26k|        "ror    $0x2,%11;"
  454|  1.26k|        "pxor   %%xmm2,%%xmm1;"
  455|  1.26k|        "mov    %9,%10;"
  456|  1.26k|        "add    %12,%8;"
  457|  1.26k|        "mov    %9,%12;"
  458|  1.26k|        "pxor   %%xmm8,%%xmm1;"
  459|  1.26k|        "or     %4,%10;"
  460|  1.26k|        "add    %8,%5;"
  461|  1.26k|        "and    %4,%12;"
  462|  1.26k|        "pshufd $0xfa,%%xmm5,%%xmm2;"
  463|  1.26k|        "and    %3,%10;"
  464|  1.26k|        "add    %11,%8;"
  465|  1.26k|        "paddd  %%xmm1,%%xmm0;"
  466|  1.26k|        "or     %12,%10;"
  467|  1.26k|        "add    %10,%8;"
  468|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  469|  1.26k|        "mov    %5,%10;"
  470|  1.26k|        "mov    %8,%11;"
  471|  1.26k|        "ror    $0xe,%10;"
  472|  1.26k|        "movdqa %%xmm2,%%xmm8;"
  473|  1.26k|        "xor    %5,%10;"
  474|  1.26k|        "ror    $0x9,%11;"
  475|  1.26k|        "mov    %6,%12;"
  476|  1.26k|        "xor    %8,%11;"
  477|  1.26k|        "ror    $0x5,%10;"
  478|  1.26k|        "psrlq  $0x11,%%xmm2;"
  479|  1.26k|        "xor    %k2,%12;"
  480|  1.26k|        "psrlq  $0x13,%%xmm3;"
  481|  1.26k|        "xor    %5,%10;"
  482|  1.26k|        "and    %5,%12;"
  483|  1.26k|        "psrld  $0xa,%%xmm8;"
  484|  1.26k|        "ror    $0xb,%11;"
  485|  1.26k|        "xor    %8,%11;"
  486|  1.26k|        "xor    %k2,%12;"
  487|  1.26k|        "ror    $0x6,%10;"
  488|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  489|  1.26k|        "add    %10,%12;"
  490|  1.26k|        "ror    $0x2,%11;"
  491|  1.26k|        "add    8+%16,%12;"
  492|  1.26k|        "pxor   %%xmm2,%%xmm8;"
  493|  1.26k|        "mov    %8,%10;"
  494|  1.26k|        "add    %12,%7;"
  495|  1.26k|        "mov    %8,%12;"
  496|  1.26k|        "pshufb %%xmm10,%%xmm8;"
  497|  1.26k|        "or     %3,%10;"
  498|  1.26k|        "add    %7,%4;"
  499|  1.26k|        "and    %3,%12;"
  500|  1.26k|        "paddd  %%xmm8,%%xmm0;"
  501|  1.26k|        "and    %9,%10;"
  502|  1.26k|        "add    %11,%7;"
  503|  1.26k|        "pshufd $0x50,%%xmm0,%%xmm2;"
  504|  1.26k|        "or     %12,%10;"
  505|  1.26k|        "add    %10,%7;"
  506|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  507|  1.26k|        "mov    %4,%10;"
  508|  1.26k|        "ror    $0xe,%10;"
  509|  1.26k|        "mov    %7,%11;"
  510|  1.26k|        "movdqa %%xmm2,%%xmm6;"
  511|  1.26k|        "ror    $0x9,%11;"
  512|  1.26k|        "xor    %4,%10;"
  513|  1.26k|        "mov    %5,%12;"
  514|  1.26k|        "ror    $0x5,%10;"
  515|  1.26k|        "psrlq  $0x11,%%xmm2;"
  516|  1.26k|        "xor    %7,%11;"
  517|  1.26k|        "xor    %6,%12;"
  518|  1.26k|        "psrlq  $0x13,%%xmm3;"
  519|  1.26k|        "xor    %4,%10;"
  520|  1.26k|        "and    %4,%12;"
  521|  1.26k|        "ror    $0xb,%11;"
  522|  1.26k|        "psrld  $0xa,%%xmm6;"
  523|  1.26k|        "xor    %7,%11;"
  524|  1.26k|        "ror    $0x6,%10;"
  525|  1.26k|        "xor    %6,%12;"
  526|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  527|  1.26k|        "ror    $0x2,%11;"
  528|  1.26k|        "add    %10,%12;"
  529|  1.26k|        "add    12+%16,%12;"
  530|  1.26k|        "pxor   %%xmm2,%%xmm6;"
  531|  1.26k|        "mov    %7,%10;"
  532|  1.26k|        "add    %12,%k2;"
  533|  1.26k|        "mov    %7,%12;"
  534|  1.26k|        "pshufb %%xmm11,%%xmm6;"
  535|  1.26k|        "or     %9,%10;"
  536|  1.26k|        "add    %k2,%3;"
  537|  1.26k|        "and    %9,%12;"
  538|  1.26k|        "paddd  %%xmm0,%%xmm6;"
  539|  1.26k|        "and    %8,%10;"
  540|  1.26k|        "add    %11,%k2;"
  541|  1.26k|        "or     %12,%10;"
  542|  1.26k|        "add    %10,%k2;"
  543|  1.26k|        "movdqa 0x30(%13),%%xmm9;"
  544|  1.26k|        "paddd  %%xmm7,%%xmm9;"
  545|  1.26k|        "movdqa %%xmm9,%16;"
  546|  1.26k|        "add    $0x40,%13;"
  547|  1.26k|        "movdqa %%xmm6,%%xmm0;"
  548|  1.26k|        "mov    %3,%10;"
  549|  1.26k|        "ror    $0xe,%10;"
  550|  1.26k|        "mov    %k2,%11;"
  551|  1.26k|        "palignr $0x4,%%xmm5,%%xmm0;"
  552|  1.26k|        "ror    $0x9,%11;"
  553|  1.26k|        "xor    %3,%10;"
  554|  1.26k|        "mov    %4,%12;"
  555|  1.26k|        "ror    $0x5,%10;"
  556|  1.26k|        "movdqa %%xmm4,%%xmm1;"
  557|  1.26k|        "xor    %k2,%11;"
  558|  1.26k|        "xor    %5,%12;"
  559|  1.26k|        "paddd  %%xmm7,%%xmm0;"
  560|  1.26k|        "xor    %3,%10;"
  561|  1.26k|        "and    %3,%12;"
  562|  1.26k|        "ror    $0xb,%11;"
  563|  1.26k|        "palignr $0x4,%%xmm7,%%xmm1;"
  564|  1.26k|        "xor    %k2,%11;"
  565|  1.26k|        "ror    $0x6,%10;"
  566|  1.26k|        "xor    %5,%12;"
  567|  1.26k|        "movdqa %%xmm1,%%xmm2;"
  568|  1.26k|        "ror    $0x2,%11;"
  569|  1.26k|        "add    %10,%12;"
  570|  1.26k|        "add    %16,%12;"
  571|  1.26k|        "movdqa %%xmm1,%%xmm3;"
  572|  1.26k|        "mov    %k2,%10;"
  573|  1.26k|        "add    %12,%6;"
  574|  1.26k|        "mov    %k2,%12;"
  575|  1.26k|        "pslld  $0x19,%%xmm1;"
  576|  1.26k|        "or     %8,%10;"
  577|  1.26k|        "add    %6,%9;"
  578|  1.26k|        "and    %8,%12;"
  579|  1.26k|        "psrld  $0x7,%%xmm2;"
  580|  1.26k|        "and    %7,%10;"
  581|  1.26k|        "add    %11,%6;"
  582|  1.26k|        "por    %%xmm2,%%xmm1;"
  583|  1.26k|        "or     %12,%10;"
  584|  1.26k|        "add    %10,%6;"
  585|  1.26k|        "movdqa %%xmm3,%%xmm2;"
  586|  1.26k|        "mov    %9,%10;"
  587|  1.26k|        "mov    %6,%11;"
  588|  1.26k|        "movdqa %%xmm3,%%xmm8;"
  589|  1.26k|        "ror    $0xe,%10;"
  590|  1.26k|        "xor    %9,%10;"
  591|  1.26k|        "mov    %3,%12;"
  592|  1.26k|        "ror    $0x9,%11;"
  593|  1.26k|        "pslld  $0xe,%%xmm3;"
  594|  1.26k|        "xor    %6,%11;"
  595|  1.26k|        "ror    $0x5,%10;"
  596|  1.26k|        "xor    %4,%12;"
  597|  1.26k|        "psrld  $0x12,%%xmm2;"
  598|  1.26k|        "ror    $0xb,%11;"
  599|  1.26k|        "xor    %9,%10;"
  600|  1.26k|        "and    %9,%12;"
  601|  1.26k|        "ror    $0x6,%10;"
  602|  1.26k|        "pxor   %%xmm3,%%xmm1;"
  603|  1.26k|        "xor    %6,%11;"
  604|  1.26k|        "xor    %4,%12;"
  605|  1.26k|        "psrld  $0x3,%%xmm8;"
  606|  1.26k|        "add    %10,%12;"
  607|  1.26k|        "add    4+%16,%12;"
  608|  1.26k|        "ror    $0x2,%11;"
  609|  1.26k|        "pxor   %%xmm2,%%xmm1;"
  610|  1.26k|        "mov    %6,%10;"
  611|  1.26k|        "add    %12,%5;"
  612|  1.26k|        "mov    %6,%12;"
  613|  1.26k|        "pxor   %%xmm8,%%xmm1;"
  614|  1.26k|        "or     %7,%10;"
  615|  1.26k|        "add    %5,%8;"
  616|  1.26k|        "and    %7,%12;"
  617|  1.26k|        "pshufd $0xfa,%%xmm6,%%xmm2;"
  618|  1.26k|        "and    %k2,%10;"
  619|  1.26k|        "add    %11,%5;"
  620|  1.26k|        "paddd  %%xmm1,%%xmm0;"
  621|  1.26k|        "or     %12,%10;"
  622|  1.26k|        "add    %10,%5;"
  623|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  624|  1.26k|        "mov    %8,%10;"
  625|  1.26k|        "mov    %5,%11;"
  626|  1.26k|        "ror    $0xe,%10;"
  627|  1.26k|        "movdqa %%xmm2,%%xmm8;"
  628|  1.26k|        "xor    %8,%10;"
  629|  1.26k|        "ror    $0x9,%11;"
  630|  1.26k|        "mov    %9,%12;"
  631|  1.26k|        "xor    %5,%11;"
  632|  1.26k|        "ror    $0x5,%10;"
  633|  1.26k|        "psrlq  $0x11,%%xmm2;"
  634|  1.26k|        "xor    %3,%12;"
  635|  1.26k|        "psrlq  $0x13,%%xmm3;"
  636|  1.26k|        "xor    %8,%10;"
  637|  1.26k|        "and    %8,%12;"
  638|  1.26k|        "psrld  $0xa,%%xmm8;"
  639|  1.26k|        "ror    $0xb,%11;"
  640|  1.26k|        "xor    %5,%11;"
  641|  1.26k|        "xor    %3,%12;"
  642|  1.26k|        "ror    $0x6,%10;"
  643|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  644|  1.26k|        "add    %10,%12;"
  645|  1.26k|        "ror    $0x2,%11;"
  646|  1.26k|        "add    8+%16,%12;"
  647|  1.26k|        "pxor   %%xmm2,%%xmm8;"
  648|  1.26k|        "mov    %5,%10;"
  649|  1.26k|        "add    %12,%4;"
  650|  1.26k|        "mov    %5,%12;"
  651|  1.26k|        "pshufb %%xmm10,%%xmm8;"
  652|  1.26k|        "or     %k2,%10;"
  653|  1.26k|        "add    %4,%7;"
  654|  1.26k|        "and    %k2,%12;"
  655|  1.26k|        "paddd  %%xmm8,%%xmm0;"
  656|  1.26k|        "and    %6,%10;"
  657|  1.26k|        "add    %11,%4;"
  658|  1.26k|        "pshufd $0x50,%%xmm0,%%xmm2;"
  659|  1.26k|        "or     %12,%10;"
  660|  1.26k|        "add    %10,%4;"
  661|  1.26k|        "movdqa %%xmm2,%%xmm3;"
  662|  1.26k|        "mov    %7,%10;"
  663|  1.26k|        "ror    $0xe,%10;"
  664|  1.26k|        "mov    %4,%11;"
  665|  1.26k|        "movdqa %%xmm2,%%xmm7;"
  666|  1.26k|        "ror    $0x9,%11;"
  667|  1.26k|        "xor    %7,%10;"
  668|  1.26k|        "mov    %8,%12;"
  669|  1.26k|        "ror    $0x5,%10;"
  670|  1.26k|        "psrlq  $0x11,%%xmm2;"
  671|  1.26k|        "xor    %4,%11;"
  672|  1.26k|        "xor    %9,%12;"
  673|  1.26k|        "psrlq  $0x13,%%xmm3;"
  674|  1.26k|        "xor    %7,%10;"
  675|  1.26k|        "and    %7,%12;"
  676|  1.26k|        "ror    $0xb,%11;"
  677|  1.26k|        "psrld  $0xa,%%xmm7;"
  678|  1.26k|        "xor    %4,%11;"
  679|  1.26k|        "ror    $0x6,%10;"
  680|  1.26k|        "xor    %9,%12;"
  681|  1.26k|        "pxor   %%xmm3,%%xmm2;"
  682|  1.26k|        "ror    $0x2,%11;"
  683|  1.26k|        "add    %10,%12;"
  684|  1.26k|        "add    12+%16,%12;"
  685|  1.26k|        "pxor   %%xmm2,%%xmm7;"
  686|  1.26k|        "mov    %4,%10;"
  687|  1.26k|        "add    %12,%3;"
  688|  1.26k|        "mov    %4,%12;"
  689|  1.26k|        "pshufb %%xmm11,%%xmm7;"
  690|  1.26k|        "or     %6,%10;"
  691|  1.26k|        "add    %3,%k2;"
  692|  1.26k|        "and    %6,%12;"
  693|  1.26k|        "paddd  %%xmm0,%%xmm7;"
  694|  1.26k|        "and    %5,%10;"
  695|  1.26k|        "add    %11,%3;"
  696|  1.26k|        "or     %12,%10;"
  697|  1.26k|        "add    %10,%3;"
  698|  1.26k|        "sub    $0x1,%1;"
  699|  1.26k|        "jne    Lloop1_%=;"
  700|  1.26k|        "mov    $0x2,%1;"
  701|       |
  702|  1.26k|        "Lloop2_%=:"
  703|  1.26k|        "paddd  0x0(%13),%%xmm4;"
  704|  1.26k|        "movdqa %%xmm4,%16;"
  705|  1.26k|        "mov    %k2,%10;"
  706|  1.26k|        "ror    $0xe,%10;"
  707|  1.26k|        "mov    %3,%11;"
  708|  1.26k|        "xor    %k2,%10;"
  709|  1.26k|        "ror    $0x9,%11;"
  710|  1.26k|        "mov    %7,%12;"
  711|  1.26k|        "xor    %3,%11;"
  712|  1.26k|        "ror    $0x5,%10;"
  713|  1.26k|        "xor    %8,%12;"
  714|  1.26k|        "xor    %k2,%10;"
  715|  1.26k|        "ror    $0xb,%11;"
  716|  1.26k|        "and    %k2,%12;"
  717|  1.26k|        "xor    %3,%11;"
  718|  1.26k|        "ror    $0x6,%10;"
  719|  1.26k|        "xor    %8,%12;"
  720|  1.26k|        "add    %10,%12;"
  721|  1.26k|        "ror    $0x2,%11;"
  722|  1.26k|        "add    %16,%12;"
  723|  1.26k|        "mov    %3,%10;"
  724|  1.26k|        "add    %12,%9;"
  725|  1.26k|        "mov    %3,%12;"
  726|  1.26k|        "or     %5,%10;"
  727|  1.26k|        "add    %9,%6;"
  728|  1.26k|        "and    %5,%12;"
  729|  1.26k|        "and    %4,%10;"
  730|  1.26k|        "add    %11,%9;"
  731|  1.26k|        "or     %12,%10;"
  732|  1.26k|        "add    %10,%9;"
  733|  1.26k|        "mov    %6,%10;"
  734|  1.26k|        "ror    $0xe,%10;"
  735|  1.26k|        "mov    %9,%11;"
  736|  1.26k|        "xor    %6,%10;"
  737|  1.26k|        "ror    $0x9,%11;"
  738|  1.26k|        "mov    %k2,%12;"
  739|  1.26k|        "xor    %9,%11;"
  740|  1.26k|        "ror    $0x5,%10;"
  741|  1.26k|        "xor    %7,%12;"
  742|  1.26k|        "xor    %6,%10;"
  743|  1.26k|        "ror    $0xb,%11;"
  744|  1.26k|        "and    %6,%12;"
  745|  1.26k|        "xor    %9,%11;"
  746|  1.26k|        "ror    $0x6,%10;"
  747|  1.26k|        "xor    %7,%12;"
  748|  1.26k|        "add    %10,%12;"
  749|  1.26k|        "ror    $0x2,%11;"
  750|  1.26k|        "add    4+%16,%12;"
  751|  1.26k|        "mov    %9,%10;"
  752|  1.26k|        "add    %12,%8;"
  753|  1.26k|        "mov    %9,%12;"
  754|  1.26k|        "or     %4,%10;"
  755|  1.26k|        "add    %8,%5;"
  756|  1.26k|        "and    %4,%12;"
  757|  1.26k|        "and    %3,%10;"
  758|  1.26k|        "add    %11,%8;"
  759|  1.26k|        "or     %12,%10;"
  760|  1.26k|        "add    %10,%8;"
  761|  1.26k|        "mov    %5,%10;"
  762|  1.26k|        "ror    $0xe,%10;"
  763|  1.26k|        "mov    %8,%11;"
  764|  1.26k|        "xor    %5,%10;"
  765|  1.26k|        "ror    $0x9,%11;"
  766|  1.26k|        "mov    %6,%12;"
  767|  1.26k|        "xor    %8,%11;"
  768|  1.26k|        "ror    $0x5,%10;"
  769|  1.26k|        "xor    %k2,%12;"
  770|  1.26k|        "xor    %5,%10;"
  771|  1.26k|        "ror    $0xb,%11;"
  772|  1.26k|        "and    %5,%12;"
  773|  1.26k|        "xor    %8,%11;"
  774|  1.26k|        "ror    $0x6,%10;"
  775|  1.26k|        "xor    %k2,%12;"
  776|  1.26k|        "add    %10,%12;"
  777|  1.26k|        "ror    $0x2,%11;"
  778|  1.26k|        "add    8+%16,%12;"
  779|  1.26k|        "mov    %8,%10;"
  780|  1.26k|        "add    %12,%7;"
  781|  1.26k|        "mov    %8,%12;"
  782|  1.26k|        "or     %3,%10;"
  783|  1.26k|        "add    %7,%4;"
  784|  1.26k|        "and    %3,%12;"
  785|  1.26k|        "and    %9,%10;"
  786|  1.26k|        "add    %11,%7;"
  787|  1.26k|        "or     %12,%10;"
  788|  1.26k|        "add    %10,%7;"
  789|  1.26k|        "mov    %4,%10;"
  790|  1.26k|        "ror    $0xe,%10;"
  791|  1.26k|        "mov    %7,%11;"
  792|  1.26k|        "xor    %4,%10;"
  793|  1.26k|        "ror    $0x9,%11;"
  794|  1.26k|        "mov    %5,%12;"
  795|  1.26k|        "xor    %7,%11;"
  796|  1.26k|        "ror    $0x5,%10;"
  797|  1.26k|        "xor    %6,%12;"
  798|  1.26k|        "xor    %4,%10;"
  799|  1.26k|        "ror    $0xb,%11;"
  800|  1.26k|        "and    %4,%12;"
  801|  1.26k|        "xor    %7,%11;"
  802|  1.26k|        "ror    $0x6,%10;"
  803|  1.26k|        "xor    %6,%12;"
  804|  1.26k|        "add    %10,%12;"
  805|  1.26k|        "ror    $0x2,%11;"
  806|  1.26k|        "add    12+%16,%12;"
  807|  1.26k|        "mov    %7,%10;"
  808|  1.26k|        "add    %12,%k2;"
  809|  1.26k|        "mov    %7,%12;"
  810|  1.26k|        "or     %9,%10;"
  811|  1.26k|        "add    %k2,%3;"
  812|  1.26k|        "and    %9,%12;"
  813|  1.26k|        "and    %8,%10;"
  814|  1.26k|        "add    %11,%k2;"
  815|  1.26k|        "or     %12,%10;"
  816|  1.26k|        "add    %10,%k2;"
  817|  1.26k|        "paddd  0x10(%13),%%xmm5;"
  818|  1.26k|        "movdqa %%xmm5,%16;"
  819|  1.26k|        "add    $0x20,%13;"
  820|  1.26k|        "mov    %3,%10;"
  821|  1.26k|        "ror    $0xe,%10;"
  822|  1.26k|        "mov    %k2,%11;"
  823|  1.26k|        "xor    %3,%10;"
  824|  1.26k|        "ror    $0x9,%11;"
  825|  1.26k|        "mov    %4,%12;"
  826|  1.26k|        "xor    %k2,%11;"
  827|  1.26k|        "ror    $0x5,%10;"
  828|  1.26k|        "xor    %5,%12;"
  829|  1.26k|        "xor    %3,%10;"
  830|  1.26k|        "ror    $0xb,%11;"
  831|  1.26k|        "and    %3,%12;"
  832|  1.26k|        "xor    %k2,%11;"
  833|  1.26k|        "ror    $0x6,%10;"
  834|  1.26k|        "xor    %5,%12;"
  835|  1.26k|        "add    %10,%12;"
  836|  1.26k|        "ror    $0x2,%11;"
  837|  1.26k|        "add    %16,%12;"
  838|  1.26k|        "mov    %k2,%10;"
  839|  1.26k|        "add    %12,%6;"
  840|  1.26k|        "mov    %k2,%12;"
  841|  1.26k|        "or     %8,%10;"
  842|  1.26k|        "add    %6,%9;"
  843|  1.26k|        "and    %8,%12;"
  844|  1.26k|        "and    %7,%10;"
  845|  1.26k|        "add    %11,%6;"
  846|  1.26k|        "or     %12,%10;"
  847|  1.26k|        "add    %10,%6;"
  848|  1.26k|        "mov    %9,%10;"
  849|  1.26k|        "ror    $0xe,%10;"
  850|  1.26k|        "mov    %6,%11;"
  851|  1.26k|        "xor    %9,%10;"
  852|  1.26k|        "ror    $0x9,%11;"
  853|  1.26k|        "mov    %3,%12;"
  854|  1.26k|        "xor    %6,%11;"
  855|  1.26k|        "ror    $0x5,%10;"
  856|  1.26k|        "xor    %4,%12;"
  857|  1.26k|        "xor    %9,%10;"
  858|  1.26k|        "ror    $0xb,%11;"
  859|  1.26k|        "and    %9,%12;"
  860|  1.26k|        "xor    %6,%11;"
  861|  1.26k|        "ror    $0x6,%10;"
  862|  1.26k|        "xor    %4,%12;"
  863|  1.26k|        "add    %10,%12;"
  864|  1.26k|        "ror    $0x2,%11;"
  865|  1.26k|        "add    4+%16,%12;"
  866|  1.26k|        "mov    %6,%10;"
  867|  1.26k|        "add    %12,%5;"
  868|  1.26k|        "mov    %6,%12;"
  869|  1.26k|        "or     %7,%10;"
  870|  1.26k|        "add    %5,%8;"
  871|  1.26k|        "and    %7,%12;"
  872|  1.26k|        "and    %k2,%10;"
  873|  1.26k|        "add    %11,%5;"
  874|  1.26k|        "or     %12,%10;"
  875|  1.26k|        "add    %10,%5;"
  876|  1.26k|        "mov    %8,%10;"
  877|  1.26k|        "ror    $0xe,%10;"
  878|  1.26k|        "mov    %5,%11;"
  879|  1.26k|        "xor    %8,%10;"
  880|  1.26k|        "ror    $0x9,%11;"
  881|  1.26k|        "mov    %9,%12;"
  882|  1.26k|        "xor    %5,%11;"
  883|  1.26k|        "ror    $0x5,%10;"
  884|  1.26k|        "xor    %3,%12;"
  885|  1.26k|        "xor    %8,%10;"
  886|  1.26k|        "ror    $0xb,%11;"
  887|  1.26k|        "and    %8,%12;"
  888|  1.26k|        "xor    %5,%11;"
  889|  1.26k|        "ror    $0x6,%10;"
  890|  1.26k|        "xor    %3,%12;"
  891|  1.26k|        "add    %10,%12;"
  892|  1.26k|        "ror    $0x2,%11;"
  893|  1.26k|        "add    8+%16,%12;"
  894|  1.26k|        "mov    %5,%10;"
  895|  1.26k|        "add    %12,%4;"
  896|  1.26k|        "mov    %5,%12;"
  897|  1.26k|        "or     %k2,%10;"
  898|  1.26k|        "add    %4,%7;"
  899|  1.26k|        "and    %k2,%12;"
  900|  1.26k|        "and    %6,%10;"
  901|  1.26k|        "add    %11,%4;"
  902|  1.26k|        "or     %12,%10;"
  903|  1.26k|        "add    %10,%4;"
  904|  1.26k|        "mov    %7,%10;"
  905|  1.26k|        "ror    $0xe,%10;"
  906|  1.26k|        "mov    %4,%11;"
  907|  1.26k|        "xor    %7,%10;"
  908|  1.26k|        "ror    $0x9,%11;"
  909|  1.26k|        "mov    %8,%12;"
  910|  1.26k|        "xor    %4,%11;"
  911|  1.26k|        "ror    $0x5,%10;"
  912|  1.26k|        "xor    %9,%12;"
  913|  1.26k|        "xor    %7,%10;"
  914|  1.26k|        "ror    $0xb,%11;"
  915|  1.26k|        "and    %7,%12;"
  916|  1.26k|        "xor    %4,%11;"
  917|  1.26k|        "ror    $0x6,%10;"
  918|  1.26k|        "xor    %9,%12;"
  919|  1.26k|        "add    %10,%12;"
  920|  1.26k|        "ror    $0x2,%11;"
  921|  1.26k|        "add    12+%16,%12;"
  922|  1.26k|        "mov    %4,%10;"
  923|  1.26k|        "add    %12,%3;"
  924|  1.26k|        "mov    %4,%12;"
  925|  1.26k|        "or     %6,%10;"
  926|  1.26k|        "add    %3,%k2;"
  927|  1.26k|        "and    %6,%12;"
  928|  1.26k|        "and    %5,%10;"
  929|  1.26k|        "add    %11,%3;"
  930|  1.26k|        "or     %12,%10;"
  931|  1.26k|        "add    %10,%3;"
  932|  1.26k|        "movdqa %%xmm6,%%xmm4;"
  933|  1.26k|        "movdqa %%xmm7,%%xmm5;"
  934|  1.26k|        "sub    $0x1,%1;"
  935|  1.26k|        "jne    Lloop2_%=;"
  936|  1.26k|        "add    (%0),%3;"
  937|  1.26k|        "mov    %3,(%0);"
  938|  1.26k|        "add    0x4(%0),%4;"
  939|  1.26k|        "mov    %4,0x4(%0);"
  940|  1.26k|        "add    0x8(%0),%5;"
  941|  1.26k|        "mov    %5,0x8(%0);"
  942|  1.26k|        "add    0xc(%0),%6;"
  943|  1.26k|        "mov    %6,0xc(%0);"
  944|  1.26k|        "add    0x10(%0),%k2;"
  945|  1.26k|        "mov    %k2,0x10(%0);"
  946|  1.26k|        "add    0x14(%0),%7;"
  947|  1.26k|        "mov    %7,0x14(%0);"
  948|  1.26k|        "add    0x18(%0),%8;"
  949|  1.26k|        "mov    %8,0x18(%0);"
  950|  1.26k|        "add    0x1c(%0),%9;"
  951|  1.26k|        "mov    %9,0x1c(%0);"
  952|  1.26k|        "mov    %15,%1;"
  953|  1.26k|        "add    $0x40,%1;"
  954|  1.26k|        "cmp    %14,%1;"
  955|  1.26k|        "jne    Lloop0_%=;"
  956|       |
  957|  1.26k|        "Ldone_hash_%=:"
  958|       |
  959|  1.26k|        : "+r"(s), "+r"(chunk), "+r"(blocks), "=r"(a), "=r"(b), "=r"(c), "=r"(d), /* e = chunk */ "=r"(f), "=r"(g), "=r"(h), "=r"(y0), "=r"(y1), "=r"(y2), "=r"(tbl), "+m"(inp_end), "+m"(inp), "+m"(xfer)
  960|  1.26k|        : "m"(K256), "m"(FLIP_MASK), "m"(SHUF_00BA), "m"(SHUF_DC00)
  961|  1.26k|        : "cc", "memory", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "xmm8", "xmm9", "xmm10", "xmm11", "xmm12"
  962|  1.26k|   );
  963|  1.26k|}

_Z7KeccakFRA25_m:
   19|  39.6k|{
   20|  39.6k|    static constexpr uint64_t RNDC[24] = {
   21|  39.6k|        0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
   22|  39.6k|        0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
   23|  39.6k|        0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
   24|  39.6k|        0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
   25|  39.6k|        0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
   26|  39.6k|        0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
   27|  39.6k|    };
   28|  39.6k|    static constexpr int ROUNDS = 24;
   29|       |
   30|   992k|    for (int round = 0; round < ROUNDS; ++round) {
  ------------------
  |  Branch (30:25): [True: 952k, False: 39.6k]
  ------------------
   31|   952k|        uint64_t bc0, bc1, bc2, bc3, bc4, t;
   32|       |
   33|       |        // Theta
   34|   952k|        bc0 = st[0] ^ st[5] ^ st[10] ^ st[15] ^ st[20];
   35|   952k|        bc1 = st[1] ^ st[6] ^ st[11] ^ st[16] ^ st[21];
   36|   952k|        bc2 = st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22];
   37|   952k|        bc3 = st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23];
   38|   952k|        bc4 = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24];
   39|   952k|        t = bc4 ^ std::rotl(bc1, 1); st[0] ^= t; st[5] ^= t; st[10] ^= t; st[15] ^= t; st[20] ^= t;
   40|   952k|        t = bc0 ^ std::rotl(bc2, 1); st[1] ^= t; st[6] ^= t; st[11] ^= t; st[16] ^= t; st[21] ^= t;
   41|   952k|        t = bc1 ^ std::rotl(bc3, 1); st[2] ^= t; st[7] ^= t; st[12] ^= t; st[17] ^= t; st[22] ^= t;
   42|   952k|        t = bc2 ^ std::rotl(bc4, 1); st[3] ^= t; st[8] ^= t; st[13] ^= t; st[18] ^= t; st[23] ^= t;
   43|   952k|        t = bc3 ^ std::rotl(bc0, 1); st[4] ^= t; st[9] ^= t; st[14] ^= t; st[19] ^= t; st[24] ^= t;
   44|       |
   45|       |        // Rho Pi
   46|   952k|        t = st[1];
   47|   952k|        bc0 = st[10]; st[10] = std::rotl(t, 1); t = bc0;
   48|   952k|        bc0 = st[7]; st[7] = std::rotl(t, 3); t = bc0;
   49|   952k|        bc0 = st[11]; st[11] = std::rotl(t, 6); t = bc0;
   50|   952k|        bc0 = st[17]; st[17] = std::rotl(t, 10); t = bc0;
   51|   952k|        bc0 = st[18]; st[18] = std::rotl(t, 15); t = bc0;
   52|   952k|        bc0 = st[3]; st[3] = std::rotl(t, 21); t = bc0;
   53|   952k|        bc0 = st[5]; st[5] = std::rotl(t, 28); t = bc0;
   54|   952k|        bc0 = st[16]; st[16] = std::rotl(t, 36); t = bc0;
   55|   952k|        bc0 = st[8]; st[8] = std::rotl(t, 45); t = bc0;
   56|   952k|        bc0 = st[21]; st[21] = std::rotl(t, 55); t = bc0;
   57|   952k|        bc0 = st[24]; st[24] = std::rotl(t, 2); t = bc0;
   58|   952k|        bc0 = st[4]; st[4] = std::rotl(t, 14); t = bc0;
   59|   952k|        bc0 = st[15]; st[15] = std::rotl(t, 27); t = bc0;
   60|   952k|        bc0 = st[23]; st[23] = std::rotl(t, 41); t = bc0;
   61|   952k|        bc0 = st[19]; st[19] = std::rotl(t, 56); t = bc0;
   62|   952k|        bc0 = st[13]; st[13] = std::rotl(t, 8); t = bc0;
   63|   952k|        bc0 = st[12]; st[12] = std::rotl(t, 25); t = bc0;
   64|   952k|        bc0 = st[2]; st[2] = std::rotl(t, 43); t = bc0;
   65|   952k|        bc0 = st[20]; st[20] = std::rotl(t, 62); t = bc0;
   66|   952k|        bc0 = st[14]; st[14] = std::rotl(t, 18); t = bc0;
   67|   952k|        bc0 = st[22]; st[22] = std::rotl(t, 39); t = bc0;
   68|   952k|        bc0 = st[9]; st[9] = std::rotl(t, 61); t = bc0;
   69|   952k|        bc0 = st[6]; st[6] = std::rotl(t, 20); t = bc0;
   70|   952k|        st[1] = std::rotl(t, 44);
   71|       |
   72|       |        // Chi Iota
   73|   952k|        bc0 = st[0]; bc1 = st[1]; bc2 = st[2]; bc3 = st[3]; bc4 = st[4];
   74|   952k|        st[0] = bc0 ^ (~bc1 & bc2) ^ RNDC[round];
   75|   952k|        st[1] = bc1 ^ (~bc2 & bc3);
   76|   952k|        st[2] = bc2 ^ (~bc3 & bc4);
   77|   952k|        st[3] = bc3 ^ (~bc4 & bc0);
   78|   952k|        st[4] = bc4 ^ (~bc0 & bc1);
   79|   952k|        bc0 = st[5]; bc1 = st[6]; bc2 = st[7]; bc3 = st[8]; bc4 = st[9];
   80|   952k|        st[5] = bc0 ^ (~bc1 & bc2);
   81|   952k|        st[6] = bc1 ^ (~bc2 & bc3);
   82|   952k|        st[7] = bc2 ^ (~bc3 & bc4);
   83|   952k|        st[8] = bc3 ^ (~bc4 & bc0);
   84|   952k|        st[9] = bc4 ^ (~bc0 & bc1);
   85|   952k|        bc0 = st[10]; bc1 = st[11]; bc2 = st[12]; bc3 = st[13]; bc4 = st[14];
   86|   952k|        st[10] = bc0 ^ (~bc1 & bc2);
   87|   952k|        st[11] = bc1 ^ (~bc2 & bc3);
   88|   952k|        st[12] = bc2 ^ (~bc3 & bc4);
   89|   952k|        st[13] = bc3 ^ (~bc4 & bc0);
   90|   952k|        st[14] = bc4 ^ (~bc0 & bc1);
   91|   952k|        bc0 = st[15]; bc1 = st[16]; bc2 = st[17]; bc3 = st[18]; bc4 = st[19];
   92|   952k|        st[15] = bc0 ^ (~bc1 & bc2);
   93|   952k|        st[16] = bc1 ^ (~bc2 & bc3);
   94|   952k|        st[17] = bc2 ^ (~bc3 & bc4);
   95|   952k|        st[18] = bc3 ^ (~bc4 & bc0);
   96|   952k|        st[19] = bc4 ^ (~bc0 & bc1);
   97|   952k|        bc0 = st[20]; bc1 = st[21]; bc2 = st[22]; bc3 = st[23]; bc4 = st[24];
   98|   952k|        st[20] = bc0 ^ (~bc1 & bc2);
   99|   952k|        st[21] = bc1 ^ (~bc2 & bc3);
  100|   952k|        st[22] = bc2 ^ (~bc3 & bc4);
  101|   952k|        st[23] = bc3 ^ (~bc4 & bc0);
  102|   952k|        st[24] = bc4 ^ (~bc0 & bc1);
  103|   952k|    }
  104|  39.6k|}
_ZN8SHA3_2565WriteE4SpanIKhE:
  107|   119k|{
  108|   119k|    if (m_bufsize && data.size() >= sizeof(m_buffer) - m_bufsize) {
  ------------------
  |  Branch (108:9): [True: 79.3k, False: 39.6k]
  |  Branch (108:22): [True: 79.3k, False: 0]
  ------------------
  109|       |        // Fill the buffer and process it.
  110|  79.3k|        std::copy(data.begin(), data.begin() + (sizeof(m_buffer) - m_bufsize), m_buffer + m_bufsize);
  111|  79.3k|        data = data.subspan(sizeof(m_buffer) - m_bufsize);
  112|  79.3k|        m_state[m_pos++] ^= ReadLE64(m_buffer);
  113|  79.3k|        m_bufsize = 0;
  114|  79.3k|        if (m_pos == RATE_BUFFERS) {
  ------------------
  |  Branch (114:13): [True: 0, False: 79.3k]
  ------------------
  115|      0|            KeccakF(m_state);
  116|      0|            m_pos = 0;
  117|      0|        }
  118|  79.3k|    }
  119|   277k|    while (data.size() >= sizeof(m_buffer)) {
  ------------------
  |  Branch (119:12): [True: 158k, False: 119k]
  ------------------
  120|       |        // Process chunks directly from the buffer.
  121|   158k|        m_state[m_pos++] ^= ReadLE64(data.data());
  122|   158k|        data = data.subspan(8);
  123|   158k|        if (m_pos == RATE_BUFFERS) {
  ------------------
  |  Branch (123:13): [True: 0, False: 158k]
  ------------------
  124|      0|            KeccakF(m_state);
  125|      0|            m_pos = 0;
  126|      0|        }
  127|   158k|    }
  128|   119k|    if (data.size()) {
  ------------------
  |  Branch (128:9): [True: 79.3k, False: 39.6k]
  ------------------
  129|       |        // Keep the remainder in the buffer.
  130|  79.3k|        std::copy(data.begin(), data.end(), m_buffer + m_bufsize);
  131|  79.3k|        m_bufsize += data.size();
  132|  79.3k|    }
  133|   119k|    return *this;
  134|   119k|}
_ZN8SHA3_2568FinalizeE4SpanIhE:
  137|  39.6k|{
  138|  39.6k|    assert(output.size() == OUTPUT_SIZE);
  139|  39.6k|    std::fill(m_buffer + m_bufsize, m_buffer + sizeof(m_buffer), 0);
  140|  39.6k|    m_buffer[m_bufsize] ^= 0x06;
  141|  39.6k|    m_state[m_pos] ^= ReadLE64(m_buffer);
  142|  39.6k|    m_state[RATE_BUFFERS - 1] ^= 0x8000000000000000;
  143|  39.6k|    KeccakF(m_state);
  144|   198k|    for (unsigned i = 0; i < 4; ++i) {
  ------------------
  |  Branch (144:26): [True: 158k, False: 39.6k]
  ------------------
  145|   158k|        WriteLE64(output.data() + 8 * i, m_state[i]);
  146|   158k|    }
  147|  39.6k|    return *this;
  148|  39.6k|}

_ZN8SHA3_256C2Ev:
   35|  39.6k|    SHA3_256() = default;

_ZN8CHash2565ResetEv:
   42|  2.10k|    CHash256& Reset() {
   43|  2.10k|        sha.Reset();
   44|  2.10k|        return *this;
   45|  2.10k|    }

_ZN10interfaces5ChainD2Ev:
  131|      2|    virtual ~Chain() = default;

_ZNK12CChainParams12MessageStartEv:
   94|  2.10k|    const MessageStartChars& MessageStart() const { return pchMessageStart; }
_ZNK12CChainParams14GetDefaultPortEv:
   95|  43.1k|    uint16_t GetDefaultPort() const { return nDefaultPort; }

_ZN11ECC_ContextD2Ev:
  482|      2|{
  483|      2|    ECC_Stop();
  484|      2|}
key.cpp:_ZL8ECC_Stopv:
  467|      2|static void ECC_Stop() {
  468|      2|    secp256k1_context *ctx = secp256k1_context_sign;
  469|      2|    secp256k1_context_sign = nullptr;
  470|       |
  471|      2|    if (ctx) {
  ------------------
  |  Branch (471:9): [True: 2, False: 0]
  ------------------
  472|      2|        secp256k1_context_destroy(ctx);
  473|      2|    }
  474|      2|}

_Z11LogInstancev:
   25|   346k|{
   26|       |/**
   27|       | * NOTE: the logger instances is leaked on exit. This is ugly, but will be
   28|       | * cleaned up by the OS/libc. Defining a logger as a global object doesn't work
   29|       | * since the order of destruction of static/global objects is undefined.
   30|       | * Consider if the logger gets destroyed, and then some later destructor calls
   31|       | * LogPrintf, maybe indirectly, and you get a core dump at shutdown trying to
   32|       | * access the logger. When the shutdown sequence is fully audited and tested,
   33|       | * explicit destruction of these objects can be implemented by changing this
   34|       | * from a raw pointer to a std::unique_ptr.
   35|       | * Since the ~Logger() destructor is never called, the Logger class and all
   36|       | * its subclasses must have implicitly-defined destructors.
   37|       | *
   38|       | * This method of initialization was originally introduced in
   39|       | * ee3374234c60aba2cc4c5cd5cac1c0aefc2d817c.
   40|       | */
   41|   346k|    static BCLog::Logger* g_logger{new BCLog::Logger()};
   42|   346k|    return *g_logger;
   43|   346k|}
_ZN5BCLog6Logger20DisconnectTestLoggerEv:
   97|      2|{
   98|      2|    StdLockGuard scoped_lock(m_cs);
   99|      2|    m_buffering = true;
  100|      2|    if (m_fileout != nullptr) fclose(m_fileout);
  ------------------
  |  Branch (100:9): [True: 0, False: 2]
  ------------------
  101|      2|    m_fileout = nullptr;
  102|      2|    m_print_callbacks.clear();
  103|      2|    m_max_buffer_memusage = DEFAULT_MAX_LOG_BUFFER;
  104|      2|    m_cur_buffer_memusage = 0;
  105|      2|    m_buffer_lines_discarded = 0;
  106|      2|    m_msgs_before_open.clear();
  107|      2|}
_ZNK5BCLog6Logger15WillLogCategoryENS_8LogFlagsE:
  148|  2.10k|{
  149|  2.10k|    return (m_categories.load(std::memory_order_relaxed) & category) != 0;
  150|  2.10k|}
_ZNK5BCLog6Logger20WillLogCategoryLevelENS_8LogFlagsENS_5LevelE:
  153|  2.10k|{
  154|       |    // Log messages at Info, Warning and Error level unconditionally, so that
  155|       |    // important troubleshooting information doesn't get lost.
  156|  2.10k|    if (level >= BCLog::Level::Info) return true;
  ------------------
  |  Branch (156:9): [True: 0, False: 2.10k]
  ------------------
  157|       |
  158|  2.10k|    if (!WillLogCategory(category)) return false;
  ------------------
  |  Branch (158:9): [True: 2.10k, False: 0]
  ------------------
  159|       |
  160|      0|    StdLockGuard scoped_lock(m_cs);
  161|      0|    const auto it{m_category_log_levels.find(category)};
  162|      0|    return level >= (it == m_category_log_levels.end() ? LogLevel() : it->second);
  ------------------
  |  Branch (162:22): [True: 0, False: 0]
  ------------------
  163|  2.10k|}

_ZNK5BCLog6Logger7EnabledEv:
  150|   344k|        {
  151|   344k|            StdLockGuard scoped_lock(m_cs);
  152|   344k|            return m_buffering || m_print_to_console || m_print_to_file || !m_print_callbacks.empty();
  ------------------
  |  Branch (152:20): [True: 0, False: 344k]
  |  Branch (152:35): [True: 0, False: 344k]
  |  Branch (152:57): [True: 0, False: 344k]
  |  Branch (152:76): [True: 0, False: 344k]
  ------------------
  153|   344k|        }
net.cpp:_ZL17LogAcceptCategoryN5BCLog8LogFlagsENS_5LevelE:
  234|  2.10k|{
  235|  2.10k|    return LogInstance().WillLogCategoryLevel(category, level);
  236|  2.10k|}
_Z22LogPrintFormatInternalIJNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEEEvNS0_17basic_string_viewIcS3_EES8_iN5BCLog8LogFlagsENS9_5LevelEN4util21ConstevalFormatStringIXsZT_EEEDpRKT_:
  243|   119k|{
  244|   119k|    if (LogInstance().Enabled()) {
  ------------------
  |  Branch (244:9): [True: 0, False: 119k]
  ------------------
  245|      0|        std::string log_msg;
  246|      0|        try {
  247|      0|            log_msg = tfm::format(fmt, args...);
  248|      0|        } catch (tinyformat::format_error& fmterr) {
  249|      0|            log_msg = "Error \"" + std::string{fmterr.what()} + "\" while formatting log message: " + fmt.fmt;
  250|      0|        }
  251|      0|        LogInstance().LogPrintStr(log_msg, logging_function, source_file, source_line, flag, level);
  252|      0|    }
  253|   119k|}
_Z22LogPrintFormatInternalIJNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEiEEvNS0_17basic_string_viewIcS3_EES8_iN5BCLog8LogFlagsENS9_5LevelEN4util21ConstevalFormatStringIXsZT_EEEDpRKT_:
  243|   224k|{
  244|   224k|    if (LogInstance().Enabled()) {
  ------------------
  |  Branch (244:9): [True: 0, False: 224k]
  ------------------
  245|      0|        std::string log_msg;
  246|      0|        try {
  247|      0|            log_msg = tfm::format(fmt, args...);
  248|      0|        } catch (tinyformat::format_error& fmterr) {
  249|      0|            log_msg = "Error \"" + std::string{fmterr.what()} + "\" while formatting log message: " + fmt.fmt;
  250|      0|        }
  251|      0|        LogInstance().LogPrintStr(log_msg, logging_function, source_file, source_line, flag, level);
  252|      0|    }
  253|   224k|}

_Z13GetListenPortv:
  145|  43.1k|{
  146|       |    // If -bind= is provided with ":port" part, use that (first one if multiple are provided).
  147|  43.1k|    for (const std::string& bind_arg : gArgs.GetArgs("-bind")) {
  ------------------
  |  Branch (147:38): [True: 0, False: 43.1k]
  ------------------
  148|      0|        constexpr uint16_t dummy_port = 0;
  149|       |
  150|      0|        const std::optional<CService> bind_addr{Lookup(bind_arg, dummy_port, /*fAllowLookup=*/false)};
  151|      0|        if (bind_addr.has_value() && bind_addr->GetPort() != dummy_port) return bind_addr->GetPort();
  ------------------
  |  Branch (151:13): [True: 0, False: 0]
  |  Branch (151:38): [True: 0, False: 0]
  ------------------
  152|      0|    }
  153|       |
  154|       |    // Otherwise, if -whitebind= without NetPermissionFlags::NoBan is provided, use that
  155|       |    // (-whitebind= is required to have ":port").
  156|  43.1k|    for (const std::string& whitebind_arg : gArgs.GetArgs("-whitebind")) {
  ------------------
  |  Branch (156:43): [True: 0, False: 43.1k]
  ------------------
  157|      0|        NetWhitebindPermissions whitebind;
  158|      0|        bilingual_str error;
  159|      0|        if (NetWhitebindPermissions::TryParse(whitebind_arg, whitebind, error)) {
  ------------------
  |  Branch (159:13): [True: 0, False: 0]
  ------------------
  160|      0|            if (!NetPermissions::HasFlag(whitebind.m_flags, NetPermissionFlags::NoBan)) {
  ------------------
  |  Branch (160:17): [True: 0, False: 0]
  ------------------
  161|      0|                return whitebind.m_service.GetPort();
  162|      0|            }
  163|      0|        }
  164|      0|    }
  165|       |
  166|       |    // Otherwise, if -port= is provided, use that. Otherwise use the default port.
  167|  43.1k|    return static_cast<uint16_t>(gArgs.GetIntArg("-port", Params().GetDefaultPort()));
  168|  43.1k|}
_Z15GetLocalAddressRK5CNode:
  227|  43.1k|{
  228|  43.1k|    return GetLocal(peer).value_or(CService{CNetAddr(), GetListenPort()});
  229|  43.1k|}
_Z8AddLocalRK8CServicei:
  278|   232k|{
  279|   232k|    CService addr{MaybeFlipIPv6toCJDNS(addr_)};
  280|       |
  281|   232k|    if (!addr.IsRoutable())
  ------------------
  |  Branch (281:9): [True: 7.90k, False: 224k]
  ------------------
  282|  7.90k|        return false;
  283|       |
  284|   224k|    if (!fDiscover && nScore < LOCAL_MANUAL)
  ------------------
  |  Branch (284:9): [True: 0, False: 224k]
  |  Branch (284:23): [True: 0, False: 0]
  ------------------
  285|      0|        return false;
  286|       |
  287|   224k|    if (!g_reachable_nets.Contains(addr))
  ------------------
  |  Branch (287:9): [True: 0, False: 224k]
  ------------------
  288|      0|        return false;
  289|       |
  290|   224k|    LogPrintf("AddLocal(%s,%i)\n", addr.ToStringAddrPort(), nScore);
  ------------------
  |  |  266|   224k|#define LogPrintf(...) LogInfo(__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  261|   224k|#define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  255|   224k|#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  291|       |
  292|   224k|    {
  293|   224k|        LOCK(g_maplocalhost_mutex);
  ------------------
  |  |  257|   224k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|   224k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|   224k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|   224k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  294|   224k|        const auto [it, is_newly_added] = mapLocalHost.emplace(addr, LocalServiceInfo());
  295|   224k|        LocalServiceInfo &info = it->second;
  296|   224k|        if (is_newly_added || nScore >= info.nScore) {
  ------------------
  |  Branch (296:13): [True: 98.6k, False: 126k]
  |  Branch (296:31): [True: 2.85k, False: 123k]
  ------------------
  297|   101k|            info.nScore = nScore + (is_newly_added ? 0 : 1);
  ------------------
  |  Branch (297:37): [True: 98.6k, False: 2.85k]
  ------------------
  298|   101k|            info.nPort = addr.GetPort();
  299|   101k|        }
  300|   224k|    }
  301|       |
  302|   224k|    return true;
  303|   224k|}
_Z11RemoveLocalRK8CService:
  311|   119k|{
  312|   119k|    LOCK(g_maplocalhost_mutex);
  ------------------
  |  |  257|   119k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|   119k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|   119k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|   119k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  313|   119k|    LogPrintf("RemoveLocal(%s)\n", addr.ToStringAddrPort());
  ------------------
  |  |  266|   119k|#define LogPrintf(...) LogInfo(__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  261|   119k|#define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  255|   119k|#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  314|   119k|    mapLocalHost.erase(addr);
  315|   119k|}
_Z9SeenLocalRK8CService:
  319|   278k|{
  320|   278k|    LOCK(g_maplocalhost_mutex);
  ------------------
  |  |  257|   278k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|   278k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|   278k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|   278k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|   278k|    const auto it = mapLocalHost.find(addr);
  322|   278k|    if (it == mapLocalHost.end()) return false;
  ------------------
  |  Branch (322:9): [True: 8.68k, False: 270k]
  ------------------
  323|   270k|    ++it->second.nScore;
  324|   270k|    return true;
  325|   278k|}
_Z7IsLocalRK8CService:
  330|   235k|{
  331|   235k|    LOCK(g_maplocalhost_mutex);
  ------------------
  |  |  257|   235k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|   235k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|   235k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|   235k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|   235k|    return mapLocalHost.count(addr) > 0;
  333|   235k|}
_ZNK5CNode23ConnectedThroughNetworkEv:
  609|  2.63M|{
  610|  2.63M|    return m_inbound_onion ? NET_ONION : addr.GetNetClass();
  ------------------
  |  Branch (610:12): [True: 456k, False: 2.17M]
  ------------------
  611|  2.63M|}
_ZNK5CNode28IsConnectedThroughPrivacyNetEv:
  614|  1.96M|{
  615|  1.96M|    return m_inbound_onion || addr.IsPrivacyNet();
  ------------------
  |  Branch (615:12): [True: 446k, False: 1.51M]
  |  Branch (615:31): [True: 595k, False: 921k]
  ------------------
  616|  1.96M|}
_ZN11V1TransportC2El:
  723|  2.10k|    : m_magic_bytes{Params().MessageStart()}, m_node_id{node_id}
  724|  2.10k|{
  725|  2.10k|    LOCK(m_recv_mutex);
  ------------------
  |  |  257|  2.10k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|  2.10k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|  2.10k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|  2.10k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  726|  2.10k|    Reset();
  727|  2.10k|}
_ZN5CNodeC2ElNSt3__110shared_ptrI4SockEERK8CAddressmmRK8CServiceRKNS0_12basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE14ConnectionTypebO12CNodeOptions:
 3803|  2.10k|    : m_transport{MakeTransport(idIn, node_opts.use_v2transport, conn_type_in == ConnectionType::INBOUND)},
 3804|  2.10k|      m_permission_flags{node_opts.permission_flags},
 3805|  2.10k|      m_sock{sock},
 3806|  2.10k|      m_connected{GetTime<std::chrono::seconds>()},
 3807|  2.10k|      addr{addrIn},
 3808|  2.10k|      addrBind{addrBindIn},
 3809|  2.10k|      m_addr_name{addrNameIn.empty() ? addr.ToStringAddrPort() : addrNameIn},
  ------------------
  |  Branch (3809:19): [True: 1.06k, False: 1.04k]
  ------------------
 3810|  2.10k|      m_dest(addrNameIn),
 3811|  2.10k|      m_inbound_onion{inbound_onion},
 3812|  2.10k|      m_prefer_evict{node_opts.prefer_evict},
 3813|  2.10k|      nKeyedNetGroup{nKeyedNetGroupIn},
 3814|  2.10k|      m_conn_type{conn_type_in},
 3815|  2.10k|      id{idIn},
 3816|  2.10k|      nLocalHostNonce{nLocalHostNonceIn},
 3817|  2.10k|      m_recv_flood_size{node_opts.recv_flood_size},
 3818|  2.10k|      m_i2p_sam_session{std::move(node_opts.i2p_sam_session)}
 3819|  2.10k|{
 3820|  2.10k|    if (inbound_onion) assert(conn_type_in == ConnectionType::INBOUND);
  ------------------
  |  Branch (3820:9): [True: 74, False: 2.03k]
  ------------------
 3821|       |
 3822|  73.7k|    for (const auto& msg : ALL_NET_MESSAGE_TYPES) {
  ------------------
  |  Branch (3822:26): [True: 73.7k, False: 2.10k]
  ------------------
 3823|  73.7k|        mapRecvBytesPerMsgType[msg] = 0;
 3824|  73.7k|    }
 3825|  2.10k|    mapRecvBytesPerMsgType[NET_MESSAGE_TYPE_OTHER] = 0;
 3826|       |
 3827|  2.10k|    if (fLogIPs) {
  ------------------
  |  Branch (3827:9): [True: 0, False: 2.10k]
  ------------------
 3828|      0|        LogDebug(BCLog::NET, "Added connection to %s peer=%d\n", m_addr_name, id);
  ------------------
  |  |  280|      0|#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  273|      0|    do {                                                  \
  |  |  |  |  274|      0|        if (LogAcceptCategory((category), (level))) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|            LogPrintLevel_(category, level, __VA_ARGS__); \
  |  |  |  |  ------------------
  |  |  |  |  |  |  255|      0|#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  276|      0|        }                                                 \
  |  |  |  |  277|      0|    } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (277:14): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3829|  2.10k|    } else {
 3830|  2.10k|        LogDebug(BCLog::NET, "Added connection peer=%d\n", id);
  ------------------
  |  |  280|  2.10k|#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  273|  2.10k|    do {                                                  \
  |  |  |  |  274|  2.10k|        if (LogAcceptCategory((category), (level))) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (274:13): [True: 0, False: 2.10k]
  |  |  |  |  ------------------
  |  |  |  |  275|      0|            LogPrintLevel_(category, level, __VA_ARGS__); \
  |  |  |  |  ------------------
  |  |  |  |  |  |  255|      0|#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  276|      0|        }                                                 \
  |  |  |  |  277|  2.10k|    } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (277:14): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3831|  2.10k|    }
 3832|  2.10k|}
net.cpp:_ZL8GetLocalRK5CNode:
  172|  43.1k|{
  173|  43.1k|    if (!fListen) return std::nullopt;
  ------------------
  |  Branch (173:9): [True: 0, False: 43.1k]
  ------------------
  174|       |
  175|  43.1k|    std::optional<CService> addr;
  176|  43.1k|    int nBestScore = -1;
  177|  43.1k|    int nBestReachability = -1;
  178|  43.1k|    {
  179|  43.1k|        LOCK(g_maplocalhost_mutex);
  ------------------
  |  |  257|  43.1k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|  43.1k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|  43.1k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|  43.1k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|  2.63M|        for (const auto& [local_addr, local_service_info] : mapLocalHost) {
  ------------------
  |  Branch (180:59): [True: 2.63M, False: 43.1k]
  ------------------
  181|       |            // For privacy reasons, don't advertise our privacy-network address
  182|       |            // to other networks and don't advertise our other-network address
  183|       |            // to privacy networks.
  184|  2.63M|            if (local_addr.GetNetwork() != peer.ConnectedThroughNetwork()
  ------------------
  |  Branch (184:17): [True: 1.97M, False: 654k]
  ------------------
  185|  2.63M|                && (local_addr.IsPrivacyNet() || peer.IsConnectedThroughPrivacyNet())) {
  ------------------
  |  Branch (185:21): [True: 12.2k, False: 1.96M]
  |  Branch (185:50): [True: 1.04M, False: 921k]
  ------------------
  186|  1.05M|                continue;
  187|  1.05M|            }
  188|  1.57M|            const int nScore{local_service_info.nScore};
  189|  1.57M|            const int nReachability{local_addr.GetReachabilityFrom(peer.addr)};
  190|  1.57M|            if (nReachability > nBestReachability || (nReachability == nBestReachability && nScore > nBestScore)) {
  ------------------
  |  Branch (190:17): [True: 34.5k, False: 1.54M]
  |  Branch (190:55): [True: 1.39M, False: 142k]
  |  Branch (190:93): [True: 21.3k, False: 1.37M]
  ------------------
  191|  55.9k|                addr.emplace(CService{local_addr, local_service_info.nPort});
  192|  55.9k|                nBestReachability = nReachability;
  193|  55.9k|                nBestScore = nScore;
  194|  55.9k|            }
  195|  1.57M|        }
  196|  43.1k|    }
  197|  43.1k|    return addr;
  198|  43.1k|}
net.cpp:_ZL13MakeTransportlbb:
 3785|  2.10k|{
 3786|  2.10k|    if (use_v2transport) {
  ------------------
  |  Branch (3786:9): [True: 0, False: 2.10k]
  ------------------
 3787|      0|        return std::make_unique<V2Transport>(id, /*initiating=*/!inbound);
 3788|  2.10k|    } else {
 3789|  2.10k|        return std::make_unique<V1Transport>(id);
 3790|  2.10k|    }
 3791|  2.10k|}

_ZN11V1Transport5ResetEv:
  386|  2.10k|    void Reset() EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex) {
  387|  2.10k|        AssertLockHeld(m_recv_mutex);
  ------------------
  |  |  142|  2.10k|#define AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs)
  ------------------
  388|  2.10k|        vRecv.clear();
  389|  2.10k|        hdrbuf.clear();
  390|  2.10k|        hdrbuf.resize(24);
  391|  2.10k|        in_data = false;
  392|  2.10k|        nHdrPos = 0;
  393|  2.10k|        nDataPos = 0;
  394|  2.10k|        data_hash.SetNull();
  395|  2.10k|        hasher.Reset();
  396|  2.10k|    }
_ZN17CSerializedNetMsgC2Ev:
  115|  2.10k|    CSerializedNetMsg() = default;
_ZN9TransportD2Ev:
  256|  2.10k|    virtual ~Transport() = default;

_ZN8CNetAddr23SetNetFromBIP155NetworkEhm:
   49|  88.3k|{
   50|  88.3k|    switch (possible_bip155_net) {
  ------------------
  |  Branch (50:13): [True: 0, False: 88.3k]
  ------------------
   51|  75.8k|    case BIP155Network::IPV4:
  ------------------
  |  Branch (51:5): [True: 75.8k, False: 12.5k]
  ------------------
   52|  75.8k|        if (address_size == ADDR_IPV4_SIZE) {
  ------------------
  |  Branch (52:13): [True: 75.8k, False: 0]
  ------------------
   53|  75.8k|            m_net = NET_IPV4;
   54|  75.8k|            return true;
   55|  75.8k|        }
   56|      0|        throw std::ios_base::failure(
   57|      0|            strprintf("BIP155 IPv4 address with length %u (should be %u)", address_size,
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
   58|      0|                      ADDR_IPV4_SIZE));
   59|  6.65k|    case BIP155Network::IPV6:
  ------------------
  |  Branch (59:5): [True: 6.65k, False: 81.7k]
  ------------------
   60|  6.65k|        if (address_size == ADDR_IPV6_SIZE) {
  ------------------
  |  Branch (60:13): [True: 6.65k, False: 0]
  ------------------
   61|  6.65k|            m_net = NET_IPV6;
   62|  6.65k|            return true;
   63|  6.65k|        }
   64|      0|        throw std::ios_base::failure(
   65|      0|            strprintf("BIP155 IPv6 address with length %u (should be %u)", address_size,
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
   66|      0|                      ADDR_IPV6_SIZE));
   67|  2.97k|    case BIP155Network::TORV3:
  ------------------
  |  Branch (67:5): [True: 2.97k, False: 85.3k]
  ------------------
   68|  2.97k|        if (address_size == ADDR_TORV3_SIZE) {
  ------------------
  |  Branch (68:13): [True: 2.97k, False: 0]
  ------------------
   69|  2.97k|            m_net = NET_ONION;
   70|  2.97k|            return true;
   71|  2.97k|        }
   72|      0|        throw std::ios_base::failure(
   73|      0|            strprintf("BIP155 TORv3 address with length %u (should be %u)", address_size,
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
   74|      0|                      ADDR_TORV3_SIZE));
   75|  2.04k|    case BIP155Network::I2P:
  ------------------
  |  Branch (75:5): [True: 2.04k, False: 86.3k]
  ------------------
   76|  2.04k|        if (address_size == ADDR_I2P_SIZE) {
  ------------------
  |  Branch (76:13): [True: 2.04k, False: 0]
  ------------------
   77|  2.04k|            m_net = NET_I2P;
   78|  2.04k|            return true;
   79|  2.04k|        }
   80|      0|        throw std::ios_base::failure(
   81|      0|            strprintf("BIP155 I2P address with length %u (should be %u)", address_size,
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
   82|      0|                      ADDR_I2P_SIZE));
   83|    821|    case BIP155Network::CJDNS:
  ------------------
  |  Branch (83:5): [True: 821, False: 87.5k]
  ------------------
   84|    821|        if (address_size == ADDR_CJDNS_SIZE) {
  ------------------
  |  Branch (84:13): [True: 821, False: 0]
  ------------------
   85|    821|            m_net = NET_CJDNS;
   86|    821|            return true;
   87|    821|        }
   88|      0|        throw std::ios_base::failure(
   89|      0|            strprintf("BIP155 CJDNS address with length %u (should be %u)", address_size,
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
   90|      0|                      ADDR_CJDNS_SIZE));
   91|  88.3k|    }
   92|       |
   93|       |    // Don't throw on addresses with unknown network ids (maybe from the future).
   94|       |    // Instead silently drop them and have the unserialization code consume
   95|       |    // subsequent ones which may be known to us.
   96|      0|    return false;
   97|  88.3k|}
_ZN8CNetAddrC2Ev:
  104|   134k|CNetAddr::CNetAddr() = default;
_ZN8CNetAddr11SetInternalERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE:
  173|  1.27k|{
  174|  1.27k|    if (name.empty()) {
  ------------------
  |  Branch (174:9): [True: 5, False: 1.26k]
  ------------------
  175|      5|        return false;
  176|      5|    }
  177|  1.26k|    m_net = NET_INTERNAL;
  178|  1.26k|    unsigned char hash[32] = {};
  179|  1.26k|    CSHA256().Write((const unsigned char*)name.data(), name.size()).Finalize(hash);
  180|  1.26k|    m_addr.assign(hash, hash + ADDR_INTERNAL_SIZE);
  181|  1.26k|    return true;
  182|  1.27k|}
_ZNK8CNetAddr9IsRFC1918Ev:
  316|  11.8M|{
  317|  11.8M|    return IsIPv4() && (
  ------------------
  |  Branch (317:12): [True: 4.26M, False: 7.56M]
  ------------------
  318|  4.26M|        m_addr[0] == 10 ||
  ------------------
  |  Branch (318:9): [True: 380, False: 4.26M]
  ------------------
  319|  4.26M|        (m_addr[0] == 192 && m_addr[1] == 168) ||
  ------------------
  |  Branch (319:10): [True: 664k, False: 3.60M]
  |  Branch (319:30): [True: 651k, False: 13.2k]
  ------------------
  320|  4.26M|        (m_addr[0] == 172 && m_addr[1] >= 16 && m_addr[1] <= 31));
  ------------------
  |  Branch (320:10): [True: 7.65k, False: 3.60M]
  |  Branch (320:30): [True: 6.01k, False: 1.64k]
  |  Branch (320:49): [True: 208, False: 5.80k]
  ------------------
  321|  11.8M|}
_ZNK8CNetAddr9IsRFC2544Ev:
  324|  11.1M|{
  325|  11.1M|    return IsIPv4() && m_addr[0] == 198 && (m_addr[1] == 18 || m_addr[1] == 19);
  ------------------
  |  Branch (325:12): [True: 3.61M, False: 7.56M]
  |  Branch (325:24): [True: 20.1k, False: 3.59M]
  |  Branch (325:45): [True: 348, False: 19.7k]
  |  Branch (325:64): [True: 156, False: 19.6k]
  ------------------
  326|  11.1M|}
_ZNK8CNetAddr9IsRFC3927Ev:
  329|  11.1M|{
  330|  11.1M|    return IsIPv4() && HasPrefix(m_addr, std::array<uint8_t, 2>{169, 254});
  ------------------
  |  Branch (330:12): [True: 3.61M, False: 7.56M]
  |  Branch (330:24): [True: 1.82k, False: 3.61M]
  ------------------
  331|  11.1M|}
_ZNK8CNetAddr9IsRFC6598Ev:
  334|  11.1M|{
  335|  11.1M|    return IsIPv4() && m_addr[0] == 100 && m_addr[1] >= 64 && m_addr[1] <= 127;
  ------------------
  |  Branch (335:12): [True: 3.61M, False: 7.56M]
  |  Branch (335:24): [True: 23.5k, False: 3.58M]
  |  Branch (335:44): [True: 6.67k, False: 16.8k]
  |  Branch (335:63): [True: 730, False: 5.94k]
  ------------------
  336|  11.1M|}
_ZNK8CNetAddr9IsRFC5737Ev:
  339|  11.1M|{
  340|  11.1M|    return IsIPv4() && (HasPrefix(m_addr, std::array<uint8_t, 3>{192, 0, 2}) ||
  ------------------
  |  Branch (340:12): [True: 3.61M, False: 7.56M]
  |  Branch (340:25): [True: 492, False: 3.61M]
  ------------------
  341|  3.61M|                        HasPrefix(m_addr, std::array<uint8_t, 3>{198, 51, 100}) ||
  ------------------
  |  Branch (341:25): [True: 227, False: 3.61M]
  ------------------
  342|  3.61M|                        HasPrefix(m_addr, std::array<uint8_t, 3>{203, 0, 113}));
  ------------------
  |  Branch (342:25): [True: 0, False: 3.61M]
  ------------------
  343|  11.1M|}
_ZNK8CNetAddr9IsRFC3849Ev:
  346|  11.8M|{
  347|  11.8M|    return IsIPv6() && HasPrefix(m_addr, std::array<uint8_t, 4>{0x20, 0x01, 0x0D, 0xB8});
  ------------------
  |  Branch (347:12): [True: 6.09M, False: 5.74M]
  |  Branch (347:24): [True: 212, False: 6.09M]
  ------------------
  348|  11.8M|}
_ZNK8CNetAddr9IsRFC3964Ev:
  351|  3.21M|{
  352|  3.21M|    return IsIPv6() && HasPrefix(m_addr, std::array<uint8_t, 2>{0x20, 0x02});
  ------------------
  |  Branch (352:12): [True: 1.80M, False: 1.40M]
  |  Branch (352:24): [True: 801, False: 1.80M]
  ------------------
  353|  3.21M|}
_ZNK8CNetAddr9IsRFC6052Ev:
  356|  3.21M|{
  357|  3.21M|    return IsIPv6() &&
  ------------------
  |  Branch (357:12): [True: 1.80M, False: 1.40M]
  ------------------
  358|  3.21M|           HasPrefix(m_addr, std::array<uint8_t, 12>{0x00, 0x64, 0xFF, 0x9B, 0x00, 0x00,
  ------------------
  |  Branch (358:12): [True: 423, False: 1.80M]
  ------------------
  359|  1.80M|                                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
  360|  3.21M|}
_ZNK8CNetAddr9IsRFC4380Ev:
  363|  4.78M|{
  364|  4.78M|    return IsIPv6() && HasPrefix(m_addr, std::array<uint8_t, 4>{0x20, 0x01, 0x00, 0x00});
  ------------------
  |  Branch (364:12): [True: 2.83M, False: 1.95M]
  |  Branch (364:24): [True: 1.23k, False: 2.83M]
  ------------------
  365|  4.78M|}
_ZNK8CNetAddr9IsRFC4862Ev:
  368|  11.1M|{
  369|  11.1M|    return IsIPv6() && HasPrefix(m_addr, std::array<uint8_t, 8>{0xFE, 0x80, 0x00, 0x00,
  ------------------
  |  Branch (369:12): [True: 6.09M, False: 5.08M]
  |  Branch (369:24): [True: 410, False: 6.09M]
  ------------------
  370|  6.09M|                                                                0x00, 0x00, 0x00, 0x00});
  371|  11.1M|}
_ZNK8CNetAddr9IsRFC4193Ev:
  374|  11.1M|{
  375|  11.1M|    return IsIPv6() && (m_addr[0] & 0xFE) == 0xFC;
  ------------------
  |  Branch (375:12): [True: 6.09M, False: 5.08M]
  |  Branch (375:24): [True: 322, False: 6.09M]
  ------------------
  376|  11.1M|}
_ZNK8CNetAddr9IsRFC6145Ev:
  379|  3.21M|{
  380|  3.21M|    return IsIPv6() &&
  ------------------
  |  Branch (380:12): [True: 1.80M, False: 1.40M]
  ------------------
  381|  3.21M|           HasPrefix(m_addr, std::array<uint8_t, 12>{0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  ------------------
  |  Branch (381:12): [True: 222, False: 1.80M]
  ------------------
  382|  1.80M|                                                     0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00});
  383|  3.21M|}
_ZNK8CNetAddr9IsRFC4843Ev:
  386|  11.1M|{
  387|  11.1M|    return IsIPv6() && HasPrefix(m_addr, std::array<uint8_t, 3>{0x20, 0x01, 0x00}) &&
  ------------------
  |  Branch (387:12): [True: 6.09M, False: 5.08M]
  |  Branch (387:24): [True: 5.84k, False: 6.08M]
  ------------------
  388|  11.1M|           (m_addr[3] & 0xF0) == 0x10;
  ------------------
  |  Branch (388:12): [True: 3.73k, False: 2.11k]
  ------------------
  389|  11.1M|}
_ZNK8CNetAddr9IsRFC7343Ev:
  392|  11.1M|{
  393|  11.1M|    return IsIPv6() && HasPrefix(m_addr, std::array<uint8_t, 3>{0x20, 0x01, 0x00}) &&
  ------------------
  |  Branch (393:12): [True: 6.08M, False: 5.08M]
  |  Branch (393:24): [True: 2.11k, False: 6.08M]
  ------------------
  394|  11.1M|           (m_addr[3] & 0xF0) == 0x20;
  ------------------
  |  Branch (394:12): [True: 205, False: 1.90k]
  ------------------
  395|  11.1M|}
_ZNK8CNetAddr7IsLocalEv:
  403|  11.1M|{
  404|       |    // IPv4 loopback (127.0.0.0/8 or 0.0.0.0/8)
  405|  11.1M|    if (IsIPv4() && (m_addr[0] == 127 || m_addr[0] == 0)) {
  ------------------
  |  Branch (405:9): [True: 3.61M, False: 7.56M]
  |  Branch (405:22): [True: 534, False: 3.60M]
  |  Branch (405:42): [True: 356k, False: 3.25M]
  ------------------
  406|   357k|        return true;
  407|   357k|    }
  408|       |
  409|       |    // IPv6 loopback (::1/128)
  410|  10.8M|    static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
  411|  10.8M|    if (IsIPv6() && memcmp(m_addr.data(), pchLocal, sizeof(pchLocal)) == 0) {
  ------------------
  |  Branch (411:9): [True: 6.08M, False: 4.72M]
  |  Branch (411:21): [True: 234, False: 6.08M]
  ------------------
  412|    234|        return true;
  413|    234|    }
  414|       |
  415|  10.8M|    return false;
  416|  10.8M|}
_ZNK8CNetAddr7IsValidEv:
  429|  11.8M|{
  430|       |    // unspecified IPv6 address (::/128)
  431|  11.8M|    unsigned char ipNone6[16] = {};
  432|  11.8M|    if (IsIPv6() && memcmp(m_addr.data(), ipNone6, sizeof(ipNone6)) == 0) {
  ------------------
  |  Branch (432:9): [True: 6.09M, False: 5.74M]
  |  Branch (432:21): [True: 727, False: 6.09M]
  ------------------
  433|    727|        return false;
  434|    727|    }
  435|       |
  436|  11.8M|    if (IsCJDNS() && !HasCJDNSPrefix()) {
  ------------------
  |  Branch (436:9): [True: 62.6k, False: 11.7M]
  |  Branch (436:22): [True: 0, False: 62.6k]
  ------------------
  437|      0|        return false;
  438|      0|    }
  439|       |
  440|       |    // documentation IPv6 address
  441|  11.8M|    if (IsRFC3849())
  ------------------
  |  Branch (441:9): [True: 212, False: 11.8M]
  ------------------
  442|    212|        return false;
  443|       |
  444|  11.8M|    if (IsInternal())
  ------------------
  |  Branch (444:9): [True: 2.31k, False: 11.8M]
  ------------------
  445|  2.31k|        return false;
  446|       |
  447|  11.8M|    if (IsIPv4()) {
  ------------------
  |  Branch (447:9): [True: 4.26M, False: 7.56M]
  ------------------
  448|  4.26M|        const uint32_t addr = ReadBE32(m_addr.data());
  449|  4.26M|        if (addr == INADDR_ANY || addr == INADDR_NONE) {
  ------------------
  |  Branch (449:13): [True: 1.01k, False: 4.26M]
  |  Branch (449:35): [True: 653, False: 4.26M]
  ------------------
  450|  1.66k|            return false;
  451|  1.66k|        }
  452|  4.26M|    }
  453|       |
  454|  11.8M|    return true;
  455|  11.8M|}
_ZNK8CNetAddr10IsRoutableEv:
  467|  11.8M|{
  468|  11.8M|    return IsValid() && !(IsRFC1918() || IsRFC2544() || IsRFC3927() || IsRFC4862() || IsRFC6598() || IsRFC5737() || IsRFC4193() || IsRFC4843() || IsRFC7343() || IsLocal() || IsInternal());
  ------------------
  |  Branch (468:12): [True: 11.8M, False: 4.91k]
  |  Branch (468:27): [True: 651k, False: 11.1M]
  |  Branch (468:42): [True: 504, False: 11.1M]
  |  Branch (468:57): [True: 1.82k, False: 11.1M]
  |  Branch (468:72): [True: 410, False: 11.1M]
  |  Branch (468:87): [True: 730, False: 11.1M]
  |  Branch (468:102): [True: 719, False: 11.1M]
  |  Branch (468:117): [True: 322, False: 11.1M]
  |  Branch (468:132): [True: 3.73k, False: 11.1M]
  |  Branch (468:147): [True: 205, False: 11.1M]
  |  Branch (468:162): [True: 357k, False: 10.8M]
  |  Branch (468:175): [True: 0, False: 10.8M]
  ------------------
  469|  11.8M|}
_ZNK8CNetAddr10IsInternalEv:
  477|  32.5M|{
  478|  32.5M|   return m_net == NET_INTERNAL;
  479|  32.5M|}
_ZNK8CNetAddr10GetNetworkEv:
  501|  6.00M|{
  502|  6.00M|    if (IsInternal())
  ------------------
  |  Branch (502:9): [True: 14.0k, False: 5.99M]
  ------------------
  503|  14.0k|        return NET_INTERNAL;
  504|       |
  505|  5.99M|    if (!IsRoutable())
  ------------------
  |  Branch (505:9): [True: 506k, False: 5.48M]
  ------------------
  506|   506k|        return NET_UNROUTABLE;
  507|       |
  508|  5.48M|    return m_net;
  509|  5.99M|}
_Z13OnionToString4SpanIKhE:
  574|  39.6k|{
  575|  39.6k|    uint8_t checksum[torv3::CHECKSUM_LEN];
  576|  39.6k|    torv3::Checksum(addr, checksum);
  577|       |    // TORv3 onion_address = base32(PUBKEY | CHECKSUM | VERSION) + ".onion"
  578|  39.6k|    prevector<torv3::TOTAL_LEN, uint8_t> address{addr.begin(), addr.end()};
  579|  39.6k|    address.insert(address.end(), checksum, checksum + torv3::CHECKSUM_LEN);
  580|  39.6k|    address.insert(address.end(), torv3::VERSION, torv3::VERSION + sizeof(torv3::VERSION));
  581|  39.6k|    return EncodeBase32(address) + ".onion";
  582|  39.6k|}
_ZNK8CNetAddr12ToStringAddrEv:
  585|   345k|{
  586|   345k|    switch (m_net) {
  ------------------
  |  Branch (586:13): [True: 0, False: 345k]
  ------------------
  587|   180k|    case NET_IPV4:
  ------------------
  |  Branch (587:5): [True: 180k, False: 164k]
  ------------------
  588|   180k|        return IPv4ToString(m_addr);
  589|  90.0k|    case NET_IPV6:
  ------------------
  |  Branch (589:5): [True: 90.0k, False: 255k]
  ------------------
  590|  90.0k|        return IPv6ToString(m_addr, m_scope_id);
  591|  39.6k|    case NET_ONION:
  ------------------
  |  Branch (591:5): [True: 39.6k, False: 305k]
  ------------------
  592|  39.6k|        return OnionToString(m_addr);
  593|  32.7k|    case NET_I2P:
  ------------------
  |  Branch (593:5): [True: 32.7k, False: 312k]
  ------------------
  594|  32.7k|        return EncodeBase32(m_addr, false /* don't pad with = */) + ".b32.i2p";
  595|  1.89k|    case NET_CJDNS:
  ------------------
  |  Branch (595:5): [True: 1.89k, False: 343k]
  ------------------
  596|  1.89k|        return IPv6ToString(m_addr, 0);
  597|    324|    case NET_INTERNAL:
  ------------------
  |  Branch (597:5): [True: 324, False: 345k]
  ------------------
  598|    324|        return EncodeBase32(m_addr) + ".internal";
  599|      0|    case NET_UNROUTABLE: // m_net is never and should not be set to NET_UNROUTABLE
  ------------------
  |  Branch (599:5): [True: 0, False: 345k]
  ------------------
  600|      0|    case NET_MAX:        // m_net is never and should not be set to NET_MAX
  ------------------
  |  Branch (600:5): [True: 0, False: 345k]
  ------------------
  601|      0|        assert(false);
  602|   345k|    } // no default case, so the compiler can warn about missing cases
  603|       |
  604|      0|    assert(false);
  605|      0|}
_ZltRK8CNetAddrS1_:
  613|  4.50M|{
  614|  4.50M|    return std::tie(a.m_net, a.m_addr) < std::tie(b.m_net, b.m_addr);
  615|  4.50M|}
_ZNK8CNetAddr13HasLinkedIPv4Ev:
  657|  1.65M|{
  658|  1.65M|    return IsRoutable() && (IsIPv4() || IsRFC6145() || IsRFC6052() || IsRFC3964() || IsRFC4380());
  ------------------
  |  Branch (658:12): [True: 1.65M, False: 0]
  |  Branch (658:29): [True: 15.9k, False: 1.63M]
  |  Branch (658:41): [True: 221, False: 1.63M]
  |  Branch (658:56): [True: 198, False: 1.63M]
  |  Branch (658:71): [True: 587, False: 1.63M]
  |  Branch (658:86): [True: 425, False: 1.63M]
  ------------------
  659|  1.65M|}
_ZNK8CNetAddr11GetNetClassEv:
  679|  2.17M|{
  680|       |    // Make sure that if we return NET_IPV6, then IsIPv6() is true. The callers expect that.
  681|       |
  682|       |    // Check for "internal" first because such addresses are also !IsRoutable()
  683|       |    // and we don't want to return NET_UNROUTABLE in that case.
  684|  2.17M|    if (IsInternal()) {
  ------------------
  |  Branch (684:9): [True: 15.1k, False: 2.15M]
  ------------------
  685|  15.1k|        return NET_INTERNAL;
  686|  15.1k|    }
  687|  2.15M|    if (!IsRoutable()) {
  ------------------
  |  Branch (687:9): [True: 508k, False: 1.65M]
  ------------------
  688|   508k|        return NET_UNROUTABLE;
  689|   508k|    }
  690|  1.65M|    if (HasLinkedIPv4()) {
  ------------------
  |  Branch (690:9): [True: 17.3k, False: 1.63M]
  ------------------
  691|  17.3k|        return NET_IPV4;
  692|  17.3k|    }
  693|  1.63M|    return m_net;
  694|  1.65M|}
_ZNK8CNetAddr19GetReachabilityFromERKS_:
  718|  1.57M|{
  719|  1.57M|    enum Reachability {
  720|  1.57M|        REACH_UNREACHABLE,
  721|  1.57M|        REACH_DEFAULT,
  722|  1.57M|        REACH_TEREDO,
  723|  1.57M|        REACH_IPV6_WEAK,
  724|  1.57M|        REACH_IPV4,
  725|  1.57M|        REACH_IPV6_STRONG,
  726|  1.57M|        REACH_PRIVATE
  727|  1.57M|    };
  728|       |
  729|  1.57M|    if (!IsRoutable() || IsInternal())
  ------------------
  |  Branch (729:9): [True: 0, False: 1.57M]
  |  Branch (729:26): [True: 0, False: 1.57M]
  ------------------
  730|      0|        return REACH_UNREACHABLE;
  731|       |
  732|  1.57M|    int ourNet = GetExtNetwork(*this);
  733|  1.57M|    int theirNet = GetExtNetwork(paddrPartner);
  734|  1.57M|    bool fTunnel = IsRFC3964() || IsRFC6052() || IsRFC6145();
  ------------------
  |  Branch (734:20): [True: 214, False: 1.57M]
  |  Branch (734:35): [True: 225, False: 1.57M]
  |  Branch (734:50): [True: 1, False: 1.57M]
  ------------------
  735|       |
  736|  1.57M|    switch(theirNet) {
  737|  22.0k|    case NET_IPV4:
  ------------------
  |  Branch (737:5): [True: 22.0k, False: 1.55M]
  ------------------
  738|  22.0k|        switch(ourNet) {
  739|  16.4k|        default:       return REACH_DEFAULT;
  ------------------
  |  Branch (739:9): [True: 16.4k, False: 5.61k]
  ------------------
  740|  5.61k|        case NET_IPV4: return REACH_IPV4;
  ------------------
  |  Branch (740:9): [True: 5.61k, False: 16.4k]
  ------------------
  741|  22.0k|        }
  742|  1.02M|    case NET_IPV6:
  ------------------
  |  Branch (742:5): [True: 1.02M, False: 556k]
  ------------------
  743|  1.02M|        switch(ourNet) {
  744|  2.12k|        default:         return REACH_DEFAULT;
  ------------------
  |  Branch (744:9): [True: 2.12k, False: 1.01M]
  ------------------
  745|    248|        case NET_TEREDO: return REACH_TEREDO;
  ------------------
  |  Branch (745:9): [True: 248, False: 1.01M]
  ------------------
  746|   382k|        case NET_IPV4:   return REACH_IPV4;
  ------------------
  |  Branch (746:9): [True: 382k, False: 637k]
  ------------------
  747|   635k|        case NET_IPV6:   return fTunnel ? REACH_IPV6_WEAK : REACH_IPV6_STRONG; // only prefer giving our IPv6 address if it's not tunnelled
  ------------------
  |  Branch (747:9): [True: 635k, False: 384k]
  |  Branch (747:33): [True: 296, False: 634k]
  ------------------
  748|  1.02M|        }
  749|    618|    case NET_ONION:
  ------------------
  |  Branch (749:5): [True: 618, False: 1.57M]
  ------------------
  750|    618|        switch(ourNet) {
  751|      0|        default:         return REACH_DEFAULT;
  ------------------
  |  Branch (751:9): [True: 0, False: 618]
  ------------------
  752|      0|        case NET_IPV4:   return REACH_IPV4; // Tor users can connect to IPv4 as well
  ------------------
  |  Branch (752:9): [True: 0, False: 618]
  ------------------
  753|    618|        case NET_ONION:    return REACH_PRIVATE;
  ------------------
  |  Branch (753:9): [True: 618, False: 0]
  ------------------
  754|    618|        }
  755|  3.82k|    case NET_I2P:
  ------------------
  |  Branch (755:5): [True: 3.82k, False: 1.57M]
  ------------------
  756|  3.82k|        switch (ourNet) {
  757|  3.62k|        case NET_I2P: return REACH_PRIVATE;
  ------------------
  |  Branch (757:9): [True: 3.62k, False: 194]
  ------------------
  758|    194|        default: return REACH_DEFAULT;
  ------------------
  |  Branch (758:9): [True: 194, False: 3.62k]
  ------------------
  759|  3.82k|        }
  760|  8.67k|    case NET_CJDNS:
  ------------------
  |  Branch (760:5): [True: 8.67k, False: 1.56M]
  ------------------
  761|  8.67k|        switch (ourNet) {
  762|    518|        case NET_CJDNS: return REACH_PRIVATE;
  ------------------
  |  Branch (762:9): [True: 518, False: 8.15k]
  ------------------
  763|  8.15k|        default: return REACH_DEFAULT;
  ------------------
  |  Branch (763:9): [True: 8.15k, False: 518]
  ------------------
  764|  8.67k|        }
  765|    425|    case NET_TEREDO:
  ------------------
  |  Branch (765:5): [True: 425, False: 1.57M]
  ------------------
  766|    425|        switch(ourNet) {
  767|      1|        default:          return REACH_DEFAULT;
  ------------------
  |  Branch (767:9): [True: 1, False: 424]
  ------------------
  768|      0|        case NET_TEREDO:  return REACH_TEREDO;
  ------------------
  |  Branch (768:9): [True: 0, False: 425]
  ------------------
  769|    173|        case NET_IPV6:    return REACH_IPV6_WEAK;
  ------------------
  |  Branch (769:9): [True: 173, False: 252]
  ------------------
  770|    251|        case NET_IPV4:    return REACH_IPV4;
  ------------------
  |  Branch (770:9): [True: 251, False: 174]
  ------------------
  771|    425|        }
  772|   506k|    case NET_UNROUTABLE:
  ------------------
  |  Branch (772:5): [True: 506k, False: 1.06M]
  ------------------
  773|   520k|    default:
  ------------------
  |  Branch (773:5): [True: 14.0k, False: 1.56M]
  ------------------
  774|   520k|        switch(ourNet) {
  775|  1.24k|        default:          return REACH_DEFAULT;
  ------------------
  |  Branch (775:9): [True: 1.24k, False: 519k]
  ------------------
  776|    126|        case NET_TEREDO:  return REACH_TEREDO;
  ------------------
  |  Branch (776:9): [True: 126, False: 520k]
  ------------------
  777|   141k|        case NET_IPV6:    return REACH_IPV6_WEAK;
  ------------------
  |  Branch (777:9): [True: 141k, False: 379k]
  ------------------
  778|   378k|        case NET_IPV4:    return REACH_IPV4;
  ------------------
  |  Branch (778:9): [True: 378k, False: 142k]
  ------------------
  779|     62|        case NET_ONION:     return REACH_PRIVATE; // either from Tor, or don't care about our address
  ------------------
  |  Branch (779:9): [True: 62, False: 520k]
  ------------------
  780|   520k|        }
  781|  1.57M|    }
  782|  1.57M|}
_ZN8CServiceC2Ev:
  784|  2.10k|CService::CService() : port(0)
  785|  2.10k|{
  786|  2.10k|}
_ZN8CServiceC2ERK8CNetAddrt:
  788|   188k|CService::CService(const CNetAddr& cip, uint16_t portIn) : CNetAddr(cip), port(portIn)
  789|   188k|{
  790|   188k|}
_ZNK8CService7GetPortEv:
  840|   101k|{
  841|   101k|    return port;
  842|   101k|}
_ZNK8CService16ToStringAddrPortEv:
  908|   345k|{
  909|   345k|    const auto port_str = strprintf("%u", port);
  ------------------
  |  | 1172|   345k|#define strprintf tfm::format
  ------------------
  910|       |
  911|   345k|    if (IsIPv4() || IsTor() || IsI2P() || IsInternal()) {
  ------------------
  |  Branch (911:9): [True: 180k, False: 164k]
  |  Branch (911:21): [True: 39.6k, False: 125k]
  |  Branch (911:32): [True: 32.7k, False: 92.2k]
  |  Branch (911:43): [True: 324, False: 91.9k]
  ------------------
  912|   253k|        return ToStringAddr() + ":" + port_str;
  913|   253k|    } else {
  914|  91.9k|        return "[" + ToStringAddr() + "]:" + port_str;
  915|  91.9k|    }
  916|   345k|}
netaddress.cpp:_ZN5torv3L8ChecksumE4SpanIKhERA2_h:
  191|  39.6k|{
  192|       |    // TORv3 CHECKSUM = H(".onion checksum" | PUBKEY | VERSION)[:2]
  193|  39.6k|    static const unsigned char prefix[] = ".onion checksum";
  194|  39.6k|    static constexpr size_t prefix_len = 15;
  195|       |
  196|  39.6k|    SHA3_256 hasher;
  197|       |
  198|  39.6k|    hasher.Write(Span{prefix}.first(prefix_len));
  199|  39.6k|    hasher.Write(addr_pubkey);
  200|  39.6k|    hasher.Write(VERSION);
  201|       |
  202|  39.6k|    uint8_t checksum_full[SHA3_256::OUTPUT_SIZE];
  203|       |
  204|  39.6k|    hasher.Finalize(checksum_full);
  205|       |
  206|  39.6k|    memcpy(checksum, checksum_full, sizeof(checksum));
  207|  39.6k|}
netaddress.cpp:_ZL12IPv4ToString4SpanIKhE:
  512|   180k|{
  513|   180k|    return strprintf("%u.%u.%u.%u", a[0], a[1], a[2], a[3]);
  ------------------
  |  | 1172|   180k|#define strprintf tfm::format
  ------------------
  514|   180k|}
netaddress.cpp:_ZL12IPv6ToString4SpanIKhEj:
  519|  91.9k|{
  520|  91.9k|    assert(a.size() == ADDR_IPV6_SIZE);
  521|  91.9k|    const std::array groups{
  522|  91.9k|        ReadBE16(&a[0]),
  523|  91.9k|        ReadBE16(&a[2]),
  524|  91.9k|        ReadBE16(&a[4]),
  525|  91.9k|        ReadBE16(&a[6]),
  526|  91.9k|        ReadBE16(&a[8]),
  527|  91.9k|        ReadBE16(&a[10]),
  528|  91.9k|        ReadBE16(&a[12]),
  529|  91.9k|        ReadBE16(&a[14]),
  530|  91.9k|    };
  531|       |
  532|       |    // The zero compression implementation is inspired by Rust's std::net::Ipv6Addr, see
  533|       |    // https://github.com/rust-lang/rust/blob/cc4103089f40a163f6d143f06359cba7043da29b/library/std/src/net/ip.rs#L1635-L1683
  534|  91.9k|    struct ZeroSpan {
  535|  91.9k|        size_t start_index{0};
  536|  91.9k|        size_t len{0};
  537|  91.9k|    };
  538|       |
  539|       |    // Find longest sequence of consecutive all-zero fields. Use first zero sequence if two or more
  540|       |    // zero sequences of equal length are found.
  541|  91.9k|    ZeroSpan longest, current;
  542|   827k|    for (size_t i{0}; i < groups.size(); ++i) {
  ------------------
  |  Branch (542:23): [True: 735k, False: 91.9k]
  ------------------
  543|   735k|        if (groups[i] != 0) {
  ------------------
  |  Branch (543:13): [True: 676k, False: 59.2k]
  ------------------
  544|   676k|            current = {i + 1, 0};
  545|   676k|            continue;
  546|   676k|        }
  547|  59.2k|        current.len += 1;
  548|  59.2k|        if (current.len > longest.len) {
  ------------------
  |  Branch (548:13): [True: 55.9k, False: 3.28k]
  ------------------
  549|  55.9k|            longest = current;
  550|  55.9k|        }
  551|  59.2k|    }
  552|       |
  553|  91.9k|    std::string r;
  554|  91.9k|    r.reserve(39);
  555|   827k|    for (size_t i{0}; i < groups.size(); ++i) {
  ------------------
  |  Branch (555:23): [True: 735k, False: 91.9k]
  ------------------
  556|       |        // Replace the longest sequence of consecutive all-zero fields with two colons ("::").
  557|   735k|        if (longest.len >= 2 && i >= longest.start_index && i < longest.start_index + longest.len) {
  ------------------
  |  Branch (557:13): [True: 107k, False: 627k]
  |  Branch (557:33): [True: 98.0k, False: 9.79k]
  |  Branch (557:61): [True: 51.7k, False: 46.2k]
  ------------------
  558|  51.7k|            if (i == longest.start_index) {
  ------------------
  |  Branch (558:17): [True: 13.4k, False: 38.3k]
  ------------------
  559|  13.4k|                r += "::";
  560|  13.4k|            }
  561|  51.7k|            continue;
  562|  51.7k|        }
  563|   683k|        r += strprintf("%s%x", ((!r.empty() && r.back() != ':') ? ":" : ""), groups[i]);
  ------------------
  |  | 1172|   683k|#define strprintf tfm::format
  ------------------
  |  Branch (563:34): [True: 601k, False: 82.7k]
  |  Branch (563:48): [True: 589k, False: 12.0k]
  ------------------
  564|   683k|    }
  565|       |
  566|  91.9k|    if (scope_id != 0) {
  ------------------
  |  Branch (566:9): [True: 0, False: 91.9k]
  ------------------
  567|      0|        r += strprintf("%%%u", scope_id);
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
  568|      0|    }
  569|       |
  570|  91.9k|    return r;
  571|  91.9k|}
netaddress.cpp:_ZL13GetExtNetworkRK8CNetAddr:
  710|  3.15M|{
  711|  3.15M|    if (addr.IsRFC4380())
  ------------------
  |  Branch (711:9): [True: 812, False: 3.15M]
  ------------------
  712|    812|        return NET_TEREDO;
  713|  3.15M|    return addr.GetNetwork();
  714|  3.15M|}

_ZNK8CNetAddr6IsIPv4Ev:
  157|  81.5M|    [[nodiscard]] bool IsIPv4() const { return m_net == NET_IPV4; } // IPv4 mapped address (::FFFF:0:0/96, 0.0.0.0/0)
_ZNK8CNetAddr6IsIPv6Ev:
  158|  93.8M|    [[nodiscard]] bool IsIPv6() const { return m_net == NET_IPV6; } // IPv6 address (not mapped IPv4, not Tor)
_ZNK8CNetAddr5IsTorEv:
  174|  3.65M|    [[nodiscard]] bool IsTor() const { return m_net == NET_ONION; }
_ZNK8CNetAddr5IsI2PEv:
  175|  3.60M|    [[nodiscard]] bool IsI2P() const { return m_net == NET_I2P; }
_ZNK8CNetAddr7IsCJDNSEv:
  176|  11.8M|    [[nodiscard]] bool IsCJDNS() const { return m_net == NET_CJDNS; }
_ZNK8CNetAddr14HasCJDNSPrefixEv:
  177|   150k|    [[nodiscard]] bool HasCJDNSPrefix() const { return m_addr[0] == CJDNS_PREFIX; }
_ZNK8CNetAddr12IsPrivacyNetEv:
  188|  3.49M|    [[nodiscard]] bool IsPrivacyNet() const { return IsTor() || IsI2P(); }
  ------------------
  |  Branch (188:54): [True: 15.4k, False: 3.47M]
  |  Branch (188:65): [True: 592k, False: 2.88M]
  ------------------
_ZN8CNetAddr11UnserializeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEEEvRT_:
  252|  88.3k|    {
  253|  88.3k|        if (s.template GetParams<SerParams>().enc == Encoding::V2) {
  ------------------
  |  Branch (253:13): [True: 88.3k, False: 0]
  ------------------
  254|  88.3k|            UnserializeV2Stream(s);
  255|  88.3k|        } else {
  256|      0|            UnserializeV1Stream(s);
  257|      0|        }
  258|  88.3k|    }
_ZN8CNetAddr19UnserializeV2StreamI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEEEvRT_:
  424|  88.3k|    {
  425|  88.3k|        uint8_t bip155_net;
  426|  88.3k|        s >> bip155_net;
  427|       |
  428|  88.3k|        size_t address_size;
  429|  88.3k|        s >> COMPACTSIZE(address_size);
  ------------------
  |  |  501|  88.3k|#define COMPACTSIZE(obj) Using<CompactSizeFormatter<true>>(obj)
  ------------------
  430|       |
  431|  88.3k|        if (address_size > MAX_ADDRV2_SIZE) {
  ------------------
  |  Branch (431:13): [True: 0, False: 88.3k]
  ------------------
  432|      0|            throw std::ios_base::failure(strprintf(
  ------------------
  |  | 1172|      0|#define strprintf tfm::format
  ------------------
  433|      0|                "Address too long: %u > %u", address_size, MAX_ADDRV2_SIZE));
  434|      0|        }
  435|       |
  436|  88.3k|        m_scope_id = 0;
  437|       |
  438|  88.3k|        if (SetNetFromBIP155Network(bip155_net, address_size)) {
  ------------------
  |  Branch (438:13): [True: 88.3k, False: 0]
  ------------------
  439|  88.3k|            m_addr.resize(address_size);
  440|  88.3k|            s >> Span{m_addr};
  441|       |
  442|  88.3k|            if (m_net != NET_IPV6) {
  ------------------
  |  Branch (442:17): [True: 81.7k, False: 6.65k]
  ------------------
  443|  81.7k|                return;
  444|  81.7k|            }
  445|       |
  446|       |            // Do some special checks on IPv6 addresses.
  447|       |
  448|       |            // Recognize NET_INTERNAL embedded in IPv6, such addresses are not
  449|       |            // gossiped but could be coming from addrman, when unserializing from
  450|       |            // disk.
  451|  6.65k|            if (util::HasPrefix(m_addr, INTERNAL_IN_IPV6_PREFIX)) {
  ------------------
  |  Branch (451:17): [True: 19, False: 6.63k]
  ------------------
  452|     19|                m_net = NET_INTERNAL;
  453|     19|                memmove(m_addr.data(), m_addr.data() + INTERNAL_IN_IPV6_PREFIX.size(),
  454|     19|                        ADDR_INTERNAL_SIZE);
  455|     19|                m_addr.resize(ADDR_INTERNAL_SIZE);
  456|     19|                return;
  457|     19|            }
  458|       |
  459|  6.63k|            if (!util::HasPrefix(m_addr, IPV4_IN_IPV6_PREFIX) &&
  ------------------
  |  Branch (459:17): [True: 6.61k, False: 21]
  ------------------
  460|  6.63k|                !util::HasPrefix(m_addr, TORV2_IN_IPV6_PREFIX)) {
  ------------------
  |  Branch (460:17): [True: 6.60k, False: 13]
  ------------------
  461|  6.60k|                return;
  462|  6.60k|            }
  463|       |
  464|       |            // IPv4 and TORv2 are not supposed to be embedded in IPv6 (like in V1
  465|       |            // encoding). Unserialize as !IsValid(), thus ignoring them.
  466|  6.63k|        } else {
  467|       |            // If we receive an unknown BIP155 network id (from the future?) then
  468|       |            // ignore the address - unserialize as !IsValid().
  469|      0|            s.ignore(address_size);
  470|      0|        }
  471|       |
  472|       |        // Mimic a default-constructed CNetAddr object which is !IsValid() and thus
  473|       |        // will not be gossiped, but continue reading next addresses from the stream.
  474|     34|        m_net = NET_IPV6;
  475|     34|        m_addr.assign(ADDR_IPV6_SIZE, 0x0);
  476|     34|    }

_Z20MaybeFlipIPv6toCJDNSRK8CService:
  883|   232k|{
  884|   232k|    CService ret{service};
  885|   232k|    if (ret.IsIPv6() && ret.HasCJDNSPrefix() && g_reachable_nets.Contains(NET_CJDNS)) {
  ------------------
  |  Branch (885:9): [True: 87.5k, False: 145k]
  |  Branch (885:25): [True: 0, False: 87.5k]
  |  Branch (885:49): [True: 0, False: 0]
  ------------------
  886|      0|        ret.m_net = NET_CJDNS;
  887|      0|    }
  888|   232k|    return ret;
  889|   232k|}

_ZNK13ReachableNets8ContainsE7Network:
  125|   224k|    {
  126|   224k|        AssertLockNotHeld(m_mutex);
  ------------------
  |  |  147|   224k|#define AssertLockNotHeld(cs) AssertLockNotHeldInline(#cs, __FILE__, __LINE__, &cs)
  ------------------
  127|   224k|        LOCK(m_mutex);
  ------------------
  |  |  257|   224k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|   224k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|   224k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|   224k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|   224k|        return m_reachable.count(net) > 0;
  129|   224k|    }
_ZNK13ReachableNets8ContainsERK8CNetAddr:
  132|   224k|    {
  133|   224k|        AssertLockNotHeld(m_mutex);
  ------------------
  |  |  147|   224k|#define AssertLockNotHeld(cs) AssertLockNotHeldInline(#cs, __FILE__, __LINE__, &cs)
  ------------------
  134|   224k|        return Contains(addr.GetNetwork());
  135|   224k|    }

_ZN4node11NodeContextD2Ev:
   26|      2|NodeContext::~NodeContext() = default;

_ZN9prevectorILj16EhjiEaSEOS0_:
  284|  83.3k|    prevector& operator=(prevector<N, T, Size, Diff>&& other) noexcept {
  285|  83.3k|        if (!is_direct()) {
  ------------------
  |  Branch (285:13): [True: 4.40k, False: 78.9k]
  ------------------
  286|  4.40k|            free(_union.indirect_contents.indirect);
  287|  4.40k|        }
  288|  83.3k|        _union = std::move(other._union);
  289|  83.3k|        _size = other._size;
  290|  83.3k|        other._size = 0;
  291|  83.3k|        return *this;
  292|  83.3k|    }
_ZNK9prevectorILj16EhjiE9is_directEv:
  173|   202M|    bool is_direct() const { return _size <= N; }
_ZN9prevectorILj16EhjiED2Ev:
  474|   888k|    ~prevector() {
  475|   888k|        if (!is_direct()) {
  ------------------
  |  Branch (475:13): [True: 119k, False: 768k]
  ------------------
  476|   119k|            free(_union.indirect_contents.indirect);
  477|   119k|            _union.indirect_contents.indirect = nullptr;
  478|   119k|        }
  479|   888k|    }
_ZN9prevectorILj16EhjiEC2ERKS0_:
  263|   654k|    prevector(const prevector<N, T, Size, Diff>& other) {
  264|   654k|        size_type n = other.size();
  265|   654k|        change_capacity(n);
  266|   654k|        _size += n;
  267|   654k|        fill(item_ptr(0), other.begin(),  other.end());
  268|   654k|    }
_ZNK9prevectorILj16EhjiE4sizeEv:
  294|  81.7M|    size_type size() const {
  295|  81.7M|        return is_direct() ? _size : _size - N - 1;
  ------------------
  |  Branch (295:16): [True: 76.5M, False: 5.18M]
  ------------------
  296|  81.7M|    }
_ZN9prevectorILj16EhjiE15change_capacityEj:
  175|   794k|    void change_capacity(size_type new_capacity) {
  176|   794k|        if (new_capacity <= N) {
  ------------------
  |  Branch (176:13): [True: 670k, False: 124k]
  ------------------
  177|   670k|            if (!is_direct()) {
  ------------------
  |  Branch (177:17): [True: 0, False: 670k]
  ------------------
  178|      0|                T* indirect = indirect_ptr(0);
  179|      0|                T* src = indirect;
  180|      0|                T* dst = direct_ptr(0);
  181|      0|                memcpy(dst, src, size() * sizeof(T));
  182|      0|                free(indirect);
  183|      0|                _size -= N + 1;
  184|      0|            }
  185|   670k|        } else {
  186|   124k|            if (!is_direct()) {
  ------------------
  |  Branch (186:17): [True: 0, False: 124k]
  ------------------
  187|       |                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
  188|       |                    success. These should instead use an allocator or new/delete so that handlers
  189|       |                    are called as necessary, but performance would be slightly degraded by doing so. */
  190|      0|                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
  191|      0|                assert(_union.indirect_contents.indirect);
  192|      0|                _union.indirect_contents.capacity = new_capacity;
  193|   124k|            } else {
  194|   124k|                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
  195|   124k|                assert(new_indirect);
  196|   124k|                T* src = direct_ptr(0);
  197|   124k|                T* dst = reinterpret_cast<T*>(new_indirect);
  198|   124k|                memcpy(dst, src, size() * sizeof(T));
  199|   124k|                _union.indirect_contents.indirect = new_indirect;
  200|   124k|                _union.indirect_contents.capacity = new_capacity;
  201|   124k|                _size += N + 1;
  202|   124k|            }
  203|   124k|        }
  204|   794k|    }
_ZN9prevectorILj16EhjiE12indirect_ptrEi:
  171|   129k|    T* indirect_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.indirect_contents.indirect) + pos; }
_ZN9prevectorILj16EhjiE10direct_ptrEi:
  169|  1.11M|    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
_ZN9prevectorILj16EhjiE4fillITkNSt3__114input_iteratorENS0_14const_iteratorEEEvPhT_S5_:
  214|   654k|    void fill(T* dst, InputIterator first, InputIterator last) {
  215|  9.61M|        while (first != last) {
  ------------------
  |  Branch (215:16): [True: 8.95M, False: 654k]
  ------------------
  216|  8.95M|            new(static_cast<void*>(dst)) T(*first);
  217|  8.95M|            ++dst;
  218|  8.95M|            ++first;
  219|  8.95M|        }
  220|   654k|    }
_ZNK9prevectorILj16EhjiE14const_iteratorneES1_:
  125|  62.6M|        bool operator!=(const_iterator x) const { return ptr != x.ptr; }
_ZNK9prevectorILj16EhjiE14const_iteratordeEv:
  111|   204M|        const T& operator*() const { return *ptr; }
_ZN9prevectorILj16EhjiE14const_iteratorppEv:
  114|   102M|        const_iterator& operator++() { ptr++; return *this; }
_ZN9prevectorILj16EhjiE8item_ptrEi:
  206|  1.11M|    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
  ------------------
  |  Branch (206:47): [True: 986k, False: 129k]
  ------------------
_ZNK9prevectorILj16EhjiE5beginEv:
  303|  60.7M|    const_iterator begin() const { return const_iterator(item_ptr(0)); }
_ZNK9prevectorILj16EhjiE8item_ptrEi:
  207|   118M|    const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
  ------------------
  |  Branch (207:59): [True: 115M, False: 3.23M]
  ------------------
_ZNK9prevectorILj16EhjiE10direct_ptrEi:
  170|   115M|    const T* direct_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.direct) + pos; }
_ZNK9prevectorILj16EhjiE12indirect_ptrEi:
  172|  3.23M|    const T* indirect_ptr(difference_type pos) const { return reinterpret_cast<const T*>(_union.indirect_contents.indirect) + pos; }
_ZN9prevectorILj16EhjiE14const_iteratorC2EPKh:
  109|  67.9M|        const_iterator(const T* ptr_) : ptr(ptr_) {}
_ZNK9prevectorILj16EhjiE3endEv:
  305|  7.15M|    const_iterator end() const { return const_iterator(item_ptr(size())); }
_ZN9prevectorILj16EhjiE5clearEv:
  355|  1.29k|    void clear() {
  356|  1.29k|        resize(0);
  357|  1.29k|    }
_ZN9prevectorILj16EhjiE6resizeEj:
  328|  89.6k|    void resize(size_type new_size) {
  329|  89.6k|        size_type cur_size = size();
  330|  89.6k|        if (cur_size == new_size) {
  ------------------
  |  Branch (330:13): [True: 7.47k, False: 82.2k]
  ------------------
  331|  7.47k|            return;
  332|  7.47k|        }
  333|  82.2k|        if (cur_size > new_size) {
  ------------------
  |  Branch (333:13): [True: 77.1k, False: 5.02k]
  ------------------
  334|  77.1k|            erase(item_ptr(new_size), end());
  335|  77.1k|            return;
  336|  77.1k|        }
  337|  5.02k|        if (new_size > capacity()) {
  ------------------
  |  Branch (337:13): [True: 5.02k, False: 0]
  ------------------
  338|  5.02k|            change_capacity(new_size);
  339|  5.02k|        }
  340|  5.02k|        ptrdiff_t increase = new_size - cur_size;
  341|  5.02k|        fill(item_ptr(cur_size), increase);
  342|  5.02k|        _size += increase;
  343|  5.02k|    }
_ZN9prevectorILj16EhjiE5eraseENS0_8iteratorES1_:
  420|  77.1k|    iterator erase(iterator first, iterator last) {
  421|       |        // Erase is not allowed to the change the object's capacity. That means
  422|       |        // that when starting with an indirectly allocated prevector with
  423|       |        // size and capacity > N, the result may be a still indirectly allocated
  424|       |        // prevector with size <= N and capacity > N. A shrink_to_fit() call is
  425|       |        // necessary to switch to the (more efficient) directly allocated
  426|       |        // representation (with capacity N and size <= N).
  427|  77.1k|        iterator p = first;
  428|  77.1k|        char* endp = (char*)&(*end());
  429|  77.1k|        _size -= last - p;
  430|  77.1k|        memmove(&(*first), &(*last), endp - ((char*)(&(*last))));
  431|  77.1k|        return first;
  432|  77.1k|    }
_ZNK9prevectorILj16EhjiE8iteratordeEv:
   59|   463k|        T& operator*() const { return *ptr; }
_ZmiN9prevectorILj16EhjiE8iteratorES1_:
   66|  77.1k|        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
_ZN9prevectorILj16EhjiE8iteratorC2EPh:
   58|   231k|        iterator(T* ptr_) : ptr(ptr_) {}
_ZN9prevectorILj16EhjiE3endEv:
  304|   154k|    iterator end() { return iterator(item_ptr(size())); }
_ZN9prevectorILj16EhjiE4fillEPhlRKh:
  209|   139k|    void fill(T* dst, ptrdiff_t count, const T& value = T{}) {
  210|   139k|        std::fill_n(dst, count, value);
  211|   139k|    }
_ZNK9prevectorILj16EhjiE8capacityEv:
  312|  6.32k|    size_t capacity() const {
  313|  6.32k|        if (is_direct()) {
  ------------------
  |  Branch (313:13): [True: 6.32k, False: 0]
  ------------------
  314|  6.32k|            return N;
  315|  6.32k|        } else {
  316|      0|            return _union.indirect_contents.capacity;
  317|      0|        }
  318|  6.32k|    }
_ZN9prevectorILj16EhjiEC2EOS0_:
  271|  99.1k|        : _union(std::move(other._union)), _size(other._size)
  272|  99.1k|    {
  273|  99.1k|        other._size = 0;
  274|  99.1k|    }
_ZNK9prevectorILj16EhjiEixEj:
  324|  33.5M|    const T& operator[](size_type pos) const {
  325|  33.5M|        return *item_ptr(pos);
  326|  33.5M|    }
_ZNK9prevectorILj16EhjiE4dataEv:
  537|  16.7M|    const value_type* data() const {
  538|  16.7M|        return item_ptr(0);
  539|  16.7M|    }
_ZN9prevectorILj16EhjiE4dataEv:
  533|  88.4k|    value_type* data() {
  534|  88.4k|        return item_ptr(0);
  535|  88.4k|    }
_ZNK9prevectorILj16EhjiE14const_iteratorptEv:
  112|  47.0M|        const T* operator->() const { return ptr; }
_ZN9prevectorILj16EhjiE6assignEjRKh:
  223|     34|    void assign(size_type n, const T& val) {
  224|     34|        clear();
  225|     34|        if (capacity() < n) {
  ------------------
  |  Branch (225:13): [True: 0, False: 34]
  ------------------
  226|      0|            change_capacity(n);
  227|      0|        }
  228|     34|        _size += n;
  229|     34|        fill(item_ptr(0), n, val);
  230|     34|    }
_ZN9prevectorILj35EhjiE4dataEv:
  533|  39.6k|    value_type* data() {
  534|  39.6k|        return item_ptr(0);
  535|  39.6k|    }
_ZN9prevectorILj35EhjiE8item_ptrEi:
  206|   317k|    T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); }
  ------------------
  |  Branch (206:47): [True: 317k, False: 0]
  ------------------
_ZNK9prevectorILj35EhjiE9is_directEv:
  173|   753k|    bool is_direct() const { return _size <= N; }
_ZN9prevectorILj35EhjiE10direct_ptrEi:
  169|   317k|    T* direct_ptr(difference_type pos) { return reinterpret_cast<T*>(_union.direct) + pos; }
_ZNK9prevectorILj35EhjiE4sizeEv:
  294|   277k|    size_type size() const {
  295|   277k|        return is_direct() ? _size : _size - N - 1;
  ------------------
  |  Branch (295:16): [True: 277k, False: 0]
  ------------------
  296|   277k|    }
_ZNK9prevectorILj16EhjiEltERKS0_:
  502|  6.50M|    bool operator<(const prevector<N, T, Size, Diff>& other) const {
  503|  6.50M|        if (size() < other.size()) {
  ------------------
  |  Branch (503:13): [True: 0, False: 6.50M]
  ------------------
  504|      0|            return true;
  505|      0|        }
  506|  6.50M|        if (size() > other.size()) {
  ------------------
  |  Branch (506:13): [True: 0, False: 6.50M]
  ------------------
  507|      0|            return false;
  508|      0|        }
  509|  6.50M|        const_iterator b1 = begin();
  510|  6.50M|        const_iterator b2 = other.begin();
  511|  6.50M|        const_iterator e1 = end();
  512|  53.0M|        while (b1 != e1) {
  ------------------
  |  Branch (512:16): [True: 50.3M, False: 2.76M]
  ------------------
  513|  50.3M|            if ((*b1) < (*b2)) {
  ------------------
  |  Branch (513:17): [True: 2.69M, False: 47.6M]
  ------------------
  514|  2.69M|                return true;
  515|  2.69M|            }
  516|  47.6M|            if ((*b2) < (*b1)) {
  ------------------
  |  Branch (516:17): [True: 1.03M, False: 46.5M]
  ------------------
  517|  1.03M|                return false;
  518|  1.03M|            }
  519|  46.5M|            ++b1;
  520|  46.5M|            ++b2;
  521|  46.5M|        }
  522|  2.76M|        return false;
  523|  6.50M|    }
_ZN9prevectorILj16EhjiEC2EjRKh:
  249|   134k|    explicit prevector(size_type n, const T& val) {
  250|   134k|        change_capacity(n);
  251|   134k|        _size += n;
  252|   134k|        fill(item_ptr(0), n, val);
  253|   134k|    }
_ZN9prevectorILj16EhjiE6assignITkNSt3__114input_iteratorEPhEEvT_S4_:
  233|  1.26k|    void assign(InputIterator first, InputIterator last) {
  234|  1.26k|        size_type n = last - first;
  235|  1.26k|        clear();
  236|  1.26k|        if (capacity() < n) {
  ------------------
  |  Branch (236:13): [True: 0, False: 1.26k]
  ------------------
  237|      0|            change_capacity(n);
  238|      0|        }
  239|  1.26k|        _size += n;
  240|  1.26k|        fill(item_ptr(0), first, last);
  241|  1.26k|    }
_ZN9prevectorILj16EhjiE4fillITkNSt3__114input_iteratorEPhEEvS3_T_S4_:
  214|  1.26k|    void fill(T* dst, InputIterator first, InputIterator last) {
  215|  13.9k|        while (first != last) {
  ------------------
  |  Branch (215:16): [True: 12.6k, False: 1.26k]
  ------------------
  216|  12.6k|            new(static_cast<void*>(dst)) T(*first);
  217|  12.6k|            ++dst;
  218|  12.6k|            ++first;
  219|  12.6k|        }
  220|  1.26k|    }
_ZN9prevectorILj35EhjiEC2ITkNSt3__114input_iteratorEPKhEET_S5_:
  256|  39.6k|    prevector(InputIterator first, InputIterator last) {
  257|  39.6k|        size_type n = last - first;
  258|  39.6k|        change_capacity(n);
  259|  39.6k|        _size += n;
  260|  39.6k|        fill(item_ptr(0), first, last);
  261|  39.6k|    }
_ZN9prevectorILj35EhjiE15change_capacityEj:
  175|  39.6k|    void change_capacity(size_type new_capacity) {
  176|  39.6k|        if (new_capacity <= N) {
  ------------------
  |  Branch (176:13): [True: 39.6k, False: 0]
  ------------------
  177|  39.6k|            if (!is_direct()) {
  ------------------
  |  Branch (177:17): [True: 0, False: 39.6k]
  ------------------
  178|      0|                T* indirect = indirect_ptr(0);
  179|      0|                T* src = indirect;
  180|      0|                T* dst = direct_ptr(0);
  181|      0|                memcpy(dst, src, size() * sizeof(T));
  182|      0|                free(indirect);
  183|      0|                _size -= N + 1;
  184|      0|            }
  185|  39.6k|        } else {
  186|      0|            if (!is_direct()) {
  ------------------
  |  Branch (186:17): [True: 0, False: 0]
  ------------------
  187|       |                /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert
  188|       |                    success. These should instead use an allocator or new/delete so that handlers
  189|       |                    are called as necessary, but performance would be slightly degraded by doing so. */
  190|      0|                _union.indirect_contents.indirect = static_cast<char*>(realloc(_union.indirect_contents.indirect, ((size_t)sizeof(T)) * new_capacity));
  191|      0|                assert(_union.indirect_contents.indirect);
  192|      0|                _union.indirect_contents.capacity = new_capacity;
  193|      0|            } else {
  194|      0|                char* new_indirect = static_cast<char*>(malloc(((size_t)sizeof(T)) * new_capacity));
  195|      0|                assert(new_indirect);
  196|      0|                T* src = direct_ptr(0);
  197|      0|                T* dst = reinterpret_cast<T*>(new_indirect);
  198|      0|                memcpy(dst, src, size() * sizeof(T));
  199|      0|                _union.indirect_contents.indirect = new_indirect;
  200|      0|                _union.indirect_contents.capacity = new_capacity;
  201|      0|                _size += N + 1;
  202|      0|            }
  203|      0|        }
  204|  39.6k|    }
_ZN9prevectorILj35EhjiE4fillITkNSt3__114input_iteratorEPKhEEvPhT_S6_:
  214|  79.3k|    void fill(T* dst, InputIterator first, InputIterator last) {
  215|  1.38M|        while (first != last) {
  ------------------
  |  Branch (215:16): [True: 1.30M, False: 79.3k]
  ------------------
  216|  1.30M|            new(static_cast<void*>(dst)) T(*first);
  217|  1.30M|            ++dst;
  218|  1.30M|            ++first;
  219|  1.30M|        }
  220|  79.3k|    }
_ZN9prevectorILj35EhjiED2Ev:
  474|  39.6k|    ~prevector() {
  475|  39.6k|        if (!is_direct()) {
  ------------------
  |  Branch (475:13): [True: 0, False: 39.6k]
  ------------------
  476|      0|            free(_union.indirect_contents.indirect);
  477|      0|            _union.indirect_contents.indirect = nullptr;
  478|      0|        }
  479|  39.6k|    }
_ZN9prevectorILj35EhjiE3endEv:
  304|  79.3k|    iterator end() { return iterator(item_ptr(size())); }
_ZN9prevectorILj35EhjiE8iteratorC2EPh:
   58|   158k|        iterator(T* ptr_) : ptr(ptr_) {}
_ZN9prevectorILj35EhjiE6insertITkNSt3__114input_iteratorEPhEEvNS0_8iteratorET_S5_:
  387|  39.6k|    void insert(iterator pos, InputIterator first, InputIterator last) {
  388|  39.6k|        size_type p = pos - begin();
  389|  39.6k|        difference_type count = last - first;
  390|  39.6k|        size_type new_size = size() + count;
  391|  39.6k|        if (capacity() < new_size) {
  ------------------
  |  Branch (391:13): [True: 0, False: 39.6k]
  ------------------
  392|      0|            change_capacity(new_size + (new_size >> 1));
  393|      0|        }
  394|  39.6k|        T* ptr = item_ptr(p);
  395|  39.6k|        T* dst = ptr + count;
  396|  39.6k|        memmove(dst, ptr, (size() - p) * sizeof(T));
  397|  39.6k|        _size += count;
  398|  39.6k|        fill(ptr, first, last);
  399|  39.6k|    }
_ZmiN9prevectorILj35EhjiE8iteratorES1_:
   66|  79.3k|        difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
_ZNK9prevectorILj35EhjiE8iteratordeEv:
   59|   158k|        T& operator*() const { return *ptr; }
_ZN9prevectorILj35EhjiE5beginEv:
  302|  79.3k|    iterator begin() { return iterator(item_ptr(0)); }
_ZNK9prevectorILj35EhjiE8capacityEv:
  312|  79.3k|    size_t capacity() const {
  313|  79.3k|        if (is_direct()) {
  ------------------
  |  Branch (313:13): [True: 79.3k, False: 0]
  ------------------
  314|  79.3k|            return N;
  315|  79.3k|        } else {
  316|      0|            return _union.indirect_contents.capacity;
  317|      0|        }
  318|  79.3k|    }
_ZN9prevectorILj35EhjiE4fillITkNSt3__114input_iteratorEPhEEvS3_T_S4_:
  214|  39.6k|    void fill(T* dst, InputIterator first, InputIterator last) {
  215|   119k|        while (first != last) {
  ------------------
  |  Branch (215:16): [True: 79.3k, False: 39.6k]
  ------------------
  216|  79.3k|            new(static_cast<void*>(dst)) T(*first);
  217|  79.3k|            ++dst;
  218|  79.3k|            ++first;
  219|  79.3k|        }
  220|  39.6k|    }
_ZN9prevectorILj35EhjiE6insertITkNSt3__114input_iteratorEPKhEEvNS0_8iteratorET_S6_:
  387|  39.6k|    void insert(iterator pos, InputIterator first, InputIterator last) {
  388|  39.6k|        size_type p = pos - begin();
  389|  39.6k|        difference_type count = last - first;
  390|  39.6k|        size_type new_size = size() + count;
  391|  39.6k|        if (capacity() < new_size) {
  ------------------
  |  Branch (391:13): [True: 0, False: 39.6k]
  ------------------
  392|      0|            change_capacity(new_size + (new_size >> 1));
  393|      0|        }
  394|  39.6k|        T* ptr = item_ptr(p);
  395|  39.6k|        T* dst = ptr + count;
  396|  39.6k|        memmove(dst, ptr, (size() - p) * sizeof(T));
  397|  39.6k|        _size += count;
  398|  39.6k|        fill(ptr, first, last);
  399|  39.6k|    }

_ZN8CAddressC2E8CService12ServiceFlagsNSt3__16chrono10time_pointI9NodeClockNS3_8durationIxNS2_5ratioILl1ELl1EEEEEEE:
  398|  4.21k|    CAddress(CService ipIn, ServiceFlags nServicesIn, NodeSeconds time) : CService{ipIn}, nTime{time}, nServices{nServicesIn} {};
_ZN14CMessageHeaderC2Ev:
   38|  2.10k|    explicit CMessageHeader() = default;

secp256k1.c:secp256k1_ecmult_gen_context_clear:
   26|      2|static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) {
   27|      2|    ctx->built = 0;
   28|      2|    secp256k1_scalar_clear(&ctx->scalar_offset);
   29|      2|    secp256k1_ge_clear(&ctx->ge_offset);
   30|      2|    secp256k1_fe_clear(&ctx->proj_blind);
   31|      2|}
secp256k1.c:secp256k1_ecmult_gen_context_is_built:
   22|      4|static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) {
   23|      4|    return ctx->built;
   24|      4|}

secp256k1.c:secp256k1_fe_clear:
   21|      2|SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) {
   22|      2|    secp256k1_memclear(a, sizeof(secp256k1_fe));
   23|      2|}

secp256k1.c:secp256k1_ge_clear:
  305|      2|static void secp256k1_ge_clear(secp256k1_ge *r) {
  306|      2|    secp256k1_memclear(r, sizeof(secp256k1_ge));
  307|      2|}

secp256k1.c:secp256k1_scalar_clear:
   30|      2|SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) {
   31|      2|    secp256k1_memclear(r, sizeof(secp256k1_scalar));
   32|      2|}

secp256k1_context_preallocated_destroy:
  176|      2|void secp256k1_context_preallocated_destroy(secp256k1_context* ctx) {
  177|      2|    ARG_CHECK_VOID(ctx == NULL || secp256k1_context_is_proper(ctx));
  ------------------
  |  |   52|      2|#define ARG_CHECK_VOID(cond) do { \
  |  |   53|      2|    if (EXPECT(!(cond), 0)) { \
  |  |  ------------------
  |  |  |  |  136|      4|#define EXPECT(x,c) __builtin_expect((x),(c))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (136:21): [True: 0, False: 2]
  |  |  |  |  |  Branch (136:39): [True: 0, False: 2]
  |  |  |  |  |  Branch (136:39): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   54|      0|        secp256k1_callback_call(&ctx->illegal_callback, #cond); \
  |  |   55|      0|        return; \
  |  |   56|      0|    } \
  |  |   57|      2|} while(0)
  |  |  ------------------
  |  |  |  Branch (57:9): [Folded - Ignored]
  |  |  ------------------
  ------------------
  178|       |
  179|       |    /* Defined as noop */
  180|      2|    if (ctx == NULL) {
  ------------------
  |  Branch (180:9): [True: 0, False: 2]
  ------------------
  181|      0|        return;
  182|      0|    }
  183|       |
  184|      2|    secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx);
  185|      2|}
secp256k1_context_destroy:
  187|      2|void secp256k1_context_destroy(secp256k1_context* ctx) {
  188|      2|    ARG_CHECK_VOID(ctx == NULL || secp256k1_context_is_proper(ctx));
  ------------------
  |  |   52|      2|#define ARG_CHECK_VOID(cond) do { \
  |  |   53|      2|    if (EXPECT(!(cond), 0)) { \
  |  |  ------------------
  |  |  |  |  136|      4|#define EXPECT(x,c) __builtin_expect((x),(c))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (136:21): [True: 0, False: 2]
  |  |  |  |  |  Branch (136:39): [True: 0, False: 2]
  |  |  |  |  |  Branch (136:39): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   54|      0|        secp256k1_callback_call(&ctx->illegal_callback, #cond); \
  |  |   55|      0|        return; \
  |  |   56|      0|    } \
  |  |   57|      2|} while(0)
  |  |  ------------------
  |  |  |  Branch (57:9): [Folded - Ignored]
  |  |  ------------------
  ------------------
  189|       |
  190|       |    /* Defined as noop */
  191|      2|    if (ctx == NULL) {
  ------------------
  |  Branch (191:9): [True: 0, False: 2]
  ------------------
  192|      0|        return;
  193|      0|    }
  194|       |
  195|      2|    secp256k1_context_preallocated_destroy(ctx);
  196|      2|    free(ctx);
  197|      2|}
secp256k1.c:secp256k1_context_is_proper:
   82|      4|static int secp256k1_context_is_proper(const secp256k1_context* ctx) {
   83|      4|    return secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx);
   84|      4|}

secp256k1.c:secp256k1_memclear:
  223|      6|static SECP256K1_INLINE void secp256k1_memclear(void *ptr, size_t len) {
  224|       |#if defined(_MSC_VER)
  225|       |    /* SecureZeroMemory is guaranteed not to be optimized out by MSVC. */
  226|       |    SecureZeroMemory(ptr, len);
  227|       |#elif defined(__GNUC__)
  228|       |    /* We use a memory barrier that scares the compiler away from optimizing out the memset.
  229|       |     *
  230|       |     * Quoting Adam Langley <agl@google.com> in commit ad1907fe73334d6c696c8539646c21b11178f20f
  231|       |     * in BoringSSL (ISC License):
  232|       |     *    As best as we can tell, this is sufficient to break any optimisations that
  233|       |     *    might try to eliminate "superfluous" memsets.
  234|       |     * This method is used in memzero_explicit() the Linux kernel, too. Its advantage is that it
  235|       |     * is pretty efficient, because the compiler can still implement the memset() efficently,
  236|       |     * just not remove it entirely. See "Dead Store Elimination (Still) Considered Harmful" by
  237|       |     * Yang et al. (USENIX Security 2017) for more background.
  238|       |     */
  239|      6|    memset(ptr, 0, len);
  240|      6|    __asm__ __volatile__("" : : "r"(ptr) : "memory");
  241|       |#else
  242|       |    void *(*volatile const volatile_memset)(void *, int, size_t) = memset;
  243|       |    volatile_memset(ptr, 0, len);
  244|       |#endif
  245|       |#ifdef VERIFY
  246|       |    SECP256K1_CHECKMEM_UNDEFINE(ptr, len);
  247|       |#endif
  248|      6|}

_Z9SerializeI10DataStreamEvRT_h:
  258|  88.3k|template<typename Stream> inline void Serialize(Stream& s, uint8_t a ) { ser_writedata8(s, a); }
_Z14ser_writedata8I10DataStreamEvRT_h:
   55|   176k|{
   56|   176k|    s.write(AsBytes(Span{&obj, 1}));
   57|   176k|}
_Z9SerializeI10DataStreamhNSt3__19allocatorIhEEEvRT_RKNS1_6vectorIT0_T1_EE:
  846|  88.3k|{
  847|  88.3k|    if constexpr (BasicByte<T>) { // Use optimized version for unformatted basic bytes
  848|  88.3k|        WriteCompactSize(os, v.size());
  849|  88.3k|        if (!v.empty()) os.write(MakeByteSpan(v));
  ------------------
  |  Branch (849:13): [True: 88.3k, False: 0]
  ------------------
  850|       |    } else if constexpr (std::is_same_v<T, bool>) {
  851|       |        // A special case for std::vector<bool>, as dereferencing
  852|       |        // std::vector<bool>::const_iterator does not result in a const bool&
  853|       |        // due to std::vector's special casing for bool arguments.
  854|       |        WriteCompactSize(os, v.size());
  855|       |        for (bool elem : v) {
  856|       |            ::Serialize(os, elem);
  857|       |        }
  858|       |    } else {
  859|       |        Serialize(os, Using<VectorFormatter<DefaultFormatter>>(v));
  860|       |    }
  861|  88.3k|}
_Z16WriteCompactSizeI10DataStreamEvRT_m:
  309|  88.3k|{
  310|  88.3k|    if (nSize < 253)
  ------------------
  |  Branch (310:9): [True: 88.3k, False: 0]
  ------------------
  311|  88.3k|    {
  312|  88.3k|        ser_writedata8(os, nSize);
  313|  88.3k|    }
  314|      0|    else if (nSize <= std::numeric_limits<uint16_t>::max())
  ------------------
  |  Branch (314:14): [True: 0, False: 0]
  ------------------
  315|      0|    {
  316|      0|        ser_writedata8(os, 253);
  317|      0|        ser_writedata16(os, nSize);
  318|      0|    }
  319|      0|    else if (nSize <= std::numeric_limits<unsigned int>::max())
  ------------------
  |  Branch (319:14): [True: 0, False: 0]
  ------------------
  320|      0|    {
  321|      0|        ser_writedata8(os, 254);
  322|      0|        ser_writedata32(os, nSize);
  323|      0|    }
  324|      0|    else
  325|      0|    {
  326|      0|        ser_writedata8(os, 255);
  327|      0|        ser_writedata64(os, nSize);
  328|      0|    }
  329|  88.3k|    return;
  330|  88.3k|}
_ZN12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEC2ES1_RKS3_:
 1127|  88.3k|    ParamsStream(SubStream&& substream, const Params& params LIFETIMEBOUND) : m_params{params}, m_substream{std::forward<SubStream>(substream)} {}
_ZN12ParamsStreamIR10DataStreamN8CAddress9SerParamsEE4readE4SpanISt4byteE:
 1136|   265k|    void read(Span<std::byte> dst) { GetStream().read(dst); }
_ZN12ParamsStreamIR10DataStreamN8CAddress9SerParamsEE9GetStreamEv:
 1154|   265k|    {
 1155|       |        if constexpr (ContainsStream<SubStream>) {
 1156|       |            return m_substream.GetStream();
 1157|   265k|        } else {
 1158|   265k|            return m_substream;
 1159|   265k|        }
 1160|   265k|    }
_Z15ReadCompactSizeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEEmRT_b:
  340|  88.3k|{
  341|  88.3k|    uint8_t chSize = ser_readdata8(is);
  342|  88.3k|    uint64_t nSizeRet = 0;
  343|  88.3k|    if (chSize < 253)
  ------------------
  |  Branch (343:9): [True: 88.3k, False: 0]
  ------------------
  344|  88.3k|    {
  345|  88.3k|        nSizeRet = chSize;
  346|  88.3k|    }
  347|      0|    else if (chSize == 253)
  ------------------
  |  Branch (347:14): [True: 0, False: 0]
  ------------------
  348|      0|    {
  349|      0|        nSizeRet = ser_readdata16(is);
  350|      0|        if (nSizeRet < 253)
  ------------------
  |  Branch (350:13): [True: 0, False: 0]
  ------------------
  351|      0|            throw std::ios_base::failure("non-canonical ReadCompactSize()");
  352|      0|    }
  353|      0|    else if (chSize == 254)
  ------------------
  |  Branch (353:14): [True: 0, False: 0]
  ------------------
  354|      0|    {
  355|      0|        nSizeRet = ser_readdata32(is);
  356|      0|        if (nSizeRet < 0x10000u)
  ------------------
  |  Branch (356:13): [True: 0, False: 0]
  ------------------
  357|      0|            throw std::ios_base::failure("non-canonical ReadCompactSize()");
  358|      0|    }
  359|      0|    else
  360|      0|    {
  361|      0|        nSizeRet = ser_readdata64(is);
  362|      0|        if (nSizeRet < 0x100000000ULL)
  ------------------
  |  Branch (362:13): [True: 0, False: 0]
  ------------------
  363|      0|            throw std::ios_base::failure("non-canonical ReadCompactSize()");
  364|      0|    }
  365|  88.3k|    if (range_check && nSizeRet > MAX_SIZE) {
  ------------------
  |  Branch (365:9): [True: 88.3k, False: 0]
  |  Branch (365:24): [True: 0, False: 88.3k]
  ------------------
  366|      0|        throw std::ios_base::failure("ReadCompactSize(): size too large");
  367|      0|    }
  368|  88.3k|    return nSizeRet;
  369|  88.3k|}
_Z13ser_readdata8I12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEEhRT_:
   84|   176k|{
   85|   176k|    uint8_t obj;
   86|   176k|    s.read(AsWritableBytes(Span{&obj, 1}));
   87|   176k|    return obj;
   88|   176k|}
deserialize.cpp:_ZL5UsingI20CompactSizeFormatterILb1EERmE7WrapperIT_RT0_EOS5_:
  497|  88.3k|static inline Wrapper<Formatter, T&> Using(T&& t) { return Wrapper<Formatter, T&>(t); }
_ZN7WrapperI20CompactSizeFormatterILb1EERmEC2ES2_:
  481|  88.3k|    explicit Wrapper(T obj) : m_object(obj) {}
_Z11UnserializeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEER8CNetAddrQ14UnserializableIT0_T_EEvRS9_OS8_:
  762|  88.3k|{
  763|  88.3k|    a.Unserialize(is);
  764|  88.3k|}
_ZNK12ParamsStreamIR10DataStreamN8CAddress9SerParamsEE9GetParamsIN8CNetAddr9SerParamsEEERKDav:
 1144|  88.3k|    {
 1145|  88.3k|        if constexpr (std::is_convertible_v<Params, P>) {
 1146|  88.3k|            return m_params;
 1147|       |        } else {
 1148|       |            return m_substream.template GetParams<P>();
 1149|       |        }
 1150|  88.3k|    }
_ZN12ParamsStreamIR10DataStreamN8CAddress9SerParamsEErsIRhEERS4_OT_:
 1134|  88.3k|    template <typename U> ParamsStream& operator>>(U&& obj) { ::Unserialize(*this, obj); return *this; }
_Z11UnserializeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEEvRT_Rh:
  273|  88.3k|template<typename Stream> inline void Unserialize(Stream& s, uint8_t& a ) { a = ser_readdata8(s); }
_ZN12ParamsStreamIR10DataStreamN8CAddress9SerParamsEErsI7WrapperI20CompactSizeFormatterILb1EERmEEERS4_OT_:
 1134|  88.3k|    template <typename U> ParamsStream& operator>>(U&& obj) { ::Unserialize(*this, obj); return *this; }
_Z11UnserializeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEER7WrapperI20CompactSizeFormatterILb1EERmEQ14UnserializableIT0_T_EEvRSD_OSC_:
  762|  88.3k|{
  763|  88.3k|    a.Unserialize(is);
  764|  88.3k|}
_ZN7WrapperI20CompactSizeFormatterILb1EERmE11UnserializeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEEEvRT_:
  483|  88.3k|    template<typename Stream> void Unserialize(Stream &s) { Formatter().Unser(s, m_object); }
_ZN20CompactSizeFormatterILb1EE5UnserI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEEmEEvRT_RT0_:
  569|  88.3k|    {
  570|  88.3k|        uint64_t n = ReadCompactSize<Stream>(s, RangeCheck);
  571|  88.3k|        if (n < std::numeric_limits<I>::min() || n > std::numeric_limits<I>::max()) {
  ------------------
  |  Branch (571:13): [True: 0, False: 88.3k]
  |  Branch (571:50): [True: 0, False: 88.3k]
  ------------------
  572|      0|            throw std::ios_base::failure("CompactSize exceeds limit of type");
  573|      0|        }
  574|  88.3k|        v = n;
  575|  88.3k|    }
_ZN12ParamsStreamIR10DataStreamN8CAddress9SerParamsEErsI4SpanIhEEERS4_OT_:
 1134|  88.3k|    template <typename U> ParamsStream& operator>>(U&& obj) { ::Unserialize(*this, obj); return *this; }
_Z11UnserializeI12ParamsStreamIR10DataStreamN8CAddress9SerParamsEETk9BasicBytehEvRT_4SpanIT0_E:
  283|  88.3k|template <typename Stream, BasicByte B> void Unserialize(Stream& s, Span<B> span) { s.read(AsWritableBytes(span)); }
_ZNK8CAddress9SerParamsclIR8CNetAddrEEDaOT_:
 1228|  88.3k|    {                                                                                    \
 1229|  88.3k|        return ParamsWrapper{*this, t};                                                  \
 1230|  88.3k|    }
_ZN13ParamsWrapperIN8CAddress9SerParamsE8CNetAddrEC2ERKS1_RS2_:
 1195|  88.3k|    explicit ParamsWrapper(const Params& params, T& obj) : m_params{params}, m_object{obj} {}
_Z11UnserializeI10DataStreamR13ParamsWrapperIN8CAddress9SerParamsE8CNetAddrEQ14UnserializableIT0_T_EEvRS8_OS7_:
  762|  88.3k|{
  763|  88.3k|    a.Unserialize(is);
  764|  88.3k|}
_ZN13ParamsWrapperIN8CAddress9SerParamsE8CNetAddrE11UnserializeI10DataStreamEEvRT_:
 1205|  88.3k|    {
 1206|  88.3k|        ParamsStream ss{s, m_params};
 1207|  88.3k|        ::Unserialize(ss, m_object);
 1208|  88.3k|    }

_ZNK4SpanIKhE4sizeEv:
  187|   720k|    constexpr std::size_t size() const noexcept { return m_size; }
_ZNK4SpanIKhE5beginEv:
  175|   350k|    constexpr C* begin() const noexcept { return m_data; }
_ZNK4SpanIKhE3endEv:
  176|   191k|    constexpr C* end() const noexcept { return m_data + m_size; }
_ZNK4SpanIhE4sizeEv:
  187|  39.6k|    constexpr std::size_t size() const noexcept { return m_size; }
_ZNK4SpanIhE4dataEv:
  174|   600k|    constexpr C* data() const noexcept { return m_data; }
_ZNK4SpanIKhE4dataEv:
  174|   247k|    constexpr C* data() const noexcept { return m_data; }
_ZNK4SpanIKhE5firstEm:
  206|  39.6k|    {
  207|  39.6k|        ASSERT_IF_DEBUG(size() >= count);
  208|  39.6k|        return Span<C>(m_data, count);
  209|  39.6k|    }
_ZNK4SpanISt4byteE4sizeEv:
  187|   795k|    constexpr std::size_t size() const noexcept { return m_size; }
_ZNK4SpanISt4byteE4dataEv:
  174|   265k|    constexpr C* data() const noexcept { return m_data; }
_ZNK4SpanIKhE7subspanEm:
  196|   238k|    {
  197|   238k|        ASSERT_IF_DEBUG(size() >= offset);
  198|   238k|        return Span<C>(m_data + offset, m_size - offset);
  199|   238k|    }
_ZNK4SpanIKSt4byteE5beginEv:
  175|   265k|    constexpr C* begin() const noexcept { return m_data; }
_ZNK4SpanIKSt4byteE3endEv:
  176|   265k|    constexpr C* end() const noexcept { return m_data + m_size; }
_ZNK4SpanIKhE10size_bytesEv:
  188|  88.3k|    constexpr std::size_t size_bytes() const noexcept { return sizeof(C) * m_size; }
_Z7AsBytesIKhE4SpanIKSt4byteES1_IT_E:
  259|  88.3k|{
  260|  88.3k|    return {reinterpret_cast<const std::byte*>(s.data()), s.size_bytes()};
  261|  88.3k|}
_Z12MakeByteSpanIRKNSt3__16vectorIhNS0_9allocatorIhEEEEE4SpanIKSt4byteEOT_:
  270|  88.3k|{
  271|  88.3k|    return AsBytes(Span{std::forward<V>(v)});
  272|  88.3k|}
_ZN4SpanIKhEC2INSt3__16vectorIhNS3_9allocatorIhEEEEEERKT_NS3_9enable_ifIXaaaantsr7is_SpanIS8_EE5valuesr3std14is_convertibleIPA_NS3_14remove_pointerIDTcldtclsr3stdE7declvalISA_EE4dataEEE4typeEPA_S0_EE5valuesr3std14is_convertibleIDTcldtclsr3stdE7declvalISA_EE4sizeEEmEE5valueEDnE4typeE:
  172|  88.3k|        : m_data(other.data()), m_size(other.size()){}
_ZN4SpanIKSt4byteEC2IS1_TnNSt3__19enable_ifIXsr3std14is_convertibleIPA_T_PA_S1_EE5valueEiE4typeELi0EEEPS6_m:
  119|   265k|    constexpr Span(T* begin, std::size_t size) noexcept : m_data(begin), m_size(size) {}
_ZNK4SpanIhE10size_bytesEv:
  188|   441k|    constexpr std::size_t size_bytes() const noexcept { return sizeof(C) * m_size; }
_Z7AsBytesIhE4SpanIKSt4byteES0_IT_E:
  259|   176k|{
  260|   176k|    return {reinterpret_cast<const std::byte*>(s.data()), s.size_bytes()};
  261|   176k|}
_ZN4SpanIKhEC2IS0_TnNSt3__19enable_ifIXsr3std14is_convertibleIPA_T_PA_S0_EE5valueEiE4typeELi0EEEPS5_m:
  119|   277k|    constexpr Span(T* begin, std::size_t size) noexcept : m_data(begin), m_size(size) {}
_ZN4SpanISt4byteEC2IS0_TnNSt3__19enable_ifIXsr3std14is_convertibleIPA_T_PA_S0_EE5valueEiE4typeELi0EEEPS5_m:
  119|   265k|    constexpr Span(T* begin, std::size_t size) noexcept : m_data(begin), m_size(size) {}
_Z15AsWritableBytesIhE4SpanISt4byteES0_IT_E:
  264|   265k|{
  265|   265k|    return {reinterpret_cast<std::byte*>(s.data()), s.size_bytes()};
  266|   265k|}
_ZN4SpanIhEC2IhTnNSt3__19enable_ifIXsr3std14is_convertibleIPA_T_PA_hEE5valueEiE4typeELi0EEEPS4_m:
  119|   353k|    constexpr Span(T* begin, std::size_t size) noexcept : m_data(begin), m_size(size) {}
_ZN4SpanIhEC2I9prevectorILj16EhjiEEERT_NSt3__19enable_ifIXaaaantsr7is_SpanIS4_EE5valuesr3std14is_convertibleIPA_NS6_14remove_pointerIDTcldtclsr3stdE7declvalIS5_EE4dataEEE4typeEPA_hEE5valuesr3std14is_convertibleIDTcldtclsr3stdE7declvalIS5_EE4sizeEEmEE5valueEDnE4typeE:
  165|  88.3k|        : m_data(other.data()), m_size(other.size()){}
_ZN4SpanIKhEC2ILi16EEERAT__S0_:
  151|  39.6k|    constexpr Span(C (&a)[N]) noexcept : m_data(a), m_size(N) {}
_ZN4SpanIKhEC2I9prevectorILj16EhjiEEERKT_NSt3__19enable_ifIXaaaantsr7is_SpanIS5_EE5valuesr3std14is_convertibleIPA_NS8_14remove_pointerIDTcldtclsr3stdE7declvalIS7_EE4dataEEE4typeEPA_S0_EE5valuesr3std14is_convertibleIDTcldtclsr3stdE7declvalIS7_EE4sizeEEmEE5valueEDnE4typeE:
  172|   345k|        : m_data(other.data()), m_size(other.size()){}
_ZN4SpanIhEC2ILi32EEERAT__h:
  151|  39.6k|    constexpr Span(C (&a)[N]) noexcept : m_data(a), m_size(N) {}
_ZNK4SpanIKhEixEm:
  191|  1.45M|    {
  192|  1.45M|        ASSERT_IF_DEBUG(size() > pos);
  193|  1.45M|        return m_data[pos];
  194|  1.45M|    }
_ZN4SpanIKhEC2ILi1EEERAT__S0_:
  151|  39.6k|    constexpr Span(C (&a)[N]) noexcept : m_data(a), m_size(N) {}
_ZN4SpanIKhEC2I9prevectorILj35EhjiEEERT_NSt3__19enable_ifIXaaaantsr7is_SpanIS5_EE5valuesr3std14is_convertibleIPA_NS7_14remove_pointerIDTcldtclsr3stdE7declvalIS6_EE4dataEEE4typeEPA_S0_EE5valuesr3std14is_convertibleIDTcldtclsr3stdE7declvalIS6_EE4sizeEEmEE5valueEDnE4typeE:
  165|  39.6k|        : m_data(other.data()), m_size(other.size()){}

_ZN10DataStream6resizeEmSt4byte:
  183|  2.10k|    void resize(size_type n, value_type c = value_type{}) { vch.resize(n + m_read_pos, c); }
_ZN10DataStream5clearEv:
  187|  4.21k|    void clear()                                     { vch.clear(); m_read_pos = 0; }
_ZN10DataStream4readE4SpanISt4byteE:
  219|   265k|    {
  220|   265k|        if (dst.size() == 0) return;
  ------------------
  |  Branch (220:13): [True: 0, False: 265k]
  ------------------
  221|       |
  222|       |        // Read from the beginning of the buffer
  223|   265k|        auto next_read_pos{CheckedAdd(m_read_pos, dst.size())};
  224|   265k|        if (!next_read_pos.has_value() || next_read_pos.value() > vch.size()) {
  ------------------
  |  Branch (224:13): [True: 0, False: 265k]
  |  Branch (224:43): [True: 0, False: 265k]
  ------------------
  225|      0|            throw std::ios_base::failure("DataStream::read(): end of data");
  226|      0|        }
  227|   265k|        memcpy(dst.data(), &vch[m_read_pos], dst.size());
  228|   265k|        if (next_read_pos.value() == vch.size()) {
  ------------------
  |  Branch (228:13): [True: 88.3k, False: 176k]
  ------------------
  229|  88.3k|            m_read_pos = 0;
  230|  88.3k|            vch.clear();
  231|  88.3k|            return;
  232|  88.3k|        }
  233|   176k|        m_read_pos = next_read_pos.value();
  234|   176k|    }
_ZN10DataStream5writeE4SpanIKSt4byteE:
  252|   265k|    {
  253|       |        // Write to the end of the buffer
  254|   265k|        vch.insert(vch.end(), src.begin(), src.end());
  255|   265k|    }
_ZN10DataStreamC2Ev:
  164|  92.5k|    explicit DataStream() = default;
_ZN10DataStreamlsIhEERS_RKT_:
  259|  88.3k|    {
  260|  88.3k|        ::Serialize(*this, obj);
  261|  88.3k|        return (*this);
  262|  88.3k|    }
_ZN10DataStreamlsINSt3__16vectorIhNS1_9allocatorIhEEEEEERS_RKT_:
  259|  88.3k|    {
  260|  88.3k|        ::Serialize(*this, obj);
  261|  88.3k|        return (*this);
  262|  88.3k|    }
_ZN10DataStreamrsI13ParamsWrapperIN8CAddress9SerParamsE8CNetAddrEEERS_OT_:
  266|  88.3k|    {
  267|  88.3k|        ::Unserialize(*this, obj);
  268|  88.3k|        return (*this);
  269|  88.3k|    }

_ZN25zero_after_free_allocatorISt4byteE10deallocateEPS0_m:
   30|   267k|    {
   31|   267k|        if (p != nullptr)
  ------------------
  |  Branch (31:13): [True: 267k, False: 0]
  ------------------
   32|   267k|            memory_cleanse(p, sizeof(T) * n);
   33|   267k|        std::allocator<T>{}.deallocate(p, n);
   34|   267k|    }
_ZN25zero_after_free_allocatorISt4byteE8allocateEm:
   25|   267k|    {
   26|   267k|        return std::allocator<T>{}.allocate(n);
   27|   267k|    }

_Z14memory_cleansePvm:
   15|   267k|{
   16|       |#if defined(WIN32)
   17|       |    /* SecureZeroMemory is guaranteed not to be optimized out. */
   18|       |    SecureZeroMemory(ptr, len);
   19|       |#else
   20|   267k|    std::memset(ptr, 0, len);
   21|       |
   22|       |    /* Memory barrier that scares the compiler away from optimizing out the memset.
   23|       |     *
   24|       |     * Quoting Adam Langley <agl@google.com> in commit ad1907fe73334d6c696c8539646c21b11178f20f
   25|       |     * in BoringSSL (ISC License):
   26|       |     *    As best as we can tell, this is sufficient to break any optimisations that
   27|       |     *    might try to eliminate "superfluous" memsets.
   28|       |     * This method is used in memzero_explicit() the Linux kernel, too. Its advantage is that it
   29|       |     * is pretty efficient because the compiler can still implement the memset() efficiently,
   30|       |     * just not remove it entirely. See "Dead Store Elimination (Still) Considered Harmful" by
   31|       |     * Yang et al. (USENIX Security 2017) for more background.
   32|       |     */
   33|   267k|    __asm__ __volatile__("" : : "r"(ptr) : "memory");
   34|   267k|#endif
   35|   267k|}

_Z17MaybeCheckNotHeldR14AnnotatedMixinINSt3__15mutexEE:
  247|   226k|inline Mutex& MaybeCheckNotHeld(Mutex& cs) EXCLUSIVE_LOCKS_REQUIRED(!cs) LOCK_RETURNED(cs) { return cs; }
_ZN10UniqueLockI14AnnotatedMixinINSt3__15mutexEEEC2ERS3_PKcS7_ib:
  177|   226k|    UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock)
  178|   226k|    {
  179|   226k|        if (fTry)
  ------------------
  |  Branch (179:13): [True: 0, False: 226k]
  ------------------
  180|      0|            TryEnter(pszName, pszFile, nLine);
  181|   226k|        else
  182|   226k|            Enter(pszName, pszFile, nLine);
  183|   226k|    }
_Z13EnterCriticalINSt3__15mutexEEvPKcS3_iPT_b:
   75|  1.13M|inline void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry = false) {}
_Z13LeaveCriticalv:
   76|  1.26M|inline void LeaveCritical() {}
_ZN10UniqueLockI14AnnotatedMixinINSt3__15mutexEEE5EnterEPKcS6_i:
  157|   226k|    {
  158|   226k|        EnterCritical(pszName, pszFile, nLine, Base::mutex());
  159|       |#ifdef DEBUG_LOCKCONTENTION
  160|       |        if (Base::try_lock()) return;
  161|       |        LOG_TIME_MICROS_WITH_CATEGORY(strprintf("lock contention %s, %s:%d", pszName, pszFile, nLine), BCLog::LOCK);
  162|       |#endif
  163|   226k|        Base::lock();
  164|   226k|    }
_ZN10UniqueLockI14AnnotatedMixinINSt3__15mutexEEED2Ev:
  197|   226k|    {
  198|   226k|        if (Base::owns_lock())
  ------------------
  |  Branch (198:13): [True: 226k, False: 0]
  ------------------
  199|   226k|            LeaveCritical();
  200|   226k|    }
_Z10DeleteLockPv:
   82|  16.8k|inline void DeleteLock(void* cs) {}
_Z23AssertLockNotHeldInlinePKcS0_iP14AnnotatedMixinINSt3__15mutexEE:
  144|   449k|inline void AssertLockNotHeldInline(const char* name, const char* file, int line, Mutex* cs) EXCLUSIVE_LOCKS_REQUIRED(!cs) { AssertLockNotHeldInternal(name, file, line, cs); }
_ZN15CSemaphoreGrant7ReleaseEv:
  369|  2.10k|    {
  370|  2.10k|        if (!fHaveGrant) {
  ------------------
  |  Branch (370:13): [True: 2.10k, False: 0]
  ------------------
  371|  2.10k|            return;
  372|  2.10k|        }
  373|      0|        sem->post();
  374|      0|        fHaveGrant = false;
  375|      0|    }
_ZN15CSemaphoreGrantC2Ev:
  408|  2.10k|    CSemaphoreGrant() noexcept : sem(nullptr), fHaveGrant(false) {}
_ZN15CSemaphoreGrantD2Ev:
  420|  2.10k|    {
  421|  2.10k|        Release();
  422|  2.10k|    }
_Z25AssertLockNotHeldInternalI14AnnotatedMixinINSt3__15mutexEEEvPKcS5_iPT_:
   81|   449k|void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) LOCKS_EXCLUDED(cs) {}
_Z17MaybeCheckNotHeldI14AnnotatedMixinINSt3__115recursive_mutexEEERT_S5_:
  253|   129k|inline MutexType& MaybeCheckNotHeld(MutexType& m) LOCKS_EXCLUDED(m) LOCK_RETURNED(m) { return m; }
_Z13EnterCriticalINSt3__115recursive_mutexEEvPKcS3_iPT_b:
   75|   129k|inline void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry = false) {}
_ZN10UniqueLockI14AnnotatedMixinINSt3__115recursive_mutexEEE5EnterEPKcS6_i:
  157|   129k|    {
  158|   129k|        EnterCritical(pszName, pszFile, nLine, Base::mutex());
  159|       |#ifdef DEBUG_LOCKCONTENTION
  160|       |        if (Base::try_lock()) return;
  161|       |        LOG_TIME_MICROS_WITH_CATEGORY(strprintf("lock contention %s, %s:%d", pszName, pszFile, nLine), BCLog::LOCK);
  162|       |#endif
  163|   129k|        Base::lock();
  164|   129k|    }
_Z22AssertLockHeldInternalI14AnnotatedMixinINSt3__15mutexEEEvPKcS5_iPT_:
   79|  2.10k|inline void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) EXCLUSIVE_LOCKS_REQUIRED(cs) {}
_ZN10UniqueLockI14AnnotatedMixinINSt3__115recursive_mutexEEEC2ERS3_PKcS7_ib:
  177|   129k|    UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock)
  178|   129k|    {
  179|   129k|        if (fTry)
  ------------------
  |  Branch (179:13): [True: 0, False: 129k]
  ------------------
  180|      0|            TryEnter(pszName, pszFile, nLine);
  181|   129k|        else
  182|   129k|            Enter(pszName, pszFile, nLine);
  183|   129k|    }
_ZN10UniqueLockI14AnnotatedMixinINSt3__115recursive_mutexEEED2Ev:
  197|   129k|    {
  198|   129k|        if (Base::owns_lock())
  ------------------
  |  Branch (198:13): [True: 129k, False: 0]
  ------------------
  199|   129k|            LeaveCritical();
  200|   129k|    }
_ZN14AnnotatedMixinINSt3__15mutexEED2Ev:
   94|  16.8k|    ~AnnotatedMixin() {
   95|  16.8k|        DeleteLock((void*)this);
   96|  16.8k|    }
_ZN14AnnotatedMixinINSt3__115recursive_mutexEED2Ev:
   94|      2|    ~AnnotatedMixin() {
   95|      2|        DeleteLock((void*)this);
   96|      2|    }
_Z17MaybeCheckNotHeldI11GlobalMutexERT_S2_:
  253|   904k|inline MutexType& MaybeCheckNotHeld(MutexType& m) LOCKS_EXCLUDED(m) LOCK_RETURNED(m) { return m; }
_ZN10UniqueLockI11GlobalMutexEC2ERS0_PKcS4_ib:
  177|   904k|    UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock)
  178|   904k|    {
  179|   904k|        if (fTry)
  ------------------
  |  Branch (179:13): [True: 0, False: 904k]
  ------------------
  180|      0|            TryEnter(pszName, pszFile, nLine);
  181|   904k|        else
  182|   904k|            Enter(pszName, pszFile, nLine);
  183|   904k|    }
_ZN10UniqueLockI11GlobalMutexE5EnterEPKcS3_i:
  157|   904k|    {
  158|   904k|        EnterCritical(pszName, pszFile, nLine, Base::mutex());
  159|       |#ifdef DEBUG_LOCKCONTENTION
  160|       |        if (Base::try_lock()) return;
  161|       |        LOG_TIME_MICROS_WITH_CATEGORY(strprintf("lock contention %s, %s:%d", pszName, pszFile, nLine), BCLog::LOCK);
  162|       |#endif
  163|   904k|        Base::lock();
  164|   904k|    }
_ZN10UniqueLockI11GlobalMutexED2Ev:
  197|   904k|    {
  198|   904k|        if (Base::owns_lock())
  ------------------
  |  Branch (198:13): [True: 904k, False: 0]
  ------------------
  199|   904k|            LeaveCritical();
  200|   904k|    }

_ZN18FuzzedDataProviderC2EPKhm:
   37|  2.10k|      : data_ptr_(data), remaining_bytes_(size) {}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeIlEET_S1_S1_:
  205|  4.21k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|  4.21k|  static_assert(std::is_integral<T>::value, "An integral type is required.");
  207|  4.21k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|  4.21k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 4.21k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|  4.21k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|  4.21k|  uint64_t result = 0;
  215|  4.21k|  size_t offset = 0;
  216|       |
  217|  28.2k|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 26.2k, False: 1.95k]
  |  Branch (217:43): [True: 24.1k, False: 2.07k]
  ------------------
  218|  28.2k|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 24.0k, False: 185]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|  24.0k|    --remaining_bytes_;
  226|  24.0k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|  24.0k|    offset += CHAR_BIT;
  228|  24.0k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|  4.21k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 4.21k, False: 0]
  ------------------
  232|  4.21k|    result = result % (range + 1);
  233|       |
  234|  4.21k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|  4.21k|}
_ZN18FuzzedDataProvider15ConsumeIntegralImEET_v:
  195|  5.37k|template <typename T> T FuzzedDataProvider::ConsumeIntegral() {
  196|  5.37k|  return ConsumeIntegralInRange(std::numeric_limits<T>::min(),
  197|  5.37k|                                std::numeric_limits<T>::max());
  198|  5.37k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeImEET_S1_S1_:
  205|   646k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|   646k|  static_assert(std::is_integral<T>::value, "An integral type is required.");
  207|   646k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|   646k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 646k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|   646k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|   646k|  uint64_t result = 0;
  215|   646k|  size_t offset = 0;
  216|       |
  217|  1.32M|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 1.31M, False: 4.36k]
  |  Branch (217:43): [True: 676k, False: 639k]
  ------------------
  218|  1.32M|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 674k, False: 2.32k]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|   674k|    --remaining_bytes_;
  226|   674k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|   674k|    offset += CHAR_BIT;
  228|   674k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|   646k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 640k, False: 5.37k]
  ------------------
  232|   640k|    result = result % (range + 1);
  233|       |
  234|   646k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|   646k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeIiEET_S1_S1_:
  205|   232k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|   232k|  static_assert(std::is_integral<T>::value, "An integral type is required.");
  207|   232k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|   232k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 232k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|   232k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|   232k|  uint64_t result = 0;
  215|   232k|  size_t offset = 0;
  216|       |
  217|   464k|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 464k, False: 0]
  |  Branch (217:43): [True: 232k, False: 232k]
  ------------------
  218|   464k|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 232k, False: 217]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|   232k|    --remaining_bytes_;
  226|   232k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|   232k|    offset += CHAR_BIT;
  228|   232k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|   232k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 232k, False: 0]
  ------------------
  232|   232k|    result = result % (range + 1);
  233|       |
  234|   232k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|   232k|}
_ZN18FuzzedDataProvider15ConsumeIntegralIjEET_v:
  195|  4.92k|template <typename T> T FuzzedDataProvider::ConsumeIntegral() {
  196|  4.92k|  return ConsumeIntegralInRange(std::numeric_limits<T>::min(),
  197|  4.92k|                                std::numeric_limits<T>::max());
  198|  4.92k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeIjEET_S1_S1_:
  205|  7.03k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|  7.03k|  static_assert(std::is_integral<T>::value, "An integral type is required.");
  207|  7.03k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|  7.03k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 7.03k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|  7.03k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|  7.03k|  uint64_t result = 0;
  215|  7.03k|  size_t offset = 0;
  216|       |
  217|  25.2k|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 21.1k, False: 4.05k]
  |  Branch (217:43): [True: 19.2k, False: 1.94k]
  ------------------
  218|  25.2k|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 18.2k, False: 1.02k]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|  18.2k|    --remaining_bytes_;
  226|  18.2k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|  18.2k|    offset += CHAR_BIT;
  228|  18.2k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|  7.03k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 7.03k, False: 0]
  ------------------
  232|  7.03k|    result = result % (range + 1);
  233|       |
  234|  7.03k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|  7.03k|}
_ZN18FuzzedDataProvider15ConsumeIntegralItEET_v:
  195|  89.6k|template <typename T> T FuzzedDataProvider::ConsumeIntegral() {
  196|  89.6k|  return ConsumeIntegralInRange(std::numeric_limits<T>::min(),
  197|  89.6k|                                std::numeric_limits<T>::max());
  198|  89.6k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeItEET_S1_S1_:
  205|  89.6k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|  89.6k|  static_assert(std::is_integral<T>::value, "An integral type is required.");
  207|  89.6k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|  89.6k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 89.6k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|  89.6k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|  89.6k|  uint64_t result = 0;
  215|  89.6k|  size_t offset = 0;
  216|       |
  217|   266k|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 178k, False: 88.5k]
  |  Branch (217:43): [True: 178k, False: 0]
  ------------------
  218|   266k|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 177k, False: 1.08k]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|   177k|    --remaining_bytes_;
  226|   177k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|   177k|    offset += CHAR_BIT;
  228|   177k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|  89.6k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 89.6k, False: 0]
  ------------------
  232|  89.6k|    result = result % (range + 1);
  233|       |
  234|  89.6k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|  89.6k|}
_ZN18FuzzedDataProvider15ConsumeIntegralIhEET_v:
  195|   555k|template <typename T> T FuzzedDataProvider::ConsumeIntegral() {
  196|   555k|  return ConsumeIntegralInRange(std::numeric_limits<T>::min(),
  197|   555k|                                std::numeric_limits<T>::max());
  198|   555k|}
_ZN18FuzzedDataProvider22ConsumeIntegralInRangeIhEET_S1_S1_:
  205|   555k|T FuzzedDataProvider::ConsumeIntegralInRange(T min, T max) {
  206|   555k|  static_assert(std::is_integral<T>::value, "An integral type is required.");
  207|   555k|  static_assert(sizeof(T) <= sizeof(uint64_t), "Unsupported integral type.");
  208|       |
  209|   555k|  if (min > max)
  ------------------
  |  Branch (209:7): [True: 0, False: 555k]
  ------------------
  210|      0|    abort();
  211|       |
  212|       |  // Use the biggest type possible to hold the range and the result.
  213|   555k|  uint64_t range = static_cast<uint64_t>(max) - static_cast<uint64_t>(min);
  214|   555k|  uint64_t result = 0;
  215|   555k|  size_t offset = 0;
  216|       |
  217|  1.10M|  while (offset < sizeof(T) * CHAR_BIT && (range >> offset) > 0 &&
  ------------------
  |  Branch (217:10): [True: 555k, False: 552k]
  |  Branch (217:43): [True: 555k, False: 0]
  ------------------
  218|  1.10M|         remaining_bytes_ != 0) {
  ------------------
  |  Branch (218:10): [True: 552k, False: 2.85k]
  ------------------
  219|       |    // Pull bytes off the end of the seed data. Experimentally, this seems to
  220|       |    // allow the fuzzer to more easily explore the input space. This makes
  221|       |    // sense, since it works by modifying inputs that caused new code to run,
  222|       |    // and this data is often used to encode length of data read by
  223|       |    // |ConsumeBytes|. Separating out read lengths makes it easier modify the
  224|       |    // contents of the data that is actually read.
  225|   552k|    --remaining_bytes_;
  226|   552k|    result = (result << CHAR_BIT) | data_ptr_[remaining_bytes_];
  227|   552k|    offset += CHAR_BIT;
  228|   552k|  }
  229|       |
  230|       |  // Avoid division by 0, in case |range + 1| results in overflow.
  231|   555k|  if (range != std::numeric_limits<decltype(range)>::max())
  ------------------
  |  Branch (231:7): [True: 555k, False: 0]
  ------------------
  232|   555k|    result = result % (range + 1);
  233|       |
  234|   555k|  return static_cast<T>(static_cast<uint64_t>(min) + result);
  235|   555k|}
_ZN18FuzzedDataProvider20ConsumeBytesAsStringEm:
  137|  1.27k|inline std::string FuzzedDataProvider::ConsumeBytesAsString(size_t num_bytes) {
  138|  1.27k|  static_assert(sizeof(std::string::value_type) == sizeof(uint8_t),
  139|  1.27k|                "ConsumeBytesAsString cannot convert the data to a string.");
  140|       |
  141|  1.27k|  num_bytes = std::min(num_bytes, remaining_bytes_);
  142|  1.27k|  std::string result(
  143|  1.27k|      reinterpret_cast<const std::string::value_type *>(data_ptr_), num_bytes);
  144|  1.27k|  Advance(num_bytes);
  145|  1.27k|  return result;
  146|  1.27k|}
_ZN18FuzzedDataProvider25ConsumeRandomLengthStringEm:
  153|  2.10k|FuzzedDataProvider::ConsumeRandomLengthString(size_t max_length) {
  154|       |  // Reads bytes from the start of |data_ptr_|. Maps "\\" to "\", and maps "\"
  155|       |  // followed by anything else to the end of the string. As a result of this
  156|       |  // logic, a fuzzer can insert characters into the string, and the string
  157|       |  // will be lengthened to include those new characters, resulting in a more
  158|       |  // stable fuzzer than picking the length of a string independently from
  159|       |  // picking its contents.
  160|  2.10k|  std::string result;
  161|       |
  162|       |  // Reserve the anticipated capacity to prevent several reallocations.
  163|  2.10k|  result.reserve(std::min(max_length, remaining_bytes_));
  164|  32.1k|  for (size_t i = 0; i < max_length && remaining_bytes_ != 0; ++i) {
  ------------------
  |  Branch (164:22): [True: 31.7k, False: 400]
  |  Branch (164:40): [True: 31.4k, False: 324]
  ------------------
  165|  31.4k|    char next = ConvertUnsignedToSigned<char>(data_ptr_[0]);
  166|  31.4k|    Advance(1);
  167|  31.4k|    if (next == '\\' && remaining_bytes_ != 0) {
  ------------------
  |  Branch (167:9): [True: 1.51k, False: 29.9k]
  |  Branch (167:25): [True: 1.51k, False: 1]
  ------------------
  168|  1.51k|      next = ConvertUnsignedToSigned<char>(data_ptr_[0]);
  169|  1.51k|      Advance(1);
  170|  1.51k|      if (next != '\\')
  ------------------
  |  Branch (170:11): [True: 1.38k, False: 128]
  ------------------
  171|  1.38k|        break;
  172|  1.51k|    }
  173|  30.0k|    result += next;
  174|  30.0k|  }
  175|       |
  176|  2.10k|  result.shrink_to_fit();
  177|  2.10k|  return result;
  178|  2.10k|}
_ZN18FuzzedDataProvider11ConsumeBoolEv:
  289|   555k|inline bool FuzzedDataProvider::ConsumeBool() {
  290|   555k|  return 1 & ConsumeIntegral<uint8_t>();
  291|   555k|}
_ZN18FuzzedDataProvider14CopyAndAdvanceEPvm:
  339|  87.5k|                                               size_t num_bytes) {
  340|  87.5k|  std::memcpy(destination, data_ptr_, num_bytes);
  341|  87.5k|  Advance(num_bytes);
  342|  87.5k|}
_ZN18FuzzedDataProvider7AdvanceEm:
  344|   121k|inline void FuzzedDataProvider::Advance(size_t num_bytes) {
  345|   121k|  if (num_bytes > remaining_bytes_)
  ------------------
  |  Branch (345:7): [True: 0, False: 121k]
  ------------------
  346|      0|    abort();
  347|       |
  348|   121k|  data_ptr_ += num_bytes;
  349|   121k|  remaining_bytes_ -= num_bytes;
  350|   121k|}
_ZN18FuzzedDataProvider23ConvertUnsignedToSignedIchEET_T0_:
  379|  32.9k|TS FuzzedDataProvider::ConvertUnsignedToSigned(TU value) {
  380|  32.9k|  static_assert(sizeof(TS) == sizeof(TU), "Incompatible data types.");
  381|  32.9k|  static_assert(!std::numeric_limits<TU>::is_signed,
  382|  32.9k|                "Source type must be unsigned.");
  383|       |
  384|       |  // TODO(Dor1s): change to `if constexpr` once C++17 becomes mainstream.
  385|  32.9k|  if (std::numeric_limits<TS>::is_modulo)
  ------------------
  |  Branch (385:7): [Folded - Ignored]
  ------------------
  386|      0|    return static_cast<TS>(value);
  387|       |
  388|       |  // Avoid using implementation-defined unsigned to signed conversions.
  389|       |  // To learn more, see https://stackoverflow.com/questions/13150449.
  390|  32.9k|  if (value <= std::numeric_limits<TS>::max()) {
  ------------------
  |  Branch (390:7): [True: 24.7k, False: 8.21k]
  ------------------
  391|  24.7k|    return static_cast<TS>(value);
  392|  24.7k|  } else {
  393|  8.21k|    constexpr auto TS_min = std::numeric_limits<TS>::min();
  394|  8.21k|    return TS_min + static_cast<TS>(value - TS_min);
  395|  8.21k|  }
  396|  32.9k|}
_ZN18FuzzedDataProvider12ConsumeBytesIhEENSt3__16vectorIT_NS1_9allocatorIS3_EEEEm:
  109|  88.3k|std::vector<T> FuzzedDataProvider::ConsumeBytes(size_t num_bytes) {
  110|  88.3k|  num_bytes = std::min(num_bytes, remaining_bytes_);
  111|  88.3k|  return ConsumeBytes<T>(num_bytes, num_bytes);
  112|  88.3k|}
_ZN18FuzzedDataProvider12ConsumeBytesIhEENSt3__16vectorIT_NS1_9allocatorIS3_EEEEmm:
  353|  88.3k|std::vector<T> FuzzedDataProvider::ConsumeBytes(size_t size, size_t num_bytes) {
  354|  88.3k|  static_assert(sizeof(T) == sizeof(uint8_t), "Incompatible data type.");
  355|       |
  356|       |  // The point of using the size-based constructor below is to increase the
  357|       |  // odds of having a vector object with capacity being equal to the length.
  358|       |  // That part is always implementation specific, but at least both libc++ and
  359|       |  // libstdc++ allocate the requested number of bytes in that constructor,
  360|       |  // which seems to be a natural choice for other implementations as well.
  361|       |  // To increase the odds even more, we also call |shrink_to_fit| below.
  362|  88.3k|  std::vector<T> result(size);
  363|  88.3k|  if (size == 0) {
  ------------------
  |  Branch (363:7): [True: 793, False: 87.5k]
  ------------------
  364|    793|    if (num_bytes != 0)
  ------------------
  |  Branch (364:9): [True: 0, False: 793]
  ------------------
  365|      0|      abort();
  366|    793|    return result;
  367|    793|  }
  368|       |
  369|  87.5k|  CopyAndAdvance(result.data(), num_bytes);
  370|       |
  371|       |  // Even though |shrink_to_fit| is also implementation specific, we expect it
  372|       |  // to provide an additional assurance in case vector's constructor allocated
  373|       |  // a buffer which is larger than the actual amount of data we put inside it.
  374|  87.5k|  result.shrink_to_fit();
  375|  87.5k|  return result;
  376|  88.3k|}
_ZN18FuzzedDataProvider16PickValueInArrayI12ServiceFlagsLm7EEET_RAT0__KS2_:
  304|  3.04k|T FuzzedDataProvider::PickValueInArray(const T (&array)[size]) {
  305|  3.04k|  static_assert(size > 0, "The array must be non empty.");
  306|  3.04k|  return array[ConsumeIntegralInRange<size_t>(0, size - 1)];
  307|  3.04k|}
_ZN18FuzzedDataProvider16PickValueInArrayI14ConnectionTypeLm6EEET_RAT0__KS2_:
  304|  2.10k|T FuzzedDataProvider::PickValueInArray(const T (&array)[size]) {
  305|  2.10k|  static_assert(size > 0, "The array must be non empty.");
  306|  2.10k|  return array[ConsumeIntegralInRange<size_t>(0, size - 1)];
  307|  2.10k|}
_ZN18FuzzedDataProvider16PickValueInArrayI18NetPermissionFlagsLm10EEET_RAT0__KS2_:
  304|  1.39k|T FuzzedDataProvider::PickValueInArray(const T (&array)[size]) {
  305|  1.39k|  static_assert(size > 0, "The array must be non empty.");
  306|  1.39k|  return array[ConsumeIntegralInRange<size_t>(0, size - 1)];
  307|  1.39k|}

LLVMFuzzerTestOneInput:
  222|  2.10k|{
  223|  2.10k|    test_one_input({data, size});
  224|  2.10k|    return 0;
  225|  2.10k|}
fuzz.cpp:_ZL14test_one_inputNSt3__14spanIKhLm18446744073709551615EEE:
   83|  2.10k|{
   84|  2.10k|    CheckGlobals check{};
   85|  2.10k|    (*Assert(g_test_one_input))(buffer);
  ------------------
  |  |   85|  2.10k|#define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val)
  ------------------
   86|  2.10k|}

_Z25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEE:
   81|  2.10k|{
   82|  2.10k|    FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
   83|  2.10k|    SetMockTime(ConsumeTime(fuzzed_data_provider));
   84|  2.10k|    CService service{ConsumeService(fuzzed_data_provider)};
   85|  2.10k|    CNode node{ConsumeNode(fuzzed_data_provider)};
   86|  2.10k|    {
   87|  2.10k|        LOCK(g_maplocalhost_mutex);
  ------------------
  |  |  257|  2.10k|#define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__)
  |  |  ------------------
  |  |  |  |   11|  2.10k|#define UNIQUE_NAME(name) PASTE2(name, __COUNTER__)
  |  |  |  |  ------------------
  |  |  |  |  |  |    9|  2.10k|#define PASTE2(x, y) PASTE(x, y)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |    8|  2.10k|#define PASTE(x, y) x ## y
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|  2.10k|        mapLocalHost.clear();
   89|  2.10k|    }
   90|   544k|    LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
  ------------------
  |  |   23|   546k|    for (unsigned _count{limit}; (condition) && _count; --_count)
  |  |  ------------------
  |  |  |  Branch (23:34): [True: 544k, False: 2.09k]
  |  |  |  Branch (23:49): [True: 544k, False: 9]
  |  |  ------------------
  ------------------
   91|   544k|        CallOneOf(
   92|   544k|            fuzzed_data_provider,
   93|   544k|            [&] {
   94|   544k|                service = ConsumeService(fuzzed_data_provider);
   95|   544k|            },
   96|   544k|            [&] {
   97|   544k|                const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))};
   98|   544k|                if (!added) return;
   99|   544k|                assert(service.IsRoutable());
  100|   544k|                assert(IsLocal(service));
  101|   544k|                assert(SeenLocal(service));
  102|   544k|            },
  103|   544k|            [&] {
  104|   544k|                (void)RemoveLocal(service);
  105|   544k|            },
  106|   544k|            [&] {
  107|   544k|                (void)SeenLocal(service);
  108|   544k|            },
  109|   544k|            [&] {
  110|   544k|                (void)IsLocal(service);
  111|   544k|            },
  112|   544k|            [&] {
  113|   544k|                (void)GetLocalAddress(node);
  114|   544k|            });
  115|   544k|    }
  116|  2.10k|}
net.cpp:_ZZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEENK3$_0clEv:
   93|  83.3k|            [&] {
   94|  83.3k|                service = ConsumeService(fuzzed_data_provider);
   95|  83.3k|            },
net.cpp:_ZZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEENK3$_1clEv:
   96|   232k|            [&] {
   97|   232k|                const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))};
   98|   232k|                if (!added) return;
  ------------------
  |  Branch (98:21): [True: 7.90k, False: 224k]
  ------------------
   99|   224k|                assert(service.IsRoutable());
  100|   224k|                assert(IsLocal(service));
  101|   224k|                assert(SeenLocal(service));
  102|   224k|            },
net.cpp:_ZZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEENK3$_2clEv:
  103|   119k|            [&] {
  104|   119k|                (void)RemoveLocal(service);
  105|   119k|            },
net.cpp:_ZZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEENK3$_3clEv:
  106|  54.2k|            [&] {
  107|  54.2k|                (void)SeenLocal(service);
  108|  54.2k|            },
net.cpp:_ZZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEENK3$_4clEv:
  109|  11.2k|            [&] {
  110|  11.2k|                (void)IsLocal(service);
  111|  11.2k|            },
net.cpp:_ZZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEENK3$_5clEv:
  112|  43.1k|            [&] {
  113|  43.1k|                (void)GetLocalAddress(node);
  114|  43.1k|            });

_Z11ConsumeTimeR18FuzzedDataProviderRKNSt3__18optionalIlEES5_:
   35|  2.10k|{
   36|       |    // Avoid t=0 (1970-01-01T00:00:00Z) since SetMockTime(0) disables mocktime.
   37|  2.10k|    static const int64_t time_min{ParseISO8601DateTime("2000-01-01T00:00:01Z").value()};
   38|  2.10k|    static const int64_t time_max{ParseISO8601DateTime("2100-12-31T23:59:59Z").value()};
   39|  2.10k|    return fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(min.value_or(time_min), max.value_or(time_max));
   40|  2.10k|}

_Z15ConsumeWeakEnumI12ServiceFlagsLm7EET_R18FuzzedDataProviderRAT0__KS1_:
  134|  4.21k|{
  135|  4.21k|    return fuzzed_data_provider.ConsumeBool() ?
  ------------------
  |  Branch (135:12): [True: 3.04k, False: 1.16k]
  ------------------
  136|  3.04k|               fuzzed_data_provider.PickValueInArray<WeakEnumType>(all_types) :
  137|  4.21k|               WeakEnumType(fuzzed_data_provider.ConsumeIntegral<typename std::underlying_type<WeakEnumType>::type>());
  138|  4.21k|}
_Z15ConsumeWeakEnumI18NetPermissionFlagsLm10EET_R18FuzzedDataProviderRAT0__KS1_:
  134|  2.10k|{
  135|  2.10k|    return fuzzed_data_provider.ConsumeBool() ?
  ------------------
  |  Branch (135:12): [True: 1.39k, False: 711]
  ------------------
  136|  1.39k|               fuzzed_data_provider.PickValueInArray<WeakEnumType>(all_types) :
  137|  2.10k|               WeakEnumType(fuzzed_data_provider.ConsumeIntegral<typename std::underlying_type<WeakEnumType>::type>());
  138|  2.10k|}
net.cpp:_Z9CallOneOfIJZ25local_address_fuzz_targetNSt3__14spanIKhLm18446744073709551615EEEE3$_0Z25local_address_fuzz_targetS3_E3$_1Z25local_address_fuzz_targetS3_E3$_2Z25local_address_fuzz_targetS3_E3$_3Z25local_address_fuzz_targetS3_E3$_4Z25local_address_fuzz_targetS3_E3$_5EEmR18FuzzedDataProviderDpT_:
   36|   544k|{
   37|   544k|    constexpr size_t call_size{sizeof...(callables)};
   38|   544k|    static_assert(call_size >= 1);
   39|   544k|    const size_t call_index{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, call_size - 1)};
   40|       |
   41|   544k|    size_t i{0};
   42|  3.26M|    ((i++ == call_index ? callables() : void()), ...);
  ------------------
  |  Branch (42:7): [True: 83.3k, False: 461k]
  |  Branch (42:7): [True: 232k, False: 311k]
  |  Branch (42:7): [True: 119k, False: 424k]
  |  Branch (42:7): [True: 54.2k, False: 490k]
  |  Branch (42:7): [True: 11.2k, False: 533k]
  |  Branch (42:7): [True: 43.1k, False: 501k]
  ------------------
   43|   544k|    return call_size;
   44|   544k|}

_ZN12CheckGlobalsC2Ev:
   56|  2.10k|CheckGlobals::CheckGlobals() : m_impl(std::make_unique<CheckGlobalsImpl>()) {}
_ZN12CheckGlobalsD2Ev:
   57|  2.10k|CheckGlobals::~CheckGlobals() = default;
_ZN16CheckGlobalsImplC2Ev:
   17|  2.10k|    {
   18|  2.10k|        g_used_g_prng = false;
   19|  2.10k|        g_seeded_g_prng_zero = false;
   20|  2.10k|        g_used_system_time = false;
   21|  2.10k|        SetMockTime(0s);
   22|  2.10k|    }
_ZN16CheckGlobalsImplD2Ev:
   24|  2.10k|    {
   25|  2.10k|        if (g_used_g_prng && !g_seeded_g_prng_zero) {
  ------------------
  |  Branch (25:13): [True: 0, False: 2.10k]
  |  Branch (25:30): [True: 0, False: 0]
  ------------------
   26|      0|            std::cerr << "\n\n"
   27|      0|                         "The current fuzz target used the global random state.\n\n"
   28|       |
   29|      0|                         "This is acceptable, but requires the fuzz target to call \n"
   30|      0|                         "SeedRandomStateForTest(SeedRand::ZEROS) in the first line \n"
   31|      0|                         "of the FUZZ_TARGET function.\n\n"
   32|       |
   33|      0|                         "An alternative solution would be to avoid any use of globals.\n\n"
   34|       |
   35|      0|                         "Without a solution, fuzz instability and non-determinism can lead \n"
   36|      0|                         "to non-reproducible bugs or inefficient fuzzing.\n\n"
   37|      0|                      << std::endl;
   38|      0|            std::abort(); // Abort, because AFL may try to recover from a std::exit
   39|      0|        }
   40|       |
   41|  2.10k|        if (g_used_system_time) {
  ------------------
  |  Branch (41:13): [True: 0, False: 2.10k]
  ------------------
   42|      0|            std::cerr << "\n\n"
   43|      0|                         "The current fuzz target accessed system time.\n\n"
   44|       |
   45|      0|                         "This is acceptable, but requires the fuzz target to call \n"
   46|      0|                         "SetMockTime() at the beginning of processing the fuzz input.\n\n"
   47|       |
   48|      0|                         "Without setting mock time, time-dependent behavior can lead \n"
   49|      0|                         "to non-reproducible bugs or inefficient fuzzing.\n\n"
   50|      0|                      << std::endl;
   51|      0|            std::abort();
   52|      0|        }
   53|  2.10k|    }

_Z14ConsumeNetAddrR18FuzzedDataProviderP17FastRandomContext:
   29|  89.6k|{
   30|  89.6k|    struct NetAux {
   31|  89.6k|        Network net;
   32|  89.6k|        CNetAddr::BIP155Network bip155;
   33|  89.6k|        size_t len;
   34|  89.6k|    };
   35|       |
   36|  89.6k|    static constexpr std::array<NetAux, 6> nets{
   37|  89.6k|        NetAux{.net = Network::NET_IPV4, .bip155 = CNetAddr::BIP155Network::IPV4, .len = ADDR_IPV4_SIZE},
   38|  89.6k|        NetAux{.net = Network::NET_IPV6, .bip155 = CNetAddr::BIP155Network::IPV6, .len = ADDR_IPV6_SIZE},
   39|  89.6k|        NetAux{.net = Network::NET_ONION, .bip155 = CNetAddr::BIP155Network::TORV3, .len = ADDR_TORV3_SIZE},
   40|  89.6k|        NetAux{.net = Network::NET_I2P, .bip155 = CNetAddr::BIP155Network::I2P, .len = ADDR_I2P_SIZE},
   41|  89.6k|        NetAux{.net = Network::NET_CJDNS, .bip155 = CNetAddr::BIP155Network::CJDNS, .len = ADDR_CJDNS_SIZE},
   42|  89.6k|        NetAux{.net = Network::NET_INTERNAL, .bip155 = CNetAddr::BIP155Network{0}, .len = 0},
   43|  89.6k|    };
   44|       |
   45|  89.6k|    const size_t nets_index{rand == nullptr
  ------------------
  |  Branch (45:29): [True: 89.6k, False: 0]
  ------------------
   46|  89.6k|        ? fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, nets.size() - 1)
   47|  89.6k|        : static_cast<size_t>(rand->randrange(nets.size()))};
   48|       |
   49|  89.6k|    const auto& aux = nets[nets_index];
   50|       |
   51|  89.6k|    CNetAddr addr;
   52|       |
   53|  89.6k|    if (aux.net == Network::NET_INTERNAL) {
  ------------------
  |  Branch (53:9): [True: 1.27k, False: 88.3k]
  ------------------
   54|  1.27k|        if (rand == nullptr) {
  ------------------
  |  Branch (54:13): [True: 1.27k, False: 0]
  ------------------
   55|  1.27k|            addr.SetInternal(fuzzed_data_provider.ConsumeBytesAsString(32));
   56|  1.27k|        } else {
   57|      0|            const auto v = rand->randbytes(32);
   58|      0|            addr.SetInternal(std::string{v.begin(), v.end()});
   59|      0|        }
   60|  1.27k|        return addr;
   61|  1.27k|    }
   62|       |
   63|  88.3k|    DataStream s;
   64|       |
   65|  88.3k|    s << static_cast<uint8_t>(aux.bip155);
   66|       |
   67|  88.3k|    std::vector<uint8_t> addr_bytes;
   68|  88.3k|    if (rand == nullptr) {
  ------------------
  |  Branch (68:9): [True: 88.3k, False: 0]
  ------------------
   69|  88.3k|        addr_bytes = fuzzed_data_provider.ConsumeBytes<uint8_t>(aux.len);
   70|  88.3k|        addr_bytes.resize(aux.len);
   71|  88.3k|    } else {
   72|      0|        addr_bytes = rand->randbytes(aux.len);
   73|      0|    }
   74|  88.3k|    if (aux.net == NET_IPV6 && addr_bytes[0] == CJDNS_PREFIX) { // Avoid generating IPv6 addresses that look like CJDNS.
  ------------------
  |  Branch (74:9): [True: 6.65k, False: 81.7k]
  |  Branch (74:32): [True: 443, False: 6.21k]
  ------------------
   75|    443|        addr_bytes[0] = 0x55; // Just an arbitrary number, anything != CJDNS_PREFIX would do.
   76|    443|    }
   77|  88.3k|    if (aux.net == NET_CJDNS) { // Avoid generating CJDNS addresses that don't start with CJDNS_PREFIX because those are !IsValid().
  ------------------
  |  Branch (77:9): [True: 821, False: 87.5k]
  ------------------
   78|    821|        addr_bytes[0] = CJDNS_PREFIX;
   79|    821|    }
   80|  88.3k|    s << addr_bytes;
   81|       |
   82|  88.3k|    s >> CAddress::V2_NETWORK(addr);
   83|       |
   84|  88.3k|    return addr;
   85|  89.6k|}
_Z14ConsumeAddressR18FuzzedDataProvider:
   88|  4.21k|{
   89|  4.21k|    return {ConsumeService(fuzzed_data_provider), ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS), NodeSeconds{std::chrono::seconds{fuzzed_data_provider.ConsumeIntegral<uint32_t>()}}};
   90|  4.21k|}
_ZN10FuzzedSockC2ER18FuzzedDataProvider:
  114|  2.10k|    : Sock{fuzzed_data_provider.ConsumeIntegralInRange<SOCKET>(INVALID_SOCKET - 1, INVALID_SOCKET)},
  ------------------
  |  |   56|  2.10k|#define INVALID_SOCKET      (SOCKET)(~0)
  ------------------
                  : Sock{fuzzed_data_provider.ConsumeIntegralInRange<SOCKET>(INVALID_SOCKET - 1, INVALID_SOCKET)},
  ------------------
  |  |   56|  2.10k|#define INVALID_SOCKET      (SOCKET)(~0)
  ------------------
  115|  2.10k|      m_fuzzed_data_provider{fuzzed_data_provider},
  116|  2.10k|      m_selectable{fuzzed_data_provider.ConsumeBool()}
  117|  2.10k|{
  118|  2.10k|}
_ZN10FuzzedSockD2Ev:
  121|  2.10k|{
  122|       |    // Sock::~Sock() will be called after FuzzedSock::~FuzzedSock() and it will call
  123|       |    // close(m_socket) if m_socket is not INVALID_SOCKET.
  124|       |    // Avoid closing an arbitrary file descriptor (m_socket is just a random very high number which
  125|       |    // theoretically may concide with a real opened file descriptor).
  126|  2.10k|    m_socket = INVALID_SOCKET;
  ------------------
  |  |   56|  2.10k|#define INVALID_SOCKET      (SOCKET)(~0)
  ------------------
  127|  2.10k|}

_Z14ConsumeServiceR18FuzzedDataProvider:
  214|  89.6k|{
  215|  89.6k|    return {ConsumeNetAddr(fuzzed_data_provider), fuzzed_data_provider.ConsumeIntegral<uint16_t>()};
  216|  89.6k|}
_Z11ConsumeNodeILb0EEDaR18FuzzedDataProviderRKNSt3__18optionalIlEE:
  222|  2.10k|{
  223|  2.10k|    const NodeId node_id = node_id_in.value_or(fuzzed_data_provider.ConsumeIntegralInRange<NodeId>(0, std::numeric_limits<NodeId>::max()));
  224|  2.10k|    const auto sock = std::make_shared<FuzzedSock>(fuzzed_data_provider);
  225|  2.10k|    const CAddress address = ConsumeAddress(fuzzed_data_provider);
  226|  2.10k|    const uint64_t keyed_net_group = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
  227|  2.10k|    const uint64_t local_host_nonce = fuzzed_data_provider.ConsumeIntegral<uint64_t>();
  228|  2.10k|    const CAddress addr_bind = ConsumeAddress(fuzzed_data_provider);
  229|  2.10k|    const std::string addr_name = fuzzed_data_provider.ConsumeRandomLengthString(64);
  230|  2.10k|    const ConnectionType conn_type = fuzzed_data_provider.PickValueInArray(ALL_CONNECTION_TYPES);
  231|  2.10k|    const bool inbound_onion{conn_type == ConnectionType::INBOUND ? fuzzed_data_provider.ConsumeBool() : false};
  ------------------
  |  Branch (231:30): [True: 610, False: 1.49k]
  ------------------
  232|  2.10k|    NetPermissionFlags permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
  233|       |    if constexpr (ReturnUniquePtr) {
  234|       |        return std::make_unique<CNode>(node_id,
  235|       |                                       sock,
  236|       |                                       address,
  237|       |                                       keyed_net_group,
  238|       |                                       local_host_nonce,
  239|       |                                       addr_bind,
  240|       |                                       addr_name,
  241|       |                                       conn_type,
  242|       |                                       inbound_onion,
  243|       |                                       CNodeOptions{ .permission_flags = permission_flags });
  244|  2.10k|    } else {
  245|  2.10k|        return CNode{node_id,
  246|  2.10k|                     sock,
  247|  2.10k|                     address,
  248|  2.10k|                     keyed_net_group,
  249|  2.10k|                     local_host_nonce,
  250|  2.10k|                     addr_bind,
  251|  2.10k|                     addr_name,
  252|  2.10k|                     conn_type,
  253|  2.10k|                     inbound_onion,
  254|  2.10k|                     CNodeOptions{ .permission_flags = permission_flags }};
  255|  2.10k|    }
  256|  2.10k|}

_ZN17BasicTestingSetupD2Ev:
  199|      2|{
  200|      2|    m_node.ecc_context.reset();
  201|      2|    m_node.kernel.reset();
  202|       |    if constexpr (!G_FUZZING) {
  203|       |        SetMockTime(0s); // Reset mocktime for following tests
  204|       |    }
  205|      2|    LogInstance().DisconnectTestLogger();
  206|      2|    if (m_has_custom_datadir) {
  ------------------
  |  Branch (206:9): [True: 0, False: 2]
  ------------------
  207|       |        // Only remove the lock file, preserve the data directory.
  208|      0|        UnlockDirectory(m_path_lock, ".lock");
  209|      0|        fs::remove(m_path_lock / ".lock");
  210|      2|    } else {
  211|      2|        fs::remove_all(m_path_root);
  212|      2|    }
  213|      2|    gArgs.ClearArgs();
  214|      2|}

_ZN12StdLockGuardC2ER8StdMutex:
   73|   344k|    explicit StdLockGuard(StdMutex& cs) EXCLUSIVE_LOCK_FUNCTION(cs) : std::lock_guard<StdMutex>(cs) {}

_ZNK10tinyformat6detail9FormatArg6formatERNSt3__113basic_ostreamIcNS2_11char_traitsIcEEEEPKcS9_i:
  541|  2.43M|        {
  542|  2.43M|            TINYFORMAT_ASSERT(m_value);
  ------------------
  |  |  153|  2.43M|#   define TINYFORMAT_ASSERT(cond) assert(cond)
  ------------------
  543|  2.43M|            TINYFORMAT_ASSERT(m_formatImpl);
  ------------------
  |  |  153|  2.43M|#   define TINYFORMAT_ASSERT(cond) assert(cond)
  ------------------
  544|  2.43M|            m_formatImpl(out, fmtBegin, fmtEnd, ntrunc, m_value);
  545|  2.43M|        }
_ZN10tinyformat10FormatListC2EPNS_6detail9FormatArgEi:
  966|  1.21M|            : m_args(args), m_N(N) { }
_ZN10tinyformat11formatValueERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEPKcS7_ih:
  385|   723k|                        const char* fmtEnd, int /**/, charType value) \
  386|   723k|{                                                                     \
  387|   723k|    switch (*(fmtEnd-1)) {                                            \
  388|   723k|        case 'u': case 'd': case 'i': case 'o': case 'X': case 'x':   \
  ------------------
  |  Branch (388:9): [True: 723k, False: 0]
  |  Branch (388:19): [True: 0, False: 723k]
  |  Branch (388:29): [True: 0, False: 723k]
  |  Branch (388:39): [True: 0, False: 723k]
  |  Branch (388:49): [True: 0, False: 723k]
  |  Branch (388:59): [True: 0, False: 723k]
  ------------------
  389|   723k|            out << static_cast<int>(value); break;                    \
  390|   723k|        default:                                                      \
  ------------------
  |  Branch (390:9): [True: 0, False: 723k]
  ------------------
  391|      0|            out << value;                   break;                    \
  392|   723k|    }                                                                 \
  393|   723k|}
_ZN10tinyformat6detail21parseWidthOrPrecisionERiRPKcbPKNS0_9FormatArgES1_i:
  593|  2.43M|{
  594|  2.43M|    if (*c >= '0' && *c <= '9') {
  ------------------
  |  Branch (594:9): [True: 2.43M, False: 0]
  |  Branch (594:22): [True: 0, False: 2.43M]
  ------------------
  595|      0|        n = parseIntAndAdvance(c);
  596|      0|    }
  597|  2.43M|    else if (*c == '*') {
  ------------------
  |  Branch (597:14): [True: 0, False: 2.43M]
  ------------------
  598|      0|        ++c;
  599|      0|        n = 0;
  600|      0|        if (positionalMode) {
  ------------------
  |  Branch (600:13): [True: 0, False: 0]
  ------------------
  601|      0|            int pos = parseIntAndAdvance(c) - 1;
  602|      0|            if (*c != '$')
  ------------------
  |  Branch (602:17): [True: 0, False: 0]
  ------------------
  603|      0|                TINYFORMAT_ERROR("tinyformat: Non-positional argument used after a positional one");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  604|      0|            if (pos >= 0 && pos < numArgs)
  ------------------
  |  Branch (604:17): [True: 0, False: 0]
  |  Branch (604:29): [True: 0, False: 0]
  ------------------
  605|      0|                n = args[pos].toInt();
  606|      0|            else
  607|      0|                TINYFORMAT_ERROR("tinyformat: Positional argument out of range");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  608|      0|            ++c;
  609|      0|        }
  610|      0|        else {
  611|      0|            if (argIndex < numArgs)
  ------------------
  |  Branch (611:17): [True: 0, False: 0]
  ------------------
  612|      0|                n = args[argIndex++].toInt();
  613|      0|            else
  614|      0|                TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable width or precision");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  615|      0|        }
  616|      0|    }
  617|  2.43M|    else {
  618|  2.43M|        return false;
  619|  2.43M|    }
  620|      0|    return true;
  621|  2.43M|}
_ZN10tinyformat6detail24printFormatStringLiteralERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKc:
  629|  3.64M|{
  630|  3.64M|    const char* c = fmt;
  631|  4.19M|    for (;; ++c) {
  632|  4.19M|        if (*c == '\0') {
  ------------------
  |  Branch (632:13): [True: 1.21M, False: 2.98M]
  ------------------
  633|  1.21M|            out.write(fmt, c - fmt);
  634|  1.21M|            return c;
  635|  1.21M|        }
  636|  2.98M|        else if (*c == '%') {
  ------------------
  |  Branch (636:18): [True: 2.43M, False: 542k]
  ------------------
  637|  2.43M|            out.write(fmt, c - fmt);
  638|  2.43M|            if (*(c+1) != '%')
  ------------------
  |  Branch (638:17): [True: 2.43M, False: 0]
  ------------------
  639|  2.43M|                return c;
  640|       |            // for "%%", tack trailing % onto next literal section.
  641|      0|            fmt = ++c;
  642|      0|        }
  643|  4.19M|    }
  644|  3.64M|}
_ZN10tinyformat6detail21streamStateFromFormatERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERbS7_RiPKcPKNS0_9FormatArgES8_i:
  685|  2.43M|{
  686|  2.43M|    TINYFORMAT_ASSERT(*fmtStart == '%');
  ------------------
  |  |  153|  2.43M|#   define TINYFORMAT_ASSERT(cond) assert(cond)
  ------------------
  687|       |    // Reset stream state to defaults.
  688|  2.43M|    out.width(0);
  689|  2.43M|    out.precision(6);
  690|  2.43M|    out.fill(' ');
  691|       |    // Reset most flags; ignore irrelevant unitbuf & skipws.
  692|  2.43M|    out.unsetf(std::ios::adjustfield | std::ios::basefield |
  693|  2.43M|               std::ios::floatfield | std::ios::showbase | std::ios::boolalpha |
  694|  2.43M|               std::ios::showpoint | std::ios::showpos | std::ios::uppercase);
  695|  2.43M|    bool precisionSet = false;
  696|  2.43M|    bool widthSet = false;
  697|  2.43M|    int widthExtra = 0;
  698|  2.43M|    const char* c = fmtStart + 1;
  699|       |
  700|       |    // 1) Parse an argument index (if followed by '$') or a width possibly
  701|       |    // preceded with '0' flag.
  702|  2.43M|    if (*c >= '0' && *c <= '9') {
  ------------------
  |  Branch (702:9): [True: 2.43M, False: 0]
  |  Branch (702:22): [True: 0, False: 2.43M]
  ------------------
  703|      0|        const char tmpc = *c;
  704|      0|        int value = parseIntAndAdvance(c);
  705|      0|        if (*c == '$') {
  ------------------
  |  Branch (705:13): [True: 0, False: 0]
  ------------------
  706|       |            // value is an argument index
  707|      0|            if (value > 0 && value <= numArgs)
  ------------------
  |  Branch (707:17): [True: 0, False: 0]
  |  Branch (707:30): [True: 0, False: 0]
  ------------------
  708|      0|                argIndex = value - 1;
  709|      0|            else
  710|      0|                TINYFORMAT_ERROR("tinyformat: Positional argument out of range");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  711|      0|            ++c;
  712|      0|            positionalMode = true;
  713|      0|        }
  714|      0|        else if (positionalMode) {
  ------------------
  |  Branch (714:18): [True: 0, False: 0]
  ------------------
  715|      0|            TINYFORMAT_ERROR("tinyformat: Non-positional argument used after a positional one");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  716|      0|        }
  717|      0|        else {
  718|      0|            if (tmpc == '0') {
  ------------------
  |  Branch (718:17): [True: 0, False: 0]
  ------------------
  719|       |                // Use internal padding so that numeric values are
  720|       |                // formatted correctly, eg -00010 rather than 000-10
  721|      0|                out.fill('0');
  722|      0|                out.setf(std::ios::internal, std::ios::adjustfield);
  723|      0|            }
  724|      0|            if (value != 0) {
  ------------------
  |  Branch (724:17): [True: 0, False: 0]
  ------------------
  725|       |                // Nonzero value means that we parsed width.
  726|      0|                widthSet = true;
  727|      0|                out.width(value);
  728|      0|            }
  729|      0|        }
  730|      0|    }
  731|  2.43M|    else if (positionalMode) {
  ------------------
  |  Branch (731:14): [True: 0, False: 2.43M]
  ------------------
  732|      0|        TINYFORMAT_ERROR("tinyformat: Non-positional argument used after a positional one");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  733|      0|    }
  734|       |    // 2) Parse flags and width if we did not do it in previous step.
  735|  2.43M|    if (!widthSet) {
  ------------------
  |  Branch (735:9): [True: 2.43M, False: 0]
  ------------------
  736|       |        // Parse flags
  737|  2.43M|        for (;; ++c) {
  738|  2.43M|            switch (*c) {
  739|      0|                case '#':
  ------------------
  |  Branch (739:17): [True: 0, False: 2.43M]
  ------------------
  740|      0|                    out.setf(std::ios::showpoint | std::ios::showbase);
  741|      0|                    continue;
  742|      0|                case '0':
  ------------------
  |  Branch (742:17): [True: 0, False: 2.43M]
  ------------------
  743|       |                    // overridden by left alignment ('-' flag)
  744|      0|                    if (!(out.flags() & std::ios::left)) {
  ------------------
  |  Branch (744:25): [True: 0, False: 0]
  ------------------
  745|       |                        // Use internal padding so that numeric values are
  746|       |                        // formatted correctly, eg -00010 rather than 000-10
  747|      0|                        out.fill('0');
  748|      0|                        out.setf(std::ios::internal, std::ios::adjustfield);
  749|      0|                    }
  750|      0|                    continue;
  751|      0|                case '-':
  ------------------
  |  Branch (751:17): [True: 0, False: 2.43M]
  ------------------
  752|      0|                    out.fill(' ');
  753|      0|                    out.setf(std::ios::left, std::ios::adjustfield);
  754|      0|                    continue;
  755|      0|                case ' ':
  ------------------
  |  Branch (755:17): [True: 0, False: 2.43M]
  ------------------
  756|       |                    // overridden by show positive sign, '+' flag.
  757|      0|                    if (!(out.flags() & std::ios::showpos))
  ------------------
  |  Branch (757:25): [True: 0, False: 0]
  ------------------
  758|      0|                        spacePadPositive = true;
  759|      0|                    continue;
  760|      0|                case '+':
  ------------------
  |  Branch (760:17): [True: 0, False: 2.43M]
  ------------------
  761|      0|                    out.setf(std::ios::showpos);
  762|      0|                    spacePadPositive = false;
  763|      0|                    widthExtra = 1;
  764|      0|                    continue;
  765|  2.43M|                default:
  ------------------
  |  Branch (765:17): [True: 2.43M, False: 0]
  ------------------
  766|  2.43M|                    break;
  767|  2.43M|            }
  768|  2.43M|            break;
  769|  2.43M|        }
  770|       |        // Parse width
  771|  2.43M|        int width = 0;
  772|  2.43M|        widthSet = parseWidthOrPrecision(width, c, positionalMode,
  773|  2.43M|                                         args, argIndex, numArgs);
  774|  2.43M|        if (widthSet) {
  ------------------
  |  Branch (774:13): [True: 0, False: 2.43M]
  ------------------
  775|      0|            if (width < 0) {
  ------------------
  |  Branch (775:17): [True: 0, False: 0]
  ------------------
  776|       |                // negative widths correspond to '-' flag set
  777|      0|                out.fill(' ');
  778|      0|                out.setf(std::ios::left, std::ios::adjustfield);
  779|      0|                width = -width;
  780|      0|            }
  781|      0|            out.width(width);
  782|      0|        }
  783|  2.43M|    }
  784|       |    // 3) Parse precision
  785|  2.43M|    if (*c == '.') {
  ------------------
  |  Branch (785:9): [True: 0, False: 2.43M]
  ------------------
  786|      0|        ++c;
  787|      0|        int precision = 0;
  788|      0|        parseWidthOrPrecision(precision, c, positionalMode,
  789|      0|                              args, argIndex, numArgs);
  790|       |        // Presence of `.` indicates precision set, unless the inferred value
  791|       |        // was negative in which case the default is used.
  792|      0|        precisionSet = precision >= 0;
  793|      0|        if (precisionSet)
  ------------------
  |  Branch (793:13): [True: 0, False: 0]
  ------------------
  794|      0|            out.precision(precision);
  795|      0|    }
  796|       |    // 4) Ignore any C99 length modifier
  797|  2.43M|    while (*c == 'l' || *c == 'h' || *c == 'L' ||
  ------------------
  |  Branch (797:12): [True: 0, False: 2.43M]
  |  Branch (797:25): [True: 0, False: 2.43M]
  |  Branch (797:38): [True: 0, False: 2.43M]
  ------------------
  798|  2.43M|           *c == 'j' || *c == 'z' || *c == 't') {
  ------------------
  |  Branch (798:12): [True: 0, False: 2.43M]
  |  Branch (798:25): [True: 0, False: 2.43M]
  |  Branch (798:38): [True: 0, False: 2.43M]
  ------------------
  799|      0|        ++c;
  800|      0|    }
  801|       |    // 5) We're up to the conversion specifier character.
  802|       |    // Set stream flags based on conversion specifier (thanks to the
  803|       |    // boost::format class for forging the way here).
  804|  2.43M|    bool intConversion = false;
  805|  2.43M|    switch (*c) {
  806|  1.06M|        case 'u': case 'd': case 'i':
  ------------------
  |  Branch (806:9): [True: 1.06M, False: 1.36M]
  |  Branch (806:19): [True: 0, False: 2.43M]
  |  Branch (806:29): [True: 0, False: 2.43M]
  ------------------
  807|  1.06M|            out.setf(std::ios::dec, std::ios::basefield);
  808|  1.06M|            intConversion = true;
  809|  1.06M|            break;
  810|      0|        case 'o':
  ------------------
  |  Branch (810:9): [True: 0, False: 2.43M]
  ------------------
  811|      0|            out.setf(std::ios::oct, std::ios::basefield);
  812|      0|            intConversion = true;
  813|      0|            break;
  814|      0|        case 'X':
  ------------------
  |  Branch (814:9): [True: 0, False: 2.43M]
  ------------------
  815|      0|            out.setf(std::ios::uppercase);
  816|      0|            [[fallthrough]];
  817|   683k|        case 'x': case 'p':
  ------------------
  |  Branch (817:9): [True: 683k, False: 1.75M]
  |  Branch (817:19): [True: 0, False: 2.43M]
  ------------------
  818|   683k|            out.setf(std::ios::hex, std::ios::basefield);
  819|   683k|            intConversion = true;
  820|   683k|            break;
  821|      0|        case 'E':
  ------------------
  |  Branch (821:9): [True: 0, False: 2.43M]
  ------------------
  822|      0|            out.setf(std::ios::uppercase);
  823|      0|            [[fallthrough]];
  824|      0|        case 'e':
  ------------------
  |  Branch (824:9): [True: 0, False: 2.43M]
  ------------------
  825|      0|            out.setf(std::ios::scientific, std::ios::floatfield);
  826|      0|            out.setf(std::ios::dec, std::ios::basefield);
  827|      0|            break;
  828|      0|        case 'F':
  ------------------
  |  Branch (828:9): [True: 0, False: 2.43M]
  ------------------
  829|      0|            out.setf(std::ios::uppercase);
  830|      0|            [[fallthrough]];
  831|      0|        case 'f':
  ------------------
  |  Branch (831:9): [True: 0, False: 2.43M]
  ------------------
  832|      0|            out.setf(std::ios::fixed, std::ios::floatfield);
  833|      0|            break;
  834|      0|        case 'A':
  ------------------
  |  Branch (834:9): [True: 0, False: 2.43M]
  ------------------
  835|      0|            out.setf(std::ios::uppercase);
  836|      0|            [[fallthrough]];
  837|      0|        case 'a':
  ------------------
  |  Branch (837:9): [True: 0, False: 2.43M]
  ------------------
  838|       |#           ifdef _MSC_VER
  839|       |            // Workaround https://developercommunity.visualstudio.com/content/problem/520472/hexfloat-stream-output-does-not-ignore-precision-a.html
  840|       |            // by always setting maximum precision on MSVC to avoid precision
  841|       |            // loss for doubles.
  842|       |            out.precision(13);
  843|       |#           endif
  844|      0|            out.setf(std::ios::fixed | std::ios::scientific, std::ios::floatfield);
  845|      0|            break;
  846|      0|        case 'G':
  ------------------
  |  Branch (846:9): [True: 0, False: 2.43M]
  ------------------
  847|      0|            out.setf(std::ios::uppercase);
  848|      0|            [[fallthrough]];
  849|      0|        case 'g':
  ------------------
  |  Branch (849:9): [True: 0, False: 2.43M]
  ------------------
  850|      0|            out.setf(std::ios::dec, std::ios::basefield);
  851|       |            // As in boost::format, let stream decide float format.
  852|      0|            out.flags(out.flags() & ~std::ios::floatfield);
  853|      0|            break;
  854|      0|        case 'c':
  ------------------
  |  Branch (854:9): [True: 0, False: 2.43M]
  ------------------
  855|       |            // Handled as special case inside formatValue()
  856|      0|            break;
  857|   683k|        case 's':
  ------------------
  |  Branch (857:9): [True: 683k, False: 1.75M]
  ------------------
  858|   683k|            if (precisionSet)
  ------------------
  |  Branch (858:17): [True: 0, False: 683k]
  ------------------
  859|      0|                ntrunc = static_cast<int>(out.precision());
  860|       |            // Make %s print Booleans as "true" and "false"
  861|   683k|            out.setf(std::ios::boolalpha);
  862|   683k|            break;
  863|      0|        case 'n':
  ------------------
  |  Branch (863:9): [True: 0, False: 2.43M]
  ------------------
  864|       |            // Not supported - will cause problems!
  865|      0|            TINYFORMAT_ERROR("tinyformat: %n conversion spec not supported");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  866|      0|            break;
  867|      0|        case '\0':
  ------------------
  |  Branch (867:9): [True: 0, False: 2.43M]
  ------------------
  868|      0|            TINYFORMAT_ERROR("tinyformat: Conversion spec incorrectly "
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  869|      0|                             "terminated by end of string");
  870|      0|            return c;
  871|      0|        default:
  ------------------
  |  Branch (871:9): [True: 0, False: 2.43M]
  ------------------
  872|      0|            break;
  873|  2.43M|    }
  874|  2.43M|    if (intConversion && precisionSet && !widthSet) {
  ------------------
  |  Branch (874:9): [True: 1.75M, False: 683k]
  |  Branch (874:26): [True: 0, False: 1.75M]
  |  Branch (874:42): [True: 0, False: 0]
  ------------------
  875|       |        // "precision" for integers gives the minimum number of digits (to be
  876|       |        // padded with zeros on the left).  This isn't really supported by the
  877|       |        // iostreams, but we can approximately simulate it with the width if
  878|       |        // the width isn't otherwise used.
  879|      0|        out.width(out.precision() + widthExtra);
  880|      0|        out.setf(std::ios::internal, std::ios::adjustfield);
  881|      0|        out.fill('0');
  882|      0|    }
  883|  2.43M|    return c+1;
  884|  2.43M|}
_ZN10tinyformat6detail10formatImplERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKcPKNS0_9FormatArgEi:
  891|  1.21M|{
  892|       |    // Saved stream state
  893|  1.21M|    std::streamsize origWidth = out.width();
  894|  1.21M|    std::streamsize origPrecision = out.precision();
  895|  1.21M|    std::ios::fmtflags origFlags = out.flags();
  896|  1.21M|    char origFill = out.fill();
  897|       |
  898|       |    // "Positional mode" means all format specs should be of the form "%n$..."
  899|       |    // with `n` an integer. We detect this in `streamStateFromFormat`.
  900|  1.21M|    bool positionalMode = false;
  901|  1.21M|    int argIndex = 0;
  902|  3.64M|    while (true) {
  ------------------
  |  Branch (902:12): [Folded - Ignored]
  ------------------
  903|  3.64M|        fmt = printFormatStringLiteral(out, fmt);
  904|  3.64M|        if (*fmt == '\0') {
  ------------------
  |  Branch (904:13): [True: 1.21M, False: 2.43M]
  ------------------
  905|  1.21M|            if (!positionalMode && argIndex < numArgs) {
  ------------------
  |  Branch (905:17): [True: 1.21M, False: 0]
  |  Branch (905:36): [True: 0, False: 1.21M]
  ------------------
  906|      0|                TINYFORMAT_ERROR("tinyformat: Not enough conversion specifiers in format string");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  907|      0|            }
  908|  1.21M|            break;
  909|  1.21M|        }
  910|  2.43M|        bool spacePadPositive = false;
  911|  2.43M|        int ntrunc = -1;
  912|  2.43M|        const char* fmtEnd = streamStateFromFormat(out, positionalMode, spacePadPositive, ntrunc, fmt,
  913|  2.43M|                                                   args, argIndex, numArgs);
  914|       |        // NB: argIndex may be incremented by reading variable width/precision
  915|       |        // in `streamStateFromFormat`, so do the bounds check here.
  916|  2.43M|        if (argIndex >= numArgs) {
  ------------------
  |  Branch (916:13): [True: 0, False: 2.43M]
  ------------------
  917|      0|            TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string");
  ------------------
  |  |  135|      0|#define TINYFORMAT_ERROR(reasonString) throw tinyformat::format_error(reasonString)
  ------------------
  918|      0|            return;
  919|      0|        }
  920|  2.43M|        const FormatArg& arg = args[argIndex];
  921|       |        // Format the arg into the stream.
  922|  2.43M|        if (!spacePadPositive) {
  ------------------
  |  Branch (922:13): [True: 2.43M, False: 0]
  ------------------
  923|  2.43M|            arg.format(out, fmt, fmtEnd, ntrunc);
  924|  2.43M|        }
  925|      0|        else {
  926|       |            // The following is a special case with no direct correspondence
  927|       |            // between stream formatting and the printf() behaviour.  Simulate
  928|       |            // it crudely by formatting into a temporary string stream and
  929|       |            // munging the resulting string.
  930|      0|            std::ostringstream tmpStream;
  931|      0|            tmpStream.copyfmt(out);
  932|      0|            tmpStream.setf(std::ios::showpos);
  933|      0|            arg.format(tmpStream, fmt, fmtEnd, ntrunc);
  934|      0|            std::string result = tmpStream.str(); // allocates... yuck.
  935|      0|            for (size_t i = 0, iend = result.size(); i < iend; ++i) {
  ------------------
  |  Branch (935:54): [True: 0, False: 0]
  ------------------
  936|      0|                if (result[i] == '+')
  ------------------
  |  Branch (936:21): [True: 0, False: 0]
  ------------------
  937|      0|                    result[i] = ' ';
  938|      0|            }
  939|      0|            out << result;
  940|      0|        }
  941|  2.43M|        if (!positionalMode)
  ------------------
  |  Branch (941:13): [True: 2.43M, False: 0]
  ------------------
  942|  2.43M|            ++argIndex;
  943|  2.43M|        fmt = fmtEnd;
  944|  2.43M|    }
  945|       |
  946|       |    // Restore stream state
  947|  1.21M|    out.width(origWidth);
  948|  1.21M|    out.precision(origPrecision);
  949|  1.21M|    out.flags(origFlags);
  950|  1.21M|    out.fill(origFill);
  951|  1.21M|}
_ZN10tinyformat7vformatERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEPKcRKNS_10FormatListE:
 1070|  1.21M|{
 1071|  1.21M|    detail::formatImpl(out, fmt, list.m_args, list.m_N);
 1072|  1.21M|}
_ZN10tinyformat17FormatStringCheckILj1EEcvPKcEv:
  197|   345k|    operator const char*() { return fmt; }
_ZN10tinyformat17FormatStringCheckILj2EEcvPKcEv:
  197|   683k|    operator const char*() { return fmt; }
_ZN10tinyformat6formatIJtEEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_17FormatStringCheckIXsZT_EEEDpRKT_:
 1088|   345k|{
 1089|   345k|    std::ostringstream oss;
 1090|   345k|    format(oss, fmt, args...);
 1091|   345k|    return oss.str();
 1092|   345k|}
_ZN10tinyformat6formatIJtEEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_17FormatStringCheckIXsZT_EEEDpRKT_:
 1080|   345k|{
 1081|   345k|    vformat(out, fmt, makeFormatList(args...));
 1082|   345k|}
_ZN10tinyformat14makeFormatListIJtEEENS_6detail11FormatListNIXsZT_EEEDpRKT_:
 1044|   345k|{
 1045|   345k|    return detail::FormatListN<sizeof...(args)>(args...);
 1046|   345k|}
_ZN10tinyformat6detail11FormatListNILi1EEC2IJtEEEDpRKT_:
  990|   345k|            : FormatList(&m_formatterStore[0], N),
  991|   345k|            m_formatterStore { FormatArg(args)... }
  992|   345k|        { static_assert(sizeof...(args) == N, "Number of args must be N"); }
_ZN10tinyformat6detail9FormatArgC2ItEERKT_:
  534|  1.02M|            : m_value(static_cast<const void*>(&value)),
  535|  1.02M|            m_formatImpl(&formatImpl<T>),
  536|  1.02M|            m_toIntImpl(&toIntImpl<T>)
  537|  1.02M|        { }
_ZN10tinyformat6detail9FormatArg10formatImplItEEvRNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEEPKcSA_iPKv:
  558|  1.02M|        {
  559|  1.02M|            formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast<const T*>(value));
  560|  1.02M|        }
_ZN10tinyformat11formatValueItEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKcS8_iRKT_:
  351|  1.02M|{
  352|  1.02M|#ifndef TINYFORMAT_ALLOW_WCHAR_STRINGS
  353|       |    // Since we don't support printing of wchar_t using "%ls", make it fail at
  354|       |    // compile time in preference to printing as a void* at runtime.
  355|  1.02M|    typedef typename detail::is_wchar<T>::tinyformat_wchar_is_not_supported DummyType;
  356|  1.02M|    (void) DummyType(); // avoid unused type warning with gcc-4.8
  357|  1.02M|#endif
  358|       |    // The mess here is to support the %c and %p conversions: if these
  359|       |    // conversions are active we try to convert the type to a char or const
  360|       |    // void* respectively and format that instead of the value itself.  For the
  361|       |    // %p conversion it's important to avoid dereferencing the pointer, which
  362|       |    // could otherwise lead to a crash when printing a dangling (const char*).
  363|  1.02M|    const bool canConvertToChar = detail::is_convertible<T,char>::value;
  364|  1.02M|    const bool canConvertToVoidPtr = detail::is_convertible<T, const void*>::value;
  365|  1.02M|    if (canConvertToChar && *(fmtEnd-1) == 'c')
  ------------------
  |  Branch (365:9): [Folded - Ignored]
  |  Branch (365:29): [True: 0, False: 1.02M]
  ------------------
  366|      0|        detail::formatValueAsType<T, char>::invoke(out, value);
  367|  1.02M|    else if (canConvertToVoidPtr && *(fmtEnd-1) == 'p')
  ------------------
  |  Branch (367:14): [Folded - Ignored]
  |  Branch (367:37): [True: 0, False: 0]
  ------------------
  368|      0|        detail::formatValueAsType<T, const void*>::invoke(out, value);
  369|       |#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
  370|       |    else if (detail::formatZeroIntegerWorkaround<T>::invoke(out, value)) /**/;
  371|       |#endif
  372|  1.02M|    else if (ntrunc >= 0) {
  ------------------
  |  Branch (372:14): [True: 0, False: 1.02M]
  ------------------
  373|       |        // Take care not to overread C strings in truncating conversions like
  374|       |        // "%.4s" where at most 4 characters may be read.
  375|      0|        detail::formatTruncated(out, value, ntrunc);
  376|      0|    }
  377|  1.02M|    else
  378|  1.02M|        out << value;
  379|  1.02M|}
_ZN10tinyformat6detail9FormatArgC2IPKcEERKT_:
  534|   683k|            : m_value(static_cast<const void*>(&value)),
  535|   683k|            m_formatImpl(&formatImpl<T>),
  536|   683k|            m_toIntImpl(&toIntImpl<T>)
  537|   683k|        { }
_ZN10tinyformat6detail9FormatArg10formatImplIPKcEEvRNSt3__113basic_ostreamIcNS5_11char_traitsIcEEEES4_S4_iPKv:
  558|   683k|        {
  559|   683k|            formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast<const T*>(value));
  560|   683k|        }
_ZN10tinyformat11formatValueIPKcEEvRNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEES2_S2_iRKT_:
  351|   683k|{
  352|   683k|#ifndef TINYFORMAT_ALLOW_WCHAR_STRINGS
  353|       |    // Since we don't support printing of wchar_t using "%ls", make it fail at
  354|       |    // compile time in preference to printing as a void* at runtime.
  355|   683k|    typedef typename detail::is_wchar<T>::tinyformat_wchar_is_not_supported DummyType;
  356|   683k|    (void) DummyType(); // avoid unused type warning with gcc-4.8
  357|   683k|#endif
  358|       |    // The mess here is to support the %c and %p conversions: if these
  359|       |    // conversions are active we try to convert the type to a char or const
  360|       |    // void* respectively and format that instead of the value itself.  For the
  361|       |    // %p conversion it's important to avoid dereferencing the pointer, which
  362|       |    // could otherwise lead to a crash when printing a dangling (const char*).
  363|   683k|    const bool canConvertToChar = detail::is_convertible<T,char>::value;
  364|   683k|    const bool canConvertToVoidPtr = detail::is_convertible<T, const void*>::value;
  365|   683k|    if (canConvertToChar && *(fmtEnd-1) == 'c')
  ------------------
  |  Branch (365:9): [Folded - Ignored]
  |  Branch (365:29): [True: 0, False: 0]
  ------------------
  366|      0|        detail::formatValueAsType<T, char>::invoke(out, value);
  367|   683k|    else if (canConvertToVoidPtr && *(fmtEnd-1) == 'p')
  ------------------
  |  Branch (367:14): [Folded - Ignored]
  |  Branch (367:37): [True: 0, False: 683k]
  ------------------
  368|      0|        detail::formatValueAsType<T, const void*>::invoke(out, value);
  369|       |#ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND
  370|       |    else if (detail::formatZeroIntegerWorkaround<T>::invoke(out, value)) /**/;
  371|       |#endif
  372|   683k|    else if (ntrunc >= 0) {
  ------------------
  |  Branch (372:14): [True: 0, False: 683k]
  ------------------
  373|       |        // Take care not to overread C strings in truncating conversions like
  374|       |        // "%.4s" where at most 4 characters may be read.
  375|      0|        detail::formatTruncated(out, value, ntrunc);
  376|      0|    }
  377|   683k|    else
  378|   683k|        out << value;
  379|   683k|}
_ZN10tinyformat6detail9FormatArgC2IhEERKT_:
  534|   723k|            : m_value(static_cast<const void*>(&value)),
  535|   723k|            m_formatImpl(&formatImpl<T>),
  536|   723k|            m_toIntImpl(&toIntImpl<T>)
  537|   723k|        { }
_ZN10tinyformat6detail9FormatArg10formatImplIhEEvRNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEEPKcSA_iPKv:
  558|   723k|        {
  559|   723k|            formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast<const T*>(value));
  560|   723k|        }
_ZN10tinyformat17FormatStringCheckILj4EEcvPKcEv:
  197|   180k|    operator const char*() { return fmt; }
_ZN10tinyformat6formatIJhhhhEEENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_17FormatStringCheckIXsZT_EEEDpRKT_:
 1088|   180k|{
 1089|   180k|    std::ostringstream oss;
 1090|   180k|    format(oss, fmt, args...);
 1091|   180k|    return oss.str();
 1092|   180k|}
_ZN10tinyformat6formatIJhhhhEEEvRNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEENS_17FormatStringCheckIXsZT_EEEDpRKT_:
 1080|   180k|{
 1081|   180k|    vformat(out, fmt, makeFormatList(args...));
 1082|   180k|}
_ZN10tinyformat14makeFormatListIJhhhhEEENS_6detail11FormatListNIXsZT_EEEDpRKT_:
 1044|   180k|{
 1045|   180k|    return detail::FormatListN<sizeof...(args)>(args...);
 1046|   180k|}
_ZN10tinyformat6detail11FormatListNILi4EEC2IJhhhhEEEDpRKT_:
  990|   180k|            : FormatList(&m_formatterStore[0], N),
  991|   180k|            m_formatterStore { FormatArg(args)... }
  992|   180k|        { static_assert(sizeof...(args) == N, "Number of args must be N"); }
_ZN10tinyformat6formatIJPKctEEENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS_17FormatStringCheckIXsZT_EEEDpRKT_:
 1088|   683k|{
 1089|   683k|    std::ostringstream oss;
 1090|   683k|    format(oss, fmt, args...);
 1091|   683k|    return oss.str();
 1092|   683k|}
_ZN10tinyformat6formatIJPKctEEEvRNSt3__113basic_ostreamIcNS3_11char_traitsIcEEEENS_17FormatStringCheckIXsZT_EEEDpRKT_:
 1080|   683k|{
 1081|   683k|    vformat(out, fmt, makeFormatList(args...));
 1082|   683k|}
_ZN10tinyformat14makeFormatListIJPKctEEENS_6detail11FormatListNIXsZT_EEEDpRKT_:
 1044|   683k|{
 1045|   683k|    return detail::FormatListN<sizeof...(args)>(args...);
 1046|   683k|}
_ZN10tinyformat6detail11FormatListNILi2EEC2IJPKctEEEDpRKT_:
  990|   683k|            : FormatList(&m_formatterStore[0], N),
  991|   683k|            m_formatterStore { FormatArg(args)... }
  992|   683k|        { static_assert(sizeof...(args) == N, "Number of args must be N"); }

_ZN9base_blobILj256EE7SetNullEv:
   56|  2.10k|    {
   57|  2.10k|        std::fill(m_data.begin(), m_data.end(), 0);
   58|  2.10k|    }
_ZN7uint256C2Ev:
  205|  2.10k|    constexpr uint256() = default;
_ZN9base_blobILj256EEC2Ev:
   35|  2.10k|    constexpr base_blob() : m_data() {}

_ZN8UniValueC2Ev:
   31|  43.1k|    UniValue() { typ = VNULL; }
_ZNK8UniValue6isNullEv:
   79|  43.1k|    bool isNull() const { return (typ == VNULL); }

_Z17ChainTypeToString9ChainType:
   12|   129k|{
   13|   129k|    switch (chain) {
  ------------------
  |  Branch (13:13): [True: 0, False: 129k]
  ------------------
   14|   129k|    case ChainType::MAIN:
  ------------------
  |  Branch (14:5): [True: 129k, False: 0]
  ------------------
   15|   129k|        return "main";
   16|      0|    case ChainType::TESTNET:
  ------------------
  |  Branch (16:5): [True: 0, False: 129k]
  ------------------
   17|      0|        return "test";
   18|      0|    case ChainType::TESTNET4:
  ------------------
  |  Branch (18:5): [True: 0, False: 129k]
  ------------------
   19|      0|        return "testnet4";
   20|      0|    case ChainType::SIGNET:
  ------------------
  |  Branch (20:5): [True: 0, False: 129k]
  ------------------
   21|      0|        return "signet";
   22|      0|    case ChainType::REGTEST:
  ------------------
  |  Branch (22:5): [True: 0, False: 129k]
  ------------------
   23|      0|        return "regtest";
   24|   129k|    }
   25|      0|    assert(false);
   26|      0|}

_Z22inline_assertion_checkILb1EbEOT0_S1_PKciS3_S3_:
   52|  4.21k|{
   53|  4.21k|    if (IS_ASSERT || std::is_constant_evaluated() || G_FUZZING
  ------------------
  |  Branch (53:9): [Folded - Ignored]
  |  Branch (53:22): [Folded - Ignored]
  |  Branch (53:54): [Folded - Ignored]
  ------------------
   54|       |#ifdef ABORT_ON_FAILED_ASSUME
   55|       |        || true
   56|       |#endif
   57|  4.21k|    ) {
   58|  4.21k|        if (!val) {
  ------------------
  |  Branch (58:13): [True: 0, False: 4.21k]
  ------------------
   59|      0|            assertion_fail(file, line, func, assertion);
   60|      0|        }
   61|  4.21k|    }
   62|  4.21k|    return std::forward<T>(val);
   63|  4.21k|}
_Z22inline_assertion_checkILb1ERPKNSt3__18functionIFvNS0_4spanIKhLm18446744073709551615EEEEEEEOT0_SB_PKciSD_SD_:
   52|  2.10k|{
   53|  2.10k|    if (IS_ASSERT || std::is_constant_evaluated() || G_FUZZING
  ------------------
  |  Branch (53:9): [Folded - Ignored]
  |  Branch (53:22): [Folded - Ignored]
  |  Branch (53:54): [Folded - Ignored]
  ------------------
   54|       |#ifdef ABORT_ON_FAILED_ASSUME
   55|       |        || true
   56|       |#endif
   57|  2.10k|    ) {
   58|  2.10k|        if (!val) {
  ------------------
  |  Branch (58:13): [True: 0, False: 2.10k]
  ------------------
   59|      0|            assertion_fail(file, line, func, assertion);
   60|      0|        }
   61|  2.10k|    }
   62|  2.10k|    return std::forward<T>(val);
   63|  2.10k|}

_Z16AdditionOverflowImEbT_S0_:
   16|   265k|{
   17|   265k|    static_assert(std::is_integral<T>::value, "Integral required.");
   18|       |    if constexpr (std::numeric_limits<T>::is_signed) {
   19|       |        return (i > 0 && j > std::numeric_limits<T>::max() - i) ||
   20|       |               (i < 0 && j < std::numeric_limits<T>::min() - i);
   21|       |    }
   22|   265k|    return std::numeric_limits<T>::max() - i < j;
   23|   265k|}
_Z10CheckedAddImENSt3__18optionalIT_EES2_S2_:
   27|   265k|{
   28|   265k|    if (AdditionOverflow(i, j)) {
  ------------------
  |  Branch (28:9): [True: 0, False: 265k]
  ------------------
   29|      0|        return std::nullopt;
   30|      0|    }
   31|   265k|    return i + j;
   32|   265k|}

_ZN4SockC2Ej:
   27|  2.10k|Sock::Sock(SOCKET s) : m_socket(s) {}
_ZN4SockD2Ev:
   35|  2.10k|Sock::~Sock() { Close(); }
_ZN4Sock5CloseEv:
  402|  2.10k|{
  403|  2.10k|    if (m_socket == INVALID_SOCKET) {
  ------------------
  |  |   56|  2.10k|#define INVALID_SOCKET      (SOCKET)(~0)
  ------------------
  |  Branch (403:9): [True: 2.10k, False: 0]
  ------------------
  404|  2.10k|        return;
  405|  2.10k|    }
  406|       |#ifdef WIN32
  407|       |    int ret = closesocket(m_socket);
  408|       |#else
  409|      0|    int ret = close(m_socket);
  410|      0|#endif
  411|      0|    if (ret) {
  ------------------
  |  Branch (411:9): [True: 0, False: 0]
  ------------------
  412|      0|        LogPrintf("Error closing socket %d: %s\n", m_socket, NetworkErrorString(WSAGetLastError()));
  ------------------
  |  |  266|      0|#define LogPrintf(...) LogInfo(__VA_ARGS__)
  |  |  ------------------
  |  |  |  |  261|      0|#define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  |  |  |  |  255|      0|#define LogPrintLevel_(category, level, ...) LogPrintFormatInternal(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|      0|    }
  414|      0|    m_socket = INVALID_SOCKET;
  ------------------
  |  |   56|      0|#define INVALID_SOCKET      (SOCKET)(~0)
  ------------------
  415|      0|}

_Z12EncodeBase324SpanIKhEb:
  146|  72.7k|{
  147|  72.7k|    static const char *pbase32 = "abcdefghijklmnopqrstuvwxyz234567";
  148|       |
  149|  72.7k|    std::string str;
  150|  72.7k|    str.reserve(((input.size() + 4) / 5) * 8);
  151|  72.7k|    ConvertBits<8, 5, true>([&](int v) { str += pbase32[v]; }, input.begin(), input.end());
  152|  72.7k|    if (pad) {
  ------------------
  |  Branch (152:9): [True: 40.0k, False: 32.7k]
  ------------------
  153|  40.0k|        while (str.size() % 8) {
  ------------------
  |  Branch (153:16): [True: 0, False: 40.0k]
  ------------------
  154|      0|            str += '=';
  155|      0|        }
  156|  40.0k|    }
  157|  72.7k|    return str;
  158|  72.7k|}
strencodings.cpp:_ZZ12EncodeBase324SpanIKhEbENK3$_0clEi:
  151|  3.92M|    ConvertBits<8, 5, true>([&](int v) { str += pbase32[v]; }, input.begin(), input.end());

strencodings.cpp:_ZNK12_GLOBAL__N_111IntIdentityclEi:
  263|  2.43M|    [[maybe_unused]] int operator()(int x) const { return x; }
strencodings.cpp:_Z11ConvertBitsILi8ELi5ELb1EZ12EncodeBase324SpanIKhEbE3$_0PS1_N12_GLOBAL__N_111IntIdentityEEbT2_T3_S8_T4_:
  270|  72.7k|bool ConvertBits(O outfn, It it, It end, I infn = {}) {
  271|  72.7k|    size_t acc = 0;
  272|  72.7k|    size_t bits = 0;
  273|  72.7k|    constexpr size_t maxv = (1 << tobits) - 1;
  274|  72.7k|    constexpr size_t max_acc = (1 << (frombits + tobits - 1)) - 1;
  275|  2.51M|    while (it != end) {
  ------------------
  |  Branch (275:12): [True: 2.43M, False: 72.7k]
  ------------------
  276|  2.43M|        int v = infn(*it);
  277|  2.43M|        if (v < 0) return false;
  ------------------
  |  Branch (277:13): [True: 0, False: 2.43M]
  ------------------
  278|  2.43M|        acc = ((acc << frombits) | v) & max_acc;
  279|  2.43M|        bits += frombits;
  280|  6.33M|        while (bits >= tobits) {
  ------------------
  |  Branch (280:16): [True: 3.89M, False: 2.43M]
  ------------------
  281|  3.89M|            bits -= tobits;
  282|  3.89M|            outfn((acc >> bits) & maxv);
  283|  3.89M|        }
  284|  2.43M|        ++it;
  285|  2.43M|    }
  286|  72.7k|    if (pad) {
  ------------------
  |  Branch (286:9): [Folded - Ignored]
  ------------------
  287|  72.7k|        if (bits) outfn((acc << (tobits - bits)) & maxv);
  ------------------
  |  Branch (287:13): [True: 32.7k, False: 40.0k]
  ------------------
  288|  72.7k|    } else if (bits >= frombits || ((acc << (tobits - bits)) & maxv)) {
  ------------------
  |  Branch (288:16): [True: 0, False: 0]
  |  Branch (288:36): [True: 0, False: 0]
  ------------------
  289|      0|        return false;
  290|      0|    }
  291|  72.7k|    return true;
  292|  72.7k|}
_Z10ToIntegralIhENSt3__18optionalIT_EENS0_17basic_string_viewIcNS0_11char_traitsIcEEEE:
  180|     10|{
  181|     10|    static_assert(std::is_integral<T>::value);
  182|     10|    T result;
  183|     10|    const auto [first_nonmatching, error_condition] = std::from_chars(str.data(), str.data() + str.size(), result);
  184|     10|    if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) {
  ------------------
  |  Branch (184:9): [True: 0, False: 10]
  |  Branch (184:57): [True: 0, False: 10]
  ------------------
  185|      0|        return std::nullopt;
  186|      0|    }
  187|     10|    return result;
  188|     10|}
_Z10ToIntegralItENSt3__18optionalIT_EENS0_17basic_string_viewIcNS0_11char_traitsIcEEEE:
  180|      2|{
  181|      2|    static_assert(std::is_integral<T>::value);
  182|      2|    T result;
  183|      2|    const auto [first_nonmatching, error_condition] = std::from_chars(str.data(), str.data() + str.size(), result);
  184|      2|    if (first_nonmatching != str.data() + str.size() || error_condition != std::errc{}) {
  ------------------
  |  Branch (184:9): [True: 0, False: 2]
  |  Branch (184:57): [True: 0, False: 2]
  ------------------
  185|      0|        return std::nullopt;
  186|      0|    }
  187|      2|    return result;
  188|      2|}

_ZN4util9HasPrefixI9prevectorILj16EhjiELm6EEEbRKT_RKNSt3__15arrayIhXT0_EEE:
  247|  13.2k|{
  248|  13.2k|    return obj.size() >= PREFIX_LEN &&
  ------------------
  |  Branch (248:12): [True: 13.2k, False: 0]
  ------------------
  249|  13.2k|           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  ------------------
  |  Branch (249:12): [True: 32, False: 13.2k]
  ------------------
  250|  13.2k|}
_ZN4util9HasPrefixI9prevectorILj16EhjiELm12EEEbRKT_RKNSt3__15arrayIhXT0_EEE:
  247|  3.62M|{
  248|  3.62M|    return obj.size() >= PREFIX_LEN &&
  ------------------
  |  Branch (248:12): [True: 3.62M, False: 0]
  ------------------
  249|  3.62M|           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  ------------------
  |  Branch (249:12): [True: 666, False: 3.62M]
  ------------------
  250|  3.62M|}
_ZN4util9HasPrefixI9prevectorILj16EhjiELm2EEEbRKT_RKNSt3__15arrayIhXT0_EEE:
  247|  5.42M|{
  248|  5.42M|    return obj.size() >= PREFIX_LEN &&
  ------------------
  |  Branch (248:12): [True: 5.42M, False: 0]
  ------------------
  249|  5.42M|           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  ------------------
  |  Branch (249:12): [True: 2.62k, False: 5.42M]
  ------------------
  250|  5.42M|}
_ZN4util9HasPrefixI9prevectorILj16EhjiELm3EEEbRKT_RKNSt3__15arrayIhXT0_EEE:
  247|  23.0M|{
  248|  23.0M|    return obj.size() >= PREFIX_LEN &&
  ------------------
  |  Branch (248:12): [True: 23.0M, False: 0]
  ------------------
  249|  23.0M|           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  ------------------
  |  Branch (249:12): [True: 8.67k, False: 23.0M]
  ------------------
  250|  23.0M|}
_ZN4util9HasPrefixI9prevectorILj16EhjiELm4EEEbRKT_RKNSt3__15arrayIhXT0_EEE:
  247|  8.92M|{
  248|  8.92M|    return obj.size() >= PREFIX_LEN &&
  ------------------
  |  Branch (248:12): [True: 8.92M, False: 0]
  ------------------
  249|  8.92M|           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  ------------------
  |  Branch (249:12): [True: 1.44k, False: 8.92M]
  ------------------
  250|  8.92M|}
_ZN4util9HasPrefixI9prevectorILj16EhjiELm8EEEbRKT_RKNSt3__15arrayIhXT0_EEE:
  247|  6.09M|{
  248|  6.09M|    return obj.size() >= PREFIX_LEN &&
  ------------------
  |  Branch (248:12): [True: 6.09M, False: 0]
  ------------------
  249|  6.09M|           std::equal(std::begin(prefix), std::end(prefix), std::begin(obj));
  ------------------
  |  Branch (249:12): [True: 410, False: 6.09M]
  ------------------
  250|  6.09M|}

_ZN9NodeClock3nowEv:
   27|  2.10k|{
   28|  2.10k|    const auto mocktime{g_mock_time.load(std::memory_order_relaxed)};
   29|  2.10k|    if (!mocktime.count()) {
  ------------------
  |  Branch (29:9): [True: 0, False: 2.10k]
  ------------------
   30|      0|        g_used_system_time = true;
   31|      0|    }
   32|  2.10k|    const auto ret{
   33|  2.10k|        mocktime.count() ?
  ------------------
  |  Branch (33:9): [True: 2.10k, False: 0]
  ------------------
   34|  2.10k|            mocktime :
   35|  2.10k|            std::chrono::system_clock::now().time_since_epoch()};
   36|  2.10k|    assert(ret > 0s);
   37|  2.10k|    return time_point{ret};
   38|  2.10k|};
_Z11SetMockTimel:
   40|  2.10k|void SetMockTime(int64_t nMockTimeIn) { SetMockTime(std::chrono::seconds{nMockTimeIn}); }
_Z11SetMockTimeNSt3__16chrono8durationIxNS_5ratioILl1ELl1EEEEE:
   42|  4.21k|{
   43|  4.21k|    Assert(mock_time_in >= 0s);
  ------------------
  |  |   85|  4.21k|#define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val)
  ------------------
   44|  4.21k|    g_mock_time.store(mock_time_in, std::memory_order_relaxed);
   45|  4.21k|}
_Z20ParseISO8601DateTimeNSt3__117basic_string_viewIcNS_11char_traitsIcEEEE:
   96|      2|{
   97|      2|    constexpr auto FMT_SIZE{std::string_view{"2000-01-01T01:01:01Z"}.size()};
   98|      2|    if (str.size() != FMT_SIZE || str[4] != '-' || str[7] != '-' || str[10] != 'T' || str[13] != ':' || str[16] != ':' || str[19] != 'Z') {
  ------------------
  |  Branch (98:9): [True: 0, False: 2]
  |  Branch (98:35): [True: 0, False: 2]
  |  Branch (98:52): [True: 0, False: 2]
  |  Branch (98:69): [True: 0, False: 2]
  |  Branch (98:87): [True: 0, False: 2]
  |  Branch (98:105): [True: 0, False: 2]
  |  Branch (98:123): [True: 0, False: 2]
  ------------------
   99|      0|        return {};
  100|      0|    }
  101|      2|    const auto year{ToIntegral<uint16_t>(str.substr(0, 4))};
  102|      2|    const auto month{ToIntegral<uint8_t>(str.substr(5, 2))};
  103|      2|    const auto day{ToIntegral<uint8_t>(str.substr(8, 2))};
  104|      2|    const auto hour{ToIntegral<uint8_t>(str.substr(11, 2))};
  105|      2|    const auto min{ToIntegral<uint8_t>(str.substr(14, 2))};
  106|      2|    const auto sec{ToIntegral<uint8_t>(str.substr(17, 2))};
  107|      2|    if (!year || !month || !day || !hour || !min || !sec) {
  ------------------
  |  Branch (107:9): [True: 0, False: 2]
  |  Branch (107:18): [True: 0, False: 2]
  |  Branch (107:28): [True: 0, False: 2]
  |  Branch (107:36): [True: 0, False: 2]
  |  Branch (107:45): [True: 0, False: 2]
  |  Branch (107:53): [True: 0, False: 2]
  ------------------
  108|      0|        return {};
  109|      0|    }
  110|      2|    const std::chrono::year_month_day ymd{std::chrono::year{*year}, std::chrono::month{*month}, std::chrono::day{*day}};
  111|      2|    if (!ymd.ok()) {
  ------------------
  |  Branch (111:9): [True: 0, False: 2]
  ------------------
  112|      0|        return {};
  113|      0|    }
  114|      2|    const auto time{std::chrono::hours{*hour} + std::chrono::minutes{*min} + std::chrono::seconds{*sec}};
  115|      2|    const auto tp{std::chrono::sys_days{ymd} + time};
  116|      2|    return int64_t{TicksSinceEpoch<std::chrono::seconds>(tp)};
  117|      2|}

_Z5TicksINSt3__16chrono8durationIxNS0_5ratioILl1ELl1EEEEES5_EDaT0_:
   73|      2|{
   74|      2|    return std::chrono::duration_cast<Dur1>(d).count();
   75|      2|}
_Z3NowINSt3__16chrono10time_pointI9NodeClockNS1_8durationIxNS0_5ratioILl1ELl1EEEEEEEET_v:
  119|  2.10k|{
  120|  2.10k|    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
  121|  2.10k|}
_Z15TicksSinceEpochINSt3__16chrono8durationIxNS0_5ratioILl1ELl1EEEEENS1_10time_pointINS1_12system_clockES5_EEEDaT0_:
   78|      2|{
   79|      2|    return Ticks<Duration>(t.time_since_epoch());
   80|      2|}
_Z7GetTimeINSt3__16chrono8durationIxNS0_5ratioILl1ELl1EEEEEET_v:
  125|  2.10k|{
  126|  2.10k|    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
  127|  2.10k|}

_ZN12TokenPipeEndD2Ev:
   34|      4|{
   35|      4|    Close();
   36|      4|}
_ZN12TokenPipeEnd5CloseEv:
   77|      4|{
   78|      4|    if (m_fd != -1) close(m_fd);
  ------------------
  |  Branch (78:9): [True: 4, False: 0]
  ------------------
   79|      4|    m_fd = -1;
   80|      4|}

