From ed3c15ff2f1ff459c797fe9c22e2dda8621998aa Mon Sep 17 00:00:00 2001 From: jtmoon79 <815261+jtmoon79@users.noreply.github.com> Date: Sun, 7 Jul 2024 23:39:14 -0700 Subject: [PATCH] (PROJECT) add releases/0.7.75 --- README.md | 21 +- releases/0.7.75/callgrind.png | Bin 0 -> 1733320 bytes releases/0.7.75/callgrind.svg | 2876 ++ releases/0.7.75/callgrind.txt | 21947 ++++++++++++++++ releases/0.7.75/cargo-bench.txt | 358 + releases/0.7.75/compare-grep-sort.txt | 91 + releases/0.7.75/compare-log-mergers.txt | 138 + releases/0.7.75/compare-s4_grep_sort.md | 6 + releases/0.7.75/flamegraph-evtx.svg | 3802 +++ releases/0.7.75/flamegraph-help.svg | 1287 + releases/0.7.75/flamegraph-journal-bz2.svg | 2442 ++ releases/0.7.75/flamegraph-journal-gz.svg | 2477 ++ releases/0.7.75/flamegraph-journal-lz4.svg | 2592 ++ releases/0.7.75/flamegraph-journal-tar.svg | 2512 ++ releases/0.7.75/flamegraph-journal-xz.svg | 2892 ++ releases/0.7.75/flamegraph-journal.svg | 2097 ++ releases/0.7.75/flamegraph-syslog-bz2.svg | 4997 ++++ releases/0.7.75/flamegraph-syslog-empty.svg | 1017 + releases/0.7.75/flamegraph-syslog-gz.svg | 5222 ++++ releases/0.7.75/flamegraph-syslog-lz4.svg | 5292 ++++ .../0.7.75/flamegraph-syslog-no-matches.svg | 6422 +++++ releases/0.7.75/flamegraph-syslog-tar.svg | 5282 ++++ releases/0.7.75/flamegraph-syslog-xz.svg | 5467 ++++ releases/0.7.75/flamegraph-syslog.svg | 7287 +++++ releases/0.7.75/flamegraph-utmp.svg | 1397 + 25 files changed, 87910 insertions(+), 11 deletions(-) create mode 100644 releases/0.7.75/callgrind.png create mode 100644 releases/0.7.75/callgrind.svg create mode 100644 releases/0.7.75/callgrind.txt create mode 100644 releases/0.7.75/cargo-bench.txt create mode 100644 releases/0.7.75/compare-grep-sort.txt create mode 100644 releases/0.7.75/compare-log-mergers.txt create mode 100644 releases/0.7.75/compare-s4_grep_sort.md create mode 100644 releases/0.7.75/flamegraph-evtx.svg create mode 100644 releases/0.7.75/flamegraph-help.svg create mode 100644 releases/0.7.75/flamegraph-journal-bz2.svg create mode 100644 releases/0.7.75/flamegraph-journal-gz.svg create mode 100644 releases/0.7.75/flamegraph-journal-lz4.svg create mode 100644 releases/0.7.75/flamegraph-journal-tar.svg create mode 100644 releases/0.7.75/flamegraph-journal-xz.svg create mode 100644 releases/0.7.75/flamegraph-journal.svg create mode 100644 releases/0.7.75/flamegraph-syslog-bz2.svg create mode 100644 releases/0.7.75/flamegraph-syslog-empty.svg create mode 100644 releases/0.7.75/flamegraph-syslog-gz.svg create mode 100644 releases/0.7.75/flamegraph-syslog-lz4.svg create mode 100644 releases/0.7.75/flamegraph-syslog-no-matches.svg create mode 100644 releases/0.7.75/flamegraph-syslog-tar.svg create mode 100644 releases/0.7.75/flamegraph-syslog-xz.svg create mode 100644 releases/0.7.75/flamegraph-syslog.svg create mode 100644 releases/0.7.75/flamegraph-utmp.svg diff --git a/README.md b/README.md index c85d4756..a32ab510 100644 --- a/README.md +++ b/README.md @@ -726,19 +726,18 @@ A comparison of merging three large log files running on Ubuntu 22 on WSL2. Using `hyperfine` and GNU `time` to measure Max RSS. -| Command | Mean [ms] | Min [ms] | Max [ms] |Max RSS [KB]| -|:--- |---: |---: |---: |---: | -| `grep+sort` | 40.8 ± 0.4 | 40.1 | 42.0 |2656 | -| `s4 (system)` | 38.3 ± 1.9 | 35.0 | 48.7 |48184 | -| `s4 (mimalloc)` | 28.4 ± 2.2 | 26.0 | 43.9 |77344 | -| `s4 (jemalloc)` | 35.1 ± 2.8 | 32.4 | 52.3 |70832 | -| `logmerger` | 729.2 ± 11.8 | 710.2 | 749.0 |56140 | -|`tl` | | | |53324 | +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |Max RSS [KB]| +|:--- |---: |---: |---: |---: |---: | +| `grep+sort` | 41.0 ± 0.5 | 40.5 | 43.8 | 1.00 |2740 | +| `s4 (system)` | 37.3 ± 1.5 | 35.3 | 44.6 | 1.00 |48084 | +| `s4 (mimalloc)` | 30.3 ± 1.8 | 27.1 | 36.6 | 1.00 |77020 | +| `s4 (jemalloc)` | 36.0 ± 2.0 | 32.5 | 43.2 | 1.00 |69028 | +| `logmerger` | 720.2 ± 4.9 | 712.9 | 728.0 | 1.00 |56332 | Programs tested: -- `grep` 3.7, `sort` 8.32 -- `s4` 0.7.74 +- GNU `grep` 3.7, GNU `sort` 8.32 +- `s4` 0.7.75 - `logmerger` 0.9.0 on Python 3.10.12 - `tl` 1.5.0 on Python 3.10.12 - `hyperfine` 1.11.0 @@ -746,7 +745,7 @@ Programs tested: See directory results in [`compare-log-mergers.txt`]. -[`compare-log-mergers.txt`]: https://github.com/jtmoon79/super-speedy-syslog-searcher/tree/0.7.74/releases/0.7.74 +[`compare-log-mergers.txt`]: https://github.com/jtmoon79/super-speedy-syslog-searcher/tree/0.7.75/releases/0.7.75 --- diff --git a/releases/0.7.75/callgrind.png b/releases/0.7.75/callgrind.png new file mode 100644 index 0000000000000000000000000000000000000000..3157a9accea5da15c16f6f95483859d1880b7f6d GIT binary patch literal 1733320 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 z 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 z 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 w+oIHKB@*Ue&Am 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

HliGzrQCL6z_ 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⪼mF0jhSnpTeOUq##UfhnJZnc+hw0}bFGVmn)>B` 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�NrI;2|i__ro+V1Yv+r*$A!%?4+4*}oLtWj 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%0D+(s!pV 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 z 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 z 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ℜ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

wZ0tb!K$U`jH%IQsk2RaRkgCThDBqb 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

*%kT1Bz{V%b)MArtu!G9!dFHtEi}It4 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 P5G^k4AUR6nr}-5w;m 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

K;`eswk7LzrtoaVur`>6~1Md;6 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%0ABTb78&Ov~hS8pp-pI9V%9(RxoCc^*UOtK+(Js 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 qeDoTV{)XP69MWC>AH9J>+K;|R + + + + + +%3 + + + +(below main) + +s4 +(below main) +99.87% +(0.00%) + + + + +main + +s4 +main +99.86% +(0.00%) + + + + +(below main)->main + + +99.86% + + + + +std::rt::lang_start_internal + +s4 +std::rt::lang_start_internal +99.86% +(0.00%) + + + + +main->std::rt::lang_start_internal + + +99.86% + + + + +0x0000000000020290 + +ld-linux-x86-64.so.2 +0x0000000000020290 +100.00% +(0.00%) + + + + +0x0000000000020290->(below main) + + +99.87% + + + + +0x0000000004898620 + +??? +0x0000000004898620 +1.59% +(0.01%) +24897× + + + +__memcpy_avx_unaligned_erms + +libc.so.6 +__memcpy_avx_unaligned_erms +5.05% +(5.05%) +857257× + + + +0x0000000004898620->__memcpy_avx_unaligned_erms + + +1.58% +24897× + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend + +s4 +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend +0.62% +(0.25%) +5074× + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + +s4 +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle +7.63% +(0.53%) +51547× + + + +<alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +0.37% +752× + + + +alloc::raw_vec::finish_grow + +s4 +alloc::raw_vec::finish_grow +18.74% +(1.54%) +202156× + + + +alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle->alloc::raw_vec::finish_grow + + +7.10% +51547× + + + +<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop + +s4 +<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop +1.80% +(0.37%) +9112× + + + +__rust_dealloc + +s4 +__rust_dealloc +14.06% +(0.11%) +385984× + + + +<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop->__rust_dealloc + + +1.28% +34693× + + + +__rdl_dealloc + +s4 +__rdl_dealloc +13.95% +(0.11%) +385984× + + + +__rust_dealloc->__rdl_dealloc + + +13.95% +385984× + + + +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold + +s4 +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold +0.50% +(0.00%) +85× + + + +__rust_alloc + +s4 +__rust_alloc +20.04% +(0.12%) +402402× + + + +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold->__rust_alloc + + +0.50% +81× + + + +__rdl_alloc + +s4 +__rdl_alloc +19.92% +(1.05%) +402402× + + + +__rust_alloc->__rdl_alloc + + +19.92% +402402× + + + +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next + +s4 +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next +24.13% +(0.01%) +350× + + + +regex_automata::nfa::thompson::compiler::Compiler::c_cap + +s4 +regex_automata::nfa::thompson::compiler::Compiler::c_cap +24.11% +(0.00%) +175× + + + +<core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next->regex_automata::nfa::thompson::compiler::Compiler::c_cap + + +24.11% +175× + + + +regex_automata::nfa::thompson::compiler::Compiler::c + +s4 +regex_automata::nfa::thompson::compiler::Compiler::c +24.09% +(0.04%) +285× + + + +regex_automata::nfa::thompson::compiler::Compiler::c_cap->regex_automata::nfa::thompson::compiler::Compiler::c + + +24.09% +175× + + + +<regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache + +s4 +<regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache +2.32% +(0.00%) +42× + + + +regex_automata::hybrid::dfa::Cache::new + +s4 +regex_automata::hybrid::dfa::Cache::new +0.78% +(0.00%) +117× + + + +<regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache->regex_automata::hybrid::dfa::Cache::new + + +0.57% +84× + + + +regex_automata::nfa::thompson::pikevm::Cache::new + +s4 +regex_automata::nfa::thompson::pikevm::Cache::new +2.09% +(0.00%) +53× + + + +<regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache->regex_automata::nfa::thompson::pikevm::Cache::new + + +1.74% +42× + + + +regex_automata::hybrid::dfa::Lazy::init_cache + +s4 +regex_automata::hybrid::dfa::Lazy::init_cache +0.66% +(0.33%) +117× + + + +regex_automata::hybrid::dfa::Cache::new->regex_automata::hybrid::dfa::Lazy::init_cache + + +0.66% +117× + + + +regex_automata::nfa::thompson::pikevm::ActiveStates::reset + +s4 +regex_automata::nfa::thompson::pikevm::ActiveStates::reset +2.09% +(0.01%) +106× + + + +regex_automata::nfa::thompson::pikevm::Cache::new->regex_automata::nfa::thompson::pikevm::ActiveStates::reset + + +2.09% +106× + + + +<regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache + +s4 +<regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache +0.56% +(0.00%) +11× + + + +<regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache->regex_automata::hybrid::dfa::Cache::new + + +0.21% +33× + + + +<regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache->regex_automata::nfa::thompson::pikevm::Cache::new + + +0.35% +11× + + + +<regex_syntax::ast::Ast as core::ops::drop::Drop>::drop + +s4 +<regex_syntax::ast::Ast as core::ops::drop::Drop>::drop +7.62% +(0.62%) +774× + + + +<regex_syntax::ast::Ast as core::ops::drop::Drop>::drop->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +0.58% +270× + + + +core::ptr::drop_in_place<regex_syntax::ast::Ast>'2 + +s4 +core::ptr::drop_in_place<regex_syntax::ast::Ast>'2 +6.37% +(0.55%) +73834× + + + +<regex_syntax::ast::Ast as core::ops::drop::Drop>::drop->core::ptr::drop_in_place<regex_syntax::ast::Ast>'2 + + +6.37% +71256× + + + +core::ptr::drop_in_place<regex_syntax::ast::Ast>'2->__rust_dealloc + + +3.53% +93316× + + + +core::ptr::drop_in_place<regex_syntax::ast::Ast>'2->core::ptr::drop_in_place<regex_syntax::ast::Ast>'2 + + +2578× + + + +core::ptr::drop_in_place<regex_syntax::ast::ClassSet> + +s4 +core::ptr::drop_in_place<regex_syntax::ast::ClassSet> +1.91% +(0.03%) +5577× + + + +core::ptr::drop_in_place<regex_syntax::ast::Ast>'2->core::ptr::drop_in_place<regex_syntax::ast::ClassSet> + + +1.86% +2753× + + + +<regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop + +s4 +<regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop +1.86% +(0.09%) +5577× + + + +<regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +1.60% +525× + + + +<regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre + +s4 +<regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre +0.56% +(0.56%) +71256× + + + +<regex_syntax::hir::Hir as core::ops::drop::Drop>::drop + +s4 +<regex_syntax::hir::Hir as core::ops::drop::Drop>::drop +4.05% +(0.62%) +39180× + + + +<regex_syntax::hir::Hir as core::ops::drop::Drop>::drop-><alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend + + +0.43% +2604× + + + +<regex_syntax::hir::Hir as core::ops::drop::Drop>::drop->__rust_dealloc + + +1.18% +27622× + + + +core::ptr::drop_in_place<regex_syntax::hir::HirKind> + +s4 +core::ptr::drop_in_place<regex_syntax::hir::HirKind> +1.83% +(0.51%) +66469× + + + +<regex_syntax::hir::Hir as core::ops::drop::Drop>::drop->core::ptr::drop_in_place<regex_syntax::hir::HirKind> + + +1.57% +27518× + + + +core::ptr::drop_in_place<regex_syntax::hir::HirKind>->__rust_dealloc + + +1.13% +30715× + + + +core::ptr::drop_in_place<regex_syntax::hir::HirKind>-><regex_syntax::hir::Hir as core::ops::drop::Drop>::drop + + +0.15% + + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post + +s4 +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post +17.36% +(3.15%) +71256× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->__memcpy_avx_unaligned_erms + + +0.22% +48360× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +1.05% +15399× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->__rust_alloc + + +0.87% +36032× + + + +__rust_realloc + +s4 +__rust_realloc +10.01% +(0.02%) +60654× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->__rust_realloc + + +0.74% +14913× + + + +alloc::raw_vec::RawVec<T,A>::reserve_for_push + +s4 +alloc::raw_vec::RawVec<T,A>::reserve_for_push +13.18% +(1.55%) +150607× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.99% +18030× + + + +core::str::converts::from_utf8 + +s4 +core::str::converts::from_utf8 +0.55% +(0.55%) +34897× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->core::str::converts::from_utf8 + + +0.26% +16096× + + + +regex_syntax::hir::Hir::alternation + +s4 +regex_syntax::hir::Hir::alternation +1.97% +(0.34%) +579× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->regex_syntax::hir::Hir::alternation + + +1.76% +512× + + + +regex_syntax::hir::Hir::class + +s4 +regex_syntax::hir::Hir::class +0.61% +(0.06%) +3879× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->regex_syntax::hir::Hir::class + + +0.61% +3878× + + + +regex_syntax::hir::Hir::concat + +s4 +regex_syntax::hir::Hir::concat +7.12% +(1.20%) +15943× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post->regex_syntax::hir::Hir::concat + + +6.99% +15786× + + + +__rdl_realloc + +s4 +__rdl_realloc +9.99% +(0.35%) +60654× + + + +__rust_realloc->__rdl_realloc + + +9.99% +60654× + + + +alloc::raw_vec::RawVec<T,A>::reserve_for_push->alloc::raw_vec::finish_grow + + +11.64% +150607× + + + +regex_syntax::hir::Hir::alternation->__rust_dealloc + + +0.55% +18936× + + + +regex_syntax::hir::Hir::alternation->__rust_alloc + + +0.35% +18867× + + + +regex_syntax::hir::Hir::alternation-><regex_syntax::hir::Hir as core::ops::drop::Drop>::drop + + +0.13% +18288× + + + +regex_syntax::hir::Hir::alternation->core::ptr::drop_in_place<regex_syntax::hir::HirKind> + + +0.12% +18288× + + + +regex_syntax::hir::Hir::concat->__rust_dealloc + + +2.35% +81305× + + + +regex_syntax::hir::Hir::concat->__rust_alloc + + +1.82% +38101× + + + +regex_syntax::hir::Hir::concat-><regex_syntax::hir::Hir as core::ops::drop::Drop>::drop + + +0.15% +20618× + + + +regex_syntax::hir::Hir::concat->core::ptr::drop_in_place<regex_syntax::hir::HirKind> + + +0.14% +20618× + + + +regex_syntax::hir::Hir::concat->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.69% +16418× + + + +regex_syntax::hir::Hir::literal + +s4 +regex_syntax::hir::Hir::literal +0.69% +(0.21%) +15406× + + + +regex_syntax::hir::Hir::concat->regex_syntax::hir::Hir::literal + + +0.69% +15406× + + + +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre + +s4 +<regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre +0.72% +(0.59%) +71256× + + + +__memset_avx2_unaligned_erms + +libc.so.6 +__memset_avx2_unaligned_erms +1.90% +(1.90%) +3745× + + + +malloc + +libc.so.6 +malloc +18.86% +(6.48%) +402291× + + + +__rdl_alloc->malloc + + +18.86% +402281× + + + +_int_malloc + +libc.so.6 +_int_malloc +16.98% +(13.08%) +217950× + + + +malloc->_int_malloc + + +12.38% +191630× + + + +free + +libc.so.6 +free +13.84% +(3.67%) +386005× + + + +__rdl_dealloc->free + + +13.84% +385984× + + + +_int_free + +libc.so.6 +_int_free +10.90% +(10.04%) +414645× + + + +free->_int_free + + +10.16% +386002× + + + +realloc + +libc.so.6 +realloc +9.64% +(1.72%) +60661× + + + +__rdl_realloc->realloc + + +9.64% +60654× + + + +_int_realloc + +libc.so.6 +_int_realloc +7.92% +(1.05%) +60655× + + + +realloc->_int_realloc + + +7.92% +60655× + + + +malloc_consolidate + +libc.so.6 +malloc_consolidate +4.24% +(3.29%) +2786× + + + +_int_free->malloc_consolidate + + +0.80% +200× + + + +unlink_chunk.constprop.0 + +libc.so.6 +unlink_chunk.constprop.0 +1.48% +(1.48%) +221386× + + + +malloc_consolidate->unlink_chunk.constprop.0 + + +0.95% +145168× + + + +_int_malloc->malloc_consolidate + + +3.44% +2586× + + + +_int_malloc->unlink_chunk.constprop.0 + + +0.46% +65537× + + + +_int_realloc->0x0000000004898620 + + +1.59% +24838× + + + +_int_realloc->_int_free + + +0.72% +28103× + + + +_int_realloc->_int_malloc + + +4.53% +24869× + + + +aho_corasick::ahocorasick::AhoCorasickBuilder::build + +s4 +aho_corasick::ahocorasick::AhoCorasickBuilder::build +1.09% +(0.00%) + + + + +aho_corasick::dfa::Builder::build_from_noncontiguous + +s4 +aho_corasick::dfa::Builder::build_from_noncontiguous +3.25% +(0.37%) +48× + + + +aho_corasick::ahocorasick::AhoCorasickBuilder::build->aho_corasick::dfa::Builder::build_from_noncontiguous + + +0.54% + + + + +aho_corasick::nfa::noncontiguous::Builder::build + +s4 +aho_corasick::nfa::noncontiguous::Builder::build +2.72% +(0.48%) +48× + + + +aho_corasick::ahocorasick::AhoCorasickBuilder::build->aho_corasick::nfa::noncontiguous::Builder::build + + +0.54% + + + + +aho_corasick::dfa::Builder::build_from_noncontiguous->__memset_avx2_unaligned_erms + + +0.16% +66× + + + +aho_corasick::dfa::Builder::finish_build_one_start + +s4 +aho_corasick::dfa::Builder::finish_build_one_start +2.54% +(1.61%) +39× + + + +aho_corasick::dfa::Builder::build_from_noncontiguous->aho_corasick::dfa::Builder::finish_build_one_start + + +2.54% +39× + + + +aho_corasick::nfa::noncontiguous::Compiler::shuffle + +s4 +aho_corasick::nfa::noncontiguous::Compiler::shuffle +0.54% +(0.02%) +48× + + + +aho_corasick::nfa::noncontiguous::Builder::build->aho_corasick::nfa::noncontiguous::Compiler::shuffle + + +0.54% +48× + + + +aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} + +s4 +aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} +0.86% +(0.86%) +93597× + + + +aho_corasick::dfa::Builder::finish_build_one_start->aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} + + +0.86% +93597× + + + +aho_corasick::util::remapper::Remapper::remap + +s4 +aho_corasick::util::remapper::Remapper::remap +0.50% +(0.07%) +48× + + + +aho_corasick::nfa::noncontiguous::Compiler::shuffle->aho_corasick::util::remapper::Remapper::remap + + +0.50% +48× + + + +aho_corasick::packed::api::Builder::build + +s4 +aho_corasick::packed::api::Builder::build +0.59% +(0.00%) +96× + + + +alloc::raw_vec::finish_grow->__rust_alloc + + +8.02% +158080× + + + +alloc::raw_vec::finish_grow->__rust_realloc + + +9.17% +44076× + + + +alloc::vec::Vec<T,A>::extend_with + +s4 +alloc::vec::Vec<T,A>::extend_with +4.84% +(2.32%) +67× + + + +alloc::vec::Vec<T,A>::extend_with->__memcpy_avx_unaligned_erms + + +2.52% +669933× + + + +alloc::vec::Vec<T,A>::retain_mut + +s4 +alloc::vec::Vec<T,A>::retain_mut +2.57% +(0.07%) +177× + + + +regex_syntax::hir::literal::PreferenceTrie::insert + +s4 +regex_syntax::hir::literal::PreferenceTrie::insert +2.41% +(1.14%) +16878× + + + +alloc::vec::Vec<T,A>::retain_mut->regex_syntax::hir::literal::PreferenceTrie::insert + + +2.41% +16878× + + + +regex_syntax::hir::literal::PreferenceTrie::insert->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +0.82% +8722× + + + +regex_syntax::hir::literal::PreferenceTrie::insert->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.44% +2014× + + + +core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> + +s4 +core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> +3.35% +(1.18%) +674× + + + +core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler>-><alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop + + +1.60% +674× + + + +core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler>->__rust_dealloc + + +0.54% +2139× + + + +core::ptr::drop_in_place<regex_syntax::ast::Ast> + +s4 +core::ptr::drop_in_place<regex_syntax::ast::Ast> +7.65% +(0.01%) +774× + + + +core::ptr::drop_in_place<regex_syntax::ast::Ast>-><regex_syntax::ast::Ast as core::ops::drop::Drop>::drop + + +7.62% +774× + + + +core::ptr::drop_in_place<regex_syntax::ast::ClassSet>-><regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop + + +1.86% +5577× + + + +core::ptr::drop_in_place<regex_syntax::hir::Hir> + +s4 +core::ptr::drop_in_place<regex_syntax::hir::Hir> +3.39% +(0.00%) +224× + + + +core::ptr::drop_in_place<regex_syntax::hir::Hir>-><regex_syntax::hir::Hir as core::ops::drop::Drop>::drop + + +3.37% +224× + + + +std::rt::lang_start::{{closure}} + +s4 +std::rt::lang_start::{{closure}} +99.83% +(0.00%) + + + + +std::rt::lang_start_internal->std::rt::lang_start::{{closure}} + + +99.83% + + + + +once_cell::imp::OnceCell<T>::initialize + +s4 +once_cell::imp::OnceCell<T>::initialize +96.05% +(0.00%) +86× + + + +once_cell::imp::initialize_or_wait + +s4 +once_cell::imp::initialize_or_wait +96.05% +(0.00%) +86× + + + +once_cell::imp::OnceCell<T>::initialize->once_cell::imp::initialize_or_wait + + +96.05% +86× + + + +once_cell::imp::OnceCell<T>::initialize::{{closure}} + +s4 +once_cell::imp::OnceCell<T>::initialize::{{closure}} +96.05% +(0.00%) +86× + + + +once_cell::imp::initialize_or_wait->once_cell::imp::OnceCell<T>::initialize::{{closure}} + + +96.05% +86× + + + +regex::regex::bytes::Regex::new + +s4 +regex::regex::bytes::Regex::new +96.04% +(0.00%) +80× + + + +once_cell::imp::OnceCell<T>::initialize::{{closure}}->regex::regex::bytes::Regex::new + + +96.04% +80× + + + +regex::regex::bytes::Regex::new-><core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold + + +0.50% +80× + + + +regex::builders::Builder::build_one_bytes + +s4 +regex::builders::Builder::build_one_bytes +95.53% +(0.00%) +80× + + + +regex::regex::bytes::Regex::new->regex::builders::Builder::build_one_bytes + + +95.53% +80× + + + +regex_automata::meta::regex::Builder::build + +s4 +regex_automata::meta::regex::Builder::build +96.00% +(0.01%) +81× + + + +regex::builders::Builder::build_one_bytes->regex_automata::meta::regex::Builder::build + + +95.49% +80× + + + +regex_automata::meta::regex::Builder::build->core::ptr::drop_in_place<regex_syntax::ast::Ast> + + +7.62% +81× + + + +regex_automata::meta::regex::Builder::build->core::ptr::drop_in_place<regex_syntax::hir::Hir> + + +3.31% +81× + + + +regex_automata::meta::strategy::new + +s4 +regex_automata::meta::strategy::new +47.98% +(0.05%) +81× + + + +regex_automata::meta::regex::Builder::build->regex_automata::meta::strategy::new + + +47.98% +81× + + + +regex_syntax::ast::parse::Parser::parse + +s4 +regex_syntax::ast::parse::Parser::parse +17.10% +(0.00%) +81× + + + +regex_automata::meta::regex::Builder::build->regex_syntax::ast::parse::Parser::parse + + +17.10% +81× + + + +regex_syntax::hir::translate::Translator::translate + +s4 +regex_syntax::hir::translate::Translator::translate +19.85% +(0.00%) +81× + + + +regex_automata::meta::regex::Builder::build->regex_syntax::hir::translate::Translator::translate + + +19.85% +81× + + + +regex::builders::Builder::build_one_string + +s4 +regex::builders::Builder::build_one_string +0.51% +(0.00%) + + + + +regex::builders::Builder::build_one_string->regex_automata::meta::regex::Builder::build + + +0.51% + + + + +regex::regex::string::Regex::new + +s4 +regex::regex::string::Regex::new +0.51% +(0.00%) + + + + +regex::regex::string::Regex::new->regex::builders::Builder::build_one_string + + +0.51% + + + + +regex_automata::dfa::onepass::Builder::build_from_nfa + +s4 +regex_automata::dfa::onepass::Builder::build_from_nfa +0.71% +(0.04%) +81× + + + +regex_automata::meta::strategy::new->__rust_alloc + + +0.27% +81× + + + +regex_automata::meta::strategy::new->core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> + + +3.32% +175× + + + +regex_automata::meta::reverse_inner::extract + +s4 +regex_automata::meta::reverse_inner::extract +9.68% +(0.00%) +13× + + + +regex_automata::meta::strategy::new->regex_automata::meta::reverse_inner::extract + + +9.68% +13× + + + +regex_automata::util::prefilter::Choice::new + +s4 +regex_automata::util::prefilter::Choice::new +6.84% +(0.00%) +50× + + + +regex_automata::meta::strategy::new->regex_automata::util::prefilter::Choice::new + + +0.85% +15× + + + +regex_automata::meta::wrappers::OnePass::new + +s4 +regex_automata::meta::wrappers::OnePass::new +0.72% +(0.00%) +81× + + + +regex_automata::meta::strategy::new->regex_automata::meta::wrappers::OnePass::new + + +0.72% +81× + + + +regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir + +s4 +regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir +29.72% +(0.01%) +175× + + + +regex_automata::meta::strategy::new->regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir + + +29.72% +175× + + + +regex_automata::util::prefilter::prefixes + +s4 +regex_automata::util::prefilter::prefixes +2.19% +(0.01%) +16× + + + +regex_automata::meta::strategy::new->regex_automata::util::prefilter::prefixes + + +2.19% +16× + + + +regex_automata::util::prefilter::suffixes + +s4 +regex_automata::util::prefilter::suffixes +0.71% +(0.00%) +13× + + + +regex_automata::meta::strategy::new->regex_automata::util::prefilter::suffixes + + +0.71% +13× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments + +s4 +regex_syntax::ast::parse::ParserI<P>::parse_with_comments +17.10% +(2.03%) +81× + + + +regex_syntax::ast::parse::Parser::parse->regex_syntax::ast::parse::ParserI<P>::parse_with_comments + + +17.10% +81× + + + +regex_syntax::ast::visitor::visit + +s4 +regex_syntax::ast::visitor::visit +21.53% +(2.33%) +162× + + + +regex_syntax::hir::translate::Translator::translate->regex_syntax::ast::visitor::visit + + +19.85% +81× + + + +regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} + +s4 +regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} +2.88% +(0.00%) +53× + + + +regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}}-><regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache + + +2.32% +42× + + + +regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}}-><regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache + + +0.56% +11× + + + +regex_automata::meta::reverse_inner::extract-><regex_syntax::hir::Hir as core::ops::drop::Drop>::drop + + +0.25% +13× + + + +regex_automata::meta::reverse_inner::flatten + +s4 +regex_automata::meta::reverse_inner::flatten +0.72% +(0.01%) +193× + + + +regex_automata::meta::reverse_inner::extract->regex_automata::meta::reverse_inner::flatten + + +0.72% +193× + + + +regex_automata::meta::reverse_inner::prefilter + +s4 +regex_automata::meta::reverse_inner::prefilter +8.54% +(0.01%) +44× + + + +regex_automata::meta::reverse_inner::extract->regex_automata::meta::reverse_inner::prefilter + + +8.54% +44× + + + +regex_automata::meta::reverse_inner::flatten->regex_syntax::hir::Hir::alternation + + +0.16% +55× + + + +regex_automata::meta::reverse_inner::prefilter->regex_automata::util::prefilter::Choice::new + + +5.99% +35× + + + +regex_syntax::hir::literal::Extractor::extract + +s4 +regex_syntax::hir::literal::Extractor::extract +2.38% +(0.02%) +73× + + + +regex_automata::meta::reverse_inner::prefilter->regex_syntax::hir::literal::Extractor::extract + + +0.96% +44× + + + +regex_syntax::hir::literal::Seq::optimize_by_preference + +s4 +regex_syntax::hir::literal::Seq::optimize_by_preference +2.94% +(0.04%) +73× + + + +regex_automata::meta::reverse_inner::prefilter->regex_syntax::hir::literal::Seq::optimize_by_preference + + +1.53% +44× + + + +regex_automata::util::prefilter::aho_corasick::AhoCorasick::new + +s4 +regex_automata::util::prefilter::aho_corasick::AhoCorasick::new +1.09% +(0.00%) + + + + +regex_automata::util::prefilter::Choice::new->regex_automata::util::prefilter::aho_corasick::AhoCorasick::new + + +1.09% + + + + +regex_automata::util::prefilter::teddy::Teddy::new + +s4 +regex_automata::util::prefilter::teddy::Teddy::new +5.75% +(0.01%) +48× + + + +regex_automata::util::prefilter::Choice::new->regex_automata::util::prefilter::teddy::Teddy::new + + +5.75% +48× + + + +regex_syntax::hir::literal::Extractor::cross + +s4 +regex_syntax::hir::literal::Extractor::cross +0.95% +(0.21%) +482× + + + +regex_syntax::hir::literal::Extractor::extract->regex_syntax::hir::literal::Extractor::cross + + +0.54% +111× + + + +regex_syntax::hir::literal::Extractor::extract'2 + +s4 +regex_syntax::hir::literal::Extractor::extract'2 +1.49% +(0.09%) +2919× + + + +regex_syntax::hir::literal::Extractor::extract->regex_syntax::hir::literal::Extractor::extract'2 + + +1.49% +975× + + + +regex_syntax::hir::literal::Extractor::union + +s4 +regex_syntax::hir::literal::Extractor::union +1.01% +(0.52%) +2447× + + + +regex_syntax::hir::literal::Extractor::extract->regex_syntax::hir::literal::Extractor::union + + +0.30% +864× + + + +regex_syntax::hir::literal::PreferenceTrie::minimize + +s4 +regex_syntax::hir::literal::PreferenceTrie::minimize +2.90% +(0.05%) +177× + + + +regex_syntax::hir::literal::Seq::optimize_by_preference->regex_syntax::hir::literal::PreferenceTrie::minimize + + +2.90% +177× + + + +regex_automata::meta::wrappers::OnePass::new->regex_automata::dfa::onepass::Builder::build_from_nfa + + +0.71% +81× + + + +regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir-><core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next + + +24.13% +350× + + + +regex_automata::nfa::thompson::builder::Builder::build + +s4 +regex_automata::nfa::thompson::builder::Builder::build +5.53% +(1.10%) +175× + + + +regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir->regex_automata::nfa::thompson::builder::Builder::build + + +5.53% +175× + + + +regex_automata::util::prefilter::prefixes->regex_syntax::hir::literal::Extractor::extract + + +0.71% +16× + + + +regex_automata::util::prefilter::prefixes->regex_syntax::hir::literal::Seq::optimize_by_preference + + +1.42% +16× + + + +regex_automata::util::prefilter::suffixes->regex_syntax::hir::literal::Extractor::extract + + +0.71% +13× + + + +regex_automata::nfa::thompson::builder::Builder::add + +s4 +regex_automata::nfa::thompson::builder::Builder::add +2.12% +(1.21%) +89172× + + + +regex_automata::nfa::thompson::builder::Builder::add->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.91% +1376× + + + +regex_automata::nfa::thompson::builder::Builder::build->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +0.12% +175× + + + +regex_automata::nfa::thompson::builder::Builder::build->__rust_alloc + + +0.83% +12199× + + + +regex_automata::nfa::thompson::builder::Builder::build->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.16% +1033× + + + +regex_automata::nfa::thompson::nfa::Inner::add + +s4 +regex_automata::nfa::thompson::nfa::Inner::add +2.07% +(1.68%) +64329× + + + +regex_automata::nfa::thompson::builder::Builder::build->regex_automata::nfa::thompson::nfa::Inner::add + + +2.07% +64329× + + + +regex_automata::nfa::thompson::nfa::Inner::add->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.39% +1275× + + + +regex_automata::nfa::thompson::builder::Builder::patch + +s4 +regex_automata::nfa::thompson::builder::Builder::patch +1.17% +(0.69%) +59946× + + + +regex_automata::nfa::thompson::builder::Builder::patch->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.48% +5350× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2 + +s4 +regex_automata::nfa::thompson::compiler::Compiler::c'2 +23.58% +(1.62%) +24591× + + + +regex_automata::nfa::thompson::compiler::Compiler::c->regex_automata::nfa::thompson::compiler::Compiler::c'2 + + +23.55% +2840× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->__rust_dealloc + + +1.75% +44977× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->regex_automata::nfa::thompson::builder::Builder::add + + +1.15% +49798× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->regex_automata::nfa::thompson::builder::Builder::patch + + +0.76% +39677× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->regex_automata::nfa::thompson::compiler::Compiler::c'2 + + +12493× + + + +regex_automata::nfa::thompson::compiler::Utf8Compiler::new + +s4 +regex_automata::nfa::thompson::compiler::Utf8Compiler::new +5.10% +(0.00%) +126× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->regex_automata::nfa::thompson::compiler::Utf8Compiler::new + + +5.10% +126× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + +s4 +regex_automata::nfa::thompson::literal_trie::LiteralTrie::add +6.82% +(2.07%) +26711× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + +6.82% +26711× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + +s4 +regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile +4.90% +(1.18%) +495× + + + +regex_automata::nfa::thompson::compiler::Compiler::c'2->regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + +4.90% +495× + + + +regex_automata::nfa::thompson::map::Utf8BoundedMap::clear + +s4 +regex_automata::nfa::thompson::map::Utf8BoundedMap::clear +5.09% +(0.00%) +126× + + + +regex_automata::nfa::thompson::compiler::Utf8Compiler::new->regex_automata::nfa::thompson::map::Utf8BoundedMap::clear + + +5.09% +126× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::add->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +1.67% +19750× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::add->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +3.07% +29149× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile->__rust_dealloc + + +0.31% +10884× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +2.62% +37448× + + + +regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile->regex_automata::nfa::thompson::builder::Builder::add + + +0.79% +34476× + + + +regex_automata::nfa::thompson::map::Utf8BoundedMap::clear->__rust_alloc + + +0.25% +67× + + + +regex_automata::nfa::thompson::map::Utf8BoundedMap::clear->alloc::vec::Vec<T,A>::extend_with + + +4.84% +67× + + + +regex_automata::nfa::thompson::pikevm::ActiveStates::reset->alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle + + +0.72% +318× + + + +regex_automata::nfa::thompson::pikevm::ActiveStates::reset->__memset_avx2_unaligned_erms + + +1.36% +318× + + + +regex_automata::util::pool::inner::Pool<T,F>::get_slow + +s4 +regex_automata::util::pool::inner::Pool<T,F>::get_slow +2.88% +(0.00%) +53× + + + +regex_automata::util::pool::inner::Pool<T,F>::get_slow->regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} + + +2.88% +53× + + + +regex_automata::util::prefilter::aho_corasick::AhoCorasick::new->aho_corasick::ahocorasick::AhoCorasickBuilder::build + + +1.09% + + + + +regex_automata::util::prefilter::teddy::Teddy::new->aho_corasick::dfa::Builder::build_from_noncontiguous + + +2.71% +39× + + + +regex_automata::util::prefilter::teddy::Teddy::new->aho_corasick::nfa::noncontiguous::Builder::build + + +2.18% +39× + + + +regex_automata::util::prefilter::teddy::Teddy::new->aho_corasick::packed::api::Builder::build + + +0.59% +48× + + + +regex_syntax::ast::Concat::into_ast + +s4 +regex_syntax::ast::Concat::into_ast +1.11% +(0.15%) +16703× + + + +regex_syntax::ast::Concat::into_ast->__rust_alloc + + +0.94% +15786× + + + +regex_syntax::ast::parse::NestLimiter<P>::check + +s4 +regex_syntax::ast::parse::NestLimiter<P>::check +1.68% +(0.00%) +81× + + + +regex_syntax::ast::parse::NestLimiter<P>::check->regex_syntax::ast::visitor::visit + + +1.68% +81× + + + +regex_syntax::ast::visitor::visit-><regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre + + +0.56% +71256× + + + +regex_syntax::ast::visitor::visit-><regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post + + +17.36% +71256× + + + +regex_syntax::ast::visitor::visit-><regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre + + +0.72% +71256× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->__rust_alloc + + +3.29% +52360× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +1.57% +18495× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->regex_syntax::ast::parse::NestLimiter<P>::check + + +1.68% +81× + + + +regex_syntax::ast::parse::ParserI<P>::bump + +s4 +regex_syntax::ast::parse::ParserI<P>::bump +2.38% +(1.31%) +92423× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->regex_syntax::ast::parse::ParserI<P>::bump + + +1.28% +49607× + + + +regex_syntax::ast::parse::ParserI<P>::char + +s4 +regex_syntax::ast::parse::ParserI<P>::char +2.84% +(2.84%) +490624× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->regex_syntax::ast::parse::ParserI<P>::char + + +1.27% +220401× + + + +regex_syntax::ast::parse::ParserI<P>::parse_set_class + +s4 +regex_syntax::ast::parse::ParserI<P>::parse_set_class +2.38% +(0.24%) +2753× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->regex_syntax::ast::parse::ParserI<P>::parse_set_class + + +2.38% +2753× + + + +regex_syntax::ast::parse::ParserI<P>::push_alternate + +s4 +regex_syntax::ast::parse::ParserI<P>::push_alternate +2.20% +(0.37%) +15929× + + + +regex_syntax::ast::parse::ParserI<P>::parse_with_comments->regex_syntax::ast::parse::ParserI<P>::push_alternate + + +2.20% +15929× + + + +regex_syntax::ast::parse::ParserI<P>::bump->regex_syntax::ast::parse::ParserI<P>::char + + +1.07% +184846× + + + +regex_syntax::ast::parse::ParserI<P>::parse_set_class->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.13% +2914× + + + +regex_syntax::ast::parse::ParserI<P>::pop_class + +s4 +regex_syntax::ast::parse::ParserI<P>::pop_class +0.60% +(0.09%) +2824× + + + +regex_syntax::ast::parse::ParserI<P>::parse_set_class->regex_syntax::ast::parse::ParserI<P>::pop_class + + +0.60% +2824× + + + +regex_syntax::ast::parse::ParserI<P>::push_class_open + +s4 +regex_syntax::ast::parse::ParserI<P>::push_class_open +0.57% +(0.12%) +2824× + + + +regex_syntax::ast::parse::ParserI<P>::parse_set_class->regex_syntax::ast::parse::ParserI<P>::push_class_open + + +0.57% +2824× + + + +regex_syntax::ast::parse::ParserI<P>::pop_class->__memcpy_avx_unaligned_erms + + +0.12% +13666× + + + +regex_syntax::ast::parse::ParserI<P>::push_class_open->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.19% +81× + + + +regex_syntax::ast::parse::ParserI<P>::push_alternate->alloc::raw_vec::RawVec<T,A>::reserve_for_push + + +0.25% +1445× + + + +regex_syntax::ast::parse::ParserI<P>::push_alternate->regex_syntax::ast::Concat::into_ast + + +1.06% +15929× + + + +regex_syntax::ast::parse::ParserI<P>::push_alternate->regex_syntax::ast::parse::ParserI<P>::bump + + +0.41% +15929× + + + +regex_syntax::hir::Hir::literal->__rust_alloc + + +0.24% +15406× + + + +regex_syntax::hir::Hir::literal->core::str::converts::from_utf8 + + +0.25% +15406× + + + +regex_syntax::hir::literal::Extractor::cross->__rust_dealloc + + +0.20% +5904× + + + +regex_syntax::hir::literal::Extractor::cross->__rust_alloc + + +0.43% +7320× + + + +regex_syntax::hir::literal::Extractor::extract'2->__rust_alloc + + +0.16% +5194× + + + +regex_syntax::hir::literal::Extractor::extract'2->regex_syntax::hir::literal::Extractor::cross + + +0.41% +371× + + + +regex_syntax::hir::literal::Extractor::extract'2->regex_syntax::hir::literal::Extractor::extract'2 + + +1944× + + + +regex_syntax::hir::literal::Extractor::extract'2->regex_syntax::hir::literal::Extractor::union + + +0.71% +1583× + + + +regex_syntax::hir::literal::Extractor::union-><alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend + + +0.15% +2443× + + + +regex_syntax::hir::literal::PreferenceTrie::minimize->__rust_dealloc + + +0.28% +7022× + + + +regex_syntax::hir::literal::PreferenceTrie::minimize->alloc::vec::Vec<T,A>::retain_mut + + +2.57% +177× + + + +s4::REGEX_DUR_OFFSET::__getit + +s4 +s4::REGEX_DUR_OFFSET::__getit +0.51% +(0.00%) + + + + +std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize + +s4 +std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize +0.51% +(0.00%) + + + + +s4::REGEX_DUR_OFFSET::__getit->std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize + + +0.51% + + + + +std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize->regex::regex::string::Regex::new + + +0.51% + + + + +s4::exec_fileprocessor_thread + +s4 +s4::exec_fileprocessor_thread +99.19% +(0.00%) + + + + +s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis + +s4 +s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis +99.16% +(0.00%) + + + + +s4::exec_fileprocessor_thread->s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis + + +99.16% + + + + +s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year + +s4 +s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year +99.12% +(0.00%) + + + + +s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis->s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year + + +99.12% + + + + +s4::main + +s4 +s4::main +0.63% +(0.00%) + + + + +s4::string_wdhms_to_duration + +s4 +s4::string_wdhms_to_duration +0.54% +(0.00%) + + + + +s4::main->s4::string_wdhms_to_duration + + +0.54% + + + + +std::thread::local::LocalKey<T>::with + +s4 +std::thread::local::LocalKey<T>::with +0.54% +(0.00%) + + + + +s4::string_wdhms_to_duration->std::thread::local::LocalKey<T>::with + + +0.54% + + + + +std::thread::local::LocalKey<T>::with->s4::REGEX_DUR_OFFSET::__getit + + +0.51% + + + + +s4lib::data::datetime::bytes_to_regex_to_datetime + +s4 +s4lib::data::datetime::bytes_to_regex_to_datetime +99.10% +(0.00%) +84× + + + +s4lib::data::datetime::bytes_to_regex_to_datetime->once_cell::imp::OnceCell<T>::initialize + + +96.04% +80× + + + +s4lib::data::datetime::bytes_to_regex_to_datetime->regex_automata::util::pool::inner::Pool<T,F>::get_slow + + +2.84% +52× + + + +s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached + +s4 +s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached +99.13% +(0.00%) + + + + +s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year->s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached + + +99.12% + + + + +s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached->s4lib::data::datetime::bytes_to_regex_to_datetime + + +99.10% +84× + + + +std::sys_common::backtrace::__rust_begin_short_backtrace + +s4 +std::sys_common::backtrace::__rust_begin_short_backtrace +99.83% +(0.00%) + + + + +std::rt::lang_start::{{closure}}->std::sys_common::backtrace::__rust_begin_short_backtrace + + +99.83% + + + + +std::sys_common::backtrace::__rust_begin_short_backtrace->s4::exec_fileprocessor_thread + + +99.19% + + + + +std::sys_common::backtrace::__rust_begin_short_backtrace->s4::main + + +0.63% + + + + diff --git a/releases/0.7.75/callgrind.txt b/releases/0.7.75/callgrind.txt new file mode 100644 index 00000000..72f3feab --- /dev/null +++ b/releases/0.7.75/callgrind.txt @@ -0,0 +1,21947 @@ +Linux host 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux +d799548f HEAD -> main +super_speedy_syslog_searcher 0.7.75 +valgrind-3.23.0 + +-------------------------------------------------------------------------------- +Profile data file './callgrind.out' (creator: callgrind-3.23.0) +-------------------------------------------------------------------------------- +I1 cache: +D1 cache: +LL cache: +Timerange: Basic block 0 - 79425929 +Trigger: Program termination +Profiled target: ./target/valgrind/s4 -a 20000101T000000 -b 20000101T080000 ./logs/other/tests/gen-1000-3-foobar.log (PID 372403, part 1) +Events recorded: Ir Ge sysCount sysTime +Events shown: Ir Ge sysCount sysTime +Event sort order: Ir Ge sysCount sysTime +Thresholds: 99 0 0 0 +Include dirs: ./src/ + ./src/data/ + ./src/tests/ + ./src/libload/ + ./src/bindings/ + ./src/debug/ + ./src/bin/ + ./src/readers/ + ./src/printer/ +User annotated: +Auto-annotation: on + +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime +-------------------------------------------------------------------------------- +346,156,352 (100.0%) 809,752 (100.0%) 310 (100.0%) 1,386 (100.0%) PROGRAM TOTALS + +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime file:function +-------------------------------------------------------------------------------- + +42,846,430 (12.38%) 10,930 ( 1.35%) 65 (20.97%) 1 ( 0.07%) < ./malloc/./malloc/malloc.c:malloc (191,630x) [/usr/lib/x86_64-linux-gnu/libc.so.6] +15,690,130 ( 4.53%) 22,674 ( 2.80%) 71 (22.90%) . < ./malloc/./malloc/malloc.c:_int_realloc (24,869x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 216,507 ( 0.06%) 276 ( 0.03%) . . < ./malloc/./malloc/malloc.c:calloc (1,327x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 30,433 ( 0.01%) . . . < ./malloc/./malloc/malloc.c:_int_memalign (121x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 629 ( 0.00%) 0 2 ( 0.65%) . < ./malloc/./malloc/malloc.c:tcache_init.part.0 (3x) [/usr/lib/x86_64-linux-gnu/libc.so.6] +45,278,581 (13.08%) 8,016 ( 0.99%) . . * ./malloc/./malloc/malloc.c:_int_malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +11,896,840 ( 3.44%) 25,860 ( 3.19%) . . > ./malloc/./malloc/malloc.c:malloc_consolidate (2,586x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,591,722 ( 0.46%) . . . > ./malloc/./malloc/malloc.c:unlink_chunk.constprop.0 (65,537x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 16,986 ( 0.00%) 4 ( 0.00%) 138 (44.52%) 1 ( 0.07%) > ./malloc/./malloc/malloc.c:sysmalloc (137x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + +35,175,603 (10.16%) 260,875 (32.22%) . . < ./malloc/./malloc/malloc.c:free (386,002x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,489,708 ( 0.72%) 2,171 ( 0.27%) . . < ./malloc/./malloc/malloc.c:_int_realloc (28,103x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 40,155 ( 0.01%) 709 ( 0.09%) . . < ./malloc/./malloc/malloc.c:__malloc_arena_thread_freeres (375x) + 13,235 ( 0.00%) 90 ( 0.01%) . . < ./malloc/./malloc/malloc.c:_int_memalign (165x) [/usr/lib/x86_64-linux-gnu/libc.so.6] +34,762,302 (10.04%) 261,845 (32.34%) . . * ./malloc/./malloc/malloc.c:_int_free [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,771,705 ( 0.80%) 2,000 ( 0.25%) . . > ./malloc/./malloc/malloc.c:malloc_consolidate (200x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 178,744 ( 0.05%) . . . > ./malloc/./malloc/malloc.c:unlink_chunk.constprop.0 (7,147x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + +65,271,278 (18.86%) 392,878 (48.52%) 65 (20.97%) 1 ( 0.07%) < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_alloc (402,281x) + 3,714 ( 0.00%) 22 ( 0.00%) 7 ( 2.26%) . < ./malloc/./malloc/malloc.c:realloc (6x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,226 ( 0.00%) 2 ( 0.00%) 3 ( 0.97%) . < ???:0x0000000004898380 (4x) [???] +20,324,703 ( 5.87%) 381,956 (47.17%) . . * ./malloc/./malloc/malloc.c:malloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +42,846,430 (12.38%) 10,930 ( 1.35%) 65 (20.97%) 1 ( 0.07%) > ./malloc/./malloc/malloc.c:_int_malloc (191,630x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,960 ( 0.00%) 16 ( 0.00%) 9 ( 2.90%) . > ./malloc/./malloc/malloc.c:tcache_init.part.0 (3x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 8,709,129 ( 2.52%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::vec::Vec::extend_with (669,933x) + 5,456,176 ( 1.58%) . . . < ???:0x0000000004898620 (24,897x) [???] + 773,760 ( 0.22%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::visit_post (48,360x) + 264,180 ( 0.08%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::Hir::concat (15,408x) + 254,160 ( 0.07%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (8,472x) [./target/valgrind/s4] + 223,949 ( 0.06%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::literal::Extractor::cross (13,790x) + 169,440 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class_op (5,648x) [./target/valgrind/s4] + 165,480 ( 0.05%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop (5,516x) + 155,491 ( 0.04%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::builder::Builder::build (12,024x) + 106,470 ( 0.03%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (3,549x) + 84,870 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop (2,829x) [./target/valgrind/s4] + 84,720 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (2,824x) + 84,720 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class_op (2,824x) + 84,720 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) + 69,914 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::vec::from_elem (5,378x) + 68,970 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,299x) + 62,760 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/iterator.rs:::drop (2,092x) + 56,690 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (4,122x) + 49,086 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::Hybrid::new (486x) [./target/valgrind/s4] + 41,720 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::literal::Extractor::extract'2 (2,411x) + 38,848 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::literal::PreferenceTrie::insert (2,611x) + 35,549 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::meta::reverse_inner::flatten'2 (2,071x) + 29,938 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::write_str (1,871x) + 27,643 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs: as core::clone::Clone>::clone (1,589x) + 24,523 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:aho_corasick::packed::pattern::Patterns::add (1,394x) + 23,975 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Builder::build_from_nfa (525x) [./target/valgrind/s4] + 19,963 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (980x) + 18,407 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::clone (1,189x) + 16,604 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (1,318x) + 15,360 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_group (512x) + 14,005 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_automata::meta::regex::Builder::build (81x) + 11,375 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) [./target/valgrind/s4] + 11,361 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (175x) + 11,238 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex::builders::Builder::build_one_bytes (80x) + 11,234 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs: as core::iter::traits::iterator::Iterator>::fold (81x) + 10,742 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::visit_class_set_item_post (846x) + 10,408 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (758x) + 9,984 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (144x) [./target/valgrind/s4] + 9,097 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (586x) + 9,097 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::util::captures::GroupInfo::new (586x) + 8,544 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:aho_corasick::nfa::noncontiguous::Builder::build (96x) + 8,523 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/pool.rs:regex_automata::util::pool::inner::Pool::get_slow (53x) [./target/valgrind/s4] + 7,730 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::OnePass::new (162x) [./target/valgrind/s4] + 6,967 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::collections::btree::node::Handle,alloc::collections::btree::node::marker::Edge>::insert_recursing (531x) + 6,006 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::Choice::new (78x) [./target/valgrind/s4] + 6,006 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::util::prefilter::teddy::Teddy::new (78x) + 5,250 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/start.rs:regex_automata::hybrid::dfa::Builder::build_from_nfa (175x) + 5,250 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (175x) [./target/valgrind/s4] + 4,914 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::collections::btree::remove::,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (354x) + 4,578 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_builder-4.2.1/src/builder/arg.rs:::augment_args (72x) + 4,242 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:::create_cache (42x) + 3,796 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::util::determinize::state::State::dead (292x) + 3,696 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (48x) [./target/valgrind/s4] + 3,120 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/prefilter.rs:aho_corasick::nfa::noncontiguous::Compiler::new (48x) + 3,120 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::new (48x) [./target/valgrind/s4] + 2,999 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_automata::util::prefilter::Prefilter::from_choice (39x) + 2,695 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::meta::reverse_inner::prefilter (35x) + 2,470 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:regex_automata::meta::strategy::new (26x) [./target/valgrind/s4] + 2,445 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (57x) + 2,445 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (57x) + 2,430 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_automata::meta::regex::RegexInfo::new (81x) + 2,314 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::ReverseHybrid::new (26x) [./target/valgrind/s4] + 2,232 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (174x) + 2,144 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_builder-4.2.1/src/builder/command.rs:::augment_args (27x) + 2,130 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::ast::parse::ParserI

::pop_class (71x) + 1,892 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:aho_corasick::util::remapper::Remapper::remap (48x) + 1,826 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:::create_cache (22x) + 1,665 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:clap_builder::util::flat_map::FlatMap::remove_entry (30x) + 1,650 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (96x) + 1,646 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:>::from (40x) + 1,560 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::collections::btree::node::BalancingContext::merge_tracking_child_edge (120x) + 1,513 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:clap_builder::builder::command::Command::arg_internal (17x) + 1,386 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/ahocorasick.rs:aho_corasick::ahocorasick::AhoCorasickBuilder::build (18x) [./target/valgrind/s4] + 1,365 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (21x) + 1,363 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (21x) + 1,311 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_automata::meta::strategy::new (13x) + 1,304 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::meta::reverse_inner::extract (13x) + 1,278 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:aho_corasick::ahocorasick::AhoCorasickBuilder::build (18x) + 1,155 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::meta::strategy::new (15x) + 1,122 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:aho_corasick::packed::api::Builder::build (48x) + 1,122 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (48x) + 951 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::collections::vec_deque::VecDeque::grow (69x) + 865 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:core::slice::sort::merge_sort (15x) + 715 ( 0.00%) . . . < src/bin/s4.rs:s4::processing_loop (11x) [./target/valgrind/s4] + 693 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:aho_corasick::ahocorasick::AhoCorasickBuilder::build (9x) + 681 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::interval::IntervalSet::negate (61x) + 651 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::interval::IntervalSet::union (58x) + 586 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) + 557 ( 0.00%) . . . < src/bin/s4.rs:::augment_args (10x) [./target/valgrind/s4] + 551 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::augment_args (11x) + 447 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::write (33x) + 445 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:crossbeam_channel::channel::read (5x) + 445 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/crossbeam-channel-0.5.13/src/flavors/array.rs:crossbeam_channel::channel::read (5x) + 445 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:crossbeam_channel::select::SelectedOperation::recv (5x) + 443 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:crossbeam_channel::channel::Sender::send (5x) + 435 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:s4lib::data::datetime::bytes_to_regex_to_datetime (25x) + 418 ( 0.00%) . . . < src/readers/syslinereader.rs:s4lib::readers::syslinereader::SyslineReader::new (2x) [./target/valgrind/s4] + 396 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::meta::reverse_inner::flatten (34x) + 394 ( 0.00%) . . . < src/readers/linereader.rs:s4lib::readers::syslinereader::SyslineReader::new (2x) + 358 ( 0.00%) . . . < src/bin/s4.rs:s4::exec_fileprocessor_thread (2x) [./target/valgrind/s4] + 340 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::collections::btree::node::BalancingContext::bulk_steal_right (24x) + 337 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::sys::unix::os_str::Slice::to_owned (24x) + 332 ( 0.00%) . . . < src/readers/summary.rs:s4lib::readers::summary::Summary::new (6x) [./target/valgrind/s4] + 330 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:::create_cache (11x) [./target/valgrind/s4] + 269 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:s4lib::readers::syslogprocessor::SyslogProcessor::new (1x) + 269 ( 0.00%) . . . < src/readers/blockreader.rs:s4lib::readers::blockreader::BlockReader::new (7x) [./target/valgrind/s4] + 257 ( 0.00%) . . . < src/readers/syslogprocessor.rs:s4lib::readers::syslogprocessor::SyslogProcessor::new (1x) [./target/valgrind/s4] + 150 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::collections::btree::node::BalancingContext::merge_tracking_parent (12x) + 142 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/builder.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<4_usize>::new_unchecked (2x) [./target/valgrind/s4] + 119 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:hashbrown::raw::RawTable::insert (2x) + 118 ( 0.00%) . . . < src/readers/syslogprocessor.rs:s4lib::readers::syslogprocessor::SyslogProcessor::summary_complete (2x) [./target/valgrind/s4] + 113 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<4_usize>::new_unchecked (1x) + 111 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<4_usize>::new_unchecked (1x) + 101 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_builder-4.2.1/src/builder/command.rs:clap_builder::builder::command::Command::get_matches_from (1x) [./target/valgrind/s4] + 89 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::map::HashMap::insert (1x) [./target/valgrind/s4] + 85 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::env::args_os (6x) + 78 ( 0.00%) . . . < src/printer/printers.rs:s4lib::printer::printers::PrinterLogMessage::print_sysline_color (6x) [./target/valgrind/s4] + 75 ( 0.00%) . . . < src/data/datetime.rs:s4lib::data::datetime::bytes_to_regex_to_datetime (5x) [./target/valgrind/s4] + 72 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::env::_var_os (5x) + 65 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::dfa::remapper::Remapper::remap (1x) + 65 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (1x) [./target/valgrind/s4] + 60 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:s4::processing_loop (2x) + 60 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::lift_common_prefix (5x) + 60 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/fs.rs:std::sys::unix::fs::stat (2x) [./target/valgrind/s4] + 54 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:<&mut W as core::fmt::Write>::write_str (4x) + 34 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::sys::unix::fs::canonicalize (2x) + 34 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::sys::unix::fs::stat (2x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/fs.rs:std::sys::unix::fs::lstat (1x) [./target/valgrind/s4] + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex::builders::Builder::build_one_string (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:std::fs::File::metadata (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:chrono::offset::local::inner::Source::new (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::parse_ref (2x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/array/mod.rs:core::array::drain::drain_array_with (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:nix::sys::signal::sigaction (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/fs.rs:std::fs::File::metadata (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:core::ops::function::FnOnce::call_once (2x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:hashbrown::raw::RawTable::remove_entry (1x) + 30 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:s4::processing_loop (1x) + 28 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/thread.rs:std::sys::unix::thread::Thread::set_name (2x) [./target/valgrind/s4] + 26 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:s4::process_dt_exit (2x) + 26 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::vec::Vec::remove (2x) + 18 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:s4lib::readers::filepreprocessor::pathbuf_to_filetype_impl (1x) + 18 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:clap_builder::builder::command::Command::get_matches_from (1x) + 15 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:<&str as alloc::ffi::c_str::CString::new::SpecNewImpl>::spec_new_impl (1x) + 13 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::fs::read::inner (1x) + 13 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::sys::unix::fs::lstat (1x) + 12 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:std::fs::OpenOptions::_open (1x) + 11 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:s4lib::readers::helpers::basename (1x) +17,469,765 ( 5.05%) . . . * ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms [/usr/lib/x86_64-linux-gnu/libc.so.6] + +11,896,840 ( 3.44%) 25,860 ( 3.19%) . . < ./malloc/./malloc/malloc.c:_int_malloc (2,586x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 2,771,705 ( 0.80%) 2,000 ( 0.25%) . . < ./malloc/./malloc/malloc.c:_int_free (200x) [/usr/lib/x86_64-linux-gnu/libc.so.6] +11,396,501 ( 3.29%) 27,860 ( 3.44%) . . * ./malloc/./malloc/malloc.c:malloc_consolidate [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,272,044 ( 0.95%) . . . > ./malloc/./malloc/malloc.c:unlink_chunk.constprop.0 (145,168x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + +47,894,015 (13.84%) 260,870 (32.22%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_dealloc (385,984x) [./target/valgrind/s4] + 1,725 ( 0.00%) 5 ( 0.00%) . . < ???:0x0000000004898370 (19x) [???] + 142 ( 0.00%) 2 ( 0.00%) . . < ./malloc/./malloc/malloc.c:__malloc_arena_thread_freeres (1x) + 89 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/fs.rs:std::sys::unix::fs::canonicalize (1x) [./target/valgrind/s4] + 8,492,087 ( 2.45%) . . . * ./malloc/./malloc/malloc.c:free [/usr/lib/x86_64-linux-gnu/libc.so.6] +35,175,603 (10.16%) 260,875 (32.22%) . . > ./malloc/./malloc/malloc.c:_int_free (386,002x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 35 ( 0.00%) 2 ( 0.00%) 1 ( 0.32%) . > ./malloc/./malloc/malloc.c:munmap_chunk (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 4,720,239 ( 1.36%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::pikevm::ActiveStates::reset (318x) + 557,484 ( 0.16%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (66x) + 324,876 ( 0.09%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (350x) + 284,644 ( 0.08%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) + 273,096 ( 0.08%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (324x) + 241,969 ( 0.07%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::util::sparse_set::SparseSets::new (468x) + 77,658 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (1,066x) + 65,552 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:s4lib::readers::blockreader::BlockReader::read_block_File (1x) + 13,901 ( 0.00%) . . . < ???:0x0000000004898670 (227x) [???] + 6,300 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) + 4,164 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:hashbrown::raw::RawTable::reserve_rehash (347x) + 2,096 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::regex::Regex::create_captures (86x) + 1,728 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/prefilter.rs:aho_corasick::nfa::noncontiguous::Compiler::new (48x) + 1,013 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::create_cache (43x) + 279 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::create_cache (11x) + 199 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/backtrack.rs:regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (9x) [./target/valgrind/s4] + 108 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:hashbrown::raw::RawTable::with_capacity (9x) + 78 ( 0.00%) . . . < src/bin/s4.rs:s4::processing_loop (1x) [./target/valgrind/s4] + 72 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:s4::processing_loop (6x) + 48 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs: as core::ops::drop::Drop>::drop (4x) + 48 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:hashbrown::raw::RawTableInner::fallible_with_capacity (4x) + 48 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:hashbrown::raw::RawTable::with_capacity_in (4x) + 38 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::DFA::try_search_slots_imp (2x) [./target/valgrind/s4] + 26 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (1x) + 6,575,664 ( 1.90%) . . . * ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms [/usr/lib/x86_64-linux-gnu/libc.so.6] + +60,085,590 (17.36%) 148,728 (18.37%) 25 ( 8.06%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (71,256x) [./target/valgrind/s4] + 5,140,722 ( 1.49%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post [./target/valgrind/s4] +24,202,143 ( 6.99%) 51,330 ( 6.34%) 3 ( 0.97%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (15,786x) [./target/valgrind/s4] + 6,081,394 ( 1.76%) 2,345 ( 0.29%) 4 ( 1.29%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (512x) [./target/valgrind/s4] + 2,114,167 ( 0.61%) 9,515 ( 1.18%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::class (3,873x) [./target/valgrind/s4] + 1,012,881 ( 0.29%) 2,240 ( 0.28%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::try_case_fold_simple (1,120x) [./target/valgrind/s4] + 317,853 ( 0.09%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (35,317x) [./target/valgrind/s4] + 178,870 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:regex_syntax::unicode::SimpleCaseFolder::overlaps (1,120x) [./target/valgrind/s4] + 85,074 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::HirFrame::unwrap_expr (2,578x) [./target/valgrind/s4] + 65,950 ( 0.02%) 55 ( 0.01%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::clone (586x) [./target/valgrind/s4] + 32,480 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::new (1,120x) [./target/valgrind/s4] + 3,020 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (20x) [./target/valgrind/s4] + + 3,272,044 ( 0.95%) . . . < ./malloc/./malloc/malloc.c:malloc_consolidate (145,168x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,591,722 ( 0.46%) . . . < ./malloc/./malloc/malloc.c:_int_malloc (65,537x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 178,744 ( 0.05%) . . . < ./malloc/./malloc/malloc.c:_int_free (7,147x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 93,275 ( 0.03%) . . . < ./malloc/./malloc/malloc.c:_int_realloc (3,534x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 5,135,785 ( 1.48%) . . . * ./malloc/./malloc/malloc.c:unlink_chunk.constprop.0 [/usr/lib/x86_64-linux-gnu/libc.so.6] + +33,363,424 ( 9.64%) 145,789 (18.00%) 71 (22.90%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_realloc (60,654x) + 4,229 ( 0.00%) 22 ( 0.00%) 7 ( 2.26%) . < ???:0x00000000048983b0 (7x) [???] + 4,608,282 ( 1.33%) 120,944 (14.94%) . . * ./malloc/./malloc/malloc.c:realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +27,424,191 ( 7.92%) 24,845 ( 3.07%) 71 (22.90%) . > ./malloc/./malloc/malloc.c:_int_realloc (60,655x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,714 ( 0.00%) 22 ( 0.00%) 7 ( 2.26%) . > ./malloc/./malloc/malloc.c:malloc (6x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 4,228,246 ( 1.22%) . . . * ./malloc/./malloc/arena.c:free + +68,722,234 (19.85%) 151,909 (18.76%) 27 ( 8.71%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::Translator::translate (81x) [./target/valgrind/s4] + 5,820,400 ( 1.68%) 301 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::NestLimiter

::check (81x) [./target/valgrind/s4] + 4,162,523 ( 1.20%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit [./target/valgrind/s4] +60,085,590 (17.36%) 148,728 (18.37%) 25 ( 8.06%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (71,256x) [./target/valgrind/s4] + 2,503,709 ( 0.72%) 1,256 ( 0.16%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_pre (71,256x) [./target/valgrind/s4] + 1,928,319 ( 0.56%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs: as regex_syntax::ast::visitor::Visitor>::visit_pre (71,256x) [./target/valgrind/s4] + 1,599,466 ( 0.46%) 1,609 ( 0.20%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_post (4,916x) [./target/valgrind/s4] + 111,580 ( 0.03%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs: as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre (4,916x) [./target/valgrind/s4] + 64,743 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_pre (4,916x) [./target/valgrind/s4] + 6,075 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::finish (81x) [./target/valgrind/s4] + + 4,406,916 ( 1.27%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (220,401x) [./target/valgrind/s4] + 3,697,472 ( 1.07%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (184,846x) [./target/valgrind/s4] + 318,580 ( 0.09%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_alternate (15,929x) [./target/valgrind/s4] + 254,904 ( 0.07%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (12,720x) [./target/valgrind/s4] + 225,912 ( 0.07%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open (11,298x) [./target/valgrind/s4] + 189,600 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item (9,360x) [./target/valgrind/s4] + 141,420 ( 0.04%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class (7,071x) [./target/valgrind/s4] + 136,920 ( 0.04%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (6,846x) [./target/valgrind/s4] + 71,580 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range (3,549x) [./target/valgrind/s4] + 71,160 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition (3,558x) [./target/valgrind/s4] + 64,480 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_escape (3,224x) [./target/valgrind/s4] + 56,480 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) [./target/valgrind/s4] + 56,432 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_class_open (2,824x) [./target/valgrind/s4] + 43,132 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group (2,159x) [./target/valgrind/s4] + 32,180 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (1,609x) [./target/valgrind/s4] + 15,100 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition (755x) [./target/valgrind/s4] + 14,244 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_group (713x) [./target/valgrind/s4] + 13,860 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 4,200 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_flags (210x) [./target/valgrind/s4] + 400 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_flag (20x) [./target/valgrind/s4] + 300 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_perl_class (15x) [./target/valgrind/s4] + 3,925,952 ( 1.13%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char [./target/valgrind/s4] + + 3,684,933 ( 1.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:alloc::vec::Vec::extend_with + +27,424,191 ( 7.92%) 24,845 ( 3.07%) 71 (22.90%) . < ./malloc/./malloc/malloc.c:realloc (60,655x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,646,328 ( 1.05%) . . . * ./malloc/./malloc/malloc.c:_int_realloc [/usr/lib/x86_64-linux-gnu/libc.so.6] +15,690,130 ( 4.53%) 22,674 ( 2.80%) 71 (22.90%) . > ./malloc/./malloc/malloc.c:_int_malloc (24,869x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 5,504,750 ( 1.59%) . . . > ???:0x0000000004898620 (24,838x) [???] + 2,489,708 ( 0.72%) 2,171 ( 0.27%) . . > ./malloc/./malloc/malloc.c:_int_free (28,103x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 93,275 ( 0.03%) . . . > ./malloc/./malloc/malloc.c:unlink_chunk.constprop.0 (3,534x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + +59,197,629 (17.10%) 142,225 (17.56%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::Parser::parse (81x) [./target/valgrind/s4] + 3,625,753 ( 1.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments [./target/valgrind/s4] + 8,247,277 ( 2.38%) 1,236 ( 0.15%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (2,753x) [./target/valgrind/s4] + 7,601,358 ( 2.20%) 26,127 ( 3.23%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_alternate (15,929x) [./target/valgrind/s4] + 5,820,805 ( 1.68%) 301 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::NestLimiter

::check (81x) [./target/valgrind/s4] + 4,414,503 ( 1.28%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (49,607x) [./target/valgrind/s4] + 4,406,916 ( 1.27%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (220,401x) [./target/valgrind/s4] + 1,561,216 ( 0.45%) 691 ( 0.09%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_group (713x) [./target/valgrind/s4] + 1,289,898 ( 0.37%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (71,661x) [./target/valgrind/s4] + 922,916 ( 0.27%) 2,262 ( 0.28%) 1 ( 0.32%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 812,915 ( 0.23%) 1,154 ( 0.14%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition (1,713x) [./target/valgrind/s4] + 250,967 ( 0.07%) 134 ( 0.02%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition (172x) [./target/valgrind/s4] + 28,437 ( 0.01%) 134 ( 0.02%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group_end (81x) [./target/valgrind/s4] + + 3,349,866 ( 0.97%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::vec::Vec::extend_with + 8,709,129 ( 2.52%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (669,933x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + +40,279,987 (11.64%) 179,450 (22.16%) 74 (23.87%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (150,607x) [./target/valgrind/s4] +24,577,118 ( 7.10%) 88,532 (10.93%) 11 ( 3.55%) 1 ( 0.07%) < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (51,547x) [./target/valgrind/s4] + 354 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::ffi::c_str::CString::_from_vec_unchecked (2x) + 3,102,270 ( 0.90%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::finish_grow [./target/valgrind/s4] +27,753,819 ( 8.02%) 155,526 (19.21%) 14 ( 4.52%) 1 ( 0.07%) > ???:__rust_alloc (158,080x) [./target/valgrind/s4] + +10,618,605 ( 3.07%) 49,414 ( 6.10%) 10 ( 3.23%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (29,149x) + 9,056,265 ( 2.62%) 44,527 ( 5.50%) 12 ( 3.87%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (37,448x) + 5,438,643 ( 1.57%) 28,487 ( 3.52%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (18,495x) + 3,424,485 ( 0.99%) 7,119 ( 0.88%) 16 ( 5.16%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_post (18,030x) + 3,150,265 ( 0.91%) 4,949 ( 0.61%) 25 ( 8.06%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::builder::Builder::add (1,376x) + 2,405,110 ( 0.69%) 3,759 ( 0.46%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::Hir::concat (16,418x) + 1,668,597 ( 0.48%) 8,779 ( 1.08%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (5,350x) [./target/valgrind/s4] + 1,526,004 ( 0.44%) 5,037 ( 0.62%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::PreferenceTrie::insert (2,014x) + 1,337,178 ( 0.39%) 3,970 ( 0.49%) 9 ( 2.90%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::nfa::Inner::add (1,275x) + 849,672 ( 0.25%) 4,361 ( 0.54%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::push_alternate (1,445x) + 665,842 ( 0.19%) 320 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::push_class_open (81x) + 537,156 ( 0.16%) 2,168 ( 0.27%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::builder::Builder::build (1,033x) + 512,951 ( 0.15%) 2,240 ( 0.28%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::case_fold_simple (1,120x) + 460,064 ( 0.13%) 2,538 ( 0.31%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::dfa::DFA::set_matches (1,835x) + 434,983 ( 0.13%) 888 ( 0.11%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (2,914x) + 431,257 ( 0.12%) 1,228 ( 0.15%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state (384x) + 354,385 ( 0.10%) 943 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1,851x) + 318,987 ( 0.09%) 1,256 ( 0.16%) 2 ( 0.65%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_pre (297x) + 257,094 ( 0.07%) 293 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_class_set_item_post (1,978x) + 225,069 ( 0.07%) 884 ( 0.11%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::pattern::Patterns::add (360x) + 180,819 ( 0.05%) 704 ( 0.09%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::rabinkarp::RabinKarp::new (733x) + 158,573 ( 0.05%) 102 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::utf8::Utf8Sequences::new (1,316x) + 123,536 ( 0.04%) 329 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::visitor::visit (486x) + 123,301 ( 0.04%) 624 ( 0.08%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (221x) + 117,771 ( 0.03%) 546 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::captures::GroupInfo::new (227x) + 116,548 ( 0.03%) 440 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::builder::Builder::add_capture_start (308x) + 114,108 ( 0.03%) 440 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::pop_group (243x) + 92,148 ( 0.03%) 310 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::Builder::build (324x) + 92,050 ( 0.03%) 260 ( 0.03%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push (211x) + 83,394 ( 0.02%) 302 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::NFA::add_match (144x) + 82,589 ( 0.02%) 335 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (167x) + 77,391 ( 0.02%) 4 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty (674x) + 73,627 ( 0.02%) 307 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/vec_deque/mod.rs:alloc::collections::vec_deque::VecDeque::grow (180x) [./target/valgrind/s4] + 67,308 ( 0.02%) 196 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (406x) + 62,139 ( 0.02%) 328 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (175x) + 49,921 ( 0.01%) 140 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::meta::regex::Builder::build (162x) + 44,415 ( 0.01%) 152 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::captures::GroupInfoInner::add_first_group (243x) + 41,275 ( 0.01%) 169 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (154x) + 36,547 ( 0.01%) 78 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::Extractor::extract'2 (125x) + 36,108 ( 0.01%) 179 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::interval::IntervalSet::negate (81x) + 25,991 ( 0.01%) 66 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::iter::traits::iterator::Iterator>::next (175x) + 16,560 ( 0.00%) 68 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (34x) + 13,338 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::hybrid::dfa::Lazy::init_cache (117x) + 11,917 ( 0.00%) 14 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::meta::regex::RegexInfo::new (81x) + 11,880 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::ClassBytes::push (110x) + 10,788 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::push_group (91x) + 10,278 ( 0.00%) 57 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::add_nfa_states (23x) [./target/valgrind/s4] + 9,288 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::parser::matches::matched_arg::MatchedArg::append_val (36x) + 9,204 ( 0.00%) 78 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::determinize::add_nfa_states (39x) + 9,153 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (81x) + 8,622 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (78x) + 8,154 ( 0.00%) 30 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::Hir::alternation (22x) + 8,023 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class (71x) + 7,638 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::new (67x) + 7,596 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::parser::arg_matcher::ArgMatcher::start_custom_arg (30x) + 5,000 ( 0.00%) 20 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_flags (20x) + 4,633 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::determinize::epsilon_closure (41x) + 3,711 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::parser::arg_matcher::ArgMatcher::add_index_to (15x) + 2,469 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::util::flat_map::Entry::or_insert (6x) + 1,681 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (4x) + 1,510 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::builder::command::Command::arg_internal (4x) + 1,293 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::augment_args (6x) + 822 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::builder::command::Command::_build_self (3x) + 819 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::write_char (2x) + 595 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::lift_common_prefix (2x) + 516 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::parser::arg_matcher::ArgMatcher::start_custom_group (2x) + 487 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::Hir::alternation'2 (2x) + 486 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::parser::parser::Parser::get_matches_with (3x) + 483 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::builder::command::Command::unroll_arg_requires (3x) + 372 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::util::flat_map::FlatMap::extend_unchecked (2x) + 325 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::mkeymap::MKeyMap::_build (1x) + 114 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::Extractor::extract (1x) + 114 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:crossbeam_channel::waker::SyncWaker::register (1x) + 113 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open (1x) + 3,095,583 ( 0.89%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push [./target/valgrind/s4] +40,279,987 (11.64%) 179,450 (22.16%) 74 (23.87%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::finish_grow (150,607x) [./target/valgrind/s4] + + 2,816,814 ( 0.81%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_alloc +65,271,278 (18.86%) 392,878 (48.52%) 65 (20.97%) 1 ( 0.07%) > ./malloc/./malloc/malloc.c:malloc (402,281x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 63,644 ( 0.02%) 328 ( 0.04%) . . > ./malloc/./malloc/malloc.c:posix_memalign (121x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 3,761,835 ( 1.09%) 2,935 ( 0.36%) 3 ( 0.97%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (46,515x) + 1,378,264 ( 0.40%) 526 ( 0.06%) 10 ( 3.23%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (16,950x) + 1,368,356 ( 0.40%) 906 ( 0.11%) 10 ( 3.23%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (17,526x) [./target/valgrind/s4] + 265,766 ( 0.08%) 84 ( 0.01%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (693x) + 225,970 ( 0.07%) 100 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (3,283x) [./target/valgrind/s4] + 86,591 ( 0.03%) 26 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (758x) + 76,699 ( 0.02%) 158 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1,078x) + 52,307 ( 0.02%) 52 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add_capture_start (774x) [./target/valgrind/s4] + 33,293 ( 0.01%) 42 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (526x) [./target/valgrind/s4] + 25,328 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (252x) + 16,432 ( 0.00%) 36 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::new (126x) + 14,889 ( 0.00%) 44 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (65x) + 13,783 ( 0.00%) 4 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c (225x) + 10,807 ( 0.00%) 12 ( 0.00%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs: as core::iter::traits::iterator::Iterator>::next (175x) + 9,574 ( 0.00%) 12 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (134x) + 7,353 ( 0.00%) 12 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap (81x) + 490 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least'2 (10x) + 49 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (1x) [./target/valgrind/s4] + 2,766,641 ( 0.80%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add [./target/valgrind/s4] + +85,524,273 (24.71%) 200,351 (24.74%) 85 (27.42%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (1,386x) [./target/valgrind/s4] +83,118,552 (24.01%) 191,492 (23.65%) 87 (28.06%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (2,840x) [./target/valgrind/s4] +24,150,509 ( 6.98%) 28,505 ( 3.52%) 21 ( 6.77%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (12,493x) [./target/valgrind/s4] +21,009,369 ( 6.07%) 14,398 ( 1.78%) 25 ( 8.06%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (6,614x) [./target/valgrind/s4] + 1,268,486 ( 0.37%) 504 ( 0.06%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (142x) [./target/valgrind/s4] + 960,162 ( 0.28%) 54 ( 0.01%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least'2 (10x) [./target/valgrind/s4] + 326,403 ( 0.09%) 844 ( 0.10%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_concat (580x) [./target/valgrind/s4] + 288,750 ( 0.08%) 870 ( 0.11%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (526x) [./target/valgrind/s4] + 2,641,943 ( 0.76%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 [./target/valgrind/s4] +86,288,458 (24.93%) 201,659 (24.90%) 86 (27.74%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (1,386x) [./target/valgrind/s4] +24,150,509 ( 6.98%) 28,505 ( 3.52%) 21 ( 6.77%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (12,493x) [./target/valgrind/s4] +23,605,451 ( 6.82%) 80,566 ( 9.95%) 11 ( 3.55%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (26,711x) [./target/valgrind/s4] +22,564,526 ( 6.52%) 16,357 ( 2.02%) 25 ( 8.06%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (538x) [./target/valgrind/s4] +17,662,970 ( 5.10%) 642 ( 0.08%) 40 (12.90%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::new (126x) [./target/valgrind/s4] +16,969,276 ( 4.90%) 46,294 ( 5.72%) 32 (10.32%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (495x) [./target/valgrind/s4] + 2,635,063 ( 0.76%) 5,922 ( 0.73%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (39,677x) [./target/valgrind/s4] + 1,339,535 ( 0.39%) 730 ( 0.09%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (142x) [./target/valgrind/s4] + 964,465 ( 0.28%) 54 ( 0.01%) 1 ( 0.32%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least'2 (10x) [./target/valgrind/s4] + 934,285 ( 0.27%) 1,530 ( 0.19%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1,144x) [./target/valgrind/s4] + 721,842 ( 0.21%) 1,964 ( 0.24%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (134x) [./target/valgrind/s4] + 395,334 ( 0.11%) 394 ( 0.05%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/map.rs:regex_automata::nfa::thompson::map::Utf8SuffixMap::clear (127x) [./target/valgrind/s4] + 346,097 ( 0.10%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:::next (3,616x) [./target/valgrind/s4] + 251,263 ( 0.07%) 596 ( 0.07%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_exactly (210x) [./target/valgrind/s4] + 225,970 ( 0.07%) 100 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (3,283x) [./target/valgrind/s4] + 211,097 ( 0.06%) 422 ( 0.05%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::finish (126x) [./target/valgrind/s4] + 186,209 ( 0.05%) 102 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequences::new (1,316x) [./target/valgrind/s4] + 169,250 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (84,625x) [./target/valgrind/s4] + 91,043 ( 0.03%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (16,112x) [./target/valgrind/s4] + 47,191 ( 0.01%) 186 ( 0.02%) . . > ???:__rust_alloc (495x) [./target/valgrind/s4] + 39,403 ( 0.01%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::ClassUnicode::is_ascii (5,629x) [./target/valgrind/s4] + 22,516 ( 0.01%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassUnicode::iter (5,629x) [./target/valgrind/s4] + 20,966 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::start (10,483x) [./target/valgrind/s4] + 20,966 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::end (10,483x) [./target/valgrind/s4] + 20,700 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequence::as_slice (2,300x) [./target/valgrind/s4] + 16,128 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassBytes::ranges (5,376x) [./target/valgrind/s4] + + 4,414,503 ( 1.28%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (49,607x) [./target/valgrind/s4] + 1,417,681 ( 0.41%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_alternate (15,929x) [./target/valgrind/s4] + 627,895 ( 0.18%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class (7,055x) [./target/valgrind/s4] + 304,647 ( 0.09%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (3,423x) [./target/valgrind/s4] + 286,651 ( 0.08%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_escape (3,219x) [./target/valgrind/s4] + 251,418 ( 0.07%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open (2,826x) [./target/valgrind/s4] + 251,256 ( 0.07%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) [./target/valgrind/s4] + 223,447 ( 0.06%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group (2,511x) [./target/valgrind/s4] + 173,833 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item (1,937x) [./target/valgrind/s4] + 152,445 ( 0.04%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition (1,713x) [./target/valgrind/s4] + 61,445 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 21,360 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (240x) [./target/valgrind/s4] + 21,271 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_and_bump_space (239x) [./target/valgrind/s4] + 15,308 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition (172x) [./target/valgrind/s4] + 2,670 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_flags (30x) [./target/valgrind/s4] + 445 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_perl_class (5x) [./target/valgrind/s4] + 2,495,421 ( 0.72%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump [./target/valgrind/s4] + 3,697,472 ( 1.07%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (184,846x) [./target/valgrind/s4] + + 2,977,092 ( 0.86%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start (93,597x) [./target/valgrind/s4] + 2,420,013 ( 0.70%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} [./target/valgrind/s4] + + 2,389,738 ( 0.69%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 7,167,439 ( 2.07%) 3,970 ( 0.49%) 9 ( 2.90%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build (64,329x) [./target/valgrind/s4] + 2,322,130 ( 0.67%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add [./target/valgrind/s4] + 4,900 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/look.rs:regex_automata::util::look::LookMatcher::add_to_byteset (245x) [./target/valgrind/s4] + +19,117,859 ( 5.52%) 32,530 ( 4.02%) 11 ( 3.55%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (175x) [./target/valgrind/s4] + 2,176,738 ( 0.63%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build [./target/valgrind/s4] + 7,167,439 ( 2.07%) 3,970 ( 0.49%) 9 ( 2.90%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (64,329x) [./target/valgrind/s4] + 1,560,608 ( 0.45%) 1,238 ( 0.15%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (175x) [./target/valgrind/s4] + 1,235,032 ( 0.36%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::remap (175x) [./target/valgrind/s4] + 11,375 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 2,101,997 ( 0.61%) . . . * ./malloc/./malloc/arena.c:malloc + 1,128 ( 0.00%) 0 1 ( 0.32%) . > ./malloc/./malloc/arena.c:ptmalloc_init.part.0 (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 2,042,913 ( 0.59%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:core::ptr::drop_in_place + +11,499,724 ( 3.32%) 37,942 ( 4.69%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:regex_automata::meta::strategy::new (175x) [./target/valgrind/s4] + 48,819 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::wrappers::Hybrid::new (243x) + 16,273 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::wrappers::PikeVM::new (81x) + 16,273 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::wrappers::BoundedBacktracker::new (81x) + 16,273 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::wrappers::OnePass::new (81x) + 2,605 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::wrappers::ReverseHybrid::new (13x) + 2,038,150 ( 0.59%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place [./target/valgrind/s4] + 5,540,132 ( 1.60%) 33,313 ( 4.11%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::ops::drop::Drop>::drop (674x) [./target/valgrind/s4] + + 2,021,554 ( 0.58%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:alloc::raw_vec::finish_grow + + 1,928,319 ( 0.56%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (71,256x) [./target/valgrind/s4] + 1,885,061 ( 0.54%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs: as regex_syntax::ast::visitor::Visitor>::visit_pre [./target/valgrind/s4] + +22,055,897 ( 6.37%) 100,995 (12.47%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop (71,256x) [./target/valgrind/s4] + 363,378 ( 0.10%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (2,578x) [./target/valgrind/s4] + 1,869,858 ( 0.54%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 [./target/valgrind/s4] +11,867,842 ( 3.43%) 94,112 (11.62%) . . > ???:__rust_dealloc (90,718x) [./target/valgrind/s4] + 6,424,936 ( 1.86%) 4,280 ( 0.53%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2,753x) [./target/valgrind/s4] + 1,517,772 ( 0.44%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop'2 (73,834x) [./target/valgrind/s4] + 363,378 ( 0.10%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (2,578x) [./target/valgrind/s4] + + 1,811,559 ( 0.52%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 2,635,063 ( 0.76%) 5,922 ( 0.73%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (39,677x) [./target/valgrind/s4] + 947,110 ( 0.27%) 1,837 ( 0.23%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (13,228x) [./target/valgrind/s4] + 219,179 ( 0.06%) 792 ( 0.10%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (1,712x) [./target/valgrind/s4] + 98,080 ( 0.03%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (2,671x) [./target/valgrind/s4] + 74,247 ( 0.02%) 228 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (504x) [./target/valgrind/s4] + 49,896 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (1,386x) [./target/valgrind/s4] + 8,496 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_concat (236x) [./target/valgrind/s4] + 7,730 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (175x) [./target/valgrind/s4] + 6,300 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs: as core::iter::traits::iterator::Iterator>::next (175x) + 5,871 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap (162x) [./target/valgrind/s4] + 2,963 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least'2 (20x) [./target/valgrind/s4] + 1,786,878 ( 0.52%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch [./target/valgrind/s4] + 1,668,597 ( 0.48%) 8,779 ( 1.08%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (5,350x) [./target/valgrind/s4] + + 2,503,709 ( 0.72%) 1,256 ( 0.16%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (71,256x) [./target/valgrind/s4] + 1,758,099 ( 0.51%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_pre [./target/valgrind/s4] + +16,969,276 ( 4.90%) 46,294 ( 5.72%) 32 (10.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (495x) [./target/valgrind/s4] + 1,696,805 ( 0.49%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile [./target/valgrind/s4] + 1,368,356 ( 0.40%) 906 ( 0.11%) 10 ( 3.23%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (17,526x) [./target/valgrind/s4] + + 4,903,867 ( 1.42%) 29,401 ( 3.63%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop (27,518x) + 474,214 ( 0.14%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::concat (20,618x) + 420,624 ( 0.12%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::alternation (18,288x) + 1,587 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::lift_common_prefix (9x) + 781 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::alternation'2 (10x) + 299 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::into_kind (13x) + 247 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::reverse_inner::extract (13x) + 1,684,346 ( 0.49%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place [./target/valgrind/s4] + 3,568,069 ( 1.03%) 28,826 ( 3.56%) . . > ???:__rust_dealloc (27,403x) [./target/valgrind/s4] + 68,050 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop'2 (2,722x) [./target/valgrind/s4] + 63,098 ( 0.02%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (2,726x) [./target/valgrind/s4] + 100 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop (4x) [./target/valgrind/s4] + + 1,289,898 ( 0.37%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (71,661x) [./target/valgrind/s4] + 179,406 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (9,967x) [./target/valgrind/s4] + 63,882 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range (3,549x) [./target/valgrind/s4] + 50,868 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open (2,826x) [./target/valgrind/s4] + 12,834 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group (713x) [./target/valgrind/s4] + 4,320 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (240x) [./target/valgrind/s4] + 4,302 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_and_bump_space (239x) [./target/valgrind/s4] + 3,096 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition (172x) [./target/valgrind/s4] + 1,519,239 ( 0.44%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space [./target/valgrind/s4] + + 1,517,772 ( 0.44%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (73,834x) [./target/valgrind/s4] + 1,517,772 ( 0.44%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop'2 [./target/valgrind/s4] + +11,678,598 ( 3.37%) 54,458 ( 6.73%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (224x) [./target/valgrind/s4] + 848,229 ( 0.25%) 4,060 ( 0.50%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::reverse_inner::extract (13x) + 515,450 ( 0.15%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::concat (20,618x) + 457,200 ( 0.13%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::alternation (18,288x) + 325 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::into_kind (13x) + 261 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::lift_common_prefix (9x) + 250 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::alternation'2 (10x) + 100 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (4x) [./target/valgrind/s4] + 25 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (1x) [./target/valgrind/s4] + 1,500,814 ( 0.43%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop [./target/valgrind/s4] + 144,616 ( 0.04%) 2 ( 0.00%) . . > ???:__rust_alloc (2,722x) [./target/valgrind/s4] + +24,202,143 ( 6.99%) 51,330 ( 6.34%) 3 ( 0.97%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (15,786x) [./target/valgrind/s4] + 239,856 ( 0.07%) 247 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::extract (39x) [./target/valgrind/s4] + 158,297 ( 0.05%) 310 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (83x) [./target/valgrind/s4] + 43,665 ( 0.01%) 74 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten (29x) [./target/valgrind/s4] + 6,532 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::lift_common_prefix (6x) [./target/valgrind/s4] + 1,486,535 ( 0.43%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat [./target/valgrind/s4] + 2,397,887 ( 0.69%) 20 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::literal (15,406x) [./target/valgrind/s4] + 90 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 (2x) [./target/valgrind/s4] + + 1,475,712 ( 0.43%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/validations.rs:regex_syntax::ast::parse::ParserI

::char + + 1,455,146 ( 0.42%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/validations.rs:core::str::converts::from_utf8 + + 1,127,404 ( 0.33%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::hir::literal::Extractor::union (51,690x) + 115,090 ( 0.03%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::hir::literal::Extractor::cross (5,251x) + 79,418 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (3,659x) + 43,281 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_automata::util::prefilter::prefixes (1,941x) + 30,680 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:alloc::collections::btree::map::BTreeMap::insert (1,394x) + 23,811 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (1,059x) + 6,779 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:hashbrown::map::HashMap::insert (356x) + 3,170 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::hir::literal::Extractor::extract'2 (317x) + 1,564 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_automata::util::prefilter::suffixes (88x) + 1,315 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_automata::util::captures::Captures::get_group_by_name (65x) + 964 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (48x) + 869 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::validator::Validator::validate (44x) + 351 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::arg_matcher::ArgMatcher::add_index_to (18x) + 351 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::parser::Parser::push_arg_values (18x) + 307 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::util::flat_map::FlatMap::remove_entry (16x) + 281 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::parser::Parser::start_custom_arg (14x) + 212 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::validator::gather_direct_conflicts (11x) + 136 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::validator::Conflicts::gather_conflicts (7x) + 110 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:chrono::format::parse::parse_internal (11x) + 104 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::arg_matcher::ArgMatcher::start_custom_group (5x) + 76 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::parser::Parser::get_matches_with (4x) + 66 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::util::flat_map::FlatMap::remove (3x) + 66 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::parser::Parser::add_defaults (3x) + 66 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::arg_matcher::ArgMatcher::start_custom_arg (3x) + 57 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::builder::command::Command::_build_self (3x) + 57 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::parser::parser::Parser::resolve_pending (3x) + 57 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::builder::command::Command::unroll_arg_requires (3x) + 46 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:clap_builder::builder::possible_value::PossibleValue::matches (2x) + 22 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_automata::util::captures::GroupInfo::new (1x) + 20 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:chrono::offset::local::tz_info::parser::Cursor::read_tag (2x) + 10 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:core::str::iter::SplitInternal

::next_back (1x) + 10 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:::eq (1x) + 10 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::hir::literal::Extractor::extract (1x) + 1,436,760 ( 0.42%) . . . * ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S:__memcmp_avx2_movbe [/usr/lib/x86_64-linux-gnu/libc.so.6] + +23,605,451 ( 6.82%) 80,566 ( 9.95%) 11 ( 3.55%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (26,711x) [./target/valgrind/s4] + 1,380,530 ( 0.40%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add [./target/valgrind/s4] + + 1,353,123 ( 0.39%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:alloc::raw_vec::RawVec::reserve_for_push + + 1,331,466 ( 0.38%) . . . * ./malloc/./malloc/arena.c:realloc + + 1,321,995 ( 0.38%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::visitor::visit + 123,536 ( 0.04%) 329 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (486x) [./target/valgrind/s4] + + 8,809,445 ( 2.54%) 896 ( 0.11%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (39x) [./target/valgrind/s4] + 1,303,082 ( 0.38%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start [./target/valgrind/s4] + 2,977,092 ( 0.86%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (93,597x) [./target/valgrind/s4] + 249,266 ( 0.07%) 896 ( 0.11%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::DFA::set_matches (953x) [./target/valgrind/s4] + + 1,219,139 ( 0.35%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ops/range.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 1,152,773 ( 0.33%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::visitor::visit + + 5,778,134 ( 1.67%) 31,152 ( 3.85%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (19,750x) + 5,547,169 ( 1.60%) 2,618 ( 0.32%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::drop (525x) + 3,634,164 ( 1.05%) 30,798 ( 3.80%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::visit_post (15,399x) + 2,845,827 ( 0.82%) 12,835 ( 1.59%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::literal::PreferenceTrie::insert (8,722x) + 2,492,906 ( 0.72%) 920 ( 0.11%) 7 ( 2.26%) 1 ( 0.07%) < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::pikevm::ActiveStates::reset (318x) + 2,000,868 ( 0.58%) 1,368 ( 0.17%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::drop (270x) + 1,274,269 ( 0.37%) 3,115 ( 0.38%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend (752x) + 956,636 ( 0.28%) 842 ( 0.10%) 2 ( 0.65%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (290x) + 414,608 ( 0.12%) 940 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) + 310,461 ( 0.09%) 818 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:aho_corasick::nfa::noncontiguous::Compiler::densify (314x) + 274,042 ( 0.08%) 786 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::write_str (1,865x) + 175,461 ( 0.05%) 456 ( 0.06%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::hybrid::dfa::Lazy::init_cache (468x) + 138,278 ( 0.04%) 560 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (428x) + 134,104 ( 0.04%) 490 ( 0.06%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::util::sparse_set::SparseSets::new (468x) + 133,238 ( 0.04%) 355 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::visit_class_set_item_post (846x) + 120,144 ( 0.03%) 194 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (243x) + 59,212 ( 0.02%) 164 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (162x) + 47,054 ( 0.01%) 68 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (34x) + 32,412 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::util::determinize::state::State::dead (292x) + 9,491 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex::regex::bytes::Regex::new (80x) + 9,172 ( 0.00%) 27 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::interval::IntervalSet::union (58x) + 5,388 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:>::from (20x) + 4,551 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) + 3,060 ( 0.00%) 14 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::util::determinize::epsilon_closure (7x) + 1,640 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::augment_args (6x) + 1,440 ( 0.00%) 10 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (5x) + 1,076 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter (2x) + 542 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:clap_builder::builder::command::Command::_build_self (2x) + 270 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:clap_builder::mkeymap::MKeyMap::_build (1x) + 218 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::parse_ref (1x) + 114 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex::regex::string::Regex::new (1x) + 113 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (1x) + 113 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::create_cache (1x) + 1,141,564 ( 0.33%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle [./target/valgrind/s4] +24,577,118 ( 7.10%) 88,532 (10.93%) 11 ( 3.55%) 1 ( 0.07%) > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::finish_grow (51,547x) [./target/valgrind/s4] + + 1,114,207 ( 0.32%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::visit_post + + 1,073,488 ( 0.31%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs: as core::ops::drop::Drop>::drop + 4,415,995 ( 1.28%) 33,387 ( 4.12%) . . > ???:__rust_dealloc (34,520x) [./target/valgrind/s4] + 6 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (6x) [./target/valgrind/s4] + + 998,827 ( 0.29%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_post + 3,424,485 ( 0.99%) 7,119 ( 0.88%) 16 ( 5.16%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (18,030x) [./target/valgrind/s4] + + 981,248 ( 0.28%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::ast::parse::ParserI

::char + + 981,248 ( 0.28%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/mod.rs:regex_syntax::ast::parse::ParserI

::char + + 980,244 ( 0.28%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_syntax::ast::parse::ParserI

::char + + 978,917 ( 0.28%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 975,778 ( 0.28%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 951,878 ( 0.27%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 906,922 ( 0.26%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add +10,618,605 ( 3.07%) 49,414 ( 6.10%) 10 ( 3.23%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (29,149x) [./target/valgrind/s4] + + 8,340,649 ( 2.41%) 17,872 ( 2.21%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:alloc::vec::Vec::retain_mut (16,878x) + 879,794 ( 0.25%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::PreferenceTrie::insert [./target/valgrind/s4] + + 1,523,369 ( 0.44%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (578x) [./target/valgrind/s4] + 838,045 ( 0.24%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::alternation [./target/valgrind/s4] + + 828,259 ( 0.24%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + 9,056,265 ( 2.62%) 44,527 ( 5.50%) 12 ( 3.87%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (37,448x) [./target/valgrind/s4] + + 7,601,358 ( 2.20%) 26,127 ( 3.23%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (15,929x) [./target/valgrind/s4] + 820,389 ( 0.24%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_alternate [./target/valgrind/s4] + 3,678,590 ( 1.06%) 21,662 ( 2.68%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (15,929x) [./target/valgrind/s4] + 1,417,681 ( 0.41%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (15,929x) [./target/valgrind/s4] + 318,580 ( 0.09%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (15,929x) [./target/valgrind/s4] + + 810,900 ( 0.23%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::hybrid::dfa::Lazy::init_cache + +68,957,387 (19.92%) 393,206 (48.56%) 65 (20.97%) 1 ( 0.07%) < ???:__rust_alloc (402,402x) [./target/valgrind/s4] + 805,046 ( 0.23%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/alloc.rs:__rdl_alloc [./target/valgrind/s4] + + 719,567 ( 0.21%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop (27,518x) + 68,050 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2,722x) [./target/valgrind/s4] + 787,617 ( 0.23%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop'2 [./target/valgrind/s4] + + 765,100 ( 0.22%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::hybrid::dfa::Builder::build_from_nfa + + 762,475 ( 0.22%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa + + 757,766 ( 0.22%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 727,848 ( 0.21%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_realloc +33,363,424 ( 9.64%) 145,789 (18.00%) 71 (22.90%) . > ./malloc/./malloc/malloc.c:realloc (60,654x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 704,434 ( 0.20%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:::visit_post + + 686,672 ( 0.20%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 672,345 ( 0.19%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/range.rs:alloc::vec::Vec::extend_with + + 1,235,032 ( 0.36%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) [./target/valgrind/s4] + 671,834 ( 0.19%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::remap [./target/valgrind/s4] + + 663,543 ( 0.19%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 628,332 ( 0.18%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::builder::Builder::add + 3,150,265 ( 0.91%) 4,949 ( 0.61%) 25 ( 8.06%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,376x) [./target/valgrind/s4] + + 618,091 ( 0.18%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::visitor::visit + + 7,551,757 ( 2.18%) 3,493 ( 0.43%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:regex_automata::util::prefilter::teddy::Teddy::new (39x) + 1,873,129 ( 0.54%) 963 ( 0.12%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/ahocorasick.rs:aho_corasick::ahocorasick::AhoCorasickBuilder::build (9x) [./target/valgrind/s4] + 616,044 ( 0.18%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build [./target/valgrind/s4] + 1,854,743 ( 0.54%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle (48x) [./target/valgrind/s4] + 1,298,137 ( 0.38%) 1,228 ( 0.15%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (48x) [./target/valgrind/s4] + 941,551 ( 0.27%) 818 ( 0.10%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::densify (48x) [./target/valgrind/s4] + 739,090 ( 0.21%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::add_transition (2,432x) [./target/valgrind/s4] + 564,049 ( 0.16%) 385 ( 0.05%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (48x) [./target/valgrind/s4] + 432,480 ( 0.12%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::add_dead_state_loop (48x) [./target/valgrind/s4] + 385,392 ( 0.11%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state (48x) [./target/valgrind/s4] + 350,208 ( 0.10%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/prefilter.rs:aho_corasick::util::prefilter::Builder::build (48x) [./target/valgrind/s4] + 224,254 ( 0.06%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::alphabet::ByteClassSet::byte_classes (48x) [./target/valgrind/s4] + 218,649 ( 0.06%) 624 ( 0.08%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (2,624x) [./target/valgrind/s4] + 166,504 ( 0.05%) 302 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::add_match (1,394x) [./target/valgrind/s4] + 158,544 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::add_unanchored_start_state_loop (48x) [./target/valgrind/s4] + 125,120 ( 0.04%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::alphabet::ByteClassSet::set_range (3,680x) [./target/valgrind/s4] + 69,245 ( 0.02%) 599 ( 0.07%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::shrink_to_fit (240x) [./target/valgrind/s4] + 40,480 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::iter_trans (3,680x) [./target/valgrind/s4] + 36,067 ( 0.01%) 94 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::new (48x) [./target/valgrind/s4] + 11,040 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::State::is_match (3,680x) [./target/valgrind/s4] + 9,984 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (144x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 9,213 ( 0.00%) 94 ( 0.01%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (48x) [./target/valgrind/s4] + 816 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::close_start_state_loop_for_leftmost (48x) [./target/valgrind/s4] + +26,377,234 ( 7.62%) 102,519 (12.66%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (774x) [./target/valgrind/s4] + 614,297 ( 0.18%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop [./target/valgrind/s4] +22,055,897 ( 6.37%) 100,995 (12.47%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (71,256x) [./target/valgrind/s4] + 136,634 ( 0.04%) . . . > ???:__rust_alloc (2,578x) [./target/valgrind/s4] + + 596,928 ( 0.17%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::PreferenceTrie::insert + 1,526,004 ( 0.44%) 5,037 ( 0.62%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (2,014x) [./target/valgrind/s4] + + 580,733 ( 0.17%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:::visit_post + + 578,650 ( 0.17%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 561,277 ( 0.16%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::concat + 515,450 ( 0.15%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop (20,618x) [./target/valgrind/s4] + 474,214 ( 0.14%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (20,618x) [./target/valgrind/s4] + + 559,959 ( 0.16%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::concat + 8,125,365 ( 2.35%) 2,712 ( 0.33%) . . > ???:__rust_dealloc (81,305x) [./target/valgrind/s4] + 6,308,115 ( 1.82%) 45,470 ( 5.62%) 3 ( 0.97%) . > ???:__rust_alloc (38,101x) [./target/valgrind/s4] + + 551,075 ( 0.16%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::nfa::thompson::builder::Builder::build + + 531,120 ( 0.15%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::hir::Properties::alternation + + 8,247,277 ( 2.38%) 1,236 ( 0.15%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (2,753x) [./target/valgrind/s4] + 526,534 ( 0.15%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class [./target/valgrind/s4] + 2,062,644 ( 0.60%) 28 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) [./target/valgrind/s4] + 1,971,018 ( 0.57%) 320 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_class_open (2,824x) [./target/valgrind/s4] + 1,370,130 ( 0.40%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range (3,549x) [./target/valgrind/s4] + 938,404 ( 0.27%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class (841x) [./target/valgrind/s4] + 254,904 ( 0.07%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (12,720x) [./target/valgrind/s4] + 179,406 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (9,967x) [./target/valgrind/s4] + + 511,480 ( 0.15%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 510,608 ( 0.15%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 490,624 ( 0.14%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::char + + 490,122 ( 0.14%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/mod.rs:regex_syntax::ast::parse::ParserI

::char + + 490,122 ( 0.14%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/traits.rs:regex_syntax::ast::parse::ParserI

::char + + 489,127 ( 0.14%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::drop + +34,576,504 ( 9.99%) 145,789 (18.00%) 71 (22.90%) . < ???:__rust_realloc (60,654x) [./target/valgrind/s4] + 485,232 ( 0.14%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/alloc.rs:__rdl_realloc [./target/valgrind/s4] + + 476,203 ( 0.14%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 738,576 ( 0.21%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::init_cache (22,413x) [./target/valgrind/s4] + 7,194 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (218x) [./target/valgrind/s4] + 475,251 ( 0.14%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::set_transition [./target/valgrind/s4] + + 472,696 ( 0.14%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:::remap + + 465,032 ( 0.13%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::Builder::build + + 739,090 ( 0.21%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (2,432x) [./target/valgrind/s4] + 459,576 ( 0.13%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::add_transition [./target/valgrind/s4] + + 456,868 ( 0.13%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 456,135 ( 0.13%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::Extractor::union + 530,506 ( 0.15%) 1,090 ( 0.13%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_extend.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend (2,443x) [./target/valgrind/s4] + + 885,640 ( 0.26%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::visit_post (16,096x) + 855,130 ( 0.25%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::literal (15,406x) [./target/valgrind/s4] + 100,845 ( 0.03%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::literal (1,912x) [./target/valgrind/s4] + 65,430 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::class (1,454x) [./target/valgrind/s4] + 801 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/os_str.rs:std::sys::unix::os_str::Slice::to_str (12x) [./target/valgrind/s4] + 387 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:std::sys::unix::os_str::Buf::into_string (5x) + 176 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chrono-0.4.38/src/offset/local/tz_info/parser.rs:chrono::offset::local::tz_info::rule::RuleDay::parse (4x) + 115 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chrono-0.4.38/src/offset/local/tz_info/parser.rs:chrono::offset::local::tz_info::parser::parse (1x) [./target/valgrind/s4] + 90 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (2x) [./target/valgrind/s4] + 74 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_lex-0.4.1/src/ext.rs:clap_lex::ParsedArg::to_short (2x) + 74 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chrono-0.4.38/src/offset/local/tz_info/parser.rs:chrono::offset::local::tz_info::parser::Cursor::read_int (2x) [./target/valgrind/s4] + 45 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/chrono-0.4.38/src/offset/local/tz_info/parser.rs:chrono::offset::local::tz_info::rule::parse_hhmmss (1x) + 453,661 ( 0.13%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 [./target/valgrind/s4] + + 453,144 ( 0.13%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Builder::build + 19,516 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:>::try_from (2,788x) [./target/valgrind/s4] + + 431,621 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/alloc/layout.rs:alloc::raw_vec::RawVec::reserve_for_push + + 422,207 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 420,933 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::visit_post + 3,634,164 ( 1.05%) 30,798 ( 3.80%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (15,399x) [./target/valgrind/s4] + + 419,622 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::nfa::thompson::builder::Builder::patch + + 408,987 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + 5,438,643 ( 1.57%) 28,487 ( 3.52%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (18,495x) [./target/valgrind/s4] + + 408,319 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::drop + + 406,972 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:aho_corasick::dfa::Builder::finish_build_one_start + +27,753,819 ( 8.02%) 155,526 (19.21%) 14 ( 4.52%) 1 ( 0.07%) < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::finish_grow (158,080x) [./target/valgrind/s4] +11,391,532 ( 3.29%) 81,699 (10.09%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (52,360x) + 6,308,115 ( 1.82%) 45,470 ( 5.62%) 3 ( 0.97%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::concat (38,101x) + 3,237,694 ( 0.94%) 22,584 ( 2.79%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::Concat::into_ast (15,786x) + 2,996,290 ( 0.87%) 10,925 ( 1.35%) 2 ( 0.65%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::visit_post (36,032x) + 2,882,121 ( 0.83%) 20,341 ( 2.51%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::builder::Builder::build (12,199x) + 1,717,048 ( 0.50%) 254 ( 0.03%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::iter::traits::iterator::Iterator>::fold (81x) + 1,481,481 ( 0.43%) 9,634 ( 1.19%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::cross (7,320x) + 1,228,294 ( 0.35%) 1,828 ( 0.23%) 4 ( 1.29%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::alternation (18,867x) + 1,166,705 ( 0.34%) 7,835 ( 0.97%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::raw_vec::RawVec::allocate_in (5,391x) + 938,940 ( 0.27%) 960 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::strategy::new (81x) + 874,050 ( 0.25%) 606 ( 0.07%) 40 (12.90%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (67x) + 818,675 ( 0.24%) 20 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::literal (15,406x) + 674,742 ( 0.19%) 4,414 ( 0.55%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::class (2,728x) + 536,036 ( 0.15%) 2,868 ( 0.35%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::extract'2 (5,025x) + 508,623 ( 0.15%) 3,616 ( 0.45%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::literal (1,912x) + 490,825 ( 0.14%) 3,696 ( 0.46%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::repetition (2,034x) + 368,240 ( 0.11%) 2,945 ( 0.36%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::clone::Clone>::clone (1,657x) + 366,759 ( 0.11%) 2,685 ( 0.33%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::reverse_inner::flatten'2 (2,166x) + 331,832 ( 0.10%) 1,154 ( 0.14%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition (3,426x) + 294,116 ( 0.08%) 2,201 ( 0.27%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::pattern::Patterns::add (1,394x) + 290,043 ( 0.08%) 2,020 ( 0.25%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::class (1,454x) + 183,229 ( 0.05%) 142 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (81x) + 170,242 ( 0.05%) 1,131 ( 0.14%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::capture (693x) + 160,128 ( 0.05%) 192 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::reverse_inner::flatten (118x) + 155,315 ( 0.04%) 352 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::vec::from_elem (153x) + 150,129 ( 0.04%) 948 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (758x) + 146,940 ( 0.04%) 990 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::captures::GroupInfo::new (761x) + 144,616 ( 0.04%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop (2,722x) [./target/valgrind/s4] + 136,634 ( 0.04%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop (2,578x) [./target/valgrind/s4] + 113,744 ( 0.03%) 814 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (586x) + 90,244 ( 0.03%) 584 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::Alternation::into_ast (512x) + 87,385 ( 0.03%) 415 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter (807x) + 76,858 ( 0.02%) 132 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::clone (1,188x) + 72,003 ( 0.02%) 319 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::parse_group (693x) + 67,038 ( 0.02%) 394 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::map::Utf8SuffixMap::clear (68x) + 64,741 ( 0.02%) 756 ( 0.09%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::regex::Builder::build (324x) + 60,486 ( 0.02%) 96 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex::builders::Builder::build_one_bytes (80x) + 58,103 ( 0.02%) 172 ( 0.02%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) + 55,943 ( 0.02%) 138 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 47,191 ( 0.01%) 186 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (495x) [./target/valgrind/s4] + 45,430 ( 0.01%) 42 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop (595x) + 44,643 ( 0.01%) 229 ( 0.03%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::pool::inner::Pool::new (81x) + 43,779 ( 0.01%) 173 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::regex::RegexInfo::new (162x) + 41,117 ( 0.01%) 36 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::Ast::empty (693x) + 40,954 ( 0.01%) 104 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::push_alternate (512x) + 39,140 ( 0.01%) 81 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (586x) + 34,722 ( 0.01%) 302 ( 0.04%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (114x) + 30,634 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::alternation (578x) + 28,888 ( 0.01%) 98 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:hashbrown::raw::RawTable::reserve_rehash (347x) + 28,374 ( 0.01%) 178 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (174x) + 19,621 ( 0.01%) 142 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::captures::GroupInfoInner::add_first_group (81x) + 19,267 ( 0.01%) 128 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::union (81x) + 18,939 ( 0.01%) 80 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::Ast::repetition (172x) + 16,970 ( 0.00%) 94 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Repetition::with (149x) + 15,938 ( 0.00%) 52 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::alloc::exchange_malloc (172x) [./target/valgrind/s4] + 15,639 ( 0.00%) 52 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop (208x) + 15,476 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::determinize::state::State::dead (292x) + 12,364 ( 0.00%) 53 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (42x) + 11,785 ( 0.00%) 32 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::prefilter::Prefilter::from_choice (50x) + 9,275 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (175x) + 8,957 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (169x) [./target/valgrind/s4] + 8,885 ( 0.00%) 58 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::collections::btree::node::Handle,alloc::collections::btree::node::marker::Edge>::insert_recursing (72x) + 8,586 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop (162x) + 8,451 ( 0.00%) 33 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<1_usize>::new_unchecked (36x) + 6,777 ( 0.00%) 22 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::pop_class (71x) + 6,611 ( 0.00%) 30 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::collections::btree::map::BTreeMap::insert (73x) + 6,474 ( 0.00%) 8 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::api::Builder::build (96x) + 5,749 ( 0.00%) 14 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::slice::sort::merge_sort (76x) + 5,390 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Compiler::c (110x) + 4,912 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::data::line::Line::get_boxptrs (84x) + 4,784 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::create_cache (42x) + 4,558 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::regex::Regex::create_captures (86x) + 3,990 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::sys::unix::os_str::Slice::to_owned (22x) + 2,956 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::util::remapper::Remapper::remap (48x) + 2,955 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:

::parse_ref (15x) + 2,941 ( 0.00%) 13 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new_unchecked (15x) + 2,786 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:>::from (20x) + 2,759 ( 0.00%) 4 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract (42x) [./target/valgrind/s4] + 2,544 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle (48x) + 2,396 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::arg::Arg::_build (12x) + 2,173 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) + 1,776 ( 0.00%) 16 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:lru::LruCache::new (8x) + 1,482 ( 0.00%) 10 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::linereader::LineReader::insert_line (5x) + 1,471 ( 0.00%) 8 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:lru::LruCache::put (15x) + 1,346 ( 0.00%) 14 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:hashbrown::raw::RawTable::with_capacity (9x) + 1,301 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::env::args_os (7x) + 1,060 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::push_group (20x) + 958 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::augment_args (6x) + 859 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::reverse_inner::extract (13x) + 780 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::parser::parser::Parser::add_defaults (12x) + 707 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:hashbrown::raw::RawTableInner::fallible_with_capacity (4x) + 666 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::linereader::LineReader::find_line_in_block (3x) + 619 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ops::function::FnOnce::call_once (3x) + 591 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::parser::parser::Parser::start_custom_arg (3x) + 583 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::create_cache (11x) + 530 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<4_usize>::new_unchecked (3x) + 490 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::insert_sysline (4x) + 477 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::extract (9x) + 477 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::ahocorasick::AhoCorasickBuilder::build (9x) + 460 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::thread::Builder::spawn (4x) + 428 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:crossbeam_channel::channel::bounded (1x) + 427 ( 0.00%) 12 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::printer::printers::PrinterLogMessage::new (1x) + 396 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:chrono::offset::local::tz_info::parser::parse (2x) + 388 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::parse_ref (2x) + 358 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::sys_common::once::futex::Once::call (2x) + 318 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::alternation'2 (6x) + 314 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::env::_var_os (1x) + 303 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::thread::Thread::new (3x) + 289 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::look (2x) + 280 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::blockreader::BlockReader::read_block_File (2x) + 265 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:crossbeam_channel::select::Select::new (5x) + 265 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::lift_common_prefix (5x) + 265 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::translate::TranslatorI::hir_perl_unicode_class (5x) + 264 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:

::possible_values (2x) + 224 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::new (1x) + 220 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:crossbeam_channel::context::Context::new (1x) + 212 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:hashbrown::raw::RawTable::with_capacity_in (4x) + 208 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::iter::traits::collect::FromIterator>::from_iter (1x) + 205 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::get_matches_from (1x) + 199 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::fs::read::inner (1x) + 191 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:<&str as alloc::ffi::c_str::CString::new::SpecNewImpl>::spec_new_impl (1x) + 147 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::unroll_arg_requires (3x) + 106 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::linereader::LineReader::find_line (2x) + 106 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::fmt::format::format_inner (2x) + 106 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::_build_self (2x) + 106 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4::process_dt_exit (2x) + 106 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4::main (2x) + 106 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::sys::unix::thread::Thread::new (2x) + 102 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::interval::IntervalSet::new (2x) + 98 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2x) + 98 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::find_sysline_year (2x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex::builders::Builder::build_one_string (1x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::sys::unix::fs::canonicalize (1x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::dfa::remapper::Remapper::remap (1x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::dfa::remapper::Remapper::new (1x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::required_graph (1x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::helpers::basename (1x) + 53 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::filepreprocessor::process_path (1x) + 49 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:ctrlc::set_handler (1x) + 49 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4::processing_loop (1x) + 49 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::filepreprocessor::pathbuf_to_filetype_impl (1x) + 402,402 ( 0.12%) . . . * ???:__rust_alloc [./target/valgrind/s4] +68,957,387 (19.92%) 393,206 (48.56%) 65 (20.97%) 1 ( 0.07%) > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/alloc.rs:__rdl_alloc (402,402x) [./target/valgrind/s4] + + 398,152 ( 0.12%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 393,439 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle + +48,279,999 (13.95%) 260,870 (32.22%) 1 ( 0.32%) . < ???:__rust_dealloc (385,984x) [./target/valgrind/s4] + 385,984 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_dealloc [./target/valgrind/s4] +47,894,015 (13.84%) 260,870 (32.22%) 1 ( 0.32%) . > ./malloc/./malloc/malloc.c:free (385,984x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + +11,867,842 ( 3.43%) 94,112 (11.62%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (90,718x) [./target/valgrind/s4] + 8,125,365 ( 2.35%) 2,712 ( 0.33%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::concat (81,305x) + 6,041,312 ( 1.75%) 40,231 ( 4.97%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (44,977x) + 4,415,995 ( 1.28%) 33,387 ( 4.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs: as core::ops::drop::Drop>::drop (34,520x) + 4,073,644 ( 1.18%) 27,194 ( 3.36%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop (27,622x) + 3,568,069 ( 1.03%) 28,826 ( 3.56%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (27,403x) [./target/valgrind/s4] + 1,897,666 ( 0.55%) 784 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::alternation (18,936x) + 1,879,618 ( 0.54%) 2,886 ( 0.36%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (2,139x) + 1,087,118 ( 0.31%) 335 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (10,884x) + 969,941 ( 0.28%) 7,555 ( 0.93%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::PreferenceTrie::minimize (7,022x) + 692,266 ( 0.20%) 3,302 ( 0.41%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::cross (5,904x) + 344,898 ( 0.10%) 575 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (3,312x) + 335,214 ( 0.10%) 2,603 ( 0.32%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place'2 (2,598x) + 333,220 ( 0.10%) 2,541 ( 0.31%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::vec::Vec::retain_mut (2,598x) + 227,715 ( 0.07%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,299x) + 213,472 ( 0.06%) 406 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::extract'2 (2,035x) + 193,147 ( 0.06%) 1,516 ( 0.19%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::prefilter::teddy::Teddy::new (1,490x) + 173,714 ( 0.05%) 993 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::sync::Arc::drop_slow (1,456x) + 163,031 ( 0.05%) 1,102 ( 0.14%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::reverse_inner::prefilter (1,317x) + 144,610 ( 0.04%) 24 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::class (1,454x) + 136,883 ( 0.04%) 1,028 ( 0.13%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::regex::Builder::build (1,069x) + 132,889 ( 0.04%) 958 ( 0.12%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (909x) + 96,395 ( 0.03%) 735 ( 0.09%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (745x) + 94,605 ( 0.03%) 68 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::extract (935x) + 92,109 ( 0.03%) 47 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::Concat::into_ast (917x) + 90,902 ( 0.03%) 35 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (928x) + 86,341 ( 0.02%) 806 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop (595x) + 85,230 ( 0.02%) 54 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::visit_class_set_item_post (846x) + 83,890 ( 0.02%) 814 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop (596x) + 80,571 ( 0.02%) 274 ( 0.03%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (735x) + 79,801 ( 0.02%) 109 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (774x) [./target/valgrind/s4] + 76,077 ( 0.02%) 550 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (565x) + 74,944 ( 0.02%) 710 ( 0.09%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::builder::Builder::build (525x) + 74,653 ( 0.02%) 549 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::sync::Arc::drop_slow'2 (555x) + 70,354 ( 0.02%) 64 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 65,316 ( 0.02%) 350 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (525x) + 64,284 ( 0.02%) 431 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::ops::drop::Drop>::drop (519x) + 41,051 ( 0.01%) 288 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::visitor::visit (324x) + 36,158 ( 0.01%) 359 ( 0.04%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (240x) + 32,551 ( 0.01%) 246 ( 0.03%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::union (254x) + 28,860 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::determinize::state::State::dead (292x) + 24,898 ( 0.01%) 91 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (224x) + 20,475 ( 0.01%) 96 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::ops::drop::Drop>::drop (173x) + 20,212 ( 0.01%) 148 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex::regex::bytes::Regex::new (160x) + 18,913 ( 0.01%) 97 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/regex.rs:regex_automata::meta::regex::Builder::build (162x) [./target/valgrind/s4] + 17,064 ( 0.00%) 93 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::strategy::new (143x) + 15,738 ( 0.00%) 122 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place> (122x) + 14,851 ( 0.00%) 4 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:hashbrown::raw::RawTable::reserve_rehash (149x) + 14,308 ( 0.00%) 90 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::api::Builder::build (108x) + 13,803 ( 0.00%) 156 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop (81x) + 11,245 ( 0.00%) 37 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (21x) + 11,183 ( 0.00%) 1 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (113x) [./target/valgrind/s4] + 9,676 ( 0.00%) 12 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (94x) + 9,488 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::util::remapper::Remapper::remap (96x) + 8,122 ( 0.00%) 10 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::data::datetime::bytes_to_regex_to_datetime (79x) + 7,812 ( 0.00%) 12 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::slice::sort::merge_sort (76x) + 7,677 ( 0.00%) 94 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (48x) + 7,398 ( 0.00%) 78 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (48x) [./target/valgrind/s4] + 6,522 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::parser::matches::matched_arg::MatchedArg::into_vals_flatten (59x) + 4,424 ( 0.00%) 46 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/node.rs:alloc::collections::btree::node::BalancingContext::merge_tracking_child_edge (24x) [./target/valgrind/s4] + 4,121 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::parser::matches::arg_matches::ArgMatches::remove_one (37x) + 3,564 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Seq::optimize_by_preference (36x) + 2,755 ( 0.00%) 3 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (27x) + 2,665 ( 0.00%) 13 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::ops::drop::Drop>::drop (23x) + 2,360 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<1_usize>::new_unchecked (24x) + 2,279 ( 0.00%) 24 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::prefilter::prefixes (15x) + 2,079 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (21x) + 1,863 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:>::from (20x) + 1,813 ( 0.00%) 5 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::ops::drop::Drop>::drop (18x) + 1,660 ( 0.00%) 12 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::meta::reverse_inner::extract (13x) + 1,365 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_builder-4.2.1/src/parser/parser.rs:clap_builder::parser::parser::Parser::push_arg_values (15x) [./target/valgrind/s4] + 1,298 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::util::prefilter::suffixes (12x) + 1,279 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::into_kind (13x) + 1,242 ( 0.00%) 10 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place> (10x) + 1,199 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Seq::cross_preamble (13x) + 1,176 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::alternation'2 (12x) + 1,100 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (10x) + 1,057 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4::processing_loop (11x) + 1,013 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::lift_common_prefix (10x) + 990 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new_unchecked (10x) + 829 ( 0.00%) 8 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (6x) + 811 ( 0.00%) 4 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (7x) + 735 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4::main (7x) + 672 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::parser::matches::any_value::AnyValue::downcast_into (6x) + 564 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::iter::traits::collect::Extend<&T>>::extend (3x) + 549 ( 0.00%) 2 ( 0.00%) . . < src/data/datetime.rs:s4lib::data::datetime::bytes_to_regex_to_datetime (5x) [./target/valgrind/s4] + 546 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::unroll_arg_requires (6x) + 546 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::get_matches_from (6x) + 449 ( 0.00%) 5 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::panicking::try (3x) + 435 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::builder::command::Command::_build_self (4x) + 399 ( 0.00%) 4 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::collections::btree::remove::,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (2x) + 364 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter (4x) + 364 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (4x) [./target/valgrind/s4] + 364 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::lift_common_prefix (4x) [./target/valgrind/s4] + 364 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4::process_dt_exit (4x) + 351 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place>>> (3x) + 351 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (3x) + 306 ( 0.00%) 4 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/node.rs:alloc::collections::btree::node::BalancingContext::merge_tracking_parent (2x) [./target/valgrind/s4] + 263 ( 0.00%) 3 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::sys::common::thread_local::fast_local::fast::destroy_value (2x) + 241 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::sys::unix::thread::Thread::new::thread_start (2x) + 231 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex::regex::string::Regex::new (2x) + 225 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (2x) + 198 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<4_usize>::new_unchecked (2x) + 198 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::summary (2x) + 198 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::iter::traits::iterator::Iterator>::next (2x) + 198 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::dfa::remapper::Remapper::remap (2x) + 182 ( 0.00%) . . . < src/bin/s4.rs:s4::cli_process_blocksz (2x) [./target/valgrind/s4] + 182 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:std::thread::local::LocalKey::with (2x) + 182 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:clap_builder::parser::validator::Validator::validate (2x) + 182 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ops::function::FnOnce::call_once (2x) + 139 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place> (1x) + 134 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:chrono::offset::local::tz_info::timezone::TimeZone::from_posix_tz (1x) + 119 ( 0.00%) 1 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:termcolor::ColorChoice::should_attempt_color (1x) + 112 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place'2 (1x) + 112 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (1x) [./target/valgrind/s4] + 99 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::syslinereader::SyslineReader::dt_patterns_analysis (1x) + 99 ( 0.00%) . . . < src/readers/blockreader.rs:s4lib::readers::blockreader::BlockReader::new (1x) [./target/valgrind/s4] + 99 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place (1x) + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::augment_args (1x) + 91 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_builder-4.2.1/src/builder/command.rs:clap_builder::builder::command::Command::get_matches_from (1x) [./target/valgrind/s4] + 91 ( 0.00%) . . . < src/readers/filepreprocessor.rs:s4lib::readers::filepreprocessor::pathbuf_to_filetype_impl (1x) [./target/valgrind/s4] + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::parse_ref (1x) + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::ops::drop::Drop>::drop (1x) + 91 ( 0.00%) . . . < src/bin/s4.rs:s4::exec_fileprocessor_thread (1x) [./target/valgrind/s4] + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::interval::IntervalSet::new (1x) + 91 ( 0.00%) . . . < src/readers/filepreprocessor.rs:s4lib::readers::filepreprocessor::process_path (1x) [./target/valgrind/s4] + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs: as core::iter::traits::iterator::Iterator>::next (1x) + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:s4lib::readers::filepreprocessor::process_path (1x) + 91 ( 0.00%) . . . < src/bin/s4.rs:::parse_ref (1x) + 91 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place> (1x) + 91 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/clap_builder-4.2.1/src/parser/parser.rs:clap_builder::parser::parser::Parser::get_matches_with (1x) [./target/valgrind/s4] + 385,984 ( 0.11%) . . . * ???:__rust_dealloc [./target/valgrind/s4] +48,279,999 (13.95%) 260,870 (32.22%) 1 ( 0.32%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_dealloc (385,984x) [./target/valgrind/s4] + + 384,277 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 379,830 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 371,635 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::hir::literal::Extractor::union + 1,127,404 ( 0.33%) . . . > ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S:__memcmp_avx2_movbe (51,690x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 370,368 ( 0.11%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 2,397,887 ( 0.69%) 20 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (15,406x) [./target/valgrind/s4] + 369,744 ( 0.11%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::literal [./target/valgrind/s4] + 855,130 ( 0.25%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 (15,406x) [./target/valgrind/s4] + + 369,528 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/validations.rs:regex_syntax::ast::parse::ParserI

::bump + + 365,838 ( 0.11%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::Hir::alternation + 457,200 ( 0.13%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop (18,288x) [./target/valgrind/s4] + 420,624 ( 0.12%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (18,288x) [./target/valgrind/s4] + + 359,228 ( 0.10%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:::remap + + 356,688 ( 0.10%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::builder::Builder::add + + 351,777 ( 0.10%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:::visit_post + + 348,732 ( 0.10%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ops/range.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 335,268 ( 0.10%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:alloc::vec::Vec::extend_with + + 324,311 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + 1,320,528 ( 0.38%) 7,829 ( 0.97%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::allocate_in (5,376x) [./target/valgrind/s4] + + 321,558 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 317,853 ( 0.09%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (35,317x) [./target/valgrind/s4] + 317,853 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place [./target/valgrind/s4] + + 313,014 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::nfa::Inner::remap + + 1,599,466 ( 0.46%) 1,609 ( 0.20%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (4,916x) [./target/valgrind/s4] + 309,347 ( 0.09%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_post [./target/valgrind/s4] + 349,167 ( 0.10%) 335 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (3,545x) [./target/valgrind/s4] + 9,820 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::TranslatorI::hir_perl_unicode_class (5x) [./target/valgrind/s4] + + 305,880 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::literal::Extractor::union + + 303,829 ( 0.09%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + 3,761,835 ( 1.09%) 2,935 ( 0.36%) 3 ( 0.97%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (46,515x) [./target/valgrind/s4] + + 303,530 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop + 4,903,867 ( 1.42%) 29,401 ( 3.63%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (27,518x) [./target/valgrind/s4] + 719,567 ( 0.21%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::drop'2 (27,518x) [./target/valgrind/s4] + + 302,964 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 301,214 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:alloc::raw_vec::RawVec::reserve_for_push + + 299,755 ( 0.09%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 291,191 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::remap + + 287,654 ( 0.08%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::nfa::thompson::builder::Builder::build + + 287,505 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::Hir::concat + 2,405,110 ( 0.69%) 3,759 ( 0.46%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (16,418x) [./target/valgrind/s4] + + 2,295,976 ( 0.66%) 1,555 ( 0.19%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Cache::new (117x) [./target/valgrind/s4] + 284,454 ( 0.08%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::init_cache [./target/valgrind/s4] + 738,576 ( 0.21%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::set_transition (22,413x) [./target/valgrind/s4] + 44,904 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::dead (117x) [./target/valgrind/s4] + + 279,186 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 277,269 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::bump + + 277,269 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::bump + + 274,477 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Hir::concat + + 271,728 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::map::Utf8SuffixMap::clear + + 1,488,569 ( 0.43%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::remap (48x) [./target/valgrind/s4] + 270,270 ( 0.08%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:::remap [./target/valgrind/s4] + + 261,800 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments +11,391,532 ( 3.29%) 81,699 (10.09%) . . > ???:__rust_alloc (52,360x) [./target/valgrind/s4] + + 261,141 ( 0.08%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::nfa::Inner::add + 1,337,178 ( 0.39%) 3,970 ( 0.49%) 9 ( 2.90%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,275x) [./target/valgrind/s4] + + 257,316 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 256,198 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::builder::Builder::build + + 251,626 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 249,834 ( 0.07%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::nfa::thompson::nfa::Inner::remap + + 349,167 ( 0.10%) 335 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_post (3,545x) [./target/valgrind/s4] + 46,801 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:::visit_pre (2,753x) + 44,132 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:::visit_class_set_item_post (1,686x) + 38,420 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::ClassUnicode::try_case_fold_simple (1,120x) + 22,002 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::Hir::alternation (1,158x) + 19,125 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::ClassUnicode::new (1,125x) + 5,440 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::TranslatorI::hir_perl_unicode_class (5x) [./target/valgrind/s4] + 2,526 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::union (58x) [./target/valgrind/s4] + 2,310 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::ClassBytes::push (110x) + 2,310 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::ClassBytes::empty (110x) + 1,207 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:::visit_class_set_item_pre (71x) + 783 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::new (2x) [./target/valgrind/s4] + 246,919 ( 0.07%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize [./target/valgrind/s4] + + 850,317 ( 0.25%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_class_open (2,824x) [./target/valgrind/s4] + 245,716 ( 0.07%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open [./target/valgrind/s4] + 251,418 ( 0.07%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (2,826x) [./target/valgrind/s4] + 225,912 ( 0.07%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (11,298x) [./target/valgrind/s4] + 50,868 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (2,826x) [./target/valgrind/s4] + + 941,551 ( 0.27%) 818 ( 0.10%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 242,678 ( 0.07%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::densify [./target/valgrind/s4] + + 241,800 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs:::visit_post + + 240,956 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:::visit_post + + 239,331 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::visit_post + 2,996,290 ( 0.87%) 10,925 ( 1.35%) 2 ( 0.65%) . > ???:__rust_alloc (36,032x) [./target/valgrind/s4] + 2,565,036 ( 0.74%) 29,826 ( 3.68%) . . > ???:__rust_realloc (14,913x) [./target/valgrind/s4] + + 239,025 ( 0.07%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 234,008 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::NFA::add_transition + + 3,678,590 ( 1.06%) 21,662 ( 2.68%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_alternate (15,929x) [./target/valgrind/s4] + 157,035 ( 0.05%) 835 ( 0.10%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 23,172 ( 0.01%) 134 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group_end (81x) [./target/valgrind/s4] + 233,842 ( 0.07%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast [./target/valgrind/s4] + + 230,964 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 229,410 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::hir::literal::Extractor::union + + 229,225 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 228,692 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 226,649 ( 0.07%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + 5,778,134 ( 1.67%) 31,152 ( 3.85%) 1 ( 0.32%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (19,750x) [./target/valgrind/s4] + + 1,296,601 ( 0.37%) 1,228 ( 0.15%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (96x) [./target/valgrind/s4] + 431,712 ( 0.12%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::add_dead_state_loop (48x) [./target/valgrind/s4] + 223,920 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state [./target/valgrind/s4] + + 223,104 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + 431,257 ( 0.12%) 1,228 ( 0.15%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (384x) [./target/valgrind/s4] + + 203,008 ( 0.06%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/sip.rs:core::hash::BuildHasher::hash_one (4,055x) + 57,495 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/mod.rs:core::hash::BuildHasher::hash_one (1,637x) [./target/valgrind/s4] + 221,590 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/sip.rs: as core::hash::Hasher>::write [./target/valgrind/s4] + + 220,380 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::raw_vec::finish_grow +31,759,436 ( 9.17%) 112,458 (13.89%) 71 (22.90%) . > ???:__rust_realloc (44,076x) [./target/valgrind/s4] + + 216,459 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/iterator.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 211,352 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop + + 211,261 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:::visit_post + + 224,254 ( 0.06%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 209,328 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::alphabet::ByteClassSet::byte_classes [./target/valgrind/s4] + + 208,923 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 201,168 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Hir::alternation + + 201,037 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 200,998 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::Hir::concat + + 198,671 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 197,970 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_syntax::ast::visitor::visit + + 197,765 ( 0.06%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 346,097 ( 0.10%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (3,616x) [./target/valgrind/s4] + 197,472 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:::next [./target/valgrind/s4] + + 6,081,394 ( 1.76%) 2,345 ( 0.29%) 4 ( 1.29%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (512x) [./target/valgrind/s4] + 551,421 ( 0.16%) 256 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten (55x) [./target/valgrind/s4] + 170,673 ( 0.05%) 68 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (12x) [./target/valgrind/s4] + 196,068 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation [./target/valgrind/s4] + 1,523,369 ( 0.44%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::alternation (578x) [./target/valgrind/s4] + 47,257 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::lift_common_prefix (579x) [./target/valgrind/s4] + 14,959 ( 0.00%) 27 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::union (58x) [./target/valgrind/s4] + 7,718 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/debug.rs:regex_syntax::debug::utf8_decode (454x) [./target/valgrind/s4] + 3,474 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place> (579x) [./target/valgrind/s4] + 157 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::new (1x) [./target/valgrind/s4] + + 1,370,130 ( 0.40%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (3,549x) [./target/valgrind/s4] + 191,661 ( 0.06%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range [./target/valgrind/s4] + 1,000,419 ( 0.29%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item (3,549x) [./target/valgrind/s4] + 71,580 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (3,549x) [./target/valgrind/s4] + 63,882 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (3,549x) [./target/valgrind/s4] + + 190,186 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 189,432 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::ast::Concat::into_ast + + 187,194 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} + + 187,194 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} + + 185,179 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/into_iter.rs:regex_syntax::hir::Hir::concat + + 185,086 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs:regex_syntax::ast::parse::ParserI

::bump + + 184,927 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::ast::parse::ParserI

::bump + + 184,846 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_syntax::ast::parse::ParserI

::bump + + 184,846 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/mod.rs:regex_syntax::ast::parse::ParserI

::bump + + 184,752 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 183,373 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::ast::visitor::visit + + 179,838 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::nfa::thompson::builder::Builder::patch + + 178,822 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 178,625 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:alloc::raw_vec::RawVec::reserve_for_push + + 178,344 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::nfa::thompson::builder::Builder::add + + 177,036 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:::visit_post + + 2,062,644 ( 0.60%) 28 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (2,824x) [./target/valgrind/s4] + 176,011 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class [./target/valgrind/s4] + 516,792 ( 0.15%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class_op (2,824x) [./target/valgrind/s4] + 254,160 ( 0.07%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (8,472x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 251,256 ( 0.07%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (2,824x) [./target/valgrind/s4] + 172,264 ( 0.05%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2,824x) [./target/valgrind/s4] + 56,480 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,824x) [./target/valgrind/s4] + + 169,250 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (84,625x) [./target/valgrind/s4] + 4,518 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (2,259x) [./target/valgrind/s4] + 574 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (287x) [./target/valgrind/s4] + 568 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten (284x) [./target/valgrind/s4] + 26 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::extract (13x) [./target/valgrind/s4] + 174,936 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind [./target/valgrind/s4] + + 174,878 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::drop + 1,493,037 ( 0.43%) 1,869 ( 0.23%) 1 ( 0.32%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_extend.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend (2,604x) [./target/valgrind/s4] + + 169,878 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::ast::visitor::visit + + 169,466 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Hir::literal + + 167,611 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::hir::literal::Extractor::union + + 9,372,525 ( 2.71%) 1,120 ( 0.14%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:regex_automata::util::prefilter::teddy::Teddy::new (39x) + 1,874,001 ( 0.54%) 1,779 ( 0.22%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/ahocorasick.rs:aho_corasick::ahocorasick::AhoCorasickBuilder::build (9x) [./target/valgrind/s4] + 164,577 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::build_from_noncontiguous [./target/valgrind/s4] + 8,809,445 ( 2.54%) 896 ( 0.11%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start (39x) [./target/valgrind/s4] + 311,723 ( 0.09%) 1,642 ( 0.20%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::DFA::set_matches (882x) [./target/valgrind/s4] + 183,375 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_both_starts::{{closure}} (6,273x) [./target/valgrind/s4] + 51,361 ( 0.01%) 38 ( 0.00%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::from_elem (48x) [./target/valgrind/s4] + 3,696 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 162,341 ( 0.05%) . . . * ./elf/../sysdeps/x86_64/dl-machine.h:_dl_relocate_object + 112,203 ( 0.03%) . . . > ./elf/./elf/dl-lookup.c:_dl_lookup_symbol_x (178x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 66 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memcmp.c:bcmp (3x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 66 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove.c:memmove (3x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 48 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memset.c:memset (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 46 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memchr.c:memchr (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 46 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wmemchr.c:wmemchr (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 44 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memcpy.c:memcpy@@GLIBC_2.14 (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 42 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strlen.c:strlen (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 42 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memrchr.c:memrchr (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 42 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wcschr.c:wcschr (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 42 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strnlen.c:strnlen (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 38 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wmemset.c:wmemset (2x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 28 ( 0.00%) . . . > ./string/../sysdeps/x86/cacheinfo.c:__x86_cacheinfo (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 23 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/rawmemchr.c:rawmemchr (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 22 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/mempcpy.c:mempcpy (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 22 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wmemcmp.c:wmemcmp (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 21 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wcscmp.c:wcscmp (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 21 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strchrnul.c:strchrnul (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 21 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strrchr.c:rindex (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 19 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wcslen.c:wcslen (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 19 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wcsnlen.c:wcsnlen (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 19 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strchr.c:index (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strcpy.c:strcpy (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strncpy.c:strncpy (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/stpcpy.c:stpcpy (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strcat.c:strcat (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strcmp.c:strcmp (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strncmp.c:strncmp (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 17 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/stpncpy.c:stpncpy (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strncase.c:strncasecmp (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strncase_l.c:strncasecmp_l (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strpbrk.c:strpbrk (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strspn.c:strspn (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strcasecmp.c:strcasecmp (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./wcsmbs/../sysdeps/x86_64/multiarch/wcscpy.c:wcscpy (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strcspn.c:strcspn (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 7 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/strcasecmp_l.c:strcasecmp_l (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 6 ( 0.00%) . . . > ./elf/../sysdeps/x86/dl-get-cpu-features.c:__x86_cpu_features (1x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + + 161,468 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::builder::Builder::build + 537,156 ( 0.16%) 2,168 ( 0.27%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,033x) [./target/valgrind/s4] + + 161,392 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 161,338 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::push_alternate + + 385,392 ( 0.11%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 161,040 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state [./target/valgrind/s4] + 2,112 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::copy_matches (48x) [./target/valgrind/s4] + + 5,171,925 ( 1.49%) 9,430 ( 1.16%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract (975x) [./target/valgrind/s4] + 2,295,330 ( 0.66%) 7,281 ( 0.90%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (1,944x) [./target/valgrind/s4] + 160,832 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 [./target/valgrind/s4] + 2,464,002 ( 0.71%) 1,082 ( 0.13%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::union (1,583x) [./target/valgrind/s4] + 2,295,330 ( 0.66%) 7,281 ( 0.90%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (1,944x) [./target/valgrind/s4] + 1,430,857 ( 0.41%) 4,544 ( 0.56%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross (371x) [./target/valgrind/s4] + 8,957 ( 0.00%) . . . > ???:__rust_alloc (169x) [./target/valgrind/s4] + + 160,653 ( 0.05%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 159,504 ( 0.05%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::prefilter::Builder::build + + 155,051 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::parse::ParserI

::parse_set_class + 84,720 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 153,962 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:::visit_post + + 151,482 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 151,080 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::alternation + 1,897,666 ( 0.55%) 784 ( 0.10%) . . > ???:__rust_dealloc (18,936x) [./target/valgrind/s4] + 1,228,294 ( 0.35%) 1,828 ( 0.23%) 4 ( 1.29%) . > ???:__rust_alloc (18,867x) [./target/valgrind/s4] + + 2,114,167 ( 0.61%) 9,515 ( 1.18%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (3,873x) [./target/valgrind/s4] + 2,402 ( 0.00%) 10 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::visit_post (5x) + 148 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation'2 (1x) [./target/valgrind/s4] + 150,307 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::class [./target/valgrind/s4] + 718,057 ( 0.21%) 4,020 ( 0.50%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::class (2,425x) [./target/valgrind/s4] + 444,409 ( 0.13%) 555 ( 0.07%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::literal (3,879x) [./target/valgrind/s4] + 65,430 ( 0.02%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 (1,454x) [./target/valgrind/s4] + + 1,971,018 ( 0.57%) 320 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (2,824x) [./target/valgrind/s4] + 149,753 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_class_open [./target/valgrind/s4] + 850,317 ( 0.25%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open (2,824x) [./target/valgrind/s4] + 56,432 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,824x) [./target/valgrind/s4] + + 148,689 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 147,984 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state + + 6,454,312 ( 1.86%) 4,280 ( 0.53%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (5,577x) [./target/valgrind/s4] + 145,849 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop [./target/valgrind/s4] + 84,870 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,829x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 144,833 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 143,700 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 142,512 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:::drop + + 142,047 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::hir::Hir::concat + + 564,049 ( 0.16%) 385 ( 0.05%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 140,696 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions [./target/valgrind/s4] + 29,612 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::copy_matches (673x) [./target/valgrind/s4] + 7,398 ( 0.00%) 78 ( 0.01%) . . > ???:__rust_dealloc (48x) [./target/valgrind/s4] + + 138,679 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 137,771 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::drop + 2,000,868 ( 0.58%) 1,368 ( 0.17%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (270x) [./target/valgrind/s4] + + 5,540,132 ( 1.60%) 33,313 ( 4.11%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (674x) [./target/valgrind/s4] + 90,936 ( 0.03%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class (5,052x) + 50,832 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2,824x) [./target/valgrind/s4] + 17,091 ( 0.00%) 74 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:alloc::sync::Arc::drop_slow'2 (3x) + 14,116 ( 0.00%) 96 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::strategy::new (12x) + 7,693 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2x) [./target/valgrind/s4] + 3,220 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::literal::Extractor::extract'2 (322x) + 2,592 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::regex::Builder::build (162x) + 1,913 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (1x) [./target/valgrind/s4] + 560 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::literal::Extractor::extract (56x) + 168 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:std::panicking::try (1x) + 19 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:clap_builder::builder::command::Command::_do_parse (1x) + 19 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:clap_builder::builder::command::Command::_build_self (1x) + 18 ( 0.00%) . . . < src/bin/s4.rs:s4::processing_loop (1x) [./target/valgrind/s4] + 137,133 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::ops::drop::Drop>::drop [./target/valgrind/s4] + + 135,799 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::builder::Builder::build + 414,608 ( 0.12%) 940 ( 0.12%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (175x) [./target/valgrind/s4] + + 516,792 ( 0.15%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) [./target/valgrind/s4] + 135,552 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class_op [./target/valgrind/s4] + 169,440 ( 0.05%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (5,648x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 2,464,002 ( 0.71%) 1,082 ( 0.13%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (1,583x) [./target/valgrind/s4] + 1,035,803 ( 0.30%) 254 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract (864x) [./target/valgrind/s4] + 132,946 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::union [./target/valgrind/s4] + + 8,911,190 ( 2.57%) 20,413 ( 2.52%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::PreferenceTrie::minimize (177x) [./target/valgrind/s4] + 132,420 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::retain_mut [./target/valgrind/s4] + + 131,202 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter + + 131,177 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/alloc/layout.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle + +166,077,448 (47.98%) 350,340 (43.27%) 104 (33.55%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/regex.rs:regex_automata::meta::regex::Builder::build (81x) [./target/valgrind/s4] + 129,892 ( 0.04%) 15 ( 0.00%) . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:regex_automata::meta::strategy::new [./target/valgrind/s4] +101,781,410 (29.40%) 222,193 (27.44%) 99 (31.94%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (162x) [./target/valgrind/s4] +33,494,575 ( 9.68%) 58,000 ( 7.16%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::extract (13x) [./target/valgrind/s4] +11,499,724 ( 3.32%) 37,942 ( 4.69%) 1 ( 0.32%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (175x) [./target/valgrind/s4] + 7,580,638 ( 2.19%) 16,769 ( 2.07%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::prefixes (16x) [./target/valgrind/s4] + 2,500,469 ( 0.72%) 2,480 ( 0.31%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::OnePass::new (81x) [./target/valgrind/s4] + 2,457,849 ( 0.71%) 5,107 ( 0.63%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::suffixes (13x) [./target/valgrind/s4] + 1,130,520 ( 0.33%) 606 ( 0.07%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::Hybrid::new (81x) [./target/valgrind/s4] + 233,455 ( 0.07%) 1,126 ( 0.14%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (13x) [./target/valgrind/s4] + 83,760 ( 0.02%) 39 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::ReverseHybrid::new (13x) [./target/valgrind/s4] + 47,980 ( 0.01%) 4 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (175x) [./target/valgrind/s4] + 44,317 ( 0.01%) 111 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::BoundedBacktracker::new (81x) [./target/valgrind/s4] + 43,963 ( 0.01%) 111 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::PikeVM::new (81x) [./target/valgrind/s4] + 2,470 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (26x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 458 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/literal.rs:regex_automata::meta::literal::alternation_literals (16x) [./target/valgrind/s4] + 351 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::configure (13x) [./target/valgrind/s4] + + 129,546 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::visit_post + 885,640 ( 0.26%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 (16,096x) [./target/valgrind/s4] + 597,388 ( 0.17%) 3,424 ( 0.42%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::repetition (1,885x) [./target/valgrind/s4] + 209,050 ( 0.06%) 1,131 ( 0.14%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::capture (693x) [./target/valgrind/s4] + 3,555 ( 0.00%) 10 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::negate (6x) [./target/valgrind/s4] + 2,402 ( 0.00%) 10 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::class (5x) [./target/valgrind/s4] + 820 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::new (5x) [./target/valgrind/s4] + + 129,543 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::Extractor::cross + +22,564,526 ( 6.52%) 16,357 ( 2.02%) 25 ( 8.06%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (538x) [./target/valgrind/s4] + 44,665 ( 0.01%) 36 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (1x) [./target/valgrind/s4] + 129,293 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter [./target/valgrind/s4] +21,009,369 ( 6.07%) 14,398 ( 1.78%) 25 ( 8.06%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (6,614x) [./target/valgrind/s4] + 1,158,758 ( 0.33%) 1,837 ( 0.23%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (13,228x) [./target/valgrind/s4] + + 812,915 ( 0.23%) 1,154 ( 0.14%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (1,713x) [./target/valgrind/s4] + 129,003 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition [./target/valgrind/s4] + 152,445 ( 0.04%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,713x) [./target/valgrind/s4] + 71,160 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (3,558x) [./target/valgrind/s4] + + 128,797 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 128,658 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 126,339 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::hir::Hir::concat + + 124,519 ( 0.04%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + + 377,056 ( 0.11%) 2,884 ( 0.36%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_alloc_zeroed (1,316x) + 2,130 ( 0.00%) 10 ( 0.00%) . . < ???:0x0000000004898400 (9x) [???] + 453 ( 0.00%) 2 ( 0.00%) . . < ./elf/../include/rtld-malloc.h:_dl_allocate_tls (2x) + 123,928 ( 0.04%) 2,620 ( 0.32%) . . * ./malloc/./malloc/malloc.c:calloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 216,507 ( 0.06%) 276 ( 0.03%) . . > ./malloc/./malloc/malloc.c:_int_malloc (1,327x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 14,295 ( 0.00%) . . . > ???:0x0000000004898670 (224x) [???] + + 1,000,419 ( 0.29%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range (3,549x) [./target/valgrind/s4] + 122,304 ( 0.04%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item [./target/valgrind/s4] + 481,513 ( 0.14%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_escape (1,612x) [./target/valgrind/s4] + 189,600 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (9,360x) [./target/valgrind/s4] + 173,833 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,937x) [./target/valgrind/s4] + + 1,737,105 ( 0.50%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle (48x) [./target/valgrind/s4] + 120,808 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::remap [./target/valgrind/s4] + 1,488,569 ( 0.43%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:::remap (48x) [./target/valgrind/s4] + + 120,297 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + 1,378,264 ( 0.40%) 526 ( 0.06%) 10 ( 3.23%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (16,950x) [./target/valgrind/s4] + + 119,071 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::literal::Extractor::cross + + 1,158,758 ( 0.33%) 1,837 ( 0.23%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (13,228x) [./target/valgrind/s4] + 119,052 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch [./target/valgrind/s4] + 947,110 ( 0.27%) 1,837 ( 0.23%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (13,228x) [./target/valgrind/s4] + + 1,874,581 ( 0.54%) 8,392 ( 1.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract (111x) [./target/valgrind/s4] + 1,430,857 ( 0.41%) 4,544 ( 0.56%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (371x) [./target/valgrind/s4] + 118,893 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross [./target/valgrind/s4] + 53,226 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::cross_preamble (482x) [./target/valgrind/s4] + + 118,817 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:core::hash::BuildHasher::hash_one + + 922,916 ( 0.27%) 2,262 ( 0.28%) 1 ( 0.32%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (693x) [./target/valgrind/s4] + 118,617 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group [./target/valgrind/s4] + 157,035 ( 0.05%) 835 ( 0.10%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (693x) [./target/valgrind/s4] + 106,628 ( 0.03%) 584 ( 0.07%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Alternation::into_ast (512x) [./target/valgrind/s4] + 98,475 ( 0.03%) 29 ( 0.00%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (693x) [./target/valgrind/s4] + 70,354 ( 0.02%) 64 ( 0.01%) . . > ???:__rust_dealloc (693x) [./target/valgrind/s4] + 61,445 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (693x) [./target/valgrind/s4] + 55,943 ( 0.02%) 138 ( 0.02%) . . > ???:__rust_alloc (693x) [./target/valgrind/s4] + 13,860 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (693x) [./target/valgrind/s4] + + 118,145 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions + + 117,889 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + 6,041,312 ( 1.75%) 40,231 ( 4.97%) . . > ???:__rust_dealloc (44,977x) [./target/valgrind/s4] + + 116,685 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 116,004 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 115,784 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::push_class_open + + 114,654 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 183,375 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (6,273x) [./target/valgrind/s4] + 114,030 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_both_starts::{{closure}} [./target/valgrind/s4] + + 1,320,528 ( 0.38%) 7,829 ( 0.97%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (5,376x) + 2,378 ( 0.00%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::meta::reverse_inner::extract (13x) + 164 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::compiler::Compiler::c (2x) + 113,250 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::allocate_in [./target/valgrind/s4] + + 112,816 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:::visit_post + 773,760 ( 0.22%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48,360x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 112,453 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::hybrid::dfa::Lazy::set_transition + + 125,120 ( 0.04%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (3,680x) [./target/valgrind/s4] + 110,400 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::alphabet::ByteClassSet::set_range [./target/valgrind/s4] + + 111,580 ( 0.03%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (4,916x) [./target/valgrind/s4] + 110,388 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs: as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre [./target/valgrind/s4] + + 110,136 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::parse::ParserI

::push_class_open + + 158,544 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 109,152 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::add_unanchored_start_state_loop [./target/valgrind/s4] + + 107,231 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 104,950 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::hir::Hir::concat + + 104,424 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::literal::Extractor::union + + 104,344 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::visit_pre + + 103,094 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle + + 102,336 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::visitor::visit + + 101,450 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:::case_fold_simple + + 481,513 ( 0.14%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item (1,612x) [./target/valgrind/s4] + 100,338 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_escape [./target/valgrind/s4] + 286,651 ( 0.08%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (3,219x) [./target/valgrind/s4] + 64,480 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (3,224x) [./target/valgrind/s4] + 16,069 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/lib.rs:regex_syntax::is_meta_character (1,607x) [./target/valgrind/s4] + 1,085 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_perl_class (5x) [./target/valgrind/s4] + + 99,397 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::push_alternate + 849,672 ( 0.25%) 4,361 ( 0.54%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,445x) [./target/valgrind/s4] + + 99,219 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 99,214 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 99,102 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/sip.rs:core::hash::BuildHasher::hash_one + 203,008 ( 0.06%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/sip.rs: as core::hash::Hasher>::write (4,055x) [./target/valgrind/s4] + + 98,274 ( 0.03%) . . . * ./elf/./elf/do-rel.h:_dl_relocate_object + + 93,597 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} + + 92,423 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::ast::parse::ParserI

::bump + + 92,423 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::ast::parse::ParserI

::bump + + 92,423 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/traits.rs:regex_syntax::ast::parse::ParserI

::bump + + 92,342 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/mod.rs:regex_syntax::ast::parse::ParserI

::bump + + 89,458 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/map.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 89,367 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::bump_space + + 89,260 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 89,172 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::builder::Builder::add + + 89,172 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_automata::nfa::thompson::builder::Builder::add + + 89,172 ( 0.03%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_automata::nfa::thompson::builder::Builder::add + + 89,094 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/search.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} + + 85,074 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (2,578x) [./target/valgrind/s4] + 2,673 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::finish (81x) [./target/valgrind/s4] + 87,747 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::HirFrame::unwrap_expr [./target/valgrind/s4] + + 938,404 ( 0.27%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (841x) [./target/valgrind/s4] + 86,769 ( 0.03%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class [./target/valgrind/s4] + 627,895 ( 0.18%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (7,055x) [./target/valgrind/s4] + 141,420 ( 0.04%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (7,071x) [./target/valgrind/s4] + 31,216 ( 0.01%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::ast::ClassAsciiKind::from_name (770x) [./target/valgrind/s4] + + 1,493,037 ( 0.43%) 1,869 ( 0.23%) 1 ( 0.32%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::drop (2,604x) + 530,506 ( 0.15%) 1,090 ( 0.13%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::literal::Extractor::union (2,443x) + 112,977 ( 0.03%) 144 ( 0.02%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::prefilter::prefixes (15x) + 5,220 ( 0.00%) 12 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::prefilter::suffixes (12x) + 86,258 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_extend.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend [./target/valgrind/s4] + + 85,480 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:::remap + + 84,720 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class_op + 84,720 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 83,802 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::drop + 4,073,644 ( 1.18%) 27,194 ( 3.36%) . . > ???:__rust_dealloc (27,622x) [./target/valgrind/s4] + 15,639 ( 0.00%) 52 ( 0.01%) . . > ???:__rust_alloc (208x) [./target/valgrind/s4] + + 178,870 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (1,120x) [./target/valgrind/s4] + 83,750 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:regex_syntax::unicode::SimpleCaseFolder::overlaps [./target/valgrind/s4] + + 6,424,936 ( 1.86%) 4,280 ( 0.53%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (2,753x) [./target/valgrind/s4] + 172,264 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) [./target/valgrind/s4] + 83,584 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place [./target/valgrind/s4] + 6,454,312 ( 1.86%) 4,280 ( 0.53%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop (5,577x) [./target/valgrind/s4] + 50,832 ( 0.01%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::ops::drop::Drop>::drop (2,824x) [./target/valgrind/s4] + + 83,510 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_syntax::unicode::SimpleCaseFolder::overlaps + + 82,990 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::Hir::alternation + 8,154 ( 0.00%) 30 ( 0.00%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (22x) [./target/valgrind/s4] + + 81,681 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::Concat::into_ast + 3,237,694 ( 0.94%) 22,584 ( 2.79%) . . > ???:__rust_alloc (15,786x) [./target/valgrind/s4] + 92,109 ( 0.03%) 47 ( 0.01%) . . > ???:__rust_dealloc (917x) [./target/valgrind/s4] + + 81,164 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::literal::Extractor::cross + 223,949 ( 0.06%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (13,790x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 78,752 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::hir::literal::PreferenceTrie::insert + + 843,071 ( 0.24%) 314 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group (586x) [./target/valgrind/s4] + 78,457 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name [./target/valgrind/s4] + 304,647 ( 0.09%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (3,423x) [./target/valgrind/s4] + 136,920 ( 0.04%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (6,846x) [./target/valgrind/s4] + + 77,397 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_pre + 318,987 ( 0.09%) 1,256 ( 0.16%) 2 ( 0.65%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (297x) [./target/valgrind/s4] + 79,837 ( 0.02%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_from_iter.rs: as alloc::vec::spec_from_iter::SpecFromIter>>::from_iter (2,753x) [./target/valgrind/s4] + + 77,030 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::literal + 818,675 ( 0.24%) 20 ( 0.00%) . . > ???:__rust_alloc (15,406x) [./target/valgrind/s4] + + 75,345 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:alloc::vec::Vec::retain_mut + 8,340,649 ( 2.41%) 17,872 ( 2.21%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::PreferenceTrie::insert (16,878x) [./target/valgrind/s4] + + 74,969 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 597,388 ( 0.17%) 3,424 ( 0.42%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::visit_post (1,885x) + 24,658 ( 0.01%) 136 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_automata::meta::reverse_inner::flatten'2 (74x) + 24,656 ( 0.01%) 136 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_automata::meta::reverse_inner::flatten (75x) + 74,478 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::repetition [./target/valgrind/s4] + + 1,648,306 ( 0.48%) 7,175 ( 0.89%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten (1,589x) [./target/valgrind/s4] + 442,251 ( 0.13%) 2,118 ( 0.26%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (653x) [./target/valgrind/s4] + 74,368 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 [./target/valgrind/s4] + 442,251 ( 0.13%) 2,118 ( 0.26%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (653x) [./target/valgrind/s4] + 170,673 ( 0.05%) 68 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (12x) [./target/valgrind/s4] + 158,297 ( 0.05%) 310 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (83x) [./target/valgrind/s4] + 11,910 ( 0.00%) 62 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Repetition::with (74x) [./target/valgrind/s4] + 4,518 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (2,259x) [./target/valgrind/s4] + + 73,872 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ops/range.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 73,728 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 73,440 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 350,208 ( 0.10%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 71,568 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/prefilter.rs:aho_corasick::util::prefilter::Builder::build [./target/valgrind/s4] + 1,152 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/api.rs:aho_corasick::packed::api::Builder::build (48x) [./target/valgrind/s4] + + 71,340 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:::case_fold_simple + + 71,265 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 71,218 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::literal::Extractor::cross + + 70,940 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_syntax::unicode::SimpleCaseFolder::mapping + + 69,137 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/set_len_on_drop.rs:::drop + + 68,872 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class + + 68,597 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:::drop + + 67,893 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/id.rs:regex_automata::hybrid::dfa::Lazy::set_transition + + 815,578 ( 0.24%) 1,530 ( 0.19%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1,144x) [./target/valgrind/s4] + 154,838 ( 0.04%) 312 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::finish (126x) [./target/valgrind/s4] + 67,106 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from [./target/valgrind/s4] + 475,225 ( 0.14%) 899 ( 0.11%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (1,553x) [./target/valgrind/s4] + + 66,704 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop + 165,480 ( 0.05%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (5,516x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 83,890 ( 0.02%) 814 ( 0.10%) . . > ???:__rust_dealloc (596x) [./target/valgrind/s4] + 54,341 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop'2 (2,758x) [./target/valgrind/s4] + 14,700 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/drain.rs: as core::ops::drop::Drop>::drop (525x) [./target/valgrind/s4] + 2,414 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (71x) [./target/valgrind/s4] + + 66,646 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/accum.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 444,409 ( 0.13%) 555 ( 0.07%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::class (3,879x) [./target/valgrind/s4] + 3,307 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Class::literal (193x) [./target/valgrind/s4] + 66,562 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::literal [./target/valgrind/s4] + + 66,473 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::literal::PreferenceTrie::minimize + + 66,205 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 66,140 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_automata::nfa::thompson::compiler::Compiler::patch + + 1,055,517 ( 0.30%) 771 ( 0.10%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (1,451x) [./target/valgrind/s4] + 66,131 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::compile_transition [./target/valgrind/s4] + 941,687 ( 0.27%) 771 ( 0.10%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (1,451x) [./target/valgrind/s4] + + 65,881 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 1,447,519 ( 0.42%) 689 ( 0.09%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_group (713x) [./target/valgrind/s4] + 65,804 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group [./target/valgrind/s4] + 843,071 ( 0.24%) 314 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (586x) [./target/valgrind/s4] + 223,447 ( 0.06%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (2,511x) [./target/valgrind/s4] + 52,898 ( 0.02%) 36 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::empty (693x) [./target/valgrind/s4] + 43,132 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,159x) [./target/valgrind/s4] + 16,800 ( 0.00%) 20 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_flags (20x) [./target/valgrind/s4] + 12,834 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (713x) [./target/valgrind/s4] + + 65,535 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::ast::visitor::visit + + 79,837 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_pre (2,753x) + 2,059 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_class_set_item_pre (71x) + 145 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::TranslatorI::hir_perl_unicode_class (5x) [./target/valgrind/s4] + 65,067 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_from_iter.rs: as alloc::vec::spec_from_iter::SpecFromIter>>::from_iter [./target/valgrind/s4] + + 941,687 ( 0.27%) 771 ( 0.10%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::compile_transition (1,451x) [./target/valgrind/s4] + 249,472 ( 0.07%) 240 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (162x) [./target/valgrind/s4] + 65,035 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state [./target/valgrind/s4] + + 64,329 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 64,329 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_automata::nfa::thompson::nfa::Inner::add + + 63,785 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::literal::PreferenceTrie::insert + 2,845,827 ( 0.82%) 12,835 ( 1.59%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (8,722x) [./target/valgrind/s4] + + 63,772 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/mem/manually_drop.rs:regex_syntax::hir::Hir::concat + + 63,716 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::push_alternate + + 63,098 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2,726x) [./target/valgrind/s4] + 62,706 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 [./target/valgrind/s4] + 364 ( 0.00%) . . . > ???:__rust_dealloc (4x) [./target/valgrind/s4] + + 62,654 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs:::next + + 2,448,763 ( 0.71%) 2,399 ( 0.30%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::OnePass::new (81x) [./target/valgrind/s4] + 62,362 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::Builder::build_from_nfa [./target/valgrind/s4] + 1,055,517 ( 0.30%) 771 ( 0.10%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::compile_transition (1,451x) [./target/valgrind/s4] + 249,472 ( 0.07%) 240 ( 0.03%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (162x) [./target/valgrind/s4] + 234,891 ( 0.07%) 260 ( 0.03%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push (2,672x) [./target/valgrind/s4] + 103,863 ( 0.03%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::remap (1x) [./target/valgrind/s4] + 1,956 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::swap (1x) [./target/valgrind/s4] + 648 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::NFA::patterns (81x) [./target/valgrind/s4] + 184 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::new (1x) [./target/valgrind/s4] + 65 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 62,232 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions + + 62,212 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:aho_corasick::nfa::noncontiguous::Builder::build + + 61,632 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::Hir::concat + 264,180 ( 0.08%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (15,408x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 61,629 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 61,624 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::Hir::literal + + 60,711 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::literal::Seq::optimize_by_preference + +31,759,436 ( 9.17%) 112,458 (13.89%) 71 (22.90%) . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::raw_vec::finish_grow (44,076x) + 2,565,036 ( 0.74%) 29,826 ( 3.68%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:::visit_post (14,913x) + 250,063 ( 0.07%) 2,906 ( 0.36%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::class (1,454x) + 62,623 ( 0.02%) 599 ( 0.07%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::vec::Vec::shrink_to_fit (211x) + 60,654 ( 0.02%) . . . * ???:__rust_realloc [./target/valgrind/s4] +34,576,504 ( 9.99%) 145,789 (18.00%) 71 (22.90%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/alloc.rs:__rdl_realloc (60,654x) [./target/valgrind/s4] + + 59,783 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle + + 64,743 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (4,916x) [./target/valgrind/s4] + 59,560 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_pre [./target/valgrind/s4] + + 91,043 ( 0.03%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (16,112x) [./target/valgrind/s4] + 58 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (10x) [./target/valgrind/s4] + 58,857 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next [./target/valgrind/s4] + + 58,660 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/alloc/layout.rs:regex_automata::nfa::thompson::builder::Builder::build + + 58,302 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter + + 58,035 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_automata::hybrid::dfa::Builder::build_from_nfa + + 57,858 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::literal::PreferenceTrie::minimize + + 57,781 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa + + 57,739 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::Properties::alternation + + 57,394 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place + 344,898 ( 0.10%) 575 ( 0.07%) . . > ???:__rust_dealloc (3,312x) [./target/valgrind/s4] + + 57,180 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::hir::Hir::alternation + + 56,861 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::compiler::Compiler::c + + 56,761 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + +86,288,458 (24.93%) 201,659 (24.90%) 86 (27.74%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (1,386x) [./target/valgrind/s4] + 56,133 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 [./target/valgrind/s4] +85,524,273 (24.71%) 200,351 (24.74%) 85 (27.42%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (1,386x) [./target/valgrind/s4] + 181,991 ( 0.05%) 410 ( 0.05%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add_capture_start (693x) [./target/valgrind/s4] + 49,896 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (1,386x) [./target/valgrind/s4] + + 56,132 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::util::remapper::Remapper::remap + + 56,022 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/into_iter.rs:regex_syntax::hir::Hir::alternation + +83,401,196 (24.09%) 191,532 (23.65%) 87 (28.06%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap (175x) [./target/valgrind/s4] + 33,110 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (110x) [./target/valgrind/s4] + 55,566 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c [./target/valgrind/s4] +83,118,552 (24.01%) 191,492 (23.65%) 87 (28.06%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (2,840x) [./target/valgrind/s4] + 98,080 ( 0.03%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (2,671x) [./target/valgrind/s4] + 44,665 ( 0.01%) 36 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1x) [./target/valgrind/s4] + 1,210 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (220x) [./target/valgrind/s4] + 574 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (287x) [./target/valgrind/s4] + 440 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassBytes::iter (110x) [./target/valgrind/s4] + 336 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassBytes::ranges (112x) [./target/valgrind/s4] + 220 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytesRange::end (110x) [./target/valgrind/s4] + 220 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytesRange::start (110x) [./target/valgrind/s4] + 58 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (10x) [./target/valgrind/s4] + 49 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (1x) [./target/valgrind/s4] + 16 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::end (8x) [./target/valgrind/s4] + 16 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::start (8x) [./target/valgrind/s4] + 14 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::ClassUnicode::is_ascii (2x) [./target/valgrind/s4] + 8 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassUnicode::iter (2x) [./target/valgrind/s4] + + 87,215 ( 0.03%) . . . < ./stdio-common/./stdio-common/isoc99_sscanf.c:__isoc99_sscanf (51x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 55,090 ( 0.02%) . . . * ./stdio-common/./stdio-common/vfscanf-internal.c:__vfscanf_internal [/usr/lib/x86_64-linux-gnu/libc.so.6] + 26,260 ( 0.01%) . . . > ./stdlib/../stdlib/strtol.c:__strtoul_internal (102x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 3,876 ( 0.00%) . . . > ./libio/./libio/genops.c:_IO_sputbackc (204x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 510 ( 0.00%) . . . > ./nptl/./nptl/libc-cleanup.c:__libc_cleanup_push_defer (51x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 408 ( 0.00%) . . . > ./nptl/./nptl/libc-cleanup.c:__libc_cleanup_pop_restore (51x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 80,146 ( 0.02%) . . . < ./elf/./elf/dl-lookup.c:_dl_lookup_symbol_x (189x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 55,068 ( 0.02%) . . . * ./elf/./elf/dl-lookup.c:do_lookup_x [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 22,502 ( 0.01%) . . . > ./elf/./elf/dl-lookup.c:check_match (191x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + + 55,036 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:::drop + + 55,017 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 54,838 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 54,466 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs: as core::ops::drop::Drop>::drop + + 718,057 ( 0.21%) 4,020 ( 0.50%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::class (2,425x) [./target/valgrind/s4] + 51,588 ( 0.01%) 296 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_automata::meta::reverse_inner::flatten'2 (159x) + 18,929 ( 0.01%) 50 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::dot (110x) [./target/valgrind/s4] + 9,392 ( 0.00%) 48 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_automata::meta::reverse_inner::flatten (34x) + 54,450 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::class [./target/valgrind/s4] + + 54,341 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop (2,758x) + 1,278 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (71x) [./target/valgrind/s4] + 54,044 ( 0.02%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop'2 [./target/valgrind/s4] + + 53,115 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::hir::Properties::alternation + + 52,907 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::push_alternate + + 52,603 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 52,360 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments + + 52,037 ( 0.02%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::literal::Extractor::cross + + 51,876 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/vec_deque/mod.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions + 78,557 ( 0.02%) 307 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/vec_deque/mod.rs:alloc::collections::vec_deque::VecDeque::grow (180x) [./target/valgrind/s4] + + 68,927 ( 0.02%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (1,318x) + 22,896 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:aho_corasick::packed::api::Builder::build (48x) + 13,251 ( 0.00%) 12 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:itertools::Itertools::sorted_by (3x) + 11,215 ( 0.00%) 14 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (5x) + 44 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:s4lib::readers::syslinereader::SyslineReader::summary (2x) + 22 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:s4lib::readers::syslinereader::SyslineReader::dt_patterns_analysis (1x) + 51,691 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/sort.rs:core::slice::sort::merge_sort [./target/valgrind/s4] + 38,128 ( 0.01%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/sort.rs:core::slice::sort::insertion_sort_shift_left (1,334x) [./target/valgrind/s4] + + 51,349 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions + + 51,343 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:::visit_pre + + 51,030 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 50,561 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::builder::Builder::build + 284,644 ( 0.08%) . . . > ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms (175x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 416,983 ( 0.12%) 786 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:::fmt (1,863x) [./target/valgrind/s4] + 50,301 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:core::fmt::Formatter::pad [./target/valgrind/s4] + 364,819 ( 0.11%) 786 ( 0.10%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::write_str (1,863x) [./target/valgrind/s4] + + 218,649 ( 0.06%) 624 ( 0.08%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (2,624x) [./target/valgrind/s4] + 50,077 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state [./target/valgrind/s4] + + 5,504,750 ( 1.59%) . . . < ./malloc/./malloc/malloc.c:_int_realloc (24,838x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 1,154 ( 0.00%) . . . < ./libio/./libio/iogetdelim.c:getdelim (55x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 42 ( 0.00%) . . . < ./nptl/./nptl/pthread_attr_setaffinity.c:pthread_attr_setaffinity_np@@GLIBC_2.32 (3x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 24 ( 0.00%) . . . < ./malloc/./malloc/scratch_buffer_dupfree.c:__libc_scratch_buffer_dupfree (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 49,794 ( 0.01%) . . . * ???:0x0000000004898620 [???] + 5,456,176 ( 1.58%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (24,897x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 49,790 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_class_set_item_post + 257,094 ( 0.07%) 293 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,978x) [./target/valgrind/s4] + 128,502 ( 0.04%) 403 ( 0.05%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_from_iter.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter (770x) [./target/valgrind/s4] + + 49,780 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::cross + 1,481,481 ( 0.43%) 9,634 ( 1.19%) . . > ???:__rust_alloc (7,320x) [./target/valgrind/s4] + 692,266 ( 0.20%) 3,302 ( 0.41%) . . > ???:__rust_dealloc (5,904x) [./target/valgrind/s4] + + 49,564 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::util::remapper::Remapper::remap + + 49,542 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/mod.rs:regex_syntax::hir::Hir::concat + + 318,341 ( 0.09%) 40 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs:regex_automata::util::captures::GroupInfo::new (586x) + 175,007 ( 0.05%) 397 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs:regex_automata::hybrid::dfa::Lazy::init_cache (468x) + 139,374 ( 0.04%) 16 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (174x) + 15,013 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) + 881 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs:s4::processing_loop (4x) + 49,058 ( 0.01%) . . . * /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::map::HashMap::insert [./target/valgrind/s4] + 304,623 ( 0.09%) 102 ( 0.01%) . . > /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs:hashbrown::raw::RawTable::insert (921x) [./target/valgrind/s4] + 245,756 ( 0.07%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/mod.rs:core::hash::BuildHasher::hash_one (1,269x) [./target/valgrind/s4] + 89 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 48,708 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::visit_class_set_item_post + + 47,921 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::builder::Builder::build + 155,491 ( 0.04%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (12,024x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 47,787 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_syntax::ast::parse::ParserI

::push_alternate + + 46,486 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:aho_corasick::nfa::noncontiguous::Builder::build + 8,544 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (96x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 46,444 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/iterator.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 46,333 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 46,295 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/map.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile + + 934,285 ( 0.27%) 1,530 ( 0.19%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (1,144x) [./target/valgrind/s4] + 45,676 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::add [./target/valgrind/s4] + 815,578 ( 0.24%) 1,530 ( 0.19%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1,144x) [./target/valgrind/s4] + + 45,262 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::hybrid::dfa::Lazy::set_transition + + 44,988 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/drain.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 42,842 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::builder::Builder::build + 2,882,121 ( 0.83%) 20,341 ( 2.51%) . . > ???:__rust_alloc (12,199x) [./target/valgrind/s4] + 76,459 ( 0.02%) 356 ( 0.04%) . . > ???:__rust_alloc_zeroed (175x) [./target/valgrind/s4] + 74,944 ( 0.02%) 710 ( 0.09%) . . > ???:__rust_dealloc (525x) [./target/valgrind/s4] + + 42,600 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:regex_syntax::unicode::SimpleCaseFolder::mapping + + 42,588 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range + + 42,538 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class + 434,983 ( 0.13%) 888 ( 0.11%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (2,914x) [./target/valgrind/s4] + + 42,264 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::remapper::onepass::::remap + + 165,920 ( 0.05%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::case_fold_simple (1,120x) [./target/valgrind/s4] + 41,730 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:regex_syntax::unicode::SimpleCaseFolder::mapping [./target/valgrind/s4] + + 41,703 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:::visit_class_set_item_post + + 41,671 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:regex_syntax::hir::interval::IntervalSet::canonicalize + + 5,280,529 ( 1.53%) 17,926 ( 2.21%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_automata::meta::reverse_inner::prefilter (44x) + 4,898,468 ( 1.42%) 10,042 ( 1.24%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_automata::util::prefilter::prefixes (16x) + 3,807 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_automata::util::prefilter::suffixes (13x) + 41,351 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::optimize_by_preference [./target/valgrind/s4] +10,039,745 ( 2.90%) 27,968 ( 3.45%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::PreferenceTrie::minimize (177x) [./target/valgrind/s4] + + 166,504 ( 0.05%) 302 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (1,394x) [./target/valgrind/s4] + 40,426 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::add_match [./target/valgrind/s4] + + 234,891 ( 0.07%) 260 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::Builder::build_from_nfa (2,672x) [./target/valgrind/s4] + 40,291 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push [./target/valgrind/s4] + + 39,840 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:aho_corasick::util::prefilter::Builder::build + + 39,772 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 255,431 ( 0.07%) 102 ( 0.01%) . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs:hashbrown::raw::RawTable::insert (347x) [./target/valgrind/s4] + 39,710 ( 0.01%) . . . * /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs:hashbrown::raw::RawTable::reserve_rehash [./target/valgrind/s4] + + 39,399 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition + + 39,283 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/set_len_on_drop.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 112,203 ( 0.03%) . . . < ./elf/../sysdeps/x86_64/dl-machine.h:_dl_relocate_object (178x) + 4,019 ( 0.00%) . . . < ./elf/./elf/dl-runtime.c:_dl_fixup (6x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 2,280 ( 0.00%) . . . < ./elf/./elf/dl-minimal.c:lookup_malloc_symbol (4x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 703 ( 0.00%) . . . < ./elf/./elf/dl-sym.c:_dl_sym (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 39,059 ( 0.01%) . . . * ./elf/./elf/dl-lookup.c:_dl_lookup_symbol_x [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 80,146 ( 0.02%) . . . > ./elf/./elf/dl-lookup.c:do_lookup_x (189x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + + 38,786 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/alloc/layout.rs:alloc::sync::arcinner_layout_for_value_layout + + 38,180 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::Hir::alternation + + 38,142 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::dfa::Builder::finish_build_both_starts::{{closure}} + + 37,436 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class + 90,936 ( 0.03%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::ops::drop::Drop>::drop (5,052x) [./target/valgrind/s4] + 84,720 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 37,104 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state + + 37,008 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state + + 36,931 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::hir::literal::Extractor::cross + + 36,864 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 36,864 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state + + 36,780 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_syntax::ast::visitor::visit + + 36,720 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open + + 36,719 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open + + 311,723 ( 0.09%) 1,642 ( 0.20%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (882x) [./target/valgrind/s4] + 249,266 ( 0.07%) 896 ( 0.11%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start (953x) [./target/valgrind/s4] + 36,700 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::DFA::set_matches [./target/valgrind/s4] + + 36,668 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 36,155 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 304,623 ( 0.09%) 102 ( 0.01%) . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::map::HashMap::insert (921x) [./target/valgrind/s4] + 597 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:s4::processing_loop (12x) + 135 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::set::HashSet::insert (3x) + 36,060 ( 0.01%) . . . * /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs:hashbrown::raw::RawTable::insert [./target/valgrind/s4] + 255,431 ( 0.07%) 102 ( 0.01%) . . > /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs:hashbrown::raw::RawTable::reserve_rehash (347x) [./target/valgrind/s4] + + 35,336 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::hir::literal::Extractor::cross + 115,090 ( 0.03%) . . . > ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S:__memcmp_avx2_movbe (5,251x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 35,298 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::Hir::concat + + 35,292 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/range.rs:regex_automata::nfa::thompson::map::Utf8SuffixMap::clear + + 34,760 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_automata::meta::strategy::new + 1,311 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (13x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 34,437 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::drop + + 34,099 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::Extractor::extract'2 + 536,036 ( 0.15%) 2,868 ( 0.35%) . . > ???:__rust_alloc (5,025x) [./target/valgrind/s4] + 213,472 ( 0.06%) 406 ( 0.05%) . . > ???:__rust_dealloc (2,035x) [./target/valgrind/s4] + + 928,541 ( 0.27%) 2,240 ( 0.28%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::ClassUnicode::try_case_fold_simple (1,120x) + 14,700 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:::visit_class_set_item_post (70x) + 33,830 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::case_fold_simple [./target/valgrind/s4] + 165,920 ( 0.05%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:regex_syntax::unicode::SimpleCaseFolder::mapping (1,120x) [./target/valgrind/s4] + + 1,561,216 ( 0.45%) 691 ( 0.09%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (713x) [./target/valgrind/s4] + 33,624 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_group [./target/valgrind/s4] + 1,447,519 ( 0.42%) 689 ( 0.09%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group (713x) [./target/valgrind/s4] + 14,244 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (713x) [./target/valgrind/s4] + + 33,420 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/search.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new + + 32,544 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Properties::repetition + + 32,264 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:::visit_post + + 32,192 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs:::visit_post + + 31,943 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/map.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 31,858 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::ast::parse::ParserI

::push_alternate + + 31,858 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::visitor::visit + + 31,648 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/sparse_set.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push + + 31,554 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter + + 31,335 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 30,782 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs:regex_automata::dfa::onepass::InternalBuilder::compile_transition + + 245,756 ( 0.07%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::map::HashMap::insert (1,269x) [./target/valgrind/s4] + 137,878 ( 0.04%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::raw::RawTable::reserve_rehash (748x) + 80,442 ( 0.02%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:regex_automata::util::captures::GroupInfo::new (505x) + 47,138 ( 0.01%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (218x) + 10,185 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:regex_automata::util::captures::Captures::get_group_by_name (65x) + 10,134 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) + 1,869 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:s4::processing_loop (21x) + 267 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::set::HashSet::insert (3x) + 267 ( 0.00%) . . . < /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs:hashbrown::set::HashSet::remove (3x) + 30,750 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/mod.rs:core::hash::BuildHasher::hash_one [./target/valgrind/s4] + 57,495 ( 0.02%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/sip.rs: as core::hash::Hasher>::write (1,637x) [./target/valgrind/s4] + + 30,008 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Properties::class + + 249,373 ( 0.07%) 596 ( 0.07%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_exactly (210x) [./target/valgrind/s4] + 120,226 ( 0.03%) 248 ( 0.03%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (134x) [./target/valgrind/s4] + 29,858 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_concat [./target/valgrind/s4] + 326,403 ( 0.09%) 844 ( 0.10%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (580x) [./target/valgrind/s4] + 8,496 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (236x) [./target/valgrind/s4] + + 29,646 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter.rs:regex_syntax::hir::interval::IntervalSet::canonicalize + + 29,568 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::next + + 475,225 ( 0.14%) 899 ( 0.11%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1,553x) [./target/valgrind/s4] + 51,219 ( 0.01%) 110 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::finish (126x) [./target/valgrind/s4] + 29,407 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile [./target/valgrind/s4] + + 29,272 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new + 79,418 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S:__memcmp_avx2_movbe (3,659x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 29,234 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::hir::literal::Extractor::union + + 28,854 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add + 56,690 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (4,122x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 620,064 ( 0.18%) 3,085 ( 0.38%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/api.rs:aho_corasick::packed::api::Builder::extend (1,394x) [./target/valgrind/s4] + 28,240 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/pattern.rs:aho_corasick::packed::pattern::Patterns::add [./target/valgrind/s4] + + 364,819 ( 0.11%) 786 ( 0.10%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:core::fmt::Formatter::pad (1,863x) [./target/valgrind/s4] + 782 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:core::fmt::Formatter::pad_integral (6x) [./target/valgrind/s4] + 86 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:core::fmt::write (2x) [./target/valgrind/s4] + 28,065 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::write_str [./target/valgrind/s4] + + 27,934 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::drop + + 27,830 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_automata::meta::reverse_inner::flatten'2 + 666,828 ( 0.19%) 3,616 ( 0.45%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::literal (1,912x) [./target/valgrind/s4] + 51,588 ( 0.01%) 296 ( 0.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::class (159x) [./target/valgrind/s4] + 24,658 ( 0.01%) 136 ( 0.02%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::repetition (74x) [./target/valgrind/s4] + 5,023 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Class::literal (159x) [./target/valgrind/s4] + 477 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Class::is_empty (159x) [./target/valgrind/s4] + 333 ( 0.00%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::look (2x) [./target/valgrind/s4] + 148 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::properties (74x) [./target/valgrind/s4] + + 27,711 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::next + + 664,526 ( 0.19%) 3,085 ( 0.38%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/teddy.rs:regex_automata::util::prefilter::teddy::Teddy::new (48x) [./target/valgrind/s4] + 27,686 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/api.rs:aho_corasick::packed::api::Builder::extend [./target/valgrind/s4] + 620,064 ( 0.18%) 3,085 ( 0.38%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/pattern.rs:aho_corasick::packed::pattern::Patterns::add (1,394x) [./target/valgrind/s4] + 5,576 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::pattern::Patterns::len (2,788x) [./target/valgrind/s4] + + 27,496 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::NFA::add_transition + + 181,991 ( 0.05%) 410 ( 0.05%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (693x) [./target/valgrind/s4] + 40,492 ( 0.01%) 82 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap (81x) [./target/valgrind/s4] + 27,414 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add_capture_start [./target/valgrind/s4] + 52,307 ( 0.02%) 52 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (774x) [./target/valgrind/s4] + + 27,235 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs: as core::hash::Hasher>::write + + 26,584 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs: as core::ops::drop::Drop>::drop + + 26,456 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::compiler::Compiler::patch + + 26,344 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 25,888 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push + + 25,852 ( 0.01%) . . . < ./stdlib/../stdlib/strtol.c:__strtoul_internal (102x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 25,852 ( 0.01%) . . . * ./stdlib/../stdlib/strtol_l.c:____strtoul_l_internal [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 25,491 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::literal::Seq::cross_preamble + + 25,416 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class_op + + 25,370 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 883,512 ( 0.26%) 2,456 ( 0.30%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) + 25,308 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::util::captures::GroupInfo::new [./target/valgrind/s4] + 71,177 ( 0.02%) 294 ( 0.04%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::util::captures::GroupInfoInner::add_first_group (81x) [./target/valgrind/s4] + 3,882 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::util::captures::GroupInfoInner::fixup_slot_ranges (175x) [./target/valgrind/s4] + + 25,261 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/search.rs:alloc::collections::btree::map::BTreeMap::insert + + 24,909 ( 0.01%) . . . * ./malloc/./malloc/arena.c:calloc + + 24,903 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 24,720 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::Compiler::add_unanchored_start_state_loop + + 18,198 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::compiler::Compiler::new (674x) + 14,700 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:::drop (525x) + 31 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:s4::processing_loop (1x) + 24,677 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/drain.rs: as core::ops::drop::Drop>::drop [./target/valgrind/s4] + + 24,672 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Compiler::add_unanchored_start_state_loop + + 24,576 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ops/range.rs:aho_corasick::util::prefilter::Builder::build + + 24,576 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::util::prefilter::Builder::build + + 48,978 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::next (218x) [./target/valgrind/s4] + 24,506 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::iter_nfa_state_ids [./target/valgrind/s4] + + 24,295 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::push_group + + 24,250 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::hir::literal::Extractor::cross + + 23,980 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::dfa::remapper::onepass::::remap + + 23,715 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new + + 23,540 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from + 354,385 ( 0.10%) 943 ( 0.12%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,851x) [./target/valgrind/s4] + + 3,326,197 ( 0.96%) 6,496 ( 0.80%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::prefilter (44x) [./target/valgrind/s4] + 2,472,218 ( 0.71%) 6,559 ( 0.81%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::prefixes (16x) [./target/valgrind/s4] + 2,442,396 ( 0.71%) 5,093 ( 0.63%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::suffixes (13x) [./target/valgrind/s4] + 23,424 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract [./target/valgrind/s4] + 5,171,925 ( 1.49%) 9,430 ( 1.16%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (975x) [./target/valgrind/s4] + 1,874,581 ( 0.54%) 8,392 ( 1.04%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross (111x) [./target/valgrind/s4] + 1,035,803 ( 0.30%) 254 ( 0.03%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::union (864x) [./target/valgrind/s4] + 2,759 ( 0.00%) 4 ( 0.00%) . . > ???:__rust_alloc (42x) [./target/valgrind/s4] + + 23,216 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push + + 23,175 ( 0.01%) . . . * /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs:hashbrown::map::HashMap::insert + + 23,136 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:aho_corasick::util::remapper::Remapper::swap + + 22,969 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::literal::Extractor::extract'2 + + 666,828 ( 0.19%) 3,616 ( 0.45%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_automata::meta::reverse_inner::flatten'2 (1,912x) + 22,944 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::literal [./target/valgrind/s4] + 100,845 ( 0.03%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 (1,912x) [./target/valgrind/s4] + + 22,723 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::hybrid::dfa::Lazy::init_cache + + 919,635 ( 0.27%) 339 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::Hybrid::new (162x) [./target/valgrind/s4] + 72,315 ( 0.02%) 26 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::ReverseHybrid::new (13x) [./target/valgrind/s4] + 22,711 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Builder::build_from_nfa [./target/valgrind/s4] + 67,176 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::dead (175x) [./target/valgrind/s4] + 23,975 ( 0.01%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (525x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 22,706 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class + 8,023 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (71x) [./target/valgrind/s4] + + 511,566 ( 0.15%) 506 ( 0.06%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::search::find_fwd (218x) + 22,692 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state [./target/valgrind/s4] + 151,074 ( 0.04%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::next (218x) [./target/valgrind/s4] + 7,194 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::set_transition (218x) [./target/valgrind/s4] + 1,914 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::next_state_id (174x) [./target/valgrind/s4] + + 22,649 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::ast::parse::ParserI

::pop_class + + 22,631 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::hybrid::dfa::Lazy::set_transition + + 31,216 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class (770x) [./target/valgrind/s4] + 22,348 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::ast::ClassAsciiKind::from_name [./target/valgrind/s4] + + 22,280 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:regex_automata::hybrid::dfa::Lazy::set_transition + + 22,269 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition + + 22,269 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition + + 22,141 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::visit_pre + + 21,956 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::vec::from_elem + 69,914 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (5,378x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 21,794 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_set_class + + 21,768 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + 1,087,118 ( 0.31%) 335 ( 0.04%) . . > ???:__rust_dealloc (10,884x) [./target/valgrind/s4] + + 21,753 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::next + + 29,612 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (673x) [./target/valgrind/s4] + 2,112 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state (48x) [./target/valgrind/s4] + 21,630 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::copy_matches [./target/valgrind/s4] + + 21,629 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs: as regex_syntax::ast::visitor::Visitor>::visit_pre + + 21,629 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs: as regex_syntax::ast::visitor::Visitor>::visit_pre + + 21,564 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:alloc::raw_vec::RawVec::allocate_in + 1,166,705 ( 0.34%) 7,835 ( 0.97%) . . > ???:__rust_alloc (5,391x) [./target/valgrind/s4] + + 21,551 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/alloc/layout.rs:alloc::raw_vec::RawVec::allocate_in + + 21,533 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:core::ptr::drop_in_place'2 + 335,214 ( 0.10%) 2,603 ( 0.32%) . . > ???:__rust_dealloc (2,598x) [./target/valgrind/s4] + + 65,950 ( 0.02%) 55 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (586x) [./target/valgrind/s4] + 65,930 ( 0.02%) 69 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (586x) + 552 ( 0.00%) 4 ( 0.00%) . . < src/readers/syslogprocessor.rs:s4lib::readers::syslogprocessor::SyslogProcessor::summary_complete (2x) [./target/valgrind/s4] + 547 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/borrow.rs:core::ops::function::FnOnce::call_once (3x) + 534 ( 0.00%) 4 ( 0.00%) . . < src/readers/blockreader.rs:s4lib::readers::blockreader::BlockReader::new (2x) [./target/valgrind/s4] + 293 ( 0.00%) . . . < src/bin/s4.rs:s4::processing_loop (3x) [./target/valgrind/s4] + 198 ( 0.00%) . . . < src/bin/s4.rs:s4::process_dt_exit (2x) [./target/valgrind/s4] + 98 ( 0.00%) . . . < src/bin/s4.rs:s4::exec_fileprocessor_thread (1x) [./target/valgrind/s4] + 98 ( 0.00%) . . . < src/bin/s4.rs:s4::main (1x) [./target/valgrind/s4] + 98 ( 0.00%) . . . < src/readers/filepreprocessor.rs:s4lib::readers::filepreprocessor::process_path (1x) [./target/valgrind/s4] + 98 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/borrow.rs:s4::processing_loop (1x) + 98 ( 0.00%) . . . < src/readers/syslogprocessor.rs:s4lib::readers::syslogprocessor::SyslogProcessor::new (1x) [./target/valgrind/s4] + 21,402 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::clone [./target/valgrind/s4] + + 21,381 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa + 62,139 ( 0.02%) 328 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (175x) [./target/valgrind/s4] + + 21,156 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:alloc::sync::arcinner_layout_for_value_layout + + 21,095 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::hybrid::dfa::Builder::build_from_nfa + + 21,044 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked + 717,161 ( 0.21%) 2,454 ( 0.30%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (21x) [./target/valgrind/s4] + 1,365 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (21x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 21,032 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Properties::literal + + 20,966 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (10,483x) [./target/valgrind/s4] + 16 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (8x) [./target/valgrind/s4] + 20,982 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::end [./target/valgrind/s4] + + 20,966 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (10,483x) [./target/valgrind/s4] + 16 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (8x) [./target/valgrind/s4] + 20,982 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::start [./target/valgrind/s4] + + 49,172 ( 0.01%) 58 ( 0.01%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map/entry.rs:alloc::collections::btree::map::BTreeMap::insert (540x) + 20,873 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/node.rs:alloc::collections::btree::node::Handle,alloc::collections::btree::node::marker::Edge>::insert_recursing [./target/valgrind/s4] + 596 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/node.rs:alloc::collections::btree::node::splitpoint (49x) [./target/valgrind/s4] + + 250,967 ( 0.07%) 134 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (172x) [./target/valgrind/s4] + 20,852 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition [./target/valgrind/s4] + 106,399 ( 0.03%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (239x) [./target/valgrind/s4] + 28,680 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_and_bump_space (239x) [./target/valgrind/s4] + 23,583 ( 0.01%) 80 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::repetition (172x) [./target/valgrind/s4] + 15,308 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (172x) [./target/valgrind/s4] + 15,100 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (755x) [./target/valgrind/s4] + 7,887 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::specialize_err (239x) [./target/valgrind/s4] + 3,096 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::push (172x) [./target/valgrind/s4] + 3,096 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (172x) [./target/valgrind/s4] + 1,204 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::span (172x) [./target/valgrind/s4] + + 20,814 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::hir::Properties::repetition + + 20,780 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa + + 20,712 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::literal::PreferenceTrie::minimize + 969,941 ( 0.28%) 7,555 ( 0.93%) . . > ???:__rust_dealloc (7,022x) [./target/valgrind/s4] + + 20,700 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (2,300x) [./target/valgrind/s4] + 20,700 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequence::as_slice [./target/valgrind/s4] + + 20,666 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::dfa::onepass::Builder::build_from_nfa + 9,153 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (81x) [./target/valgrind/s4] + + 20,550 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_syntax::hir::Hir::concat + + 20,439 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile + + 20,430 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + + 20,417 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/sparse_set.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa + + 20,284 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/count.rs:regex_syntax::ast::parse::ParserI

::parse_group (606x) + 20,020 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/count.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class (770x) + 20,396 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:core::str::count::char_count_general_case [./target/valgrind/s4] + + 20,185 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::dfa::DFA::set_matches + + 19,886 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/iterator.rs:::drop + 62,760 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,092x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 21,497 ( 0.01%) . . . < ./elf/../elf/dl-sysdep.c:_dl_sysdep_start (1x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 19,879 ( 0.01%) . . . * ./elf/./elf/dl-tunables.c:__GI___tunables_init [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + + 19,516 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Builder::build (2,788x) + 19,516 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:>::try_from [./target/valgrind/s4] + + 717,161 ( 0.21%) 2,454 ( 0.30%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (21x) + 126,568 ( 0.04%) 482 ( 0.06%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new_unchecked (10x) + 84,368 ( 0.02%) 310 ( 0.04%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<1_usize>::new_unchecked (24x) + 8,492 ( 0.00%) 43 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<4_usize>::new_unchecked (2x) + 19,094 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new [./target/valgrind/s4] + 122,962 ( 0.04%) 6 ( 0.00%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs:alloc::collections::btree::map::BTreeMap::insert (406x) [./target/valgrind/s4] + 20,142 ( 0.01%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::from_elem (57x) [./target/valgrind/s4] + + 19,040 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::ClassUnicode::try_case_fold_simple + 928,541 ( 0.27%) 2,240 ( 0.28%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::case_fold_simple (1,120x) [./target/valgrind/s4] + 38,420 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (1,120x) [./target/valgrind/s4] + + 19,004 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/look.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 18,902 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:regex_syntax::hir::ClassUnicode::literal + 13,086 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:core::fmt::Formatter::new (1,454x) [./target/valgrind/s4] + + 721,842 ( 0.21%) 1,964 ( 0.24%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (134x) [./target/valgrind/s4] + 18,882 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded [./target/valgrind/s4] + 288,750 ( 0.08%) 870 ( 0.11%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (526x) [./target/valgrind/s4] + 219,179 ( 0.06%) 792 ( 0.10%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (1,712x) [./target/valgrind/s4] + 120,226 ( 0.03%) 248 ( 0.03%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_concat (134x) [./target/valgrind/s4] + 33,293 ( 0.01%) 42 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (526x) [./target/valgrind/s4] + + 18,876 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::ast::visitor::visit + + 18,805 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from + + 18,576 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::nfa::thompson::builder::Builder::build + +26,377,136 ( 7.62%) 102,599 (12.67%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::meta::regex::Builder::build (81x) + 98,475 ( 0.03%) 29 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) [./target/valgrind/s4] + 18,576 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place [./target/valgrind/s4] +26,377,234 ( 7.62%) 102,519 (12.66%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:::drop (774x) [./target/valgrind/s4] + 79,801 ( 0.02%) 109 ( 0.01%) . . > ???:__rust_dealloc (774x) [./target/valgrind/s4] + + 186,209 ( 0.05%) 102 ( 0.01%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (1,316x) [./target/valgrind/s4] + 18,424 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequences::new [./target/valgrind/s4] + + 40,480 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (3,680x) [./target/valgrind/s4] + 18,400 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::iter_trans [./target/valgrind/s4] + + 18,396 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:aho_corasick::packed::rabinkarp::RabinKarp::new + + 1,560,608 ( 0.45%) 1,238 ( 0.15%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) [./target/valgrind/s4] + 18,230 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa [./target/valgrind/s4] + 5,250 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 18,122 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::NFA::add_match + + 18,090 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::literal::Extractor::extract + + 17,990 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name + + 17,812 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:aho_corasick::dfa::Builder::finish_build_one_start + + 17,781 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::pop_class + + 17,646 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs:core::hash::BuildHasher::hash_one + + 17,620 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::Concat::into_ast + + 17,577 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::parse_set_class + 106,470 ( 0.03%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (3,549x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 60,952 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle (1,490x) [./target/valgrind/s4] + 17,528 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::swap [./target/valgrind/s4] + + 17,448 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Hir::class + 290,043 ( 0.08%) 2,020 ( 0.25%) . . > ???:__rust_alloc (1,454x) [./target/valgrind/s4] + 250,063 ( 0.07%) 2,906 ( 0.36%) . . > ???:__rust_realloc (1,454x) [./target/valgrind/s4] + + 17,398 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:alloc::collections::btree::map::BTreeMap::insert + + 17,330 ( 0.01%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend + 1,274,269 ( 0.37%) 3,115 ( 0.38%) 1 ( 0.32%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (752x) [./target/valgrind/s4] + + 209,050 ( 0.06%) 1,131 ( 0.14%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::visit_post (693x) + 17,325 ( 0.01%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::capture [./target/valgrind/s4] + + 106,399 ( 0.03%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition (239x) [./target/valgrind/s4] + 17,200 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal [./target/valgrind/s4] + 32,180 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (1,609x) [./target/valgrind/s4] + 21,360 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (240x) [./target/valgrind/s4] + 10,764 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:core::num::::from_str_radix (239x) [./target/valgrind/s4] + 4,320 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (240x) [./target/valgrind/s4] + + 17,136 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_automata::nfa::thompson::map::Utf8SuffixMap::clear + + 17,130 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition + 331,832 ( 0.10%) 1,154 ( 0.14%) . . > ???:__rust_alloc (3,426x) [./target/valgrind/s4] + + 16,944 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::pop_class + + 16,893 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::is_ascii + + 122,962 ( 0.04%) 6 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (406x) [./target/valgrind/s4] + 53,290 ( 0.02%) 58 ( 0.01%) . . < src/readers/syslinereader.rs:s4lib::readers::syslinereader::SyslineReader::new (173x) [./target/valgrind/s4] + 1,604 ( 0.00%) 12 ( 0.00%) . . < src/bin/s4.rs:s4::processing_loop (5x) [./target/valgrind/s4] + 1,356 ( 0.00%) 4 ( 0.00%) . . < src/readers/linereader.rs:s4lib::readers::linereader::LineReader::insert_line (10x) [./target/valgrind/s4] + 1,263 ( 0.00%) 4 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rangemap-1.5.1/src/map.rs:rangemap::map::RangeMap::insert (9x) [./target/valgrind/s4] + 390 ( 0.00%) . . . < src/readers/syslinereader.rs:s4lib::readers::syslinereader::SyslineReader::insert_sysline (4x) [./target/valgrind/s4] + 246 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/set.rs:s4lib::readers::blockreader::BlockReader::read_block_File (1x) + 246 ( 0.00%) 2 ( 0.00%) . . < src/readers/blockreader.rs:s4lib::readers::blockreader::BlockReader::read_block_File (1x) [./target/valgrind/s4] + 162 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs:s4lib::readers::syslinereader::SyslineReader::summary (2x) + 162 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs: as core::iter::traits::iterator::Iterator>::fold (2x) + 16,812 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs:alloc::collections::btree::map::BTreeMap::insert [./target/valgrind/s4] + + 13,086 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:regex_syntax::hir::ClassUnicode::literal (1,454x) + 3,663 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:regex_syntax::hir::literal::Extractor::extract'2 (407x) + 18 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:regex_syntax::hir::literal::Extractor::extract (2x) + 18 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:core::ops::function::FnOnce::call_once (2x) + 9 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::parse_ref (1x) + 9 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:s4lib::readers::syslinereader::SyslineReader::new (1x) + 16,803 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs:core::fmt::Formatter::new [./target/valgrind/s4] + + 16,800 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from + + 151,074 ( 0.04%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (218x) [./target/valgrind/s4] + 16,667 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::next [./target/valgrind/s4] + 48,978 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::iter_nfa_state_ids (218x) [./target/valgrind/s4] + 30,367 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::epsilon_closure (194x) [./target/valgrind/s4] + 24,097 ( 0.01%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::add_nfa_states (218x) [./target/valgrind/s4] + 60 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::StateBuilderMatches::add_match_pattern_id (3x) [./target/valgrind/s4] + + 16,614 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::visit_class_set_item_post + 133,238 ( 0.04%) 355 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (846x) [./target/valgrind/s4] + + 16,612 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs:regex_syntax::hir::Properties::class + + 16,593 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:alloc::vec::from_elem + + 16,523 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::rabinkarp::RabinKarp::new + 180,819 ( 0.05%) 704 ( 0.09%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (733x) [./target/valgrind/s4] + + 16,518 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:::visit_pre + 46,801 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (2,753x) [./target/valgrind/s4] + + 16,518 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/collect.rs:::visit_pre + + 16,515 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::dfa::DFA::set_matches + 460,064 ( 0.13%) 2,538 ( 0.31%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,835x) [./target/valgrind/s4] + + 16,387 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::literal::Extractor::extract'2 + + 16,379 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:::drop + + 16,368 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::class + 674,742 ( 0.19%) 4,414 ( 0.55%) . . > ???:__rust_alloc (2,728x) [./target/valgrind/s4] + + 16,298 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:core::ptr::drop_in_place'2 + + 16,224 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::dfa::Builder::build_from_noncontiguous + + 16,116 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::meta::reverse_inner::flatten'2 + + 16,096 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/macros/mod.rs:::visit_post + + 16,093 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::ast::parse::ParserI

::pop_class + 68,970 ( 0.02%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,299x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 16,069 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_escape (1,607x) [./target/valgrind/s4] + 16,069 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/lib.rs:regex_syntax::is_meta_character [./target/valgrind/s4] + + 15,994 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Hir::class + + 15,929 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::ast::visitor::visit + + 15,929 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:regex_syntax::ast::parse::ParserI

::push_alternate + + 15,848 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:::visit_class_set_item_post + + 11,570 ( 0.00%) . . . < ./elf/./elf/dl-lookup.c:check_match (297x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 2,742 ( 0.00%) . . . < ./elf/./elf/dl-misc.c:_dl_name_match_p (86x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 890 ( 0.00%) . . . < ./elf/./elf/dl-version.c:_dl_check_map_versions (23x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 282 ( 0.00%) . . . < ./elf/./elf/dl-lookup-direct.c:_dl_lookup_direct (6x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 218 ( 0.00%) . . . < ./elf/./elf/dl-load.c:_dl_map_object (6x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 50 ( 0.00%) . . . < ./elf/../sysdeps/x86/dl-procinfo.h:_dl_load_cache_lookup (2x) + 50 ( 0.00%) . . . < ./elf/./elf/dl-load.c:_dl_map_object_from_fd (2x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 43 ( 0.00%) . . . < ./elf/./elf/rtld.c:dl_main (1x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 15,845 ( 0.00%) . . . * ./string/../sysdeps/x86_64/strcmp.S:strcmp [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + + 15,744 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state + + 53,226 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross (482x) [./target/valgrind/s4] + 15,639 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::cross_preamble [./target/valgrind/s4] + + 15,496 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item + + 15,406 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::Hir::literal + + 15,406 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/macros/mod.rs:regex_syntax::hir::Hir::literal + + 15,406 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::hir::Hir::literal + + 15,334 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::packed::rabinkarp::RabinKarp::new + + 14,944 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::write_str + 274,042 ( 0.08%) 786 ( 0.10%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (1,865x) [./target/valgrind/s4] + + 14,789 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/sparse_set.rs:regex_automata::util::determinize::epsilon_closure + + 14,720 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:aho_corasick::util::alphabet::ByteClassSet::set_range + + 14,660 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::case_fold_simple + 512,951 ( 0.15%) 2,240 ( 0.28%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (1,120x) [./target/valgrind/s4] + + 14,611 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::nfa::thompson::compiler::Compiler::c + + 1,012,881 ( 0.29%) 2,240 ( 0.28%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_post (1,120x) [./target/valgrind/s4] + 14,560 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::try_case_fold_simple [./target/valgrind/s4] + + 14,460 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs:aho_corasick::util::remapper::Remapper::swap + + 14,459 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle + + 14,428 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 + + 14,337 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::meta::wrappers::Hybrid::new + 65,853 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (243x) [./target/valgrind/s4] + + 14,260 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_syntax::ast::parse::ParserI

::push_group + + 14,240 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_group + + 14,175 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name + + 14,127 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::drop + + 13,928 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::ast::parse::ParserI

::parse_group + + 13,872 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:::next + + 13,860 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::ast::parse::ParserI

::pop_group + + 13,783 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state + 123,301 ( 0.04%) 624 ( 0.08%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (221x) [./target/valgrind/s4] + + 128,502 ( 0.04%) 403 ( 0.05%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::visit_class_set_item_post (770x) + 18,018 ( 0.01%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (5x) + 17,636 ( 0.01%) 6 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:itertools::Itertools::sorted_by (3x) + 4,865 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:::augment_args (17x) + 3,209 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::builder::command::Command::_build_self (2x) + 726 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:s4lib::readers::syslinereader::SyslineReader::summary (2x) + 630 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::ClassUnicode::new (5x) + 624 ( 0.00%) 2 ( 0.00%) . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:s4::main (1x) + 558 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:clap_builder::builder::command::Command::get_matches_from (1x) + 156 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:s4lib::readers::syslinereader::SyslineReader::dt_patterns_analysis (1x) + 13,769 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_from_iter.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter [./target/valgrind/s4] + + 1,854,743 ( 0.54%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (48x) [./target/valgrind/s4] + 13,754 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle [./target/valgrind/s4] + 1,737,105 ( 0.50%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::remap (48x) [./target/valgrind/s4] + 60,952 ( 0.02%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::swap (1,490x) [./target/valgrind/s4] + + 13,583 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:aho_corasick::util::alphabet::ByteClassSet::byte_classes + + 13,582 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded + + 13,480 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs:regex_automata::nfa::thompson::compiler::Compiler::new + 113,113 ( 0.03%) 4 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs:regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty (1,348x) [./target/valgrind/s4] + + 113,113 ( 0.03%) 4 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs:regex_automata::nfa::thompson::compiler::Compiler::new (1,348x) + 13,480 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs:regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty [./target/valgrind/s4] + + 13,429 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:::visit_class_set_item_post + 44,132 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (1,686x) [./target/valgrind/s4] + 14,700 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::case_fold_simple (70x) [./target/valgrind/s4] + + 13,410 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::pop_group + 114,108 ( 0.03%) 440 ( 0.05%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (243x) [./target/valgrind/s4] + + 13,400 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::interval::IntervalSet::canonicalize + 82,589 ( 0.02%) 335 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (167x) [./target/valgrind/s4] + + 38,128 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/sort.rs:core::slice::sort::merge_sort (1,334x) [./target/valgrind/s4] + 13,345 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/sort.rs:core::slice::sort::insertion_sort_shift_left [./target/valgrind/s4] + + 13,292 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name + 65,930 ( 0.02%) 69 ( 0.01%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::clone (586x) [./target/valgrind/s4] + + 13,266 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::pattern::Patterns::add + 225,069 ( 0.07%) 884 ( 0.11%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (360x) [./target/valgrind/s4] + + 13,182 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/pattern.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new + + 13,160 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs:__rdl_alloc_zeroed + 377,056 ( 0.11%) 2,884 ( 0.36%) . . > ./malloc/./malloc/malloc.c:calloc (1,316x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 13,060 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 + + 13,014 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile + 150,129 ( 0.04%) 948 ( 0.12%) . . > ???:__rust_alloc (758x) [./target/valgrind/s4] + 90,902 ( 0.03%) 35 ( 0.00%) . . > ???:__rust_dealloc (928x) [./target/valgrind/s4] + + 39,758 ( 0.01%) 133 ( 0.02%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) [./target/valgrind/s4] + 24,097 ( 0.01%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::next (218x) [./target/valgrind/s4] + 13,004 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::add_nfa_states [./target/valgrind/s4] + 10,278 ( 0.00%) 57 ( 0.01%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (23x) [./target/valgrind/s4] + + 12,978 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::dfa::Builder::finish_build_both_starts::{{closure}} + + 36,826 ( 0.01%) 14 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) [./target/valgrind/s4] + 30,367 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::next (194x) [./target/valgrind/s4] + 12,972 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::epsilon_closure [./target/valgrind/s4] + + 12,931 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:core::slice::sort::insertion_sort_shift_left + + 47,257 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (579x) [./target/valgrind/s4] + 12,902 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::lift_common_prefix [./target/valgrind/s4] + 6,532 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (6x) [./target/valgrind/s4] + 4,832 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation'2 (1x) [./target/valgrind/s4] + 364 ( 0.00%) . . . > ???:__rust_dealloc (4x) [./target/valgrind/s4] + + 12,876 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_syntax::ast::parse::ParserI

::parse_escape + + 12,812 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::util::prefilter::prefixes + 112,977 ( 0.03%) 144 ( 0.02%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_extend.rs: as alloc::vec::spec_extend::SpecExtend>::spec_extend (15x) [./target/valgrind/s4] + + 65,853 ( 0.02%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::meta::wrappers::Hybrid::new (243x) + 47,980 ( 0.01%) 4 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:regex_automata::meta::strategy::new (175x) [./target/valgrind/s4] + 21,951 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::meta::wrappers::OnePass::new (81x) + 21,951 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/backtrack.rs:regex_automata::meta::wrappers::BoundedBacktracker::new (81x) + 21,951 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/pikevm.rs:regex_automata::meta::wrappers::PikeVM::new (81x) + 3,523 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::meta::wrappers::ReverseHybrid::new (13x) + 12,806 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new [./target/valgrind/s4] + 3,370 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/parser.rs:regex_syntax::parser::ParserBuilder::new (674x) [./target/valgrind/s4] + + 12,787 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile + + 12,739 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::util::captures::GroupInfo::new + + 12,676 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/range.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 12,546 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::NFA::add_match + + 12,536 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter + 294 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs: as core::iter::traits::iterator::Iterator>::next (2x) [./target/valgrind/s4] + + 12,450 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:::case_fold_simple + + 12,443 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::ast::parse::ParserI

::pop_group + 15,360 ( 0.00%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (512x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 12,401 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_syntax::hir::literal::Extractor::cross + + 12,360 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa + + 12,311 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::util::captures::GroupInfo::new + + 12,240 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs:aho_corasick::util::prefilter::Builder::build + + 12,168 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + 310,461 ( 0.09%) 818 ( 0.10%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (314x) [./target/valgrind/s4] + + 12,103 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_automata::util::prefilter::prefixes + 43,281 ( 0.01%) . . . > ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S:__memcmp_avx2_movbe (1,941x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 12,066 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:regex_automata::dfa::remapper::onepass::::remap + + 12,030 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_syntax::hir::Properties::repetition + + 102,562 ( 0.03%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::remap (1x) [./target/valgrind/s4] + 12,009 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::onepass::::remap [./target/valgrind/s4] + + 11,963 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:::drop + 5,547,169 ( 1.60%) 2,618 ( 0.32%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (525x) [./target/valgrind/s4] + + 11,934 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::dfa::Builder::finish_build_both_starts::{{closure}} + + 1,339,535 ( 0.39%) 730 ( 0.09%) 2 ( 0.65%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (142x) [./target/valgrind/s4] + 84,098 ( 0.02%) 2 ( 0.00%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (110x) [./target/valgrind/s4] + 11,844 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least [./target/valgrind/s4] + 1,268,486 ( 0.37%) 504 ( 0.06%) 2 ( 0.65%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (142x) [./target/valgrind/s4] + 74,247 ( 0.02%) 228 ( 0.03%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (504x) [./target/valgrind/s4] + 33,110 ( 0.01%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (110x) [./target/valgrind/s4] + 288 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::properties (144x) [./target/valgrind/s4] + + 11,772 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_syntax::hir::interval::IntervalSet::canonicalize + + 11,749 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::add + + 16,986 ( 0.00%) 4 ( 0.00%) 138 (44.52%) 1 ( 0.07%) < ./malloc/./malloc/malloc.c:_int_malloc (137x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 11,701 ( 0.00%) . . . * ./malloc/./malloc/malloc.c:sysmalloc [/usr/lib/x86_64-linux-gnu/libc.so.6] + 128 ( 0.00%) 0 3 ( 0.97%) . > ./malloc/./malloc/morecore.c:__glibc_morecore (3x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 63 ( 0.00%) 4 ( 0.00%) 1 ( 0.32%) . > ./malloc/./malloc/malloc.c:sysmalloc_mmap.constprop.0 (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 11,624 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::add + + 11,610 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_syntax::unicode::SimpleCaseFolder::overlaps + + 11,594 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state + +101,781,410 (29.40%) 222,193 (27.44%) 99 (31.94%) . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:regex_automata::meta::strategy::new (162x) [./target/valgrind/s4] + 1,085,830 ( 0.31%) 2,138 ( 0.26%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::meta::strategy::new (13x) + 11,548 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir [./target/valgrind/s4] +83,534,697 (24.13%) 191,704 (23.67%) 88 (28.39%) . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/map.rs: as core::iter::traits::iterator::Iterator>::next (350x) [./target/valgrind/s4] +19,117,859 ( 5.52%) 32,530 ( 4.02%) 11 ( 3.55%) . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) [./target/valgrind/s4] + 84,098 ( 0.02%) 2 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (110x) [./target/valgrind/s4] + 46,869 ( 0.01%) 50 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::dot (110x) [./target/valgrind/s4] + 28,140 ( 0.01%) 1 ( 0.00%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (110x) [./target/valgrind/s4] + 7,730 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (175x) [./target/valgrind/s4] + 5,425 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::clear (175x) [./target/valgrind/s4] + 350 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::properties (175x) [./target/valgrind/s4] + + 11,458 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::ast::parse::ParserI

::push_class_open + 665,842 ( 0.19%) 320 ( 0.04%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (81x) [./target/valgrind/s4] + + 11,409 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:regex_syntax::hir::Hir::alternation + + 11,388 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/node.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter + + 11,332 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:regex_syntax::hir::literal::Seq::optimize_by_preference + + 11,331 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:alloc::vec::Vec::retain_mut + + 2,484,151 ( 0.72%) 7,913 ( 0.98%) . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::extract (193x) [./target/valgrind/s4] + 11,325 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten [./target/valgrind/s4] + 1,648,306 ( 0.48%) 7,175 ( 0.89%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (1,589x) [./target/valgrind/s4] + 551,421 ( 0.16%) 256 ( 0.03%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (55x) [./target/valgrind/s4] + 43,665 ( 0.01%) 74 ( 0.01%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (29x) [./target/valgrind/s4] + 10,126 ( 0.00%) 32 ( 0.00%) . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Repetition::with (75x) [./target/valgrind/s4] + 568 ( 0.00%) . . . > /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (284x) [./target/valgrind/s4] + + 11,320 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:regex_syntax::hir::literal::Extractor::extract'2 + 3,220 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::ops::drop::Drop>::drop (322x) [./target/valgrind/s4] + + 11,310 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:::visit_class_set_item_post + + 11,302 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/macros.rs:regex_syntax::hir::literal::Extractor::extract'2 + + 11,235 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state + + 11,174 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs: as alloc::vec::spec_from_iter::SpecFromIter>::from_iter + 1,076 ( 0.00%) . . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (2x) [./target/valgrind/s4] + + 11,152 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:alloc::collections::btree::map::BTreeMap::insert + 30,680 ( 0.01%) . . . > ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S:__memcmp_avx2_movbe (1,394x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 11,110 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push + 92,050 ( 0.03%) 260 ( 0.03%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (211x) [./target/valgrind/s4] + + 11,052 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/sparse_set.rs:regex_automata::util::determinize::state::State::iter_nfa_state_ids + + 11,040 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::NFA::iter_trans + + 11,040 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs:aho_corasick::nfa::noncontiguous::NFA::iter_trans + + 11,010 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::dfa::DFA::set_matches + + 22,502 ( 0.01%) . . . < ./elf/./elf/dl-lookup.c:do_lookup_x (191x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 10,932 ( 0.00%) . . . * ./elf/./elf/dl-lookup.c:check_match [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + 11,570 ( 0.00%) . . . > ./string/../sysdeps/x86_64/strcmp.S:strcmp (297x) [/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2] + + 10,884 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile + + 10,810 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::nfa::noncontiguous::NFA::add_transition + + 10,796 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs: as core::clone::Clone>::clone + + 10,716 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state + + 19,278 ( 0.01%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::Hybrid::new (162x) [./target/valgrind/s4] + 1,547 ( 0.00%) . . . < /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::ReverseHybrid::new (13x) [./target/valgrind/s4] + 10,675 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Builder::configure [./target/valgrind/s4] + + 10,650 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs:regex_syntax::unicode::SimpleCaseFolder::mapping + + 24,612 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (1,172x) + 24,612 ( 0.01%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex_automata::util::captures::GroupInfo::new (1,172x) + 12,264 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex_automata::util::determinize::state::State::dead (584x) + 7,308 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (348x) + 3,360 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex::builders::Builder::build_one_bytes (160x) + 1,722 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (82x) + 126 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:std::thread::Thread::new (6x) + 42 ( 0.00%) . . . < /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/sync.rs:regex::builders::Builder::build_one_string (2x) + 10,578 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs:alloc::sync::arcinner_layout_for_value_layout [./target/valgrind/s4] + + 10,496 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state + + 10,491 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs:::next + + 10,448 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:core::ptr::drop_in_place + + 10,444 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs:regex_syntax::hir::literal::PreferenceTrie::insert + 38,848 ( 0.01%) . . . > ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,611x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 10,431 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::vec::Vec::retain_mut + + 10,395 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Properties::capture + + 10,395 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 + + 10,331 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_automata::dfa::onepass::Builder::build_from_nfa + 120,144 ( 0.03%) 194 ( 0.02%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve::do_reserve_and_handle (243x) [./target/valgrind/s4] + + 10,311 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:aho_corasick::nfa::noncontiguous::Compiler::densify + + 10,278 ( 0.00%) . . . * /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::parse::ParserI

::parse_uncounted_repetition + + 10,170 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs:regex_syntax::hir::Properties::repetition + 490,825 ( 0.14%) 3,696 ( 0.46%) . . > ???:__rust_alloc (2,034x) [./target/valgrind/s4] + + 53,781 ( 0.02%) 90 ( 0.01%) . . < ./malloc/./malloc/malloc.c:posix_memalign (121x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 10,113 ( 0.00%) . . . * ./malloc/./malloc/malloc.c:_int_memalign [/usr/lib/x86_64-linux-gnu/libc.so.6] + 30,433 ( 0.01%) . . . > ./malloc/./malloc/malloc.c:_int_malloc (121x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 13,235 ( 0.00%) 90 ( 0.01%) . . > ./malloc/./malloc/malloc.c:_int_free (165x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 10,110 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty + 77,391 ( 0.02%) 4 ( 0.00%) . . > /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:alloc::raw_vec::RawVec::reserve_for_push (674x) [./target/valgrind/s4] + + 10,096 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/take.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new + + 9,954 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/validations.rs:core::str::count::char_count_general_case + + 9,833 ( 0.00%) . . . * ./malloc/./malloc/malloc.c:__malloc_arena_thread_freeres + 40,155 ( 0.01%) 709 ( 0.09%) . . > ./malloc/./malloc/malloc.c:_int_free (375x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + 142 ( 0.00%) 2 ( 0.00%) . . > ./malloc/./malloc/malloc.c:free (1x) [/usr/lib/x86_64-linux-gnu/libc.so.6] + + 9,826 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs:regex_syntax::hir::Properties::alternation + + 9,800 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs:regex_automata::hybrid::dfa::Builder::configure + + 9,788 ( 0.00%) . . . * /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 448 ---------------------------------------- + . . . . /// None, + . . . . /// re.find(&mut cache, b"\nabc\n"), + . . . . /// ); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn look_matcher(mut self, m: LookMatcher) -> Config { + . . . . self.look_matcher = Some(m); + 104 ( 0.00%) . . . self + . . . . } + . . . . + . . . . /// Whether to compile an unanchored prefix into this NFA. + . . . . /// + . . . . /// This is enabled by default. It is made available for tests only to make + . . . . /// it easier to unit test the output of the compiler. + . . . . #[cfg(test)] + . . . . fn unanchored_prefix(mut self, yes: bool) -> Config { +-- line 464 ---------------------------------------- +-- line 468 ---------------------------------------- + . . . . + . . . . /// Returns whether this configuration has enabled UTF-8 mode. + . . . . pub fn get_utf8(&self) -> bool { + . . . . self.utf8.unwrap_or(true) + . . . . } + . . . . + . . . . /// Returns whether this configuration has enabled reverse NFA compilation. + . . . . pub fn get_reverse(&self) -> bool { + 175 ( 0.00%) . . . self.reverse.unwrap_or(false) + . . . . } + . . . . + . . . . /// Return the configured NFA size limit, if it exists, in the number of + . . . . /// bytes of heap used. + . . . . pub fn get_nfa_size_limit(&self) -> Option { + 350 ( 0.00%) . . . self.nfa_size_limit.unwrap_or(None) + . . . . } + . . . . + . . . . /// Return whether NFA shrinking is enabled. + . . . . pub fn get_shrink(&self) -> bool { + . . . . self.shrink.unwrap_or(false) + . . . . } + . . . . + . . . . /// Return whether NFA compilation is configured to produce capture states. +-- line 490 ---------------------------------------- +-- line 521 ---------------------------------------- + . . . . /// Overwrite the default configuration such that the options in `o` are + . . . . /// always used. If an option in `o` is not set, then the corresponding + . . . . /// option in `self` is used. If it's not set in `self` either, then it + . . . . /// remains not set. + . . . . pub(crate) fn overwrite(&self, o: Config) -> Config { + . . . . Config { + . . . . utf8: o.utf8.or(self.utf8), + . . . . reverse: o.reverse.or(self.reverse), + 13 ( 0.00%) . . . nfa_size_limit: o.nfa_size_limit.or(self.nfa_size_limit), + . . . . shrink: o.shrink.or(self.shrink), + 13 ( 0.00%) . . . which_captures: o.which_captures.or(self.which_captures), + 13 ( 0.00%) . . . look_matcher: o.look_matcher.or_else(|| self.look_matcher.clone()), + . . . . #[cfg(test)] + . . . . unanchored_prefix: o.unanchored_prefix.or(self.unanchored_prefix), + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// A configuration indicating which kinds of + . . . . /// [`State::Capture`](crate::nfa::thompson::State::Capture) states to include. +-- line 540 ---------------------------------------- +-- line 571 ---------------------------------------- + . . . . WhichCaptures::All + . . . . } + . . . . } + . . . . + . . . . impl WhichCaptures { + . . . . /// Returns true if this configuration indicates that no capture states + . . . . /// should be produced in an NFA. + . . . . pub fn is_none(&self) -> bool { + 94 ( 0.00%) . . . matches!(*self, WhichCaptures::None) + . . . . } + . . . . + . . . . /// Returns true if this configuration indicates that some capture states + . . . . /// should be added to an NFA. Note that this might only include capture + . . . . /// states for implicit capture groups. + . . . . pub fn is_any(&self) -> bool { + . . . . !self.is_none() + . . . . } +-- line 587 ---------------------------------------- +-- line 710 ---------------------------------------- + . . . . trie_state: RefCell, + . . . . /// State used for caching common suffixes when compiling reverse UTF-8 + . . . . /// automata (for Unicode character classes). + . . . . utf8_suffix: RefCell, + . . . . } + . . . . + . . . . impl Compiler { + . . . . /// Create a new NFA builder with its default configuration. + 2,696 ( 0.00%) . . . pub fn new() -> Compiler { + 6,066 ( 0.00%) . . . Compiler { + 674 ( 0.00%) . . . parser: ParserBuilder::new(), + 3,370 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/parser.rs:regex_syntax::parser::ParserBuilder::new (674x) + . . . . config: Config::default(), + . . . . builder: RefCell::new(Builder::new()), + . . . . utf8_state: RefCell::new(Utf8State::new()), + . . . . trie_state: RefCell::new(RangeTrie::new()), + . . . . utf8_suffix: RefCell::new(Utf8SuffixMap::new(1000)), + . . . . } + 3,370 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given regular expression pattern into an NFA. + . . . . /// + . . . . /// If there was a problem parsing the regex, then that error is returned. + . . . . /// + . . . . /// Otherwise, if there was a problem building the NFA, then an error is + . . . . /// returned. The only error that can occur is if the compiled regex would + . . . . /// exceed the size limits configured on this builder, or if any part of +-- line 735 ---------------------------------------- +-- line 829 ---------------------------------------- + . . . . /// let mut caps = re.create_captures(); + . . . . /// let expected = Some(Match::must(0, 3..4)); + . . . . /// re.captures(&mut cache, "!@#A#@!", &mut caps); + . . . . /// assert_eq!(expected, caps.get_match()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn build_from_hir(&self, expr: &Hir) -> Result { + 78 ( 0.00%) . . . self.build_many_from_hir(&[expr]) +1,085,830 ( 0.31%) 2,138 ( 0.26%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (13x) + . . . . } + . . . . + . . . . /// Compile the given high level intermediate representations of regular + . . . . /// expressions into a single NFA. + . . . . /// + . . . . /// When matches are returned, the pattern ID corresponds to the index of + . . . . /// the pattern in the slice given. + . . . . /// +-- line 845 ---------------------------------------- +-- line 869 ---------------------------------------- + . . . . /// let mut cache = re.create_cache(); + . . . . /// let mut caps = re.create_captures(); + . . . . /// let expected = Some(Match::must(1, 1..2)); + . . . . /// re.captures(&mut cache, "!A! !A!", &mut caps); + . . . . /// assert_eq!(expected, caps.get_match()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 1,575 ( 0.00%) . . . pub fn build_many_from_hir>( + . . . . &self, + . . . . exprs: &[H], + . . . . ) -> Result { + . . . . self.compile(exprs) + 1,575 ( 0.00%) . . . } + . . . . + . . . . /// Apply the given NFA configuration options to this builder. + . . . . /// + . . . . /// # Example + . . . . /// + . . . . /// ``` + . . . . /// use regex_automata::nfa::thompson::NFA; + . . . . /// + . . . . /// let config = NFA::config().nfa_size_limit(Some(1_000)); + . . . . /// let nfa = NFA::compiler().configure(config).build(r"(?-u)\w")?; + . . . . /// assert_eq!(nfa.pattern_len(), 1); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 13 ( 0.00%) . . . pub fn configure(&mut self, config: Config) -> &mut Compiler { + 1,617 ( 0.00%) . . . self.config = self.config.overwrite(config); + . . . . self + 13 ( 0.00%) . . . } + . . . . + . . . . /// Set the syntax configuration for this builder using + . . . . /// [`syntax::Config`](crate::util::syntax::Config). + . . . . /// + . . . . /// This permits setting things like case insensitivity, Unicode and multi + . . . . /// line mode. + . . . . /// + . . . . /// This syntax configuration only applies when an NFA is built directly +-- line 908 ---------------------------------------- +-- line 932 ---------------------------------------- + . . . . + . . . . impl Compiler { + . . . . /// Compile the sequence of HIR expressions given. Pattern IDs are + . . . . /// allocated starting from 0, in correspondence with the slice given. + . . . . /// + . . . . /// It is legal to provide an empty slice. In that case, the NFA returned + . . . . /// has no patterns and will never match anything. + . . . . fn compile>(&self, exprs: &[H]) -> Result { + 350 ( 0.00%) . . . if exprs.len() > PatternID::LIMIT { + . . . . return Err(BuildError::too_many_patterns(exprs.len())); + . . . . } + 269 ( 0.00%) . . . if self.config.get_reverse() + . . . . && self.config.get_which_captures().is_any() + . . . . { + . . . . return Err(BuildError::unsupported_captures()); + . . . . } + . . . . + 350 ( 0.00%) . . . self.builder.borrow_mut().clear(); + 5,425 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::clear (175x) + . . . . self.builder.borrow_mut().set_utf8(self.config.get_utf8()); + . . . . self.builder.borrow_mut().set_reverse(self.config.get_reverse()); + . . . . self.builder + . . . . .borrow_mut() + . . . . .set_look_matcher(self.config.get_look_matcher()); + . . . . self.builder + . . . . .borrow_mut() + . . . . .set_size_limit(self.config.get_nfa_size_limit())?; + . . . . + . . . . // We always add an unanchored prefix unless we were specifically told + . . . . // not to (for tests only), or if we know that the regex is anchored + . . . . // for all matches. When an unanchored prefix is not added, then the + . . . . // NFA's anchored and unanchored start states are equivalent. + . . . . let all_anchored = exprs.iter().all(|e| { + 175 ( 0.00%) . . . let props = e.borrow().properties(); + 350 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::properties (175x) + 350 ( 0.00%) . . . if self.config.get_reverse() { + . . . . props.look_set_suffix().contains(hir::Look::End) + . . . . } else { + . . . . props.look_set_prefix().contains(hir::Look::Start) + . . . . } + . . . . }); + . . . . let anchored = !self.config.get_unanchored_prefix() || all_anchored; + . . . . let unanchored_prefix = if anchored { + . . . . self.c_empty()? + . . . . } else { + 880 ( 0.00%) . . . self.c_at_least(&Hir::dot(hir::Dot::AnyByte), false, 0)? + 84,098 ( 0.02%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (110x) + 46,869 ( 0.01%) 50 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::dot (110x) + 440 ( 0.00%) . . . }; + 28,140 ( 0.01%) 1 ( 0.00%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (110x) + . . . . + . . . . let compiled = self.c_alt_iter(exprs.iter().map(|e| { + . . . . let _ = self.start_pattern()?; + 700 ( 0.00%) . . . let one = self.c_cap(0, None, e.borrow())?; +83,467,449 (24.11%) 191,626 (23.66%) 87 (28.06%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap (175x) + . . . . let match_state_id = self.add_match()?; + . . . . self.patch(one.end, match_state_id)?; + . . . . let _ = self.finish_pattern(one.start)?; + . . . . Ok(ThompsonRef { start: one.start, end: match_state_id }) + . . . . }))?; + . . . . self.patch(unanchored_prefix.end, compiled.start)?; + 700 ( 0.00%) . . . let nfa = self +19,117,859 ( 5.52%) 32,530 ( 4.02%) 11 ( 3.55%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::build (175x) + . . . . .builder + . . . . .borrow_mut() + . . . . .build(compiled.start, unanchored_prefix.start)?; + . . . . + . . . . debug!("HIR-to-NFA compilation complete, config: {:?}", self.config); + 525 ( 0.00%) . . . Ok(nfa) + . . . . } + . . . . + . . . . /// Compile an arbitrary HIR expression. +223,884 ( 0.06%) . . . fn c(&self, expr: &Hir) -> Result { + . . . . use regex_syntax::hir::{Class, HirKind::*}; + . . . . +309,994 ( 0.09%) . . . match *expr.kind() { + 570 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (285x) + . . . . Empty => self.c_empty(), + 17,662 ( 0.01%) . . . Literal(hir::Literal(ref bytes)) => self.c_literal(bytes), + 110 ( 0.00%) . . . Class(Class::Bytes(ref c)) => self.c_byte_class(c), + 5,631 ( 0.00%) . . . Class(Class::Unicode(ref c)) => self.c_unicode_class(c), + 245 ( 0.00%) . . . Look(ref look) => self.c_look(look), + . . . . Repetition(ref rep) => self.c_repetition(rep), + 16,632 ( 0.00%) . . . Capture(ref c) => self.c_cap(c.index, c.name.as_deref(), &c.sub), +86,288,458 (24.93%) 201,659 (24.90%) 86 (27.74%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_cap'2 (1,386x) + 44,337 ( 0.01%) . . . Concat(ref es) => self.c_concat(es.iter().map(|e| self.c(e))), +83,117,734 (24.01%) 191,492 (23.65%) 87 (28.06%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (2,839x) + . . . . Alternation(ref es) => self.c_alt_slice(es), + . . . . } +183,952 ( 0.05%) . . . } + . . . . + . . . . /// Compile a concatenation of the sub-expressions yielded by the given + . . . . /// iterator. If the iterator yields no elements, then this compiles down + . . . . /// to an "empty" state that always matches. + . . . . /// + . . . . /// If the compiler is in reverse mode, then the expressions given are + . . . . /// automatically compiled in reverse. + 3,096 ( 0.00%) . . . fn c_concat(&self, mut it: I) -> Result + . . . . where + . . . . I: DoubleEndedIterator>, + . . . . { +190,030 ( 0.05%) . . . let first = if self.is_reverse() { it.next_back() } else { it.next() }; +211,121 ( 0.06%) 514 ( 0.06%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (344x) + 8,406 ( 0.00%) . . . let ThompsonRef { start, mut end } = match first { + . . . . Some(result) => result?, + . . . . None => return self.c_empty(), + . . . . }; + . . . . loop { + . . . . let next = +447,576 ( 0.13%) . . . if self.is_reverse() { it.next_back() } else { it.next() }; +115,282 ( 0.03%) 330 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (236x) + 16,852 ( 0.00%) . . . let compiled = match next { + . . . . Some(result) => result?, + . . . . None => break, + . . . . }; + . . . . self.patch(end, compiled.start)?; + . . . . end = compiled.end; + . . . . } + 52,136 ( 0.02%) . . . Ok(ThompsonRef { start, end }) + 2,752 ( 0.00%) . . . } + . . . . + . . . . /// Compile an alternation of the given HIR values. + . . . . /// + . . . . /// This is like 'c_alt_iter', but it accepts a slice of HIR values instead + . . . . /// of an iterator of compiled NFA subgraphs. The point of accepting a + . . . . /// slice here is that it opens up some optimization opportunities. For + . . . . /// example, if all of the HIR values are literals, then this routine might + . . . . /// re-shuffle them to make NFA epsilon closures substantially faster. + . . . . fn c_alt_slice(&self, exprs: &[Hir]) -> Result { + . . . . // self.c_alt_iter(exprs.iter().map(|e| self.c(e))) + . . . . let literal_count = exprs + . . . . .iter() + . . . . .filter(|e| { +133,300 ( 0.04%) . . . matches!(*e.kind(), hir::HirKind::Literal(hir::Literal(_))) + 4 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (2x) + . . . . }) + . . . . .count(); + 4,268 ( 0.00%) . . . if literal_count <= 1 || literal_count < exprs.len() { + 26,995 ( 0.01%) . . . return self.c_alt_iter(exprs.iter().map(|e| self.c(e))); +21,009,369 ( 6.07%) 14,398 ( 1.78%) 25 ( 8.06%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (6,614x) + . . . . } + . . . . + 495 ( 0.00%) . . . let mut trie = if self.is_reverse() { + . . . . LiteralTrie::reverse() + . . . . } else { + . . . . LiteralTrie::forward() + . . . . }; + . . . . for expr in exprs.iter() { +106,844 ( 0.03%) . . . let literal = match *expr.kind() { + 53,422 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (26,711x) + . . . . hir::HirKind::Literal(hir::Literal(ref bytes)) => bytes, + . . . . _ => unreachable!(), + . . . . }; +133,555 ( 0.04%) . . . trie.add(literal)?; +23,605,451 ( 6.82%) 80,566 ( 9.95%) 11 ( 3.55%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (26,711x) + . . . . } + 495 ( 0.00%) . . . trie.compile(&mut self.builder.borrow_mut()) +16,969,276 ( 4.90%) 46,294 ( 5.72%) 32 (10.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs:regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (495x) + . . . . } + . . . . + . . . . /// Compile an alternation, where each element yielded by the given + . . . . /// iterator represents an item in the alternation. If the iterator yields + . . . . /// no elements, then this compiles down to a "fail" state. + . . . . /// + . . . . /// In an alternation, expressions appearing earlier are "preferred" at + . . . . /// match time over expressions appearing later. At least, this is true + . . . . /// when using "leftmost first" match semantics. (If "leftmost longest" are + . . . . /// ever added in the future, then this preference order of priority would + . . . . /// not apply in that mode.) + 4,851 ( 0.00%) . . . fn c_alt_iter(&self, mut it: I) -> Result + . . . . where + . . . . I: Iterator>, + . . . . { + 1,778 ( 0.00%) . . . let first = match it.next() { +83,531,022 (24.13%) 191,704 (23.67%) 88 (28.39%) . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/map.rs: as core::iter::traits::iterator::Iterator>::next (175x) + . . . . None => return self.c_fail(), + 175 ( 0.00%) . . . Some(result) => result?, + . . . . }; + 1,778 ( 0.00%) . . . let second = match it.next() { + 3,675 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/map.rs: as core::iter::traits::iterator::Iterator>::next (175x) + . . . . None => return Ok(first), + . . . . Some(result) => result?, + . . . . }; + . . . . + . . . . let union = self.add_union()?; + . . . . let end = self.add_empty()?; + 2,156 ( 0.00%) . . . self.patch(union, first.start)?; +179,012 ( 0.05%) 712 ( 0.09%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (539x) + 2,156 ( 0.00%) . . . self.patch(first.end, end)?; + 28,041 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (539x) + 2,156 ( 0.00%) . . . self.patch(union, second.start)?; + 35,035 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (539x) + 2,156 ( 0.00%) . . . self.patch(second.end, end)?; + 28,067 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (539x) + 11,072 ( 0.00%) . . . for result in it { + . . . . let compiled = result?; + 27,680 ( 0.01%) . . . self.patch(union, compiled.start)?; +600,692 ( 0.17%) 1,125 ( 0.14%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (5,536x) + 33,216 ( 0.01%) . . . self.patch(compiled.end, end)?; +287,911 ( 0.08%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::patch (5,536x) + . . . . } + 2,695 ( 0.00%) . . . Ok(ThompsonRef { start: union, end }) + 4,312 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given capture sub-expression. `expr` should be the + . . . . /// sub-expression contained inside the capture. If "capture" states are + . . . . /// enabled, then they are added as appropriate. + . . . . /// + . . . . /// This accepts the pieces of a capture instead of a `hir::Capture` so + . . . . /// that it's easy to manufacture a "fake" group when necessary, e.g., for + . . . . /// adding the entire pattern as if it were a group in order to create + . . . . /// appropriate "capture" states in the NFA. + 20,293 ( 0.01%) . . . fn c_cap( + . . . . &self, + . . . . index: u32, + . . . . name: Option<&str>, + . . . . expr: &Hir, + . . . . ) -> Result { + 7,805 ( 0.00%) . . . match self.config.get_which_captures() { + . . . . // No capture states means we always skip them. + . . . . WhichCaptures::None => return self.c(expr), + . . . . // Implicit captures states means we only add when index==0 since + . . . . // index==0 implies the group is implicit. + . . . . WhichCaptures::Implicit if index > 0 => return self.c(expr), + . . . . _ => {} + . . . . } + . . . . + . . . . let start = self.add_capture_start(index, name)?; + 2,322 ( 0.00%) . . . let inner = self.c(expr)?; +52,800,239 (15.25%) 107,887 (13.32%) 86 (27.74%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (81x) + . . . . let end = self.add_capture_end(index)?; + . . . . self.patch(start, inner.start)?; + . . . . self.patch(inner.end, end)?; + 3,096 ( 0.00%) . . . Ok(ThompsonRef { start, end }) + 14,049 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given repetition expression. This handles all types of + . . . . /// repetitions and greediness. + . . . . fn c_repetition( + . . . . &self, + . . . . rep: &hir::Repetition, + . . . . ) -> Result { + 33,096 ( 0.01%) . . . match (rep.min, rep.max) { + 6,568 ( 0.00%) . . . (0, Some(1)) => self.c_zero_or_one(&rep.sub, rep.greedy), + 1,824 ( 0.00%) . . . (min, None) => self.c_at_least(&rep.sub, rep.greedy, min), +1,339,535 ( 0.39%) 730 ( 0.09%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least (142x) +964,465 ( 0.28%) 54 ( 0.01%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_at_least'2 (10x) + 2,998 ( 0.00%) . . . (min, Some(max)) if min == max => self.c_exactly(&rep.sub, min), +251,263 ( 0.07%) 596 ( 0.07%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_exactly (210x) + 1,474 ( 0.00%) . . . (min, Some(max)) => self.c_bounded(&rep.sub, rep.greedy, min, max), +721,842 ( 0.21%) 1,964 ( 0.24%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_bounded (134x) + . . . . } + . . . . } + . . . . + . . . . /// Compile the given expression such that it matches at least `min` times, + . . . . /// but no more than `max` times. + . . . . /// + . . . . /// When `greedy` is true, then the preference is for the expression to + . . . . /// match as much as possible. Otherwise, it will match as little as + . . . . /// possible. + 1,742 ( 0.00%) . . . fn c_bounded( + . . . . &self, + . . . . expr: &Hir, + . . . . greedy: bool, + . . . . min: u32, + . . . . max: u32, + . . . . ) -> Result { + . . . . let prefix = self.c_exactly(expr, min)?; + 268 ( 0.00%) . . . if min == max { + . . . . return Ok(prefix); + . . . . } + . . . . + . . . . // It is tempting here to compile the rest here as a concatenation + . . . . // of zero-or-one matches. i.e., for `a{2,5}`, compile it as if it + . . . . // were `aaa?a?a?`. The problem here is that it leads to this program: + . . . . // + . . . . // >000000: 61 => 01 +-- line 1178 ---------------------------------------- +-- line 1198 ---------------------------------------- + . . . . // 000006: union(07, 08) + . . . . // 000007: 61 => 08 + . . . . // 000008: MATCH + . . . . // + . . . . // So that the epsilon closure of state 2 is now just 3 and 8. + . . . . let empty = self.add_empty()?; + . . . . let mut prev_end = prefix.end; + . . . . for _ in min..max { + 1,052 ( 0.00%) . . . let union = if greedy { + . . . . self.add_union() + . . . . } else { + . . . . self.add_union_reverse() + . . . . }?; + 2,104 ( 0.00%) . . . let compiled = self.c(expr)?; +288,750 ( 0.08%) 870 ( 0.11%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (526x) + . . . . self.patch(prev_end, union)?; + . . . . self.patch(union, compiled.start)?; + . . . . self.patch(union, empty)?; + . . . . prev_end = compiled.end; + . . . . } + . . . . self.patch(prev_end, empty)?; + 536 ( 0.00%) . . . Ok(ThompsonRef { start: prefix.start, end: empty }) + 1,072 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given expression such that it may be matched `n` or more + . . . . /// times, where `n` can be any integer. (Although a particularly large + . . . . /// integer is likely to run afoul of any configured size limits.) + . . . . /// + . . . . /// When `greedy` is true, then the preference is for the expression to + . . . . /// match as much as possible. Otherwise, it will match as little as + . . . . /// possible. + 2,882 ( 0.00%) . . . fn c_at_least( + . . . . &self, + . . . . expr: &Hir, + . . . . greedy: bool, + . . . . n: u32, + . . . . ) -> Result { + 812 ( 0.00%) . . . if n == 0 { + . . . . // When the expression cannot match the empty string, then we + . . . . // can get away with something much simpler: just one 'alt' + . . . . // instruction that optionally repeats itself. But if the expr + . . . . // can match the empty string... see below. + 720 ( 0.00%) . . . if expr.properties().minimum_len().map_or(false, |len| len > 0) { + 288 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::properties (144x) + 288 ( 0.00%) . . . let union = if greedy { + . . . . self.add_union() + . . . . } else { + . . . . self.add_union_reverse() + . . . . }?; + 432 ( 0.00%) . . . let compiled = self.c(expr)?; + 62,960 ( 0.02%) 84 ( 0.01%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (34x) + 33,110 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c (110x) + . . . . self.patch(union, compiled.start)?; + . . . . self.patch(compiled.end, union)?; + 288 ( 0.00%) . . . return Ok(ThompsonRef { start: union, end: union }); + . . . . } + . . . . + . . . . // What's going on here? Shouldn't x* be simpler than this? It + . . . . // turns out that when implementing leftmost-first (Perl-like) + . . . . // match semantics, x* results in an incorrect preference order + . . . . // when computing the transitive closure of states if and only if + . . . . // 'x' can match the empty string. So instead, we compile x* as + . . . . // (x+)?, which preserves the correct preference order. +-- line 1256 ---------------------------------------- +-- line 1271 ---------------------------------------- + . . . . self.add_union_reverse() + . . . . }?; + . . . . let empty = self.add_empty()?; + . . . . self.patch(question, compiled.start)?; + . . . . self.patch(question, empty)?; + . . . . self.patch(plus, empty)?; + . . . . Ok(ThompsonRef { start: question, end: empty }) + . . . . } else if n == 1 { + 354 ( 0.00%) . . . let compiled = self.c(expr)?; +1,205,526 ( 0.35%) 420 ( 0.05%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (108x) + 236 ( 0.00%) . . . let union = if greedy { + . . . . self.add_union() + . . . . } else { + . . . . self.add_union_reverse() + . . . . }?; + . . . . self.patch(compiled.end, union)?; + . . . . self.patch(union, compiled.start)?; + 236 ( 0.00%) . . . Ok(ThompsonRef { start: compiled.start, end: union }) + . . . . } else { + . . . . let prefix = self.c_exactly(expr, n - 1)?; + . . . . let last = self.c(expr)?; + . . . . let union = if greedy { + . . . . self.add_union() + . . . . } else { + . . . . self.add_union_reverse() + . . . . }?; + . . . . self.patch(prefix.end, last.start)?; + . . . . self.patch(last.end, union)?; + . . . . self.patch(union, last.start)?; + . . . . Ok(ThompsonRef { start: prefix.start, end: union }) + . . . . } + 2,358 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given expression such that it may be matched zero or one + . . . . /// times. + . . . . /// + . . . . /// When `greedy` is true, then the preference is for the expression to + . . . . /// match as much as possible. Otherwise, it will match as little as + . . . . /// possible. + . . . . fn c_zero_or_one( + . . . . &self, + . . . . expr: &Hir, + . . . . greedy: bool, + . . . . ) -> Result { + . . . . let union = + 16,420 ( 0.00%) . . . if greedy { self.add_union() } else { self.add_union_reverse() }?; + 49 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (1x) + 9,852 ( 0.00%) . . . let compiled = self.c(expr)?; + 818 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c'2 (1x) + . . . . let empty = self.add_empty()?; + . . . . self.patch(union, compiled.start)?; + . . . . self.patch(union, empty)?; + . . . . self.patch(compiled.end, empty)?; + 13,136 ( 0.00%) . . . Ok(ThompsonRef { start: union, end: empty }) + . . . . } + . . . . + . . . . /// Compile the given HIR expression exactly `n` times. + 210 ( 0.00%) . . . fn c_exactly( + . . . . &self, + . . . . expr: &Hir, + . . . . n: u32, + . . . . ) -> Result { + . . . . let it = (0..n).map(|_| self.c(expr)); + 344 ( 0.00%) . . . self.c_concat(it) +120,226 ( 0.03%) 248 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::c_concat (134x) + 420 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given byte oriented character class. + . . . . /// + . . . . /// This uses "sparse" states to represent an alternation between ranges in + . . . . /// this character class. We can use "sparse" states instead of stitching + . . . . /// together a "union" state because all ranges in a character class have + . . . . /// equal priority *and* are non-overlapping (thus, only one can match, so + . . . . /// there's never a question of priority in the first place). This saves a +-- line 1340 ---------------------------------------- +-- line 1341 ---------------------------------------- + . . . . /// fair bit of overhead when traversing an NFA. + . . . . /// + . . . . /// This routine compiles an empty character class into a "fail" state. + . . . . fn c_byte_class( + . . . . &self, + . . . . cls: &hir::ClassBytes, + . . . . ) -> Result { + . . . . let end = self.add_empty()?; + 330 ( 0.00%) . . . let mut trans = Vec::with_capacity(cls.ranges().len()); + 330 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassBytes::ranges (110x) + 1,430 ( 0.00%) . . . for r in cls.iter() { + 1,210 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (220x) + 440 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassBytes::iter (110x) + 660 ( 0.00%) . . . trans.push(Transition { + 330 ( 0.00%) . . . start: r.start(), + 220 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytesRange::start (110x) + 220 ( 0.00%) . . . end: r.end(), + 220 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytesRange::end (110x) + . . . . next: end, + . . . . }); + . . . . } + 550 ( 0.00%) . . . Ok(ThompsonRef { start: self.add_sparse(trans)?, end }) + . . . . } + . . . . + . . . . /// Compile the given Unicode character class. + . . . . /// + . . . . /// This routine specifically tries to use various types of compression, + . . . . /// since UTF-8 automata of large classes can get quite large. The specific + . . . . /// type of compression used depends on forward vs reverse compilation, and + . . . . /// whether NFA shrinking is enabled or not. +-- line 1365 ---------------------------------------- +-- line 1372 ---------------------------------------- + . . . . /// This routine compiles an empty character class into a "fail" state. + . . . . fn c_unicode_class( + . . . . &self, + . . . . cls: &hir::ClassUnicode, + . . . . ) -> Result { + . . . . // If all we have are ASCII ranges wrapped in a Unicode package, then + . . . . // there is zero reason to bring out the big guns. We can fit all ASCII + . . . . // ranges within a single sparse state. + 22,524 ( 0.01%) . . . if cls.is_ascii() { + 14 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:regex_syntax::hir::ClassUnicode::is_ascii (2x) + . . . . let end = self.add_empty()?; + 16,134 ( 0.00%) . . . let mut trans = Vec::with_capacity(cls.ranges().len()); + 6 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassBytes::ranges (2x) + 88,899 ( 0.03%) . . . for r in cls.iter() { + 58 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (10x) + 8 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassUnicode::iter (2x) + . . . . // The unwraps below are OK because we've verified that this + . . . . // class only contains ASCII codepoints. + 45,875 ( 0.01%) . . . trans.push(Transition { + . . . . // FIXME(1.59): use the 'TryFrom for u8' impl. + 18,350 ( 0.01%) . . . start: u8::try_from(u32::from(r.start())).unwrap(), + 16 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::start (8x) + 18,350 ( 0.01%) . . . end: u8::try_from(u32::from(r.end())).unwrap(), + 16 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::end (8x) + . . . . next: end, + . . . . }); + . . . . } + 21,512 ( 0.01%) . . . Ok(ThompsonRef { start: self.add_sparse(trans)?, end }) + 253 ( 0.00%) . . . } else if self.is_reverse() { + 127 ( 0.00%) . . . if !self.config.get_shrink() { + . . . . // When we don't want to spend the extra time shrinking, we + . . . . // compile the UTF-8 automaton in reverse using something like + . . . . // the "naive" approach, but will attempt to re-use common + . . . . // suffixes. + . . . . self.c_unicode_class_reverse_with_suffix(cls) + . . . . } else { + . . . . // When we want to shrink our NFA for reverse UTF-8 automata, + . . . . // we cannot feed UTF-8 sequences directly to the UTF-8 +-- line 1403 ---------------------------------------- +-- line 1432 ---------------------------------------- + . . . . } else { + . . . . // In the forward direction, we always shrink our UTF-8 automata + . . . . // because we can stream it right into the UTF-8 compiler. There + . . . . // is almost no downside (in either memory or time) to using this + . . . . // approach. + . . . . let mut builder = self.builder.borrow_mut(); + . . . . let mut utf8_state = self.utf8_state.borrow_mut(); + . . . . let mut utf8c = + 378 ( 0.00%) . . . Utf8Compiler::new(&mut *builder, &mut *utf8_state)?; +17,662,970 ( 5.10%) 642 ( 0.08%) 40 (12.90%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::new (126x) + 4,288 ( 0.00%) . . . for rng in cls.iter() { + 4,566 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (782x) + 504 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassUnicode::iter (126x) + 28,664 ( 0.01%) . . . for seq in Utf8Sequences::new(rng.start(), rng.end()) { +172,146 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:::next (1,800x) + 97,769 ( 0.03%) 102 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequences::new (656x) + 1,312 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::end (656x) + 1,312 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::start (656x) + 8,008 ( 0.00%) . . . utf8c.add(seq.as_slice())?; +934,285 ( 0.27%) 1,530 ( 0.19%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1,144x) + 10,296 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequence::as_slice (1,144x) + . . . . } + . . . . } + 126 ( 0.00%) . . . utf8c.finish() +211,097 ( 0.06%) 422 ( 0.05%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::finish (126x) + . . . . } + . . . . + . . . . // For reference, the code below is the "naive" version of compiling a + . . . . // UTF-8 automaton. It is deliciously simple (and works for both the + . . . . // forward and reverse cases), but will unfortunately produce very + . . . . // large NFAs. When compiling a forward automaton, the size difference + . . . . // can sometimes be an order of magnitude. For example, the '\w' regex + . . . . // will generate about ~3000 NFA states using the naive approach below, +-- line 1454 ---------------------------------------- +-- line 1510 ---------------------------------------- + . . . . &self, + . . . . cls: &hir::ClassUnicode, + . . . . ) -> Result { + . . . . // N.B. It would likely be better to cache common *prefixes* in the + . . . . // reverse direction, but it's not quite clear how to do that. The + . . . . // advantage of caching suffixes is that it does give us a win, and + . . . . // has a very small additional overhead. + . . . . let mut cache = self.utf8_suffix.borrow_mut(); + 127 ( 0.00%) . . . cache.clear(); +395,334 ( 0.11%) 394 ( 0.05%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/map.rs:regex_automata::nfa::thompson::map::Utf8SuffixMap::clear (127x) + . . . . + . . . . let union = self.add_union()?; + . . . . let alt_end = self.add_empty()?; + 6,423 ( 0.00%) . . . for urng in cls.iter() { + 4,595 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs:::next (787x) + 508 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs:regex_syntax::hir::ClassUnicode::iter (127x) + 22,448 ( 0.01%) . . . for seq in Utf8Sequences::new(urng.start(), urng.end()) { +173,951 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:::next (1,816x) + 88,440 ( 0.03%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequences::new (660x) + 1,320 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::start (660x) + 1,320 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicodeRange::end (660x) + . . . . let mut end = alt_end; + 2,312 ( 0.00%) . . . for brng in seq.as_slice() { + 10,404 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs:regex_syntax::utf8::Utf8Sequence::as_slice (1,156x) + . . . . let key = Utf8SuffixKey { + . . . . from: end, + . . . . start: brng.start, + . . . . end: brng.end, + . . . . }; + . . . . let hash = cache.hash(&key); + . . . . if let Some(id) = cache.get(&key, hash) { + . . . . end = id; + . . . . continue; + . . . . } + . . . . + 5,456 ( 0.00%) . . . let compiled = self.c_range(brng.start, brng.end)?; + . . . . self.patch(compiled.end, end)?; + . . . . end = compiled.start; + 10,912 ( 0.00%) . . . cache.set(key, hash, end); + . . . . } + . . . . self.patch(union, end)?; + . . . . } + . . . . } + 508 ( 0.00%) . . . Ok(ThompsonRef { start: union, end: alt_end }) + 254 ( 0.00%) . . . } + . . . . + . . . . /// Compile the given HIR look-around assertion to an NFA look-around + . . . . /// assertion. + . . . . fn c_look(&self, anchor: &hir::Look) -> Result { + . . . . let look = match *anchor { + . . . . hir::Look::Start => Look::Start, + . . . . hir::Look::End => Look::End, + . . . . hir::Look::StartLF => Look::StartLF, +-- line 1554 ---------------------------------------- +-- line 1606 ---------------------------------------- + . . . . + . . . . // The below helpers are meant to be simple wrappers around the + . . . . // corresponding Builder methods. For the most part, they let us write + . . . . // 'self.add_foo()' instead of 'self.builder.borrow_mut().add_foo()', where + . . . . // the latter is a mouthful. Some of the methods do inject a little bit + . . . . // of extra logic. e.g., Flipping look-around operators when compiling in + . . . . // reverse mode. + . . . . + 39,684 ( 0.01%) . . . fn patch(&self, from: StateID, to: StateID) -> Result<(), BuildError> { +183,706 ( 0.05%) . . . self.builder.borrow_mut().patch(from, to) + 7,730 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::patch (175x) + 66,140 ( 0.02%) . . . } + . . . . + . . . . fn start_pattern(&self) -> Result { + . . . . self.builder.borrow_mut().start_pattern() + . . . . } + . . . . + . . . . fn finish_pattern( + . . . . &self, + . . . . start_id: StateID, +-- line 1624 ---------------------------------------- +-- line 1626 ---------------------------------------- + . . . . self.builder.borrow_mut().finish_pattern(start_id) + . . . . } + . . . . + . . . . fn add_empty(&self) -> Result { + . . . . self.builder.borrow_mut().add_empty() + . . . . } + . . . . + . . . . fn add_range(&self, start: u8, end: u8) -> Result { + 49,675 ( 0.01%) . . . self.builder.borrow_mut().add_range(Transition { + . . . . start, + . . . . end, + . . . . next: StateID::ZERO, + . . . . }) + . . . . } + . . . . + . . . . fn add_sparse( + . . . . &self, + . . . . ranges: Vec, + . . . . ) -> Result { + . . . . self.builder.borrow_mut().add_sparse(ranges) + . . . . } + . . . . + . . . . fn add_look(&self, mut look: Look) -> Result { + 490 ( 0.00%) . . . if self.is_reverse() { + . . . . look = look.reversed(); + . . . . } + . . . . self.builder.borrow_mut().add_look(StateID::ZERO, look) + . . . . } + . . . . + . . . . fn add_union(&self) -> Result { + . . . . self.builder.borrow_mut().add_union(vec![]) + . . . . } +-- line 1657 ---------------------------------------- +-- line 1661 ---------------------------------------- + . . . . } + . . . . + . . . . fn add_capture_start( + . . . . &self, + . . . . capture_index: u32, + . . . . name: Option<&str>, + . . . . ) -> Result { + . . . . let name = name.map(|n| Arc::from(n)); + 4,644 ( 0.00%) . . . self.builder.borrow_mut().add_capture_start( + 40,492 ( 0.01%) 82 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add_capture_start (81x) + . . . . StateID::ZERO, + . . . . capture_index, + . . . . name, + . . . . ) + . . . . } + . . . . + . . . . fn add_capture_end( + . . . . &self, +-- line 1677 ---------------------------------------- +-- line 1748 ---------------------------------------- + . . . . } + . . . . + . . . . impl Utf8State { + . . . . fn new() -> Utf8State { + . . . . Utf8State { compiled: Utf8BoundedMap::new(10_000), uncompiled: vec![] } + . . . . } + . . . . + . . . . fn clear(&mut self) { + 252 ( 0.00%) . . . self.compiled.clear(); +17,632,718 ( 5.09%) 606 ( 0.07%) 40 (12.90%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/map.rs:regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (126x) + . . . . self.uncompiled.clear(); + . . . . } + . . . . } + . . . . + . . . . impl<'a> Utf8Compiler<'a> { + 1,260 ( 0.00%) . . . fn new( + . . . . builder: &'a mut Builder, + . . . . state: &'a mut Utf8State, + . . . . ) -> Result, BuildError> { + . . . . let target = builder.add_empty()?; + . . . . state.clear(); + . . . . let mut utf8c = Utf8Compiler { builder, state, target }; + . . . . utf8c.add_empty(); + 504 ( 0.00%) . . . Ok(utf8c) + 1,008 ( 0.00%) . . . } + . . . . + 756 ( 0.00%) . . . fn finish(&mut self) -> Result { + 252 ( 0.00%) . . . self.compile_from(0)?; +154,838 ( 0.04%) 312 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (126x) + 126 ( 0.00%) . . . let node = self.pop_root(); + 504 ( 0.00%) . . . let start = self.compile(node)?; + 51,219 ( 0.01%) 110 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (126x) + 504 ( 0.00%) . . . Ok(ThompsonRef { start, end: self.target }) + 504 ( 0.00%) . . . } + . . . . + 11,440 ( 0.00%) . . . fn add(&mut self, ranges: &[Utf8Range]) -> Result<(), BuildError> { + . . . . let prefix_len = ranges + . . . . .iter() + 1,144 ( 0.00%) . . . .zip(&self.state.uncompiled) + . . . . .take_while(|&(range, node)| { + 2,826 ( 0.00%) . . . node.last.as_ref().map_or(false, |t| { + . . . . (t.start, t.end) == (range.start, range.end) + . . . . }) + . . . . }) + . . . . .count(); + 2,288 ( 0.00%) . . . assert!(prefix_len < ranges.len()); + 2,288 ( 0.00%) . . . self.compile_from(prefix_len)?; +815,578 ( 0.24%) 1,530 ( 0.19%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1,144x) + 848 ( 0.00%) . . . self.add_suffix(&ranges[prefix_len..]); + . . . . Ok(()) + 10,296 ( 0.00%) . . . } + . . . . + 11,430 ( 0.00%) . . . fn compile_from(&mut self, from: usize) -> Result<(), BuildError> { + 1,270 ( 0.00%) . . . let mut next = self.target; + 5,646 ( 0.00%) . . . while from + 1 < self.state.uncompiled.len() { + . . . . let node = self.pop_freeze(next); + 7,765 ( 0.00%) . . . next = self.compile(node)?; +475,225 ( 0.14%) 899 ( 0.11%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (1,553x) + . . . . } + . . . . self.top_last_freeze(next); + 2,540 ( 0.00%) . . . Ok(()) + 10,160 ( 0.00%) . . . } + . . . . + 18,469 ( 0.01%) . . . fn compile( + . . . . &mut self, + . . . . node: Vec, + . . . . ) -> Result { + . . . . let hash = self.state.compiled.hash(&node); + . . . . if let Some(id) = self.state.compiled.get(&node, hash) { + 1,842 ( 0.00%) . . . return Ok(id); + . . . . } + . . . . let id = self.builder.add_sparse(node.clone())?; + . . . . self.state.compiled.set(node, hash, id); + 2,274 ( 0.00%) . . . Ok(id) + 6,064 ( 0.00%) . . . } + . . . . + . . . . fn add_suffix(&mut self, ranges: &[Utf8Range]) { + . . . . assert!(!ranges.is_empty()); + . . . . let last = self + . . . . .state + . . . . .uncompiled + . . . . .len() + . . . . .checked_sub(1) + . . . . .expect("non-empty nodes"); + 3,432 ( 0.00%) . . . assert!(self.state.uncompiled[last].last.is_none()); + 2,288 ( 0.00%) . . . self.state.uncompiled[last].last = Some(Utf8LastTransition { + 1,144 ( 0.00%) . . . start: ranges[0].start, + . . . . end: ranges[0].end, + . . . . }); + . . . . for r in &ranges[1..] { + . . . . self.state.uncompiled.push(Utf8Node { + . . . . trans: vec![], + 3,106 ( 0.00%) . . . last: Some(Utf8LastTransition { start: r.start, end: r.end }), + . . . . }); + . . . . } + . . . . } + . . . . + . . . . fn add_empty(&mut self) { + 67 ( 0.00%) . . . self.state.uncompiled.push(Utf8Node { trans: vec![], last: None }); + . . . . } + . . . . + . . . . fn pop_freeze(&mut self, next: StateID) -> Vec { + 1,553 ( 0.00%) . . . let mut uncompiled = self.state.uncompiled.pop().unwrap(); + . . . . uncompiled.set_last_transition(next); + 6,212 ( 0.00%) . . . uncompiled.trans + . . . . } + . . . . + . . . . fn pop_root(&mut self) -> Vec { + 252 ( 0.00%) . . . assert_eq!(self.state.uncompiled.len(), 1); + 252 ( 0.00%) . . . assert!(self.state.uncompiled[0].last.is_none()); + . . . . self.state.uncompiled.pop().expect("non-empty nodes").trans + . . . . } + . . . . + . . . . fn top_last_freeze(&mut self, next: StateID) { + . . . . let last = self + . . . . .state + . . . . .uncompiled + . . . . .len() + . . . . .checked_sub(1) + . . . . .expect("non-empty nodes"); + 3,558 ( 0.00%) . . . self.state.uncompiled[last].set_last_transition(next); + . . . . } + . . . . } + . . . . + . . . . impl Utf8Node { + . . . . fn set_last_transition(&mut self, next: StateID) { + 5,646 ( 0.00%) . . . if let Some(last) = self.last.take() { + 5,394 ( 0.00%) . . . self.trans.push(Transition { + . . . . start: last.start, + . . . . end: last.end, + . . . . next, + . . . . }); + . . . . } + . . . . } + . . . . } + . . . . +-- line 1878 ---------------------------------------- + +242,699 ( 0.07%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 152 ---------------------------------------- + . . . . limit_total: usize, + . . . . } + . . . . + . . . . impl Extractor { + . . . . /// Create a new extractor with a default configuration. + . . . . /// + . . . . /// The extractor can be optionally configured before calling + . . . . /// [`Extractor::extract`] to get a literal sequence. + 73 ( 0.00%) . . . pub fn new() -> Extractor { + 365 ( 0.00%) . . . Extractor { + . . . . kind: ExtractKind::Prefix, + . . . . limit_class: 10, + . . . . limit_repeat: 10, + . . . . limit_literal_len: 100, + . . . . limit_total: 250, + . . . . } + 73 ( 0.00%) . . . } + . . . . + . . . . /// Execute the extractor and return a sequence of literals. + 32,912 ( 0.01%) . . . pub fn extract(&self, hir: &Hir) -> Seq { + . . . . use crate::hir::HirKind::*; + . . . . + 18,382 ( 0.01%) . . . match *hir.kind() { + . . . . Empty | Look(_) => Seq::singleton(self::Literal::exact(vec![])), + . . . . Literal(hir::Literal(ref bytes)) => { + . . . . let mut seq = + 7,233 ( 0.00%) . . . Seq::singleton(self::Literal::exact(bytes.to_vec())); + 2,411 ( 0.00%) . . . self.enforce_literal_len(&mut seq); + 9,644 ( 0.00%) . . . seq + . . . . } + . . . . Class(hir::Class::Unicode(ref cls)) => { + . . . . self.extract_class_unicode(cls) + . . . . } + . . . . Class(hir::Class::Bytes(ref cls)) => self.extract_class_bytes(cls), + . . . . Repetition(ref rep) => self.extract_repetition(rep), + 39 ( 0.00%) . . . Capture(hir::Capture { ref sub, .. }) => self.extract(sub), + 633 ( 0.00%) . . . Concat(ref hirs) => match self.kind { + . . . . ExtractKind::Prefix => self.extract_concat(hirs.iter()), + . . . . ExtractKind::Suffix => self.extract_concat(hirs.iter().rev()), + . . . . }, + . . . . Alternation(ref hirs) => { + . . . . // Unlike concat, we always union starting from the beginning, + . . . . // since the beginning corresponds to the highest preference, + . . . . // which doesn't change based on forwards vs reverse. + . . . . self.extract_alternation(hirs.iter()) + . . . . } + . . . . } + 23,936 ( 0.01%) . . . } + . . . . + . . . . /// Set the kind of literal sequence to extract from an [`Hir`] expression. + . . . . /// + . . . . /// The default is to extract prefixes, but suffixes can be selected + . . . . /// instead. The contract for prefixes is that every match of the + . . . . /// corresponding `Hir` must start with one of the literals in the sequence + . . . . /// returned. Moreover, the _order_ of the sequence returned corresponds to + . . . . /// the preference order. +-- line 207 ---------------------------------------- +-- line 212 ---------------------------------------- + . . . . /// preference order. + . . . . /// + . . . . /// Remember that a sequence can be infinite. For example, unless the + . . . . /// limits are configured to be impractically large, attempting to extract + . . . . /// prefixes (or suffixes) for the pattern `[A-Z]` will return an infinite + . . . . /// sequence. Generally speaking, if the sequence returned is infinite, + . . . . /// then it is presumed to be unwise to do prefix (or suffix) optimizations + . . . . /// for the pattern. + 73 ( 0.00%) . . . pub fn kind(&mut self, kind: ExtractKind) -> &mut Extractor { + 73 ( 0.00%) . . . self.kind = kind; + . . . . self + 73 ( 0.00%) . . . } + . . . . + . . . . /// Configure a limit on the length of the sequence that is permitted for + . . . . /// a character class. If a character class exceeds this limit, then the + . . . . /// sequence returned for it is infinite. + . . . . /// + . . . . /// This prevents classes like `[A-Z]` or `\pL` from getting turned into + . . . . /// huge and likely unproductive sequences of literals. + . . . . /// +-- line 231 ---------------------------------------- +-- line 399 ---------------------------------------- + . . . . // product will always be a no-op. Thus, there is nothing else we + . . . . // can add to it and can quit early. Note that this also includes + . . . . // infinite sequences. + . . . . if seq.is_inexact() { + . . . . break; + . . . . } + . . . . // Note that 'cross' also dispatches based on whether we're + . . . . // extracting prefixes or suffixes. + 6,795 ( 0.00%) . . . seq = self.cross(seq, &mut self.extract(hir)); +4,724,056 ( 1.36%) 7,673 ( 0.95%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (111x) +1,874,581 ( 0.54%) 8,392 ( 1.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross (111x) + . . . . } + . . . . seq + . . . . } + . . . . + . . . . /// Extract a sequence from the given alternation. + . . . . /// + . . . . /// This short circuits once the union turns into an infinite sequence. + . . . . fn extract_alternation<'a, I: Iterator>( + . . . . &self, + . . . . it: I, + . . . . ) -> Seq { + . . . . let mut seq = Seq::empty(); + 2,258 ( 0.00%) . . . for hir in it { + . . . . // Once our 'seq' is infinite, every subsequent union + . . . . // operation on it will itself always result in an + . . . . // infinite sequence. Thus, it can never change and we can + . . . . // short-circuit. + . . . . if !seq.is_finite() { + . . . . break; + . . . . } + 31,570 ( 0.01%) . . . seq = self.union(seq, &mut self.extract(hir)); +438,140 ( 0.13%) 1,757 ( 0.22%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (855x) +1,033,841 ( 0.30%) 254 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::union (855x) + . . . . } + . . . . seq + . . . . } + . . . . + . . . . /// Extract a sequence of literals from the given repetition. We do our + . . . . /// best, Some examples: + . . . . /// + . . . . /// 'a*' => [inexact(a), exact("")] +-- line 436 ---------------------------------------- +-- line 441 ---------------------------------------- + . . . . /// + . . . . /// The key here really is making sure we get the 'inexact' vs 'exact' + . . . . /// attributes correct on each of the literals we add. For example, the + . . . . /// fact that 'a*' gives us an inexact 'a' and an exact empty string means + . . . . /// that a regex like 'ab*c' will result in [inexact(ab), exact(ac)] + . . . . /// literals being extracted, which might actually be a better prefilter + . . . . /// than just 'a'. + . . . . fn extract_repetition(&self, rep: &hir::Repetition) -> Seq { + 844 ( 0.00%) . . . let mut subseq = self.extract(&rep.sub); + 9,729 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract'2 (9x) + 900 ( 0.00%) . . . match *rep { + 384 ( 0.00%) . . . hir::Repetition { min: 0, max, greedy, .. } => { + . . . . // When 'max=1', we can retain exactness, since 'a?' is + . . . . // equivalent to 'a|'. Similarly below, 'a??' is equivalent to + . . . . // '|a'. + 570 ( 0.00%) . . . if max != Some(1) { + 6 ( 0.00%) . . . subseq.make_inexact(); + . . . . } + . . . . let mut empty = Seq::singleton(Literal::exact(vec![])); + 192 ( 0.00%) . . . if !greedy { + . . . . mem::swap(&mut subseq, &mut empty); + . . . . } + 1,920 ( 0.00%) . . . self.union(subseq, &mut empty) + 1,962 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::union (9x) + . . . . } + . . . . hir::Repetition { min, max: Some(max), .. } if min == max => { + . . . . assert!(min > 0); // handled above + . . . . let limit = + . . . . u32::try_from(self.limit_repeat).unwrap_or(u32::MAX); + . . . . let mut seq = Seq::singleton(Literal::exact(vec![])); + . . . . for _ in 0..cmp::min(min, limit) { + . . . . if seq.is_inexact() { + . . . . break; + . . . . } + 198 ( 0.00%) . . . seq = self.cross(seq, &mut subseq.clone()); +373,560 ( 0.11%) 1,140 ( 0.14%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross (18x) + . . . . } + 16 ( 0.00%) . . . if usize::try_from(min).is_err() || min > limit { + . . . . seq.make_inexact(); + . . . . } + 24 ( 0.00%) . . . seq + . . . . } + . . . . hir::Repetition { min, .. } => { + . . . . assert!(min > 0); // handled above + . . . . let limit = + . . . . u32::try_from(self.limit_repeat).unwrap_or(u32::MAX); + . . . . let mut seq = Seq::singleton(Literal::exact(vec![])); + . . . . for _ in 0..cmp::min(min, limit) { + . . . . if seq.is_inexact() { + . . . . break; + . . . . } + 121 ( 0.00%) . . . seq = self.cross(seq, &mut subseq.clone()); + 7,145 ( 0.00%) 3 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::cross (11x) + . . . . } + . . . . seq.make_inexact(); + 44 ( 0.00%) . . . seq + . . . . } + . . . . } + 249 ( 0.00%) . . . } + . . . . + . . . . /// Convert the given Unicode class into a sequence of literals if the + . . . . /// class is small enough. If the class is too big, return an infinite + . . . . /// sequence. + . . . . fn extract_class_unicode(&self, cls: &hir::ClassUnicode) -> Seq { + 187 ( 0.00%) . . . if self.class_over_limit_unicode(cls) { + . . . . return Seq::infinite(); + . . . . } + . . . . let mut seq = Seq::empty(); + . . . . for r in cls.iter() { + . . . . for ch in r.start()..=r.end() { + . . . . seq.push(Literal::from(ch)); + . . . . } + . . . . } + 445 ( 0.00%) . . . self.enforce_literal_len(&mut seq); + 534 ( 0.00%) . . . seq + . . . . } + . . . . + . . . . /// Convert the given byte class into a sequence of literals if the class + . . . . /// is small enough. If the class is too big, return an infinite sequence. + . . . . fn extract_class_bytes(&self, cls: &hir::ClassBytes) -> Seq { + . . . . if self.class_over_limit_bytes(cls) { + . . . . return Seq::infinite(); + . . . . } +-- line 519 ---------------------------------------- +-- line 527 ---------------------------------------- + . . . . seq + . . . . } + . . . . + . . . . /// Returns true if the given Unicode class exceeds the configured limits + . . . . /// on this extractor. + . . . . fn class_over_limit_unicode(&self, cls: &hir::ClassUnicode) -> bool { + . . . . let mut count = 0; + . . . . for r in cls.iter() { + 608 ( 0.00%) . . . if count > self.limit_class { + . . . . return true; + . . . . } + 246 ( 0.00%) . . . count += r.len(); + . . . . } + 89 ( 0.00%) . . . count > self.limit_class + . . . . } + . . . . + . . . . /// Returns true if the given byte class exceeds the configured limits on + . . . . /// this extractor. + . . . . fn class_over_limit_bytes(&self, cls: &hir::ClassBytes) -> bool { + . . . . let mut count = 0; + . . . . for r in cls.iter() { + . . . . if count > self.limit_class { +-- line 548 ---------------------------------------- +-- line 551 ---------------------------------------- + . . . . count += r.len(); + . . . . } + . . . . count > self.limit_class + . . . . } + . . . . + . . . . /// Compute the cross product of the two sequences if the result would be + . . . . /// within configured limits. Otherwise, make `seq2` infinite and cross the + . . . . /// infinite sequence with `seq1`. + 4,338 ( 0.00%) . . . fn cross(&self, mut seq1: Seq, seq2: &mut Seq) -> Seq { + 1,907 ( 0.00%) . . . if seq1.max_cross_len(seq2).map_or(false, |len| len > self.limit_total) + . . . . { + . . . . seq2.make_infinite(); + . . . . } + 2,410 ( 0.00%) . . . if let ExtractKind::Suffix = self.kind { + . . . . seq1.cross_reverse(seq2); + . . . . } else { + . . . . seq1.cross_forward(seq2); + . . . . } + 469 ( 0.00%) . . . assert!(seq1.len().map_or(true, |x| x <= self.limit_total)); + 964 ( 0.00%) . . . self.enforce_literal_len(&mut seq1); + 2,410 ( 0.00%) . . . seq1 + 3,856 ( 0.00%) . . . } + . . . . + . . . . /// Union the two sequences if the result would be within configured + . . . . /// limits. Otherwise, make `seq2` infinite and union the infinite sequence + . . . . /// with `seq1`. + 22,023 ( 0.01%) . . . fn union(&self, mut seq1: Seq, seq2: &mut Seq) -> Seq { + 2,444 ( 0.00%) . . . if seq1.max_union_len(seq2).map_or(false, |len| len > self.limit_total) + . . . . { + . . . . // We try to trim our literal sequences to see if we can make + . . . . // room for more literals. The idea is that we'd rather trim down + . . . . // literals already in our sequence if it means we can add a few + . . . . // more and retain a finite sequence. Otherwise, we'll union with + . . . . // an infinite sequence and that infects everything and effectively + . . . . // stops literal extraction in its tracks. + . . . . // + . . . . // We do we keep 4 bytes here? Well, it's a bit of an abstraction + . . . . // leakage. Downstream, the literals may wind up getting fed to + . . . . // the Teddy algorithm, which supports searching literals up to + . . . . // length 4. So that's why we pick that number here. Arguably this + . . . . // should be a tuneable parameter, but it seems a little tricky to + . . . . // describe. And I'm still unsure if this is the right way to go + . . . . // about culling literal sequences. + 2 ( 0.00%) . . . match self.kind { + . . . . ExtractKind::Prefix => { + . . . . seq1.keep_first_bytes(4); + . . . . seq2.keep_first_bytes(4); + . . . . } + . . . . ExtractKind::Suffix => { + . . . . seq1.keep_last_bytes(4); + 2 ( 0.00%) . . . seq2.keep_last_bytes(4); + . . . . } + . . . . } + . . . . seq1.dedup(); + . . . . seq2.dedup(); + 1 ( 0.00%) . . . if seq1 + . . . . .max_union_len(seq2) + . . . . .map_or(false, |len| len > self.limit_total) + . . . . { + . . . . seq2.make_infinite(); + . . . . } + . . . . } + . . . . seq1.union(seq2); + 2,443 ( 0.00%) . . . assert!(seq1.len().map_or(true, |x| x <= self.limit_total)); + 12,235 ( 0.00%) . . . seq1 + 19,576 ( 0.01%) . . . } + . . . . + . . . . /// Applies the literal length limit to the given sequence. If none of the + . . . . /// literals in the sequence exceed the limit, then this is a no-op. + . . . . fn enforce_literal_len(&self, seq: &mut Seq) { + . . . . let len = self.limit_literal_len; + 5,482 ( 0.00%) . . . match self.kind { + . . . . ExtractKind::Prefix => seq.keep_first_bytes(len), + . . . . ExtractKind::Suffix => seq.keep_last_bytes(len), + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl Default for Extractor { + . . . . fn default() -> Extractor { +-- line 630 ---------------------------------------- +-- line 724 ---------------------------------------- + . . . . /// // not altered by simplifying the set. + . . . . /// let expected = Seq::from_iter([ + . . . . /// Literal::inexact("far"), + . . . . /// Literal::inexact("app"), + . . . . /// Literal::exact("gap"), + . . . . /// ]); + . . . . /// assert_eq!(expected, seq); + . . . . /// ``` + 116 ( 0.00%) . . . #[derive(Clone, Eq, PartialEq)] + . . . . pub struct Seq { + . . . . /// The members of this seq. + . . . . /// + . . . . /// When `None`, the seq represents all possible literals. That is, it + . . . . /// prevents one from making assumptions about specific literals in the + . . . . /// seq, and forces one to treat it as if any literal might be in the seq. + . . . . /// + . . . . /// Note that `Some(vec![])` is valid and corresponds to the empty seq of +-- line 740 ---------------------------------------- +-- line 746 ---------------------------------------- + . . . . + . . . . impl Seq { + . . . . /// Returns an empty sequence. + . . . . /// + . . . . /// An empty sequence matches zero literals, and thus corresponds to a + . . . . /// regex that itself can never match. + . . . . #[inline] + . . . . pub fn empty() -> Seq { + 534 ( 0.00%) . . . Seq { literals: Some(vec![]) } + . . . . } + . . . . + . . . . /// Returns a sequence of literals without a finite size and may contain + . . . . /// any literal. + . . . . /// + . . . . /// A sequence without finite size does not reveal anything about the + . . . . /// characteristics of the literals in its set. There are no fixed prefixes + . . . . /// or suffixes, nor are lower or upper bounds on the length of the literals +-- line 762 ---------------------------------------- +-- line 810 ---------------------------------------- + . . . . /// Similarly, if the most recently added item of this sequence is + . . . . /// equivalent to the literal given, then it is not added. This reflects + . . . . /// a `Seq`'s "set like" behavior, and represents a practical trade off. + . . . . /// Namely, there is never any need to have two adjacent and equivalent + . . . . /// literals in the same sequence, _and_ it is easy to detect in some + . . . . /// cases. + . . . . #[inline] + . . . . pub fn push(&mut self, lit: Literal) { + 1,227 ( 0.00%) . . . let lits = match self.literals { + . . . . None => return, + . . . . Some(ref mut lits) => lits, + . . . . }; + 318 ( 0.00%) . . . if lits.last().map_or(false, |m| m == &lit) { + . . . . return; + . . . . } + . . . . lits.push(lit); + . . . . } + . . . . + . . . . /// Make all of the literals in this sequence inexact. + . . . . /// + . . . . /// This is a no-op if this sequence is not finite. + . . . . #[inline] + . . . . pub fn make_inexact(&mut self) { + 116 ( 0.00%) . . . let lits = match self.literals { + . . . . None => return, + . . . . Some(ref mut lits) => lits, + . . . . }; + . . . . for lit in lits.iter_mut() { + . . . . lit.make_inexact(); + . . . . } + . . . . } + . . . . + . . . . /// Converts this sequence to an infinite sequence. + . . . . /// + . . . . /// This is a no-op if the sequence is already infinite. + . . . . #[inline] + . . . . pub fn make_infinite(&mut self) { + 145 ( 0.00%) . . . self.literals = None; + . . . . } + . . . . + . . . . /// Modify this sequence to contain the cross product between it and the + . . . . /// sequence given. + . . . . /// + . . . . /// The cross product only considers literals in this sequence that are + . . . . /// exact. That is, inexact literals are not extended. + . . . . /// +-- line 855 ---------------------------------------- +-- line 952 ---------------------------------------- + . . . . /// + . . . . /// // seq1 remains unchanged. + . . . . /// assert!(!seq1.is_finite()); + . . . . /// // Even though the literals in seq2 weren't used, it was still drained. + . . . . /// assert_eq!(Some(0), seq2.len()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn cross_forward(&mut self, other: &mut Seq) { + 2,161 ( 0.00%) . . . let (lits1, lits2) = match self.cross_preamble(other) { + 45,240 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::cross_preamble (399x) + . . . . None => return, + . . . . Some((lits1, lits2)) => (lits1, lits2), + . . . . }; + . . . . let newcap = lits1.len().saturating_mul(lits2.len()); + 2,898 ( 0.00%) . . . for selflit in mem::replace(lits1, Vec::with_capacity(newcap)) { + . . . . if !selflit.is_exact() { + 96 ( 0.00%) . . . lits1.push(selflit); + . . . . continue; + . . . . } + . . . . for otherlit in lits2.iter() { + . . . . let mut newlit = Literal::exact(Vec::with_capacity( + . . . . selflit.len() + otherlit.len(), + . . . . )); + . . . . newlit.extend(&selflit); + 9,256 ( 0.00%) . . . newlit.extend(&otherlit); + 4,628 ( 0.00%) . . . if !otherlit.is_exact() { + . . . . newlit.make_inexact(); + . . . . } + . . . . lits1.push(newlit); + . . . . } + . . . . } + . . . . lits2.drain(..); + . . . . self.dedup(); + . . . . } +-- line 984 ---------------------------------------- +-- line 1091 ---------------------------------------- + . . . . /// + . . . . /// // seq1 remains unchanged. + . . . . /// assert!(!seq1.is_finite()); + . . . . /// // Even though the literals in seq2 weren't used, it was still drained. + . . . . /// assert_eq!(Some(0), seq2.len()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn cross_reverse(&mut self, other: &mut Seq) { + 249 ( 0.00%) . . . let (lits1, lits2) = match self.cross_preamble(other) { + 7,986 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::cross_preamble (83x) + . . . . None => return, + . . . . Some((lits1, lits2)) => (lits1, lits2), + . . . . }; + . . . . // We basically proceed as we do in 'cross_forward' at this point, + . . . . // except that the outer loop is now 'other' and the inner loop is now + . . . . // 'self'. That's because 'self' corresponds to suffixes and 'other' + . . . . // corresponds to the sequence we want to *prepend* to the suffixes. + . . . . let newcap = lits1.len().saturating_mul(lits2.len()); + . . . . let selflits = mem::replace(lits1, Vec::with_capacity(newcap)); + . . . . for (i, otherlit) in lits2.drain(..).enumerate() { + . . . . for selflit in selflits.iter() { + 2,343 ( 0.00%) . . . if !selflit.is_exact() { + . . . . // If the suffix isn't exact, then we can't prepend + . . . . // anything to it. However, we still want to keep it. But + . . . . // we only want to keep one of them, to avoid duplication. + . . . . // (The duplication is okay from a correctness perspective, + . . . . // but wasteful.) + 80 ( 0.00%) . . . if i == 0 { + . . . . lits1.push(selflit.clone()); + . . . . } + . . . . continue; + . . . . } + . . . . let mut newlit = Literal::exact(Vec::with_capacity( + . . . . otherlit.len() + selflit.len(), + . . . . )); + . . . . newlit.extend(&otherlit); + 4,526 ( 0.00%) . . . newlit.extend(&selflit); + 2,263 ( 0.00%) . . . if !otherlit.is_exact() { + . . . . newlit.make_inexact(); + . . . . } + . . . . lits1.push(newlit); + . . . . } + . . . . } + . . . . self.dedup(); + . . . . } + . . . . + . . . . /// A helper function the corresponds to the subtle preamble for both + . . . . /// `cross_forward` and `cross_reverse`. In effect, it handles the cases + . . . . /// of infinite sequences for both `self` and `other`, as well as ensuring + . . . . /// that literals from `other` are drained even if they aren't used. + 4,338 ( 0.00%) . . . fn cross_preamble<'a>( + . . . . &'a mut self, + . . . . other: &'a mut Seq, + . . . . ) -> Option<(&'a mut Vec, &'a mut Vec)> { + 1,446 ( 0.00%) . . . let lits2 = match other.literals { + . . . . None => { + . . . . // If our current seq contains the empty string and the seq + . . . . // we're adding matches any literal, then it follows that the + . . . . // current seq must now also match any literal. + . . . . // + . . . . // Otherwise, we just have to make sure everything in this + . . . . // sequence is inexact. + 73 ( 0.00%) . . . if self.min_literal_len() == Some(0) { + 13 ( 0.00%) . . . *self = Seq::infinite(); + . . . . } else { + . . . . self.make_inexact(); + . . . . } + . . . . return None; + . . . . } + . . . . Some(ref mut lits) => lits, + . . . . }; + 422 ( 0.00%) . . . let lits1 = match self.literals { + . . . . None => { + . . . . // If we aren't going to make it to the end of this routine + . . . . // where lits2 is drained, then we need to do it now. + . . . . lits2.drain(..); + . . . . return None; + . . . . } + . . . . Some(ref mut lits) => lits, + . . . . }; + . . . . Some((lits1, lits2)) + 4,820 ( 0.00%) . . . } + . . . . + . . . . /// Unions the `other` sequence into this one. + . . . . /// + . . . . /// The literals are always drained out of the given `other` sequence, + . . . . /// even if they are being unioned into an infinite sequence. This permits + . . . . /// the caller to reuse the `other` sequence in another context. + . . . . /// + . . . . /// Some literal deduping may be performed. If any deduping happens, +-- line 1179 ---------------------------------------- +-- line 1212 ---------------------------------------- + . . . . /// seq1.union(&mut seq2); + . . . . /// + . . . . /// // seq1 is still infinite and seq2 has been drained. + . . . . /// assert_eq!(None, seq1.len()); + . . . . /// assert_eq!(Some(0), seq2.len()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn union(&mut self, other: &mut Seq) { + 93 ( 0.00%) . . . let lits2 = match other.literals { + . . . . None => { + . . . . // Unioning with an infinite sequence always results in an + . . . . // infinite sequence. + . . . . self.make_infinite(); + . . . . return; + . . . . } + . . . . Some(ref mut lits) => lits.drain(..), + . . . . }; + 54 ( 0.00%) . . . let lits1 = match self.literals { + . . . . None => return, + . . . . Some(ref mut lits) => lits, + . . . . }; + 14,793 ( 0.00%) . . . lits1.extend(lits2); + . . . . self.dedup(); + . . . . } + . . . . + . . . . /// Unions the `other` sequence into this one by splice the `other` + . . . . /// sequence at the position of the first zero-length literal. + . . . . /// + . . . . /// This is useful for preserving preference order semantics when combining + . . . . /// two literal sequences. For example, in the regex `(a||f)+foo`, the +-- line 1241 ---------------------------------------- +-- line 1334 ---------------------------------------- + . . . . /// Literal::inexact("foo"), + . . . . /// ]); + . . . . /// seq.dedup(); + . . . . /// + . . . . /// assert_eq!(Seq::from_iter([Literal::inexact("foo")]), seq); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn dedup(&mut self) { + 8,682 ( 0.00%) . . . if let Some(ref mut lits) = self.literals { + . . . . lits.dedup_by(|lit1, lit2| { + 58,970 ( 0.02%) . . . if lit1.as_bytes() != lit2.as_bytes() { + . . . . return false; + . . . . } + . . . . if lit1.is_exact() != lit2.is_exact() { + . . . . lit1.make_inexact(); + . . . . lit2.make_inexact(); + . . . . } + . . . . true + . . . . }); +-- line 1352 ---------------------------------------- +-- line 1482 ---------------------------------------- + . . . . /// Literal::exact("a"), + . . . . /// Literal::inexact("fo"), + . . . . /// Literal::inexact("qu"), + . . . . /// ]); + . . . . /// assert_eq!(expected, seq); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn keep_first_bytes(&mut self, len: usize) { + 454 ( 0.00%) . . . if let Some(ref mut lits) = self.literals { + . . . . for m in lits.iter_mut() { + . . . . m.keep_first_bytes(len); + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Trims all literals in this seq such that only the last `len` bytes + . . . . /// remain. If a literal has less than or equal to `len` bytes, then it +-- line 1498 ---------------------------------------- +-- line 1510 ---------------------------------------- + . . . . /// Literal::exact("a"), + . . . . /// Literal::inexact("oo"), + . . . . /// Literal::inexact("ux"), + . . . . /// ]); + . . . . /// assert_eq!(expected, seq); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn keep_last_bytes(&mut self, len: usize) { + 119 ( 0.00%) . . . if let Some(ref mut lits) = self.literals { + . . . . for m in lits.iter_mut() { + . . . . m.keep_last_bytes(len); + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Returns true if this sequence is finite. + . . . . /// +-- line 1526 ---------------------------------------- +-- line 1583 ---------------------------------------- + . . . . Some(len1.saturating_mul(len2)) + . . . . } + . . . . + . . . . /// Returns the length of the shortest literal in this sequence. + . . . . /// + . . . . /// If the sequence is infinite or empty, then this returns `None`. + . . . . #[inline] + . . . . pub fn min_literal_len(&self) -> Option { + 202 ( 0.00%) . . . self.literals.as_ref()?.iter().map(|x| x.len()).min() + . . . . } + . . . . + . . . . /// Returns the length of the longest literal in this sequence. + . . . . /// + . . . . /// If the sequence is infinite or empty, then this returns `None`. + . . . . #[inline] + . . . . pub fn max_literal_len(&self) -> Option { + . . . . self.literals.as_ref()?.iter().map(|x| x.len()).max() +-- line 1599 ---------------------------------------- +-- line 1624 ---------------------------------------- + . . . . /// assert_eq!(None, seq.longest_common_prefix()); + . . . . /// let seq = Seq::empty(); + . . . . /// assert_eq!(None, seq.longest_common_prefix()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn longest_common_prefix(&self) -> Option<&[u8]> { + . . . . // If we match everything or match nothing, then there's no meaningful + . . . . // longest common prefix. + 200 ( 0.00%) . . . let lits = match self.literals { + . . . . None => return None, + . . . . Some(ref lits) => lits, + . . . . }; + . . . . if lits.len() == 0 { + . . . . return None; + . . . . } + . . . . let base = lits[0].as_bytes(); + . . . . let mut len = base.len(); + . . . . for m in lits.iter().skip(1) { + . . . . len = m + . . . . .as_bytes() + . . . . .iter() + . . . . .zip(base[..len].iter()) + . . . . .take_while(|&(a, b)| a == b) + . . . . .count(); + 1,310 ( 0.00%) . . . if len == 0 { + . . . . return Some(&[]); + . . . . } + . . . . } + . . . . Some(&base[..len]) + . . . . } + . . . . + . . . . /// Returns the longest common suffix from this seq. + . . . . /// +-- line 1656 ---------------------------------------- +-- line 1677 ---------------------------------------- + . . . . /// assert_eq!(None, seq.longest_common_suffix()); + . . . . /// let seq = Seq::empty(); + . . . . /// assert_eq!(None, seq.longest_common_suffix()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn longest_common_suffix(&self) -> Option<&[u8]> { + . . . . // If we match everything or match nothing, then there's no meaningful + . . . . // longest common suffix. + 62 ( 0.00%) . . . let lits = match self.literals { + . . . . None => return None, + . . . . Some(ref lits) => lits, + . . . . }; + . . . . if lits.len() == 0 { + . . . . return None; + . . . . } + . . . . let base = lits[0].as_bytes(); + . . . . let mut len = base.len(); + . . . . for m in lits.iter().skip(1) { + . . . . len = m + . . . . .as_bytes() + . . . . .iter() + . . . . .rev() + 48 ( 0.00%) . . . .zip(base[base.len() - len..].iter().rev()) + . . . . .take_while(|&(a, b)| a == b) + . . . . .count(); + 72 ( 0.00%) . . . if len == 0 { + . . . . return Some(&[]); + . . . . } + . . . . } + . . . . Some(&base[base.len() - len..]) + . . . . } + . . . . + . . . . /// Optimizes this seq while treating its literals as prefixes and + . . . . /// respecting the preference order of its literals. +-- line 1710 ---------------------------------------- +-- line 1812 ---------------------------------------- + . . . . /// "sam", + . . . . /// "frodo", + . . . . /// ]); + . . . . /// seq.optimize_for_prefix_by_preference(); + . . . . /// assert!(seq.is_finite()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn optimize_for_prefix_by_preference(&mut self) { + 152 ( 0.00%) . . . self.optimize_by_preference(true); +4,898,468 ( 1.42%) 10,042 ( 1.24%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::optimize_by_preference (16x) + . . . . } + . . . . + . . . . /// Optimizes this seq while treating its literals as suffixes and + . . . . /// respecting the preference order of its literals. + . . . . /// + . . . . /// Optimization should only be run once extraction is complete. + . . . . /// + . . . . /// The [`Seq::optimize_for_prefix_by_preference`] does the same thing, but + . . . . /// for prefixes. See its documentation for more explanation. + . . . . #[inline] + . . . . pub fn optimize_for_suffix_by_preference(&mut self) { + 52 ( 0.00%) . . . self.optimize_by_preference(false); + 3,807 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Seq::optimize_by_preference (13x) + . . . . } + . . . . + 584 ( 0.00%) . . . fn optimize_by_preference(&mut self, prefix: bool) { + . . . . let origlen = match self.len() { + . . . . None => return, + . . . . Some(len) => len, + . . . . }; + . . . . // Just give up now if our sequence contains an empty string. + 71 ( 0.00%) . . . if self.min_literal_len().map_or(false, |len| len == 0) { + . . . . // We squash the sequence so that nobody else gets any bright + . . . . // ideas to try and use it. An empty string implies a match at + . . . . // every position. A prefilter cannot help you here. + . . . . self.make_infinite(); + . . . . return; + . . . . } + . . . . // Make sure we start with the smallest sequence possible. We use a + . . . . // special version of preference minimization that retains exactness. + . . . . // This is legal because optimization is only expected to occur once + . . . . // extraction is complete. + 124 ( 0.00%) . . . if prefix { + . . . . if let Some(ref mut lits) = self.literals { + 150 ( 0.00%) . . . PreferenceTrie::minimize(lits, true); +2,765,359 ( 0.80%) 8,232 ( 1.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::PreferenceTrie::minimize (50x) + . . . . } + . . . . } + . . . . + . . . . // Look for a common prefix (or suffix). If we found one of those and + . . . . // it's long enough, then it's a good bet that it will be our fastest + . . . . // possible prefilter since single-substring search is so fast. + . . . . let fix = if prefix { + 100 ( 0.00%) . . . self.longest_common_prefix() + . . . . } else { + . . . . self.longest_common_suffix() + . . . . }; + . . . . if let Some(fix) = fix { + . . . . // As a special case, if we have a common prefix and the leading + . . . . // byte of that prefix is one that we think probably occurs rarely, + . . . . // then strip everything down to just that single byte. This should + . . . . // promote the use of memchr. +-- line 1870 ---------------------------------------- +-- line 1889 ---------------------------------------- + . . . . self.dedup(); + . . . . return; + . . . . } + . . . . // We only strip down to the common prefix/suffix if we think + . . . . // the existing set of literals isn't great, or if the common + . . . . // prefix/suffix is expected to be particularly discriminatory. + . . . . let isfast = + . . . . self.is_exact() && self.len().map_or(false, |len| len <= 16); + 186 ( 0.00%) . . . let usefix = fix.len() > 4 || (fix.len() > 1 && !isfast); + . . . . if usefix { + . . . . // If we keep exactly the number of bytes equal to the length + . . . . // of the prefix (or suffix), then by the definition of a + . . . . // prefix, every literal in the sequence will be equivalent. + . . . . // Thus, 'dedup' will leave us with one literal. + . . . . // + . . . . // We do it this way to avoid an alloc, but also to make sure + . . . . // the exactness of literals is kept (or not). +-- line 1905 ---------------------------------------- +-- line 1945 ---------------------------------------- + . . . . // + . . . . // So for example, the pair (3, 500) would mean, "if we have more than + . . . . // 500 literals in our sequence, then truncate all of our literals + . . . . // such that they are at most 3 bytes in length and the minimize the + . . . . // sequence." + . . . . const ATTEMPTS: [(usize, usize); 5] = + . . . . [(5, 10), (4, 10), (3, 64), (2, 64), (1, 10)]; + . . . . for (keep, limit) in ATTEMPTS { + 184 ( 0.00%) . . . let len = match self.len() { + . . . . None => break, + . . . . Some(len) => len, + . . . . }; + . . . . if len <= limit { + . . . . break; + . . . . } + 262 ( 0.00%) . . . if prefix { + . . . . self.keep_first_bytes(keep); + . . . . } else { + . . . . self.keep_last_bytes(keep); + . . . . } + 516 ( 0.00%) . . . if prefix { + . . . . if let Some(ref mut lits) = self.literals { + 508 ( 0.00%) . . . PreferenceTrie::minimize(lits, true); +7,274,386 ( 2.10%) 19,736 ( 2.44%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::PreferenceTrie::minimize (127x) + . . . . } + . . . . } + . . . . } + . . . . // Check for a poison literal. A poison literal is one that is short + . . . . // and is believed to have a very high match count. These poisons + . . . . // generally lead to a prefilter with a very high false positive rate, + . . . . // and thus overall worse performance. + . . . . // + . . . . // We do this last because we could have gone from a non-poisonous + . . . . // sequence to a poisonous one. Perhaps we should add some code to + . . . . // prevent such transitions in the first place, but then again, we + . . . . // likely only made the transition in the first place if the sequence + . . . . // was itself huge. And huge sequences are themselves poisonous. So... + 9 ( 0.00%) . . . if let Some(lits) = self.literals() { + . . . . if lits.iter().any(|lit| lit.is_poisonous()) { + . . . . self.make_infinite(); + . . . . } + . . . . } + . . . . // OK, if we had an exact sequence before attempting more optimizations + . . . . // above and our post-optimized sequence sucks for some reason or + . . . . // another, then we go back to the exact sequence. + 124 ( 0.00%) . . . if let Some(exact) = exact { + . . . . // If optimizing resulted in dropping our literals, then certainly + . . . . // backup and use the exact sequence that we had. + . . . . if !self.is_finite() { + . . . . *self = exact; + . . . . return; + . . . . } + . . . . // If our optimized sequence contains a short literal, then it's + . . . . // *probably* not so great. So throw it away and revert to the +-- line 1997 ---------------------------------------- +-- line 2002 ---------------------------------------- + . . . . } + . . . . // Finally, if our optimized sequence is "big" (i.e., can't use + . . . . // Teddy), then also don't use it and rely on the exact sequence. + . . . . if self.len().map_or(true, |len| len > 64) { + . . . . *self = exact; + . . . . return; + . . . . } + . . . . } + 584 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for Seq { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . write!(f, "Seq")?; + . . . . if let Some(lits) = self.literals() { + . . . . f.debug_list().entries(lits.iter()).finish() + . . . . } else { +-- line 2018 ---------------------------------------- +-- line 2043 ---------------------------------------- + . . . . /// has not been trimmed, and may continue to be extended. If a literal is + . . . . /// "exact" after visiting the entire `Hir` expression, then this implies that + . . . . /// the literal leads to a match state. (Although it doesn't necessarily imply + . . . . /// all occurrences of the literal correspond to a match of the regex, since + . . . . /// literal extraction ignores look-around assertions.) + . . . . #[derive(Clone, Eq, PartialEq, PartialOrd, Ord)] + . . . . pub struct Literal { + . . . . bytes: Vec, + 636 ( 0.00%) . . . exact: bool, + . . . . } + . . . . + . . . . impl Literal { + . . . . /// Returns a new exact literal containing the bytes given. + . . . . #[inline] + . . . . pub fn exact>>(bytes: B) -> Literal { + 27,973 ( 0.01%) . . . Literal { bytes: bytes.into(), exact: true } + . . . . } + . . . . + . . . . /// Returns a new inexact literal containing the bytes given. + . . . . #[inline] + . . . . pub fn inexact>>(bytes: B) -> Literal { + . . . . Literal { bytes: bytes.into(), exact: false } + . . . . } + . . . . +-- line 2066 ---------------------------------------- +-- line 2088 ---------------------------------------- + . . . . #[inline] + . . . . pub fn is_empty(&self) -> bool { + . . . . self.len() == 0 + . . . . } + . . . . + . . . . /// Returns true if and only if this literal is exact. + . . . . #[inline] + . . . . pub fn is_exact(&self) -> bool { + 11,200 ( 0.00%) . . . self.exact + . . . . } + . . . . + . . . . /// Marks this literal as inexact. + . . . . /// + . . . . /// Inexact literals can never be extended. For example, + . . . . /// [`Seq::cross_forward`] will not extend inexact literals. + . . . . #[inline] + . . . . pub fn make_inexact(&mut self) { + 8,732 ( 0.00%) . . . self.exact = false; + . . . . } + . . . . + . . . . /// Reverse the bytes in this literal. + . . . . #[inline] + . . . . pub fn reverse(&mut self) { + . . . . self.bytes.reverse(); + . . . . } + . . . . +-- line 2113 ---------------------------------------- +-- line 2122 ---------------------------------------- + . . . . self.bytes.extend_from_slice(&lit.bytes); + . . . . } + . . . . + . . . . /// Trims this literal such that only the first `len` bytes remain. If + . . . . /// this literal has fewer than `len` bytes, then it remains unchanged. + . . . . /// Otherwise, the literal is marked as inexact. + . . . . #[inline] + . . . . pub fn keep_first_bytes(&mut self, len: usize) { + 45,160 ( 0.01%) . . . if len >= self.len() { + . . . . return; + . . . . } + . . . . self.make_inexact(); + . . . . self.bytes.truncate(len); + . . . . } + . . . . + . . . . /// Trims this literal such that only the last `len` bytes remain. If this + . . . . /// literal has fewer than `len` bytes, then it remains unchanged. + . . . . /// Otherwise, the literal is marked as inexact. + . . . . #[inline] + . . . . pub fn keep_last_bytes(&mut self, len: usize) { + 7,227 ( 0.00%) . . . if len >= self.len() { + . . . . return; + . . . . } + . . . . self.make_inexact(); + . . . . self.bytes.drain(..self.len() - len); + . . . . } + . . . . + . . . . /// Returns true if it is believe that this literal is likely to match very + . . . . /// frequently, and is thus not a good candidate for a prefilter. + . . . . fn is_poisonous(&self) -> bool { + 6,306 ( 0.00%) . . . self.is_empty() || (self.len() == 1 && rank(self.as_bytes()[0]) >= 250) + . . . . } + . . . . } + . . . . + . . . . impl From for Literal { + . . . . fn from(byte: u8) -> Literal { + . . . . Literal::exact(vec![byte]) + . . . . } + . . . . } + . . . . + . . . . impl From for Literal { + . . . . fn from(ch: char) -> Literal { + . . . . use alloc::string::ToString; + 409 ( 0.00%) . . . Literal::exact(ch.encode_utf8(&mut [0; 4]).to_string()) + . . . . } + . . . . } + . . . . + . . . . impl AsRef<[u8]> for Literal { + . . . . fn as_ref(&self) -> &[u8] { + . . . . self.as_bytes() + 6,995 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for Literal { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . let tag = if self.exact { "E" } else { "I" }; + . . . . f.debug_tuple(tag) + . . . . .field(&crate::debug::Bytes(self.as_bytes())) + . . . . .finish() +-- line 2180 ---------------------------------------- +-- line 2229 ---------------------------------------- + . . . . /// order semantics. + . . . . /// + . . . . /// When `keep_exact` is true, the exactness of every literal retained is + . . . . /// kept. This is useful when dealing with a fully extracted `Seq` that + . . . . /// only contains exact literals. In that case, we can keep all retained + . . . . /// literals as exact because we know we'll never need to match anything + . . . . /// after them and because any removed literals are guaranteed to never + . . . . /// match. + 1,062 ( 0.00%) . . . fn minimize(literals: &mut Vec, keep_exact: bool) { + 1,239 ( 0.00%) . . . let mut trie = PreferenceTrie { + . . . . states: vec![], + . . . . matches: vec![], + . . . . next_literal_index: 1, + . . . . }; + . . . . let mut make_inexact = vec![]; + 68,751 ( 0.02%) . . . literals.retain_mut(|lit| match trie.insert(lit.as_bytes()) { +8,911,190 ( 2.57%) 20,413 ( 2.52%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::retain_mut (177x) + . . . . Ok(_) => true, + . . . . Err(i) => { + 5,274 ( 0.00%) . . . if !keep_exact { + . . . . make_inexact.push(i.checked_sub(1).unwrap()); + . . . . } + . . . . false + . . . . } + . . . . }); + 531 ( 0.00%) . . . for i in make_inexact { + . . . . literals[i].make_inexact(); + . . . . } + 885 ( 0.00%) . . . } + . . . . + . . . . /// Returns `Ok` if the given byte string is accepted into this trie and + . . . . /// `Err` otherwise. The index for the success case corresponds to the + . . . . /// index of the literal added. The index for the error case corresponds to + . . . . /// the index of the literal already in the trie that prevented the given + . . . . /// byte string from being added. (Which implies it is a prefix of the one + . . . . /// given.) + . . . . /// + . . . . /// In short, the byte string given is accepted into the trie if and only + . . . . /// if it is possible for it to match when executing a preference order + . . . . /// search. +168,780 ( 0.05%) . . . fn insert(&mut self, bytes: &[u8]) -> Result { + . . . . let mut prev = self.root(); +101,091 ( 0.03%) . . . if let Some(idx) = self.matches[prev] { + . . . . return Err(idx.get()); + . . . . } + . . . . for &b in bytes.iter() { + 98,724 ( 0.03%) . . . match self.states[prev].trans.binary_search_by_key(&b, |t| t.0) { + . . . . Ok(i) => { + 30,371 ( 0.01%) . . . prev = self.states[prev].trans[i].1; +154,453 ( 0.04%) . . . if let Some(idx) = self.matches[prev] { + . . . . return Err(idx.get()); + . . . . } + . . . . } + . . . . Err(i) => { + . . . . let next = self.create_state(); + 37,982 ( 0.01%) . . . self.states[prev].trans.insert(i, (b, next)); + . . . . prev = next; + . . . . } + . . . . } + . . . . } + 14,280 ( 0.00%) . . . let idx = self.next_literal_index; + 28,560 ( 0.01%) . . . self.next_literal_index += 1; + 71,400 ( 0.02%) . . . self.matches[prev] = NonZeroUsize::new(idx); + . . . . Ok(idx) +135,024 ( 0.04%) . . . } + . . . . + . . . . /// Returns the root state ID, and if it doesn't exist, creates it. + . . . . fn root(&mut self) -> usize { + 33,756 ( 0.01%) . . . if !self.states.is_empty() { + . . . . 0 + . . . . } else { + . . . . self.create_state() + . . . . } + . . . . } + . . . . + . . . . /// Creates a new empty state and returns its ID. + . . . . fn create_state(&mut self) -> usize { + . . . . let id = self.states.len(); + . . . . self.states.push(State::default()); + 177 ( 0.00%) . . . self.matches.push(None); + . . . . id + . . . . } + . . . . } + . . . . + . . . . /// Returns the "rank" of the given byte. + . . . . /// + . . . . /// The minimum rank value is `0` and the maximum rank value is `255`. + . . . . /// +-- line 2315 ---------------------------------------- + + 43,381 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 196 ---------------------------------------- + . . . . /// expression pattern string, and uses constant stack space and heap space + . . . . /// proportional to the size of the `Hir`. The regex it prints is guaranteed to + . . . . /// be _semantically_ equivalent to the original concrete syntax, but it may + . . . . /// look very different. (And potentially not practically readable by a human.) + . . . . /// + . . . . /// An `Hir`'s `fmt::Debug` implementation currently does not use constant + . . . . /// stack space. The implementation will also suppress some details (such as + . . . . /// the `Properties` inlined into every `Hir` value to make it less noisy). + 897 ( 0.00%) . . . #[derive(Clone, Eq, PartialEq)] + . . . . pub struct Hir { + . . . . /// The underlying HIR kind. + . . . . kind: HirKind, + . . . . /// Analysis info about this HIR, computed during construction. + 190 ( 0.00%) . . . props: Properties, + . . . . } + . . . . + . . . . /// Methods for accessing the underlying `HirKind` and `Properties`. + . . . . impl Hir { + . . . . /// Returns a reference to the underlying HIR kind. + . . . . pub fn kind(&self) -> &HirKind { + 87,468 ( 0.03%) . . . &self.kind + 87,468 ( 0.03%) . . . } + . . . . + . . . . /// Consumes ownership of this HIR expression and returns its underlying + . . . . /// `HirKind`. + 65 ( 0.00%) . . . pub fn into_kind(mut self) -> HirKind { + 13 ( 0.00%) . . . core::mem::replace(&mut self.kind, HirKind::Empty) + 65 ( 0.00%) . . . } + . . . . + . . . . /// Returns the properties computed for this `Hir`. + 549 ( 0.00%) . . . pub fn properties(&self) -> &Properties { + . . . . &self.props + 549 ( 0.00%) . . . } + . . . . + . . . . /// Splits this HIR into its constituent parts. + . . . . /// + . . . . /// This is useful because `let Hir { kind, props } = hir;` does not work + . . . . /// because of `Hir`'s custom `Drop` implementation. + . . . . fn into_parts(mut self) -> (HirKind, Properties) { +123,436 ( 0.04%) . . . ( + . . . . core::mem::replace(&mut self.kind, HirKind::Empty), + . . . . core::mem::replace(&mut self.props, Properties::empty()), + . . . . ) + . . . . } + . . . . } + . . . . + . . . . /// Smart constructors for HIR values. + . . . . /// +-- line 243 ---------------------------------------- +-- line 318 ---------------------------------------- + . . . . /// assert!(concat.properties().is_utf8()); + . . . . /// + . . . . /// // And also notice that the literals have been concatenated into a + . . . . /// // single `Literal`, to the point where there is no explicit `Concat`! + . . . . /// let expected = HirKind::Literal(Literal(Box::from("☃".as_bytes()))); + . . . . /// assert_eq!(&expected, concat.kind()); + . . . . /// ``` + . . . . #[inline] +107,842 ( 0.03%) . . . pub fn literal>>(lit: B) -> Hir { + . . . . let bytes = lit.into(); + 31,997 ( 0.01%) . . . if bytes.is_empty() { + . . . . return Hir::empty(); + . . . . } + . . . . + 5,736 ( 0.00%) . . . let lit = Literal(bytes); + 1,912 ( 0.00%) . . . let props = Properties::literal(&lit); +666,828 ( 0.19%) 3,616 ( 0.45%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::literal (1,912x) + 75,546 ( 0.02%) . . . Hir { kind: HirKind::Literal(lit), props } + 92,436 ( 0.03%) . . . } + . . . . + . . . . /// Creates a class HIR expression. The class may either be defined over + . . . . /// ranges of Unicode codepoints or ranges of raw byte values. + . . . . /// + . . . . /// Note that an empty class is permitted. An empty class is equivalent to + . . . . /// `Hir::fail()`. + . . . . #[inline] + 34,910 ( 0.01%) . . . pub fn class(class: Class) -> Hir { + 4,788 ( 0.00%) . . . if class.is_empty() { + 102 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Class::is_empty (34x) + . . . . return Hir::fail(); + 15,756 ( 0.00%) . . . } else if let Some(bytes) = class.literal() { + 986 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Class::literal (34x) + . . . . return Hir::literal(bytes); + . . . . } + 5,153 ( 0.00%) . . . let props = Properties::class(&class); + 9,392 ( 0.00%) 48 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::class (34x) + 21,824 ( 0.01%) . . . Hir { kind: HirKind::Class(class), props } + 31,031 ( 0.01%) . . . } + . . . . + . . . . /// Creates a look-around assertion HIR expression. + . . . . #[inline] + . . . . pub fn look(look: Look) -> Hir { + 4 ( 0.00%) . . . let props = Properties::look(look); + 333 ( 0.00%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::look (2x) + 8 ( 0.00%) . . . Hir { kind: HirKind::Look(look), props } + . . . . } + . . . . + . . . . /// Creates a repetition HIR expression. + . . . . #[inline] + . . . . pub fn repetition(mut rep: Repetition) -> Hir { + . . . . // If the sub-expression of a repetition can only match the empty + . . . . // string, then we force its maximum to be at most 1. + 6,545 ( 0.00%) . . . if rep.sub.properties().maximum_len() == Some(0) { + 150 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::properties (75x) + . . . . rep.min = cmp::min(rep.min, 1); + . . . . rep.max = rep.max.map(|n| cmp::min(n, 1)).or(Some(1)); + . . . . } + . . . . // The regex 'a{0}' is always equivalent to the empty regex. This is + . . . . // true even when 'a' is an expression that never matches anything + . . . . // (like '\P{any}'). + . . . . // + . . . . // Additionally, the regex 'a{1}' is always equivalent to 'a'. + 4,588 ( 0.00%) . . . if rep.min == 0 && rep.max == Some(0) { + . . . . return Hir::empty(); + . . . . } else if rep.min == 1 && rep.max == Some(1) { + . . . . return *rep.sub; + . . . . } + 3,919 ( 0.00%) . . . let props = Properties::repetition(&rep); + 24,656 ( 0.01%) 136 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::repetition (75x) + 12,353 ( 0.00%) . . . Hir { kind: HirKind::Repetition(rep), props } + . . . . } + . . . . + . . . . /// Creates a capture HIR expression. + . . . . /// + . . . . /// Note that there is no explicit HIR value for a non-capturing group. + . . . . /// Since a non-capturing group only exists to override precedence in the + . . . . /// concrete syntax and since an HIR already does its own grouping based on + . . . . /// what is parsed, there is no need to explicitly represent non-capturing + . . . . /// groups in the HIR. + . . . . #[inline] + . . . . pub fn capture(capture: Capture) -> Hir { + 1,386 ( 0.00%) . . . let props = Properties::capture(&capture); +209,050 ( 0.06%) 1,131 ( 0.14%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::capture (693x) + 3,465 ( 0.00%) . . . Hir { kind: HirKind::Capture(capture), props } + . . . . } + . . . . + . . . . /// Returns the concatenation of the given expressions. + . . . . /// + . . . . /// This attempts to flatten and simplify the concatenation as appropriate. + . . . . /// + . . . . /// # Example + . . . . /// +-- line 401 ---------------------------------------- +-- line 415 ---------------------------------------- + . . . . /// Hir::literal([b'x']), + . . . . /// Hir::literal([b'y']), + . . . . /// Hir::literal([b'z']), + . . . . /// ]), + . . . . /// ]); + . . . . /// let expected = Hir::literal("abcxyz".as_bytes()); + . . . . /// assert_eq!(expected, hir); + . . . . /// ``` +127,544 ( 0.04%) . . . pub fn concat(subs: Vec) -> Hir { + . . . . // We rebuild the concatenation by simplifying it. Would be nice to do + . . . . // it in place, but that seems a little tricky? + . . . . let mut new = vec![]; + . . . . // This gobbles up any adjacent literals in a concatenation and smushes + . . . . // them together. Basically, when we see a literal, we add its bytes + . . . . // to 'prior_lit', and whenever we see anything else, we first take + . . . . // any bytes in 'prior_lit' and add it to the 'new' concatenation. + 15,943 ( 0.00%) . . . let mut prior_lit: Option> = None; +143,850 ( 0.04%) . . . for sub in subs { + . . . . let (kind, props) = sub.into_parts(); +215,788 ( 0.06%) . . . match kind { + 30,812 ( 0.01%) . . . HirKind::Literal(Literal(bytes)) => { + 46,218 ( 0.01%) . . . if let Some(ref mut prior_bytes) = prior_lit { + . . . . prior_bytes.extend_from_slice(&bytes); + . . . . } else { + 61,624 ( 0.02%) . . . prior_lit = Some(bytes.to_vec()); + . . . . } + . . . . } + . . . . // We also flatten concats that are direct children of another + . . . . // concat. We only need to do this one level deep since + . . . . // Hir::concat is the only way to build concatenations, and so + . . . . // flattening happens inductively. + 116 ( 0.00%) . . . HirKind::Concat(subs2) => { + 553 ( 0.00%) . . . for sub2 in subs2 { + . . . . let (kind2, props2) = sub2.into_parts(); + 136 ( 0.00%) . . . match kind2 { + . . . . HirKind::Literal(Literal(bytes)) => { + 2 ( 0.00%) . . . if let Some(ref mut prior_bytes) = prior_lit { + . . . . prior_bytes.extend_from_slice(&bytes); + . . . . } else { + 6 ( 0.00%) . . . prior_lit = Some(bytes.to_vec()); + . . . . } + . . . . } + . . . . kind2 => { + 66 ( 0.00%) . . . if let Some(prior_bytes) = prior_lit.take() { + . . . . new.push(Hir::literal(prior_bytes)); + . . . . } + . . . . new.push(Hir { kind: kind2, props: props2 }); + . . . . } + . . . . } + . . . . } + . . . . } + . . . . // We can just skip empty HIRs. + . . . . HirKind::Empty => {} + . . . . kind => { + 16,350 ( 0.00%) . . . if let Some(prior_bytes) = prior_lit.take() { + 4,590 ( 0.00%) . . . new.push(Hir::literal(prior_bytes)); +235,808 ( 0.07%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::literal (1,530x) + . . . . } + . . . . new.push(Hir { kind, props }); + . . . . } + . . . . } +138,857 ( 0.04%) . . . } +117,209 ( 0.03%) . . . if let Some(prior_bytes) = prior_lit.take() { + 13,876 ( 0.00%) . . . new.push(Hir::literal(prior_bytes)); +2,162,079 ( 0.62%) 18 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::literal (13,876x) + . . . . } + 36,032 ( 0.01%) . . . if new.is_empty() { + . . . . return Hir::empty(); + . . . . } else if new.len() == 1 { + . . . . return new.pop().unwrap(); + . . . . } + . . . . let props = Properties::concat(&new); + 14,511 ( 0.00%) . . . Hir { kind: HirKind::Concat(new), props } +127,544 ( 0.04%) . . . } + . . . . + . . . . /// Returns the alternation of the given expressions. + . . . . /// + . . . . /// This flattens and simplifies the alternation as appropriate. This may + . . . . /// include factoring out common prefixes or even rewriting the alternation + . . . . /// as a character class. + . . . . /// + . . . . /// Note that an empty alternation is equivalent to `Hir::fail()`. (It +-- line 494 ---------------------------------------- +-- line 548 ---------------------------------------- + . . . . /// ClassUnicodeRange::new('a', 'z'), + . . . . /// ]))), + . . . . /// ]), + . . . . /// ]); + . . . . /// assert_eq!(expected, hir); + . . . . /// ``` + . . . . /// + . . . . /// Note that these sorts of simplifications are not guaranteed. + 4,640 ( 0.00%) . . . pub fn alternation(subs: Vec) -> Hir { + . . . . // We rebuild the alternation by simplifying it. We proceed similarly + . . . . // as the concatenation case. But in this case, there's no literal + . . . . // simplification happening. We're just flattening alternations. + . . . . let mut new = Vec::with_capacity(subs.len()); +109,758 ( 0.03%) . . . for sub in subs { + . . . . let (kind, props) = sub.into_parts(); + 36,586 ( 0.01%) . . . match kind { + . . . . HirKind::Alternation(subs2) => { + . . . . new.extend(subs2); + . . . . } + . . . . kind => { + . . . . new.push(Hir { kind, props }); + . . . . } + . . . . } + . . . . } + 2,320 ( 0.00%) . . . if new.is_empty() { + . . . . return Hir::fail(); + . . . . } else if new.len() == 1 { + . . . . return new.pop().unwrap(); + . . . . } + . . . . // Now that it's completely flattened, look for the special case of + . . . . // 'char1|char2|...|charN' and collapse that into a class. Note that + . . . . // we look for 'char' first and then bytes. The issue here is that if + . . . . // we find both non-ASCII codepoints and non-ASCII singleton bytes, + . . . . // then it isn't actually possible to smush them into a single class. + . . . . // (Because classes are either "all codepoints" or "all bytes." You + . . . . // can have a class that both matches non-ASCII but valid UTF-8 and + . . . . // invalid UTF-8.) So we look for all chars and then all bytes, and + . . . . // don't handle anything else. + 3 ( 0.00%) . . . if let Some(singletons) = singleton_chars(&new) { + . . . . let it = singletons + . . . . .into_iter() + . . . . .map(|ch| ClassUnicodeRange { start: ch, end: ch }); + 4 ( 0.00%) . . . return Hir::class(Class::Unicode(ClassUnicode::new(it))); + . . . . } + . . . . if let Some(singletons) = singleton_bytes(&new) { + . . . . let it = singletons + . . . . .into_iter() + . . . . .map(|b| ClassBytesRange { start: b, end: b }); + . . . . return Hir::class(Class::Bytes(ClassBytes::new(it))); + . . . . } + . . . . // Similar to singleton chars, we can also look for alternations of + . . . . // classes. Those can be smushed into a single class. + . . . . if let Some(cls) = class_chars(&new) { + . . . . return Hir::class(cls); + . . . . } + . . . . if let Some(cls) = class_bytes(&new) { + . . . . return Hir::class(cls); + 579 ( 0.00%) . . . } + 3,474 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place> (579x) + . . . . // Factor out a common prefix if we can, which might potentially + . . . . // simplify the expression and unlock other optimizations downstream. + . . . . // It also might generally make NFA matching and DFA construction + . . . . // faster by reducing the scope of branching in the regex. + 5,211 ( 0.00%) . . . new = match lift_common_prefix(new) { + 47,257 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::lift_common_prefix (579x) + 7 ( 0.00%) . . . Ok(hir) => return hir, + 2,312 ( 0.00%) . . . Err(unchanged) => unchanged, + . . . . }; + 578 ( 0.00%) . . . let props = Properties::alternation(&new); +1,523,369 ( 0.44%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Properties::alternation (578x) + 4,046 ( 0.00%) . . . Hir { kind: HirKind::Alternation(new), props } + 5,220 ( 0.00%) . . . } + . . . . + . . . . /// Returns an HIR expression for `.`. + . . . . /// + . . . . /// * [`Dot::AnyChar`] maps to `(?su-R:.)`. + . . . . /// * [`Dot::AnyByte`] maps to `(?s-Ru:.)`. + . . . . /// * [`Dot::AnyCharExceptLF`] maps to `(?u-Rs:.)`. + . . . . /// * [`Dot::AnyCharExceptCRLF`] maps to `(?Ru-s:.)`. + . . . . /// * [`Dot::AnyByteExceptLF`] maps to `(?-Rsu:.)`. +-- line 624 ---------------------------------------- +-- line 635 ---------------------------------------- + . . . . /// + . . . . /// let hir = Hir::dot(Dot::AnyByte); + . . . . /// let expected = Hir::class(Class::Bytes(ClassBytes::new([ + . . . . /// ClassBytesRange::new(0x00, 0xFF), + . . . . /// ]))); + . . . . /// assert_eq!(expected, hir); + . . . . /// ``` + . . . . #[inline] + 550 ( 0.00%) . . . pub fn dot(dot: Dot) -> Hir { + . . . . match dot { + . . . . Dot::AnyChar => { + . . . . let mut cls = ClassUnicode::empty(); + . . . . cls.push(ClassUnicodeRange::new('\0', '\u{10FFFF}')); + . . . . Hir::class(Class::Unicode(cls)) + . . . . } + . . . . Dot::AnyByte => { + 220 ( 0.00%) . . . let mut cls = ClassBytes::empty(); + 3,410 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytes::empty (110x) + 770 ( 0.00%) . . . cls.push(ClassBytesRange::new(b'\0', b'\xFF')); + 16,720 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytes::push (110x) + 660 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassBytesRange::new (110x) + 660 ( 0.00%) . . . Hir::class(Class::Bytes(cls)) + . . . . } + . . . . Dot::AnyCharExcept(ch) => { + . . . . let mut cls = + 35 ( 0.00%) . . . ClassUnicode::new([ClassUnicodeRange::new(ch, ch)]); + 820 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::new (5x) + . . . . cls.negate(); + . . . . Hir::class(Class::Unicode(cls)) + . . . . } + . . . . Dot::AnyCharExceptLF => { + . . . . let mut cls = ClassUnicode::empty(); + . . . . cls.push(ClassUnicodeRange::new('\0', '\x09')); + . . . . cls.push(ClassUnicodeRange::new('\x0B', '\u{10FFFF}')); + . . . . Hir::class(Class::Unicode(cls)) +-- line 665 ---------------------------------------- +-- line 686 ---------------------------------------- + . . . . Dot::AnyByteExceptCRLF => { + . . . . let mut cls = ClassBytes::empty(); + . . . . cls.push(ClassBytesRange::new(b'\0', b'\x09')); + . . . . cls.push(ClassBytesRange::new(b'\x0B', b'\x0C')); + . . . . cls.push(ClassBytesRange::new(b'\x0E', b'\xFF')); + . . . . Hir::class(Class::Bytes(cls)) + . . . . } + . . . . } + 440 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// The underlying kind of an arbitrary [`Hir`] expression. + . . . . /// + . . . . /// An `HirKind` is principally useful for doing case analysis on the type + . . . . /// of a regular expression. If you're looking to build new `Hir` values, + . . . . /// then you _must_ use the smart constructors defined on `Hir`, like + . . . . /// [`Hir::repetition`], to build new `Hir` values. The API intentionally does + . . . . /// not expose any way of building an `Hir` directly from an `HirKind`. + 966 ( 0.00%) . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . pub enum HirKind { + . . . . /// The empty regular expression, which matches everything, including the + . . . . /// empty string. + . . . . Empty, + . . . . /// A literalstring that matches exactly these bytes. + . . . . Literal(Literal), + . . . . /// A single character class that matches any of the characters in the + . . . . /// class. A class can either consist of Unicode scalar values as +-- line 712 ---------------------------------------- +-- line 809 ---------------------------------------- + . . . . /// regex `(?-u:a|\xc2\xa0)` will compile down to HIR for the Unicode class + . . . . /// `[a\u00A0]` due to optimizations. + . . . . /// + . . . . /// Note that `Bytes` variant may be produced even when it exclusively matches + . . . . /// valid UTF-8. This is because a `Bytes` variant represents an intention by + . . . . /// the author of the regular expression to disable Unicode mode, which in turn + . . . . /// impacts the semantics of case insensitive matching. For example, `(?i)k` + . . . . /// and `(?i-u)k` will not match the same set of strings. + 1,414 ( 0.00%) . . . #[derive(Clone, Eq, PartialEq)] + . . . . pub enum Class { + . . . . /// A set of characters represented by Unicode scalar values. + . . . . Unicode(ClassUnicode), + . . . . /// A set of characters represented by arbitrary bytes (one byte per + . . . . /// character). + . . . . Bytes(ClassBytes), + . . . . } + . . . . +-- line 825 ---------------------------------------- +-- line 931 ---------------------------------------- + . . . . /// assert_eq!(Some(1), hir.properties().minimum_len()); + . . . . /// // But sometimes Unicode classes might be bigger! + . . . . /// let hir = parse(r"\p{Cyrillic}")?; + . . . . /// assert_eq!(Some(2), hir.properties().minimum_len()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn minimum_len(&self) -> Option { + 5,456 ( 0.00%) . . . match *self { + . . . . Class::Unicode(ref x) => x.minimum_len(), + . . . . Class::Bytes(ref x) => x.minimum_len(), + . . . . } + . . . . } + . . . . + . . . . /// Returns the length, in bytes, of the longest string matched by this + . . . . /// character class. + . . . . /// +-- line 947 ---------------------------------------- +-- line 989 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . /// Returns true if and only if this character class is empty. That is, + . . . . /// it has no elements. + . . . . /// + . . . . /// An empty character can never match anything, including an empty string. + . . . . pub fn is_empty(&self) -> bool { + 3 ( 0.00%) . . . match *self { + . . . . Class::Unicode(ref x) => x.ranges().is_empty(), + . . . . Class::Bytes(ref x) => x.ranges().is_empty(), + . . . . } + 303 ( 0.00%) . . . } + . . . . + . . . . /// If this class consists of exactly one element (whether a codepoint or a + . . . . /// byte), then return it as a literal byte string. + . . . . /// + . . . . /// If this class is empty or contains more than one element, then `None` + . . . . /// is returned. + 1,212 ( 0.00%) . . . pub fn literal(&self) -> Option> { + 8,362 ( 0.00%) . . . match *self { + 8,337 ( 0.00%) . . . Class::Unicode(ref x) => x.literal(), + 3,307 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::literal (193x) + . . . . Class::Bytes(ref x) => x.literal(), + . . . . } + 1,515 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for Class { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . use crate::debug::Byte; + . . . . + . . . . let mut fmter = f.debug_set(); + . . . . match *self { +-- line 1021 ---------------------------------------- +-- line 1032 ---------------------------------------- + . . . . } + . . . . fmter.finish() + . . . . } + . . . . } + . . . . + . . . . /// A set of characters represented by Unicode scalar values. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . pub struct ClassUnicode { + 64 ( 0.00%) . . . set: IntervalSet, + 1,810 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/partial_eq.rs: as core::cmp::PartialEq>::eq (60x) + . . . . } + . . . . + . . . . impl ClassUnicode { + . . . . /// Create a new class from a sequence of ranges. + . . . . /// + . . . . /// The given ranges do not need to be in any specific order, and ranges + . . . . /// may overlap. Ranges will automatically be sorted into a canonical + . . . . /// non-overlapping order. + 2,255 ( 0.00%) . . . pub fn new(ranges: I) -> ClassUnicode + . . . . where + . . . . I: IntoIterator, + . . . . { + 1 ( 0.00%) . . . ClassUnicode { set: IntervalSet::new(ranges) } + 982 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::new (1x) + 3,380 ( 0.00%) . . . } + . . . . + . . . . /// Create a new class with no ranges. + . . . . /// + . . . . /// An empty class matches nothing. That is, it is equivalent to + . . . . /// [`Hir::fail`]. + . . . . pub fn empty() -> ClassUnicode { + . . . . ClassUnicode::new(vec![]) + . . . . } +-- line 1062 ---------------------------------------- +-- line 1066 ---------------------------------------- + . . . . self.set.push(range); + . . . . } + . . . . + . . . . /// Return an iterator over all ranges in this class. + . . . . /// + . . . . /// The iterator yields ranges in ascending order. + . . . . pub fn iter(&self) -> ClassUnicodeIter<'_> { + . . . . ClassUnicodeIter(self.set.iter()) + 5,631 ( 0.00%) . . . } + . . . . + . . . . /// Return the underlying ranges as a slice. + . . . . pub fn ranges(&self) -> &[ClassUnicodeRange] { + . . . . self.set.intervals() + . . . . } + . . . . + . . . . /// Expand this character class such that it contains all case folded + . . . . /// characters, according to Unicode's "simple" mapping. For example, if +-- line 1082 ---------------------------------------- +-- line 1102 ---------------------------------------- + . . . . /// this class consists of the range `a-z`, then applying case folding will + . . . . /// result in the class containing both the ranges `a-z` and `A-Z`. + . . . . /// + . . . . /// # Error + . . . . /// + . . . . /// This routine returns an error when the case mapping data necessary + . . . . /// for this routine to complete is unavailable. This occurs when the + . . . . /// `unicode-case` feature is not enabled. + 6,720 ( 0.00%) . . . pub fn try_case_fold_simple( + . . . . &mut self, + . . . . ) -> core::result::Result<(), CaseFoldError> { + . . . . self.set.case_fold_simple() + 7,840 ( 0.00%) . . . } + . . . . + . . . . /// Negate this character class. + . . . . /// + . . . . /// For all `c` where `c` is a Unicode scalar value, if `c` was in this + . . . . /// set, then it will not be in this set after negation. + . . . . pub fn negate(&mut self) { + 66 ( 0.00%) . . . self.set.negate(); + 3,555 ( 0.00%) 10 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::negate (6x) + . . . . } + . . . . + . . . . /// Union this character class with the given character class, in place. + . . . . pub fn union(&mut self, other: &ClassUnicode) { + 114 ( 0.00%) . . . self.set.union(&other.set); + 14,747 ( 0.00%) 27 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::union (57x) + . . . . } + . . . . + . . . . /// Intersect this character class with the given character class, in + . . . . /// place. + . . . . pub fn intersect(&mut self, other: &ClassUnicode) { + . . . . self.set.intersect(&other.set); + . . . . } + . . . . +-- line 1134 ---------------------------------------- +-- line 1148 ---------------------------------------- + . . . . pub fn symmetric_difference(&mut self, other: &ClassUnicode) { + . . . . self.set.symmetric_difference(&other.set); + . . . . } + . . . . + . . . . /// Returns true if and only if this character class will either match + . . . . /// nothing or only ASCII bytes. Stated differently, this returns false + . . . . /// if and only if this class contains a non-ASCII codepoint. + . . . . pub fn is_ascii(&self) -> bool { + 11,319 ( 0.00%) . . . self.set.intervals().last().map_or(true, |r| r.end <= '\x7F') + 5,631 ( 0.00%) . . . } + . . . . + . . . . /// Returns the length, in bytes, of the smallest string matched by this + . . . . /// character class. + . . . . /// + . . . . /// Returns `None` when the class is empty. + . . . . pub fn minimum_len(&self) -> Option { + 2,618 ( 0.00%) . . . let first = self.ranges().get(0)?; + . . . . // Correct because c1 < c2 implies c1.len_utf8() < c2.len_utf8(). + 2,618 ( 0.00%) . . . Some(first.start.len_utf8()) + . . . . } + . . . . + . . . . /// Returns the length, in bytes, of the longest string matched by this + . . . . /// character class. + . . . . /// + . . . . /// Returns `None` when the class is empty. + . . . . pub fn maximum_len(&self) -> Option { + . . . . let last = self.ranges().last()?; + . . . . // Correct because c1 < c2 implies c1.len_utf8() < c2.len_utf8(). + 2,618 ( 0.00%) . . . Some(last.end.len_utf8()) + . . . . } + . . . . + . . . . /// If this class consists of exactly one codepoint, then return it as + . . . . /// a literal byte string. + . . . . /// + . . . . /// If this class is empty or contains more than one codepoint, then `None` + . . . . /// is returned. + 20,360 ( 0.01%) . . . pub fn literal(&self) -> Option> { + . . . . let rs = self.ranges(); + 15,080 ( 0.00%) . . . if rs.len() == 1 && rs[0].start == rs[0].end { + 1,454 ( 0.00%) . . . Some(rs[0].start.encode_utf8(&mut [0; 4]).to_string().into_bytes()) + . . . . } else { + 5,236 ( 0.00%) . . . None + . . . . } + 24,432 ( 0.01%) . . . } + . . . . + . . . . /// If this class consists of only ASCII ranges, then return its + . . . . /// corresponding and equivalent byte class. + . . . . pub fn to_byte_class(&self) -> Option { + 57 ( 0.00%) . . . if !self.is_ascii() { + . . . . return None; + . . . . } + . . . . Some(ClassBytes::new(self.ranges().iter().map(|r| { + . . . . // Since we are guaranteed that our codepoint range is ASCII, the + . . . . // 'u8::try_from' calls below are guaranteed to be correct. + . . . . ClassBytesRange { + . . . . start: u8::try_from(r.start).unwrap(), + . . . . end: u8::try_from(r.end).unwrap(), +-- line 1204 ---------------------------------------- +-- line 1213 ---------------------------------------- + . . . . #[derive(Debug)] + . . . . pub struct ClassUnicodeIter<'a>(IntervalSetIter<'a, ClassUnicodeRange>); + . . . . + . . . . impl<'a> Iterator for ClassUnicodeIter<'a> { + . . . . type Item = &'a ClassUnicodeRange; + . . . . + . . . . fn next(&mut self) -> Option<&'a ClassUnicodeRange> { + . . . . self.0.next() + 16,122 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A single range of characters represented by Unicode scalar values. + . . . . /// + . . . . /// The range is closed. That is, the start and end of the range are included + . . . . /// in the range. + . . . . #[derive(Clone, Copy, Default, Eq, PartialEq, PartialOrd, Ord)] + . . . . pub struct ClassUnicodeRange { +-- line 1229 ---------------------------------------- +-- line 1270 ---------------------------------------- + . . . . fn set_upper(&mut self, bound: char) { + . . . . self.end = bound; + . . . . } + . . . . + . . . . /// Apply simple case folding to this Unicode scalar value range. + . . . . /// + . . . . /// Additional ranges are appended to the given vector. Canonical ordering + . . . . /// is *not* maintained in the given vector. + 8,330 ( 0.00%) . . . fn case_fold_simple( + . . . . &self, + . . . . ranges: &mut Vec, + . . . . ) -> Result<(), unicode::CaseFoldError> { + 1,190 ( 0.00%) . . . let mut folder = unicode::SimpleCaseFolder::new()?; + 2,380 ( 0.00%) . . . if !folder.overlaps(self.start, self.end) { + . . . . return Ok(()); + . . . . } + . . . . let (start, end) = (u32::from(self.start), u32::from(self.end)); + 2,240 ( 0.00%) . . . for cp in (start..=end).filter_map(char::from_u32) { + 3,380 ( 0.00%) . . . for &cp_folded in folder.mapping(cp) { +165,920 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:regex_syntax::unicode::SimpleCaseFolder::mapping (1,120x) + . . . . ranges.push(ClassUnicodeRange::new(cp_folded, cp_folded)); + . . . . } + . . . . } + . . . . Ok(()) + 10,710 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl ClassUnicodeRange { + . . . . /// Create a new Unicode scalar value range for a character class. + . . . . /// + . . . . /// The returned range is always in a canonical form. That is, the range + . . . . /// returned always satisfies the invariant that `start <= end`. + . . . . pub fn new(start: char, end: char) -> ClassUnicodeRange { +-- line 1301 ---------------------------------------- +-- line 1302 ---------------------------------------- + . . . . ClassUnicodeRange::create(start, end) + . . . . } + . . . . + . . . . /// Return the start of this range. + . . . . /// + . . . . /// The start of a range is always less than or equal to the end of the + . . . . /// range. + . . . . pub fn start(&self) -> char { + 10,951 ( 0.00%) . . . self.start + 10,491 ( 0.00%) . . . } + . . . . + . . . . /// Return the end of this range. + . . . . /// + . . . . /// The end of a range is always greater than or equal to the start of the + . . . . /// range. + . . . . pub fn end(&self) -> char { + 10,721 ( 0.00%) . . . self.end + 10,491 ( 0.00%) . . . } + . . . . + . . . . /// Returns the number of codepoints in this range. + . . . . pub fn len(&self) -> usize { + 738 ( 0.00%) . . . let diff = 1 + u32::from(self.end) - u32::from(self.start); + . . . . // This is likely to panic in 16-bit targets since a usize can only fit + . . . . // 2^16. It's not clear what to do here, other than to return an error + . . . . // when building a Unicode class that contains a range whose length + . . . . // overflows usize. (Which, to be honest, is probably quite common on + . . . . // 16-bit targets. For example, this would imply that '.' and '\p{any}' + . . . . // would be impossible to build.) + . . . . usize::try_from(diff).expect("char class len fits in usize") + . . . . } +-- line 1331 ---------------------------------------- +-- line 1344 ---------------------------------------- + . . . . /// + . . . . /// The given ranges do not need to be in any specific order, and ranges + . . . . /// may overlap. Ranges will automatically be sorted into a canonical + . . . . /// non-overlapping order. + . . . . pub fn new(ranges: I) -> ClassBytes + . . . . where + . . . . I: IntoIterator, + . . . . { + 2 ( 0.00%) . . . ClassBytes { set: IntervalSet::new(ranges) } + 157 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::new (1x) + . . . . } + . . . . + . . . . /// Create a new class with no ranges. + . . . . /// + . . . . /// An empty class matches nothing. That is, it is equivalent to + . . . . /// [`Hir::fail`]. + 220 ( 0.00%) . . . pub fn empty() -> ClassBytes { + . . . . ClassBytes::new(vec![]) + 330 ( 0.00%) . . . } + . . . . + . . . . /// Add a new range to this set. + 660 ( 0.00%) . . . pub fn push(&mut self, range: ClassBytesRange) { + . . . . self.set.push(range); + 440 ( 0.00%) . . . } + . . . . + . . . . /// Return an iterator over all ranges in this class. + . . . . /// + . . . . /// The iterator yields ranges in ascending order. + . . . . pub fn iter(&self) -> ClassBytesIter<'_> { + . . . . ClassBytesIter(self.set.iter()) + 110 ( 0.00%) . . . } + . . . . + . . . . /// Return the underlying ranges as a slice. + . . . . pub fn ranges(&self) -> &[ClassBytesRange] { + . . . . self.set.intervals() + 5,488 ( 0.00%) . . . } + . . . . + . . . . /// Expand this character class such that it contains all case folded + . . . . /// characters. For example, if this class consists of the range `a-z`, + . . . . /// then applying case folding will result in the class containing both the + . . . . /// ranges `a-z` and `A-Z`. + . . . . /// + . . . . /// Note that this only applies ASCII case folding, which is limited to the + . . . . /// characters `a-z` and `A-Z`. +-- line 1386 ---------------------------------------- +-- line 1393 ---------------------------------------- + . . . . /// For all `b` where `b` is a any byte, if `b` was in this set, then it + . . . . /// will not be in this set after negation. + . . . . pub fn negate(&mut self) { + . . . . self.set.negate(); + . . . . } + . . . . + . . . . /// Union this byte class with the given byte class, in place. + . . . . pub fn union(&mut self, other: &ClassBytes) { + 3 ( 0.00%) . . . self.set.union(&other.set); + 212 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::union (1x) + . . . . } + . . . . + . . . . /// Intersect this byte class with the given byte class, in place. + . . . . pub fn intersect(&mut self, other: &ClassBytes) { + . . . . self.set.intersect(&other.set); + . . . . } + . . . . + . . . . /// Subtract the given byte class from this byte class, in place. +-- line 1409 ---------------------------------------- +-- line 1429 ---------------------------------------- + . . . . self.set.intervals().last().map_or(true, |r| r.end <= 0x7F) + . . . . } + . . . . + . . . . /// Returns the length, in bytes, of the smallest string matched by this + . . . . /// character class. + . . . . /// + . . . . /// Returns `None` when the class is empty. + . . . . pub fn minimum_len(&self) -> Option { + 220 ( 0.00%) . . . if self.ranges().is_empty() { + . . . . None + . . . . } else { + . . . . Some(1) + . . . . } + . . . . } + . . . . + . . . . /// Returns the length, in bytes, of the longest string matched by this + . . . . /// character class. +-- line 1445 ---------------------------------------- +-- line 1455 ---------------------------------------- + . . . . + . . . . /// If this class consists of exactly one byte, then return it as + . . . . /// a literal byte string. + . . . . /// + . . . . /// If this class is empty or contains more than one byte, then `None` + . . . . /// is returned. + . . . . pub fn literal(&self) -> Option> { + . . . . let rs = self.ranges(); + 550 ( 0.00%) . . . if rs.len() == 1 && rs[0].start == rs[0].end { + . . . . Some(vec![rs[0].start]) + . . . . } else { + 220 ( 0.00%) . . . None + . . . . } + . . . . } + . . . . + . . . . /// If this class consists of only ASCII ranges, then return its + . . . . /// corresponding and equivalent Unicode class. + . . . . pub fn to_unicode_class(&self) -> Option { + . . . . if !self.is_ascii() { + . . . . return None; +-- line 1474 ---------------------------------------- +-- line 1491 ---------------------------------------- + . . . . #[derive(Debug)] + . . . . pub struct ClassBytesIter<'a>(IntervalSetIter<'a, ClassBytesRange>); + . . . . + . . . . impl<'a> Iterator for ClassBytesIter<'a> { + . . . . type Item = &'a ClassBytesRange; + . . . . + . . . . fn next(&mut self) -> Option<&'a ClassBytesRange> { + . . . . self.0.next() + 220 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A single range of characters represented by arbitrary bytes. + . . . . /// + . . . . /// The range is closed. That is, the start and end of the range are included + . . . . /// in the range. + . . . . #[derive(Clone, Copy, Default, Eq, PartialEq, PartialOrd, Ord)] + . . . . pub struct ClassBytesRange { +-- line 1507 ---------------------------------------- +-- line 1552 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . impl ClassBytesRange { + . . . . /// Create a new byte range for a character class. + . . . . /// + . . . . /// The returned range is always in a canonical form. That is, the range + . . . . /// returned always satisfies the invariant that `start <= end`. + 110 ( 0.00%) . . . pub fn new(start: u8, end: u8) -> ClassBytesRange { + . . . . ClassBytesRange::create(start, end) + 110 ( 0.00%) . . . } + . . . . + . . . . /// Return the start of this range. + . . . . /// + . . . . /// The start of a range is always less than or equal to the end of the + . . . . /// range. + . . . . pub fn start(&self) -> u8 { + 110 ( 0.00%) . . . self.start + 110 ( 0.00%) . . . } + . . . . + . . . . /// Return the end of this range. + . . . . /// + . . . . /// The end of a range is always greater than or equal to the start of the + . . . . /// range. + . . . . pub fn end(&self) -> u8 { + 110 ( 0.00%) . . . self.end + 110 ( 0.00%) . . . } + . . . . + . . . . /// Returns the number of bytes in this range. + . . . . pub fn len(&self) -> usize { + . . . . usize::from(self.end.checked_sub(self.start).unwrap()) + . . . . .checked_add(1) + . . . . .unwrap() + . . . . } + . . . . } +-- line 1586 ---------------------------------------- +-- line 1592 ---------------------------------------- + . . . . .field("end", &crate::debug::Byte(self.end)) + . . . . .finish() + . . . . } + . . . . } + . . . . + . . . . /// The high-level intermediate representation for a look-around assertion. + . . . . /// + . . . . /// An assertion match is always zero-length. Also called an "empty match." + 2 ( 0.00%) . . . #[derive(Clone, Copy, Debug, Eq, PartialEq)] + . . . . pub enum Look { + . . . . /// Match the beginning of text. Specifically, this matches at the starting + . . . . /// position of the input. + . . . . Start = 1 << 0, + . . . . /// Match the end of text. Specifically, this matches at the ending + . . . . /// position of the input. + . . . . End = 1 << 1, + . . . . /// Match the beginning of a line or the beginning of text. Specifically, +-- line 1608 ---------------------------------------- +-- line 1801 ---------------------------------------- + . . . . pub struct Repetition { + . . . . /// The minimum range of the repetition. + . . . . /// + . . . . /// Note that special cases like `?`, `+` and `*` all get translated into + . . . . /// the ranges `{0,1}`, `{1,}` and `{0,}`, respectively. + . . . . /// + . . . . /// When `min` is zero, this expression can match the empty string + . . . . /// regardless of what its sub-expression is. + 8 ( 0.00%) . . . pub min: u32, + . . . . /// The maximum range of the repetition. + . . . . /// + . . . . /// Note that when `max` is `None`, `min` acts as a lower bound but where + . . . . /// there is no upper bound. For something like `x{5}` where the min and + . . . . /// max are equivalent, `min` will be set to `5` and `max` will be set to + . . . . /// `Some(5)`. + 4 ( 0.00%) . . . pub max: Option, + . . . . /// Whether this repetition operator is greedy or not. A greedy operator + . . . . /// will match as much as it can. A non-greedy operator will match as + . . . . /// little as it can. + . . . . /// + . . . . /// Typically, operators are greedy by default and are only non-greedy when + . . . . /// a `?` suffix is used, e.g., `(expr)*` is greedy while `(expr)*?` is + . . . . /// not. However, this can be inverted via the `U` "ungreedy" flag. + 24 ( 0.00%) . . . pub greedy: bool, + . . . . /// The expression being repeated. + 4 ( 0.00%) . . . pub sub: Box, + . . . . } + . . . . + . . . . impl Repetition { + . . . . /// Returns a new repetition with the same `min`, `max` and `greedy` + . . . . /// values, but with its sub-expression replaced with the one given. + 1,043 ( 0.00%) . . . pub fn with(&self, sub: Hir) -> Repetition { + 745 ( 0.00%) . . . Repetition { + 149 ( 0.00%) . . . min: self.min, + 298 ( 0.00%) . . . max: self.max, + 149 ( 0.00%) . . . greedy: self.greedy, + . . . . sub: Box::new(sub), + . . . . } + 1,043 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A type describing the different flavors of `.`. + . . . . /// + . . . . /// This type is meant to be used with [`Hir::dot`], which is a convenience + . . . . /// routine for building HIR values derived from the `.` regex. + . . . . #[non_exhaustive] + . . . . #[derive(Clone, Copy, Debug, Eq, PartialEq)] +-- line 1847 ---------------------------------------- +-- line 1894 ---------------------------------------- + . . . . /// + . . . . /// This is equivalent to `(?R-su:.)` and also `(?-u:[[\x00-\xFF]--\r\n])`. + . . . . AnyByteExceptCRLF, + . . . . } + . . . . + . . . . /// A custom `Drop` impl is used for `HirKind` such that it uses constant stack + . . . . /// space but heap space proportional to the depth of the total `Hir`. + . . . . impl Drop for Hir { +555,360 ( 0.16%) . . . fn drop(&mut self) { + . . . . use core::mem; + . . . . +624,780 ( 0.18%) . . . match *self.kind() { + . . . . HirKind::Empty + . . . . | HirKind::Literal(_) + . . . . | HirKind::Class(_) + . . . . | HirKind::Look(_) => return, + 693 ( 0.00%) . . . HirKind::Capture(ref x) if x.sub.kind.subs().is_empty() => return, + 4,068 ( 0.00%) . . . HirKind::Repetition(ref x) if x.sub.kind.subs().is_empty() => { + . . . . return + . . . . } + . . . . HirKind::Concat(ref x) if x.is_empty() => return, + . . . . HirKind::Alternation(ref x) if x.is_empty() => return, + . . . . _ => {} + . . . . } + . . . . + 104 ( 0.00%) . . . let mut stack = vec![mem::replace(self, Hir::empty())]; +220,144 ( 0.06%) . . . while let Some(mut expr) = stack.pop() { +192,626 ( 0.06%) . . . match expr.kind { + . . . . HirKind::Empty + . . . . | HirKind::Literal(_) + . . . . | HirKind::Class(_) + . . . . | HirKind::Look(_) => {} + . . . . HirKind::Capture(ref mut x) => { + 693 ( 0.00%) . . . stack.push(mem::replace(&mut x.sub, Hir::empty())); + . . . . } + . . . . HirKind::Repetition(ref mut x) => { + 2,029 ( 0.00%) . . . stack.push(mem::replace(&mut x.sub, Hir::empty())); + . . . . } + . . . . HirKind::Concat(ref mut x) => { + . . . . stack.extend(x.drain(..)); + . . . . } + . . . . HirKind::Alternation(ref mut x) => { + . . . . stack.extend(x.drain(..)); + . . . . } + . . . . } + . . . . } +555,360 ( 0.16%) . . . } + . . . . } + . . . . + . . . . /// A type that collects various properties of an HIR value. + . . . . /// + . . . . /// Properties are always scalar values and represent meta data that is + . . . . /// computed inductively on an HIR value. Properties are defined for all + . . . . /// HIR values. + . . . . /// + . . . . /// All methods on a `Properties` value take constant time and are meant to + . . . . /// be cheap to call. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] + 81 ( 0.00%) . . . pub struct Properties(Box); + . . . . + . . . . /// The property definition. It is split out so that we can box it, and + . . . . /// there by make `Properties` use less stack size. This is kind-of important + . . . . /// because every HIR value has a `Properties` attached to it. + . . . . /// + . . . . /// This does have the unfortunate consequence that creating any HIR value + . . . . /// always leads to at least one alloc for properties, but this is generally + . . . . /// true anyway (for pretty much all HirKinds except for look-arounds). + . . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . struct PropertiesI { + . . . . minimum_len: Option, + 174 ( 0.00%) . . . maximum_len: Option, + 166 ( 0.00%) . . . look_set: LookSet, + 58 ( 0.00%) . . . look_set_prefix: LookSet, + 58 ( 0.00%) . . . look_set_suffix: LookSet, + 58 ( 0.00%) . . . look_set_prefix_any: LookSet, + 58 ( 0.00%) . . . look_set_suffix_any: LookSet, + 348 ( 0.00%) . . . utf8: bool, + 174 ( 0.00%) . . . explicit_captures_len: usize, + 58 ( 0.00%) . . . static_explicit_captures_len: Option, + 464 ( 0.00%) . . . literal: bool, + 406 ( 0.00%) . . . alternation_literal: bool, + . . . . } + . . . . + . . . . impl Properties { + . . . . /// Returns the length (in bytes) of the smallest string matched by this + . . . . /// HIR. + . . . . /// + . . . . /// A return value of `0` is possible and occurs when the HIR can match an + . . . . /// empty string. + . . . . /// + . . . . /// `None` is returned when there is no minimum length. This occurs in + . . . . /// precisely the cases where the HIR matches nothing. i.e., The language + . . . . /// the regex matches is empty. An example of such a regex is `\P{any}`. + . . . . #[inline] + . . . . pub fn minimum_len(&self) -> Option { + 22,662 ( 0.01%) . . . self.0.minimum_len + . . . . } + . . . . + . . . . /// Returns the length (in bytes) of the longest string matched by this + . . . . /// HIR. + . . . . /// + . . . . /// A return value of `0` is possible and occurs when nothing longer than + . . . . /// the empty string is in the language described by this HIR. + . . . . /// + . . . . /// `None` is returned when there is no longest matching string. This + . . . . /// occurs when the HIR matches nothing or when there is no upper bound on + . . . . /// the length of matching strings. Example of such regexes are `\P{any}` + . . . . /// (matches nothing) and `a+` (has no upper bound). + . . . . #[inline] + . . . . pub fn maximum_len(&self) -> Option { + 20,358 ( 0.01%) . . . self.0.maximum_len + . . . . } + . . . . + . . . . /// Returns a set of all look-around assertions that appear at least once + . . . . /// in this HIR value. + . . . . #[inline] + . . . . pub fn look_set(&self) -> LookSet { + 24,440 ( 0.01%) . . . self.0.look_set + . . . . } + . . . . + . . . . /// Returns a set of all look-around assertions that appear as a prefix for + . . . . /// this HIR value. That is, the set returned corresponds to the set of + . . . . /// assertions that must be passed before matching any bytes in a haystack. + . . . . /// + . . . . /// For example, `hir.look_set_prefix().contains(Look::Start)` returns true + . . . . /// if and only if the HIR is fully anchored at the start. + . . . . #[inline] + . . . . pub fn look_set_prefix(&self) -> LookSet { + 2,699 ( 0.00%) . . . self.0.look_set_prefix + . . . . } + . . . . + . . . . /// Returns a set of all look-around assertions that appear as a _possible_ + . . . . /// prefix for this HIR value. That is, the set returned corresponds to the + . . . . /// set of assertions that _may_ be passed before matching any bytes in a + . . . . /// haystack. + . . . . /// + . . . . /// For example, `hir.look_set_prefix_any().contains(Look::Start)` returns +-- line 2030 ---------------------------------------- +-- line 2039 ---------------------------------------- + . . . . /// this HIR value. That is, the set returned corresponds to the set of + . . . . /// assertions that must be passed in order to be considered a match after + . . . . /// all other consuming HIR expressions. + . . . . /// + . . . . /// For example, `hir.look_set_suffix().contains(Look::End)` returns true + . . . . /// if and only if the HIR is fully anchored at the end. + . . . . #[inline] + . . . . pub fn look_set_suffix(&self) -> LookSet { + 2,292 ( 0.00%) . . . self.0.look_set_suffix + . . . . } + . . . . + . . . . /// Returns a set of all look-around assertions that appear as a _possible_ + . . . . /// suffix for this HIR value. That is, the set returned corresponds to the + . . . . /// set of assertions that _may_ be passed before matching any bytes in a + . . . . /// haystack. + . . . . /// + . . . . /// For example, `hir.look_set_suffix_any().contains(Look::End)` returns +-- line 2055 ---------------------------------------- +-- line 2121 ---------------------------------------- + . . . . /// // are not valid UTF-8, when combined together, the + . . . . /// // overall expression *does* match valid UTF-8! + . . . . /// assert!(parse(r"(?-u)\xE2\x98\x83")?.properties().is_utf8()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn is_utf8(&self) -> bool { + 24,424 ( 0.01%) . . . self.0.utf8 + . . . . } + . . . . + . . . . /// Returns the total number of explicit capturing groups in the + . . . . /// corresponding HIR. + . . . . /// + . . . . /// Note that this does not include the implicit capturing group + . . . . /// corresponding to the entire match that is typically included by regex + . . . . /// engines. +-- line 2137 ---------------------------------------- +-- line 2145 ---------------------------------------- + . . . . /// + . . . . /// assert_eq!(0, parse("a")?.properties().explicit_captures_len()); + . . . . /// assert_eq!(1, parse("(a)")?.properties().explicit_captures_len()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn explicit_captures_len(&self) -> usize { + 1,467 ( 0.00%) . . . self.0.explicit_captures_len + . . . . } + . . . . + . . . . /// Returns the total number of explicit capturing groups that appear in + . . . . /// every possible match. + . . . . /// + . . . . /// If the number of capture groups can vary depending on the match, then + . . . . /// this returns `None`. That is, a value is only returned when the number + . . . . /// of matching groups is invariant or "static." +-- line 2161 ---------------------------------------- +-- line 2185 ---------------------------------------- + . . . . /// assert_eq!(None, len("a|(b)")?); + . . . . /// assert_eq!(None, len("(b)*")?); + . . . . /// assert_eq!(Some(1), len("(b)+")?); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn static_explicit_captures_len(&self) -> Option { + 24,526 ( 0.01%) . . . self.0.static_explicit_captures_len + . . . . } + . . . . + . . . . /// Return true if and only if this HIR is a simple literal. This is + . . . . /// only true when this HIR expression is either itself a `Literal` or a + . . . . /// concatenation of only `Literal`s. + . . . . /// + . . . . /// For example, `f` and `foo` are literals, but `f+`, `(foo)`, `foo()` and + . . . . /// the empty string are not (even though they contain sub-expressions that + . . . . /// are literals). + . . . . #[inline] + . . . . pub fn is_literal(&self) -> bool { + 18,314 ( 0.01%) . . . self.0.literal + . . . . } + . . . . + . . . . /// Return true if and only if this HIR is either a simple literal or an + . . . . /// alternation of simple literals. This is only + . . . . /// true when this HIR expression is either itself a `Literal` or a + . . . . /// concatenation of only `Literal`s or an alternation of only `Literal`s. + . . . . /// + . . . . /// For example, `f`, `foo`, `a|b|c`, and `foo|bar|baz` are alternation + . . . . /// literals, but `f+`, `(foo)`, `foo()`, and the empty pattern are not + . . . . /// (even though that contain sub-expressions that are literals). + . . . . #[inline] + . . . . pub fn is_alternation_literal(&self) -> bool { + 3,560 ( 0.00%) . . . self.0.alternation_literal + . . . . } + . . . . + . . . . /// Returns the total amount of heap memory usage, in bytes, used by this + . . . . /// `Properties` value. + . . . . #[inline] + . . . . pub fn memory_usage(&self) -> usize { + . . . . core::mem::size_of::() + . . . . } +-- line 2226 ---------------------------------------- +-- line 2290 ---------------------------------------- + . . . . /// hir2.properties(), + . . . . /// hir3.properties(), + . . . . /// ]); + . . . . /// assert_eq!(Some(1), unioned.minimum_len()); + . . . . /// assert_eq!(None, unioned.maximum_len()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 567 ( 0.00%) . . . pub fn union(props: I) -> Properties + . . . . where + . . . . I: IntoIterator, + . . . . P: core::borrow::Borrow, + . . . . { + . . . . let mut it = props.into_iter().peekable(); + . . . . // While empty alternations aren't possible, we still behave as if they + . . . . // are. When we have an empty alternate, then clearly the look-around + . . . . // prefix and suffix is empty. Otherwise, it is the intersection of all +-- line 2306 ---------------------------------------- +-- line 2339 ---------------------------------------- + . . . . // Handle properties that need to visit every child hir. + . . . . for prop in it { + . . . . let p = prop.borrow(); + . . . . props.look_set.set_union(p.look_set()); + . . . . props.look_set_prefix.set_intersect(p.look_set_prefix()); + . . . . props.look_set_suffix.set_intersect(p.look_set_suffix()); + . . . . props.look_set_prefix_any.set_union(p.look_set_prefix_any()); + . . . . props.look_set_suffix_any.set_union(p.look_set_suffix_any()); + 37,722 ( 0.01%) . . . props.utf8 = props.utf8 && p.is_utf8(); + . . . . props.explicit_captures_len = props + . . . . .explicit_captures_len + . . . . .saturating_add(p.explicit_captures_len()); + 53,115 ( 0.02%) . . . if props.static_explicit_captures_len + . . . . != p.static_explicit_captures_len() + . . . . { + . . . . props.static_explicit_captures_len = None; + . . . . } + . . . . props.alternation_literal = + 35,410 ( 0.01%) . . . props.alternation_literal && p.is_literal(); + 50,185 ( 0.01%) . . . if !min_poisoned { + 36,728 ( 0.01%) . . . if let Some(xmin) = p.minimum_len() { + 53,115 ( 0.02%) . . . if props.minimum_len.map_or(true, |pmin| xmin < pmin) { + . . . . props.minimum_len = Some(xmin); + . . . . } + . . . . } else { + . . . . props.minimum_len = None; + . . . . min_poisoned = true; + . . . . } + . . . . } + 35,410 ( 0.01%) . . . if !max_poisoned { + 36,720 ( 0.01%) . . . if let Some(xmax) = p.maximum_len() { + 53,100 ( 0.02%) . . . if props.maximum_len.map_or(true, |pmax| xmax > pmax) { + . . . . props.maximum_len = Some(xmax); + . . . . } + . . . . } else { + . . . . props.maximum_len = None; + . . . . max_poisoned = true; + . . . . } + . . . . } + . . . . } + . . . . Properties(Box::new(props)) + 648 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl Properties { + . . . . /// Create a new set of HIR properties for an empty regex. + . . . . fn empty() -> Properties { + . . . . let inner = PropertiesI { + . . . . minimum_len: Some(0), + . . . . maximum_len: Some(0), +-- line 2388 ---------------------------------------- +-- line 2413 ---------------------------------------- + . . . . static_explicit_captures_len: Some(0), + . . . . literal: false, + . . . . alternation_literal: false, + . . . . }; + . . . . Properties(Box::new(inner)) + . . . . } + . . . . + . . . . /// Create a new set of HIR properties for a literal regex. + 5,736 ( 0.00%) . . . fn literal(lit: &Literal) -> Properties { + . . . . let inner = PropertiesI { + 1,912 ( 0.00%) . . . minimum_len: Some(lit.0.len()), + . . . . maximum_len: Some(lit.0.len()), + . . . . look_set: LookSet::empty(), + . . . . look_set_prefix: LookSet::empty(), + . . . . look_set_suffix: LookSet::empty(), + . . . . look_set_prefix_any: LookSet::empty(), + . . . . look_set_suffix_any: LookSet::empty(), +122,622 ( 0.04%) . . . utf8: core::str::from_utf8(&lit.0).is_ok(), +855,130 ( 0.25%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs:core::str::converts::from_utf8 (15,406x) + . . . . explicit_captures_len: 0, + . . . . static_explicit_captures_len: Some(0), + . . . . literal: true, + . . . . alternation_literal: true, + . . . . }; + . . . . Properties(Box::new(inner)) + 7,648 ( 0.00%) . . . } + . . . . + . . . . /// Create a new set of HIR properties for a character class. + 13,640 ( 0.00%) . . . fn class(class: &Class) -> Properties { + 440 ( 0.00%) . . . let inner = PropertiesI { + . . . . minimum_len: class.minimum_len(), + . . . . maximum_len: class.maximum_len(), + . . . . look_set: LookSet::empty(), + . . . . look_set_prefix: LookSet::empty(), + . . . . look_set_suffix: LookSet::empty(), + . . . . look_set_prefix_any: LookSet::empty(), + . . . . look_set_suffix_any: LookSet::empty(), + . . . . utf8: class.is_utf8(), + . . . . explicit_captures_len: 0, + . . . . static_explicit_captures_len: Some(0), + . . . . literal: false, + . . . . alternation_literal: false, + . . . . }; + . . . . Properties(Box::new(inner)) + 16,368 ( 0.00%) . . . } + . . . . + . . . . /// Create a new set of HIR properties for a look-around assertion. + 4 ( 0.00%) . . . fn look(look: Look) -> Properties { + . . . . let inner = PropertiesI { + . . . . minimum_len: Some(0), + . . . . maximum_len: Some(0), + . . . . look_set: LookSet::singleton(look), + . . . . look_set_prefix: LookSet::singleton(look), + . . . . look_set_suffix: LookSet::singleton(look), + . . . . look_set_prefix_any: LookSet::singleton(look), + . . . . look_set_suffix_any: LookSet::singleton(look), +-- line 2467 ---------------------------------------- +-- line 2480 ---------------------------------------- + . . . . // property borderline useless. + . . . . utf8: true, + . . . . explicit_captures_len: 0, + . . . . static_explicit_captures_len: Some(0), + . . . . literal: false, + . . . . alternation_literal: false, + . . . . }; + . . . . Properties(Box::new(inner)) + 4 ( 0.00%) . . . } + . . . . + . . . . /// Create a new set of HIR properties for a repetition. + 14,238 ( 0.00%) . . . fn repetition(rep: &Repetition) -> Properties { + 2,034 ( 0.00%) . . . let p = rep.sub.properties(); + 2,034 ( 0.00%) . . . let minimum_len = p.minimum_len().map(|child_min| { + . . . . let rep_min = usize::try_from(rep.min).unwrap_or(usize::MAX); + . . . . child_min.saturating_mul(rep_min) + . . . . }); + 3,981 ( 0.00%) . . . let maximum_len = rep.max.and_then(|rep_max| { + . . . . let rep_max = usize::try_from(rep_max).ok()?; + 1,947 ( 0.00%) . . . let child_max = p.maximum_len()?; + . . . . child_max.checked_mul(rep_max) + . . . . }); + . . . . + . . . . let mut inner = PropertiesI { + . . . . minimum_len, + . . . . maximum_len, + . . . . look_set: p.look_set(), + . . . . look_set_prefix: LookSet::empty(), +-- line 2507 ---------------------------------------- +-- line 2512 ---------------------------------------- + . . . . explicit_captures_len: p.explicit_captures_len(), + . . . . static_explicit_captures_len: p.static_explicit_captures_len(), + . . . . literal: false, + . . . . alternation_literal: false, + . . . . }; + . . . . // If the repetition operator can match the empty string, then its + . . . . // lookset prefix and suffixes themselves remain empty since they are + . . . . // no longer required to match. + 4,068 ( 0.00%) . . . if rep.min > 0 { + . . . . inner.look_set_prefix = p.look_set_prefix(); + . . . . inner.look_set_suffix = p.look_set_suffix(); + . . . . } + . . . . // If the static captures len of the sub-expression is not known or + . . . . // is greater than zero, then it automatically propagates to the + . . . . // repetition, regardless of the repetition. Otherwise, it might + . . . . // change, but only when the repetition can match 0 times. + 7,096 ( 0.00%) . . . if rep.min == 0 + . . . . && inner.static_explicit_captures_len.map_or(false, |len| len > 0) + . . . . { + . . . . // If we require a match 0 times, then our captures len is + . . . . // guaranteed to be zero. Otherwise, if we *can* match the empty + . . . . // string, then it's impossible to know how many captures will be + . . . . // in the resulting match. + . . . . if rep.max == Some(0) { + . . . . inner.static_explicit_captures_len = Some(0); + . . . . } else { + . . . . inner.static_explicit_captures_len = None; + . . . . } + . . . . } + . . . . Properties(Box::new(inner)) + 16,272 ( 0.00%) . . . } + . . . . + . . . . /// Create a new set of HIR properties for a capture. + 4,851 ( 0.00%) . . . fn capture(capture: &Capture) -> Properties { + 693 ( 0.00%) . . . let p = capture.sub.properties(); + . . . . Properties(Box::new(PropertiesI { + . . . . explicit_captures_len: p.explicit_captures_len().saturating_add(1), + . . . . static_explicit_captures_len: p + . . . . .static_explicit_captures_len() + . . . . .map(|len| len.saturating_add(1)), + . . . . literal: false, + . . . . alternation_literal: false, + . . . . ..*p.0.clone() + . . . . })) + 5,544 ( 0.00%) . . . } + . . . . + . . . . /// Create a new set of HIR properties for a concatenation. + . . . . fn concat(concat: &[Hir]) -> Properties { + . . . . // The base case is an empty concatenation, which matches the empty + . . . . // string. Note though that empty concatenations aren't possible, + . . . . // because the Hir::concat smart constructor rewrites those as + . . . . // Hir::empty. + . . . . let mut props = PropertiesI { +-- line 2564 ---------------------------------------- +-- line 2574 ---------------------------------------- + . . . . static_explicit_captures_len: Some(0), + . . . . literal: true, + . . . . alternation_literal: true, + . . . . }; + . . . . // Handle properties that need to visit every child hir. + . . . . for x in concat.iter() { + . . . . let p = x.properties(); + . . . . props.look_set.set_union(p.look_set()); + 46,661 ( 0.01%) . . . props.utf8 = props.utf8 && p.is_utf8(); + . . . . props.explicit_captures_len = props + . . . . .explicit_captures_len + . . . . .saturating_add(p.explicit_captures_len()); + . . . . props.static_explicit_captures_len = p + . . . . .static_explicit_captures_len() + . . . . .and_then(|len1| { + . . . . Some((len1, props.static_explicit_captures_len?)) + . . . . }) + . . . . .and_then(|(len1, len2)| Some(len1.saturating_add(len2))); + 13,438 ( 0.00%) . . . props.literal = props.literal && p.is_literal(); + . . . . props.alternation_literal = + 13,438 ( 0.00%) . . . props.alternation_literal && p.is_alternation_literal(); + 13,438 ( 0.00%) . . . if let Some(minimum_len) = props.minimum_len { + 13,438 ( 0.00%) . . . match p.minimum_len() { + . . . . None => props.minimum_len = None, + . . . . Some(len) => { + . . . . // We use saturating arithmetic here because the + . . . . // minimum is just a lower bound. We can't go any + . . . . // higher than what our number types permit. + . . . . props.minimum_len = + . . . . Some(minimum_len.saturating_add(len)); + . . . . } + . . . . } + . . . . } + 26,396 ( 0.01%) . . . if let Some(maximum_len) = props.maximum_len { + 12,478 ( 0.00%) . . . match p.maximum_len() { + . . . . None => props.maximum_len = None, + . . . . Some(len) => { + . . . . props.maximum_len = maximum_len.checked_add(len) + . . . . } + . . . . } + . . . . } + . . . . } + . . . . // Handle the prefix properties, which only requires visiting + . . . . // child exprs until one matches more than the empty string. + . . . . let mut it = concat.iter(); + . . . . while let Some(x) = it.next() { + . . . . props.look_set_prefix.set_union(x.properties().look_set_prefix()); + . . . . props + . . . . .look_set_prefix_any + . . . . .set_union(x.properties().look_set_prefix_any()); + 8,519 ( 0.00%) . . . if x.properties().maximum_len().map_or(true, |x| x > 0) { + . . . . break; + . . . . } + . . . . } + . . . . // Same thing for the suffix properties, but in reverse. + . . . . let mut it = concat.iter().rev(); + . . . . while let Some(x) = it.next() { + . . . . props.look_set_suffix.set_union(x.properties().look_set_suffix()); + . . . . props + . . . . .look_set_suffix_any + . . . . .set_union(x.properties().look_set_suffix_any()); + 8,277 ( 0.00%) . . . if x.properties().maximum_len().map_or(true, |x| x > 0) { + . . . . break; + . . . . } + . . . . } + . . . . Properties(Box::new(props)) + . . . . } + . . . . + . . . . /// Create a new set of HIR properties for a concatenation. + 4,046 ( 0.00%) . . . fn alternation(alts: &[Hir]) -> Properties { + . . . . Properties::union(alts.iter().map(|hir| hir.properties())) + 4,624 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A set of look-around assertions. + . . . . /// + . . . . /// This is useful for efficiently tracking look-around assertions. For + . . . . /// example, an [`Hir`] provides properties that return `LookSet`s. + 1,548 ( 0.00%) . . . #[derive(Clone, Copy, Default, Eq, PartialEq)] + . . . . pub struct LookSet { + . . . . /// The underlying representation this set is exposed to make it possible + . . . . /// to store it somewhere efficiently. The representation is that + . . . . /// of a bitset, where each assertion occupies bit `i` where `i = + . . . . /// Look::as_repr()`. + . . . . /// + . . . . /// Note that users of this internal representation must permit the full + . . . . /// range of `u16` values to be represented. For example, even if the + . . . . /// current implementation only makes use of the 10 least significant bits, + . . . . /// it may use more bits in a future semver compatible release. + 580 ( 0.00%) . . . pub bits: u32, + . . . . } + . . . . + . . . . impl LookSet { + . . . . /// Create an empty set of look-around assertions. + . . . . #[inline] + . . . . pub fn empty() -> LookSet { + . . . . LookSet { bits: 0 } + . . . . } +-- line 2671 ---------------------------------------- +-- line 2693 ---------------------------------------- + . . . . // OK because max value always fits in a u8, which in turn always + . . . . // fits in a usize, regardless of target. + . . . . usize::try_from(self.bits.count_ones()).unwrap() + . . . . } + . . . . + . . . . /// Returns true if and only if this set is empty. + . . . . #[inline] + . . . . pub fn is_empty(self) -> bool { + 16 ( 0.00%) . . . self.len() == 0 + . . . . } + . . . . + . . . . /// Returns true if and only if the given look-around assertion is in this + . . . . /// set. + . . . . #[inline] + . . . . pub fn contains(self, look: Look) -> bool { + 300 ( 0.00%) . . . self.bits & look.as_repr() != 0 + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any anchor assertions. + . . . . /// This includes both "start/end of haystack" and "start/end of line." + . . . . #[inline] + . . . . pub fn contains_anchor(&self) -> bool { + . . . . self.contains_anchor_haystack() || self.contains_anchor_line() + . . . . } +-- line 2716 ---------------------------------------- +-- line 2829 ---------------------------------------- + . . . . #[inline] + . . . . pub fn set_subtract(&mut self, other: LookSet) { + . . . . *self = self.subtract(other); + . . . . } + . . . . + . . . . /// Returns a new set that is the union of this and the one given. + . . . . #[inline] + . . . . pub fn union(self, other: LookSet) -> LookSet { + 8,422 ( 0.00%) . . . LookSet { bits: self.bits | other.bits } + . . . . } + . . . . + . . . . /// Updates this set in place with the result of unioning it with the one + . . . . /// given. + . . . . #[inline] + . . . . pub fn set_union(&mut self, other: LookSet) { + . . . . *self = self.union(other); + . . . . } +-- line 2845 ---------------------------------------- +-- line 2923 ---------------------------------------- + . . . . } + . . . . + . . . . /// Given a sequence of HIR values where each value corresponds to a Unicode + . . . . /// class (or an all-ASCII byte class), return a single Unicode class + . . . . /// corresponding to the union of the classes found. + . . . . fn class_chars(hirs: &[Hir]) -> Option { + . . . . let mut cls = ClassUnicode::new(vec![]); + . . . . for hir in hirs.iter() { + 3,816 ( 0.00%) . . . match *hir.kind() { + . . . . HirKind::Class(Class::Unicode(ref cls2)) => { + . . . . cls.union(cls2); + . . . . } + . . . . HirKind::Class(Class::Bytes(ref cls2)) => { + . . . . cls.union(&cls2.to_unicode_class()?); + . . . . } + . . . . _ => return None, + . . . . }; +-- line 2939 ---------------------------------------- +-- line 2942 ---------------------------------------- + . . . . } + . . . . + . . . . /// Given a sequence of HIR values where each value corresponds to a byte class + . . . . /// (or an all-ASCII Unicode class), return a single byte class corresponding + . . . . /// to the union of the classes found. + . . . . fn class_bytes(hirs: &[Hir]) -> Option { + . . . . let mut cls = ClassBytes::new(vec![]); + . . . . for hir in hirs.iter() { + 4,003 ( 0.00%) . . . match *hir.kind() { + . . . . HirKind::Class(Class::Unicode(ref cls2)) => { + 1 ( 0.00%) . . . cls.union(&cls2.to_byte_class()?); + . . . . } + . . . . HirKind::Class(Class::Bytes(ref cls2)) => { + . . . . cls.union(cls2); + . . . . } + . . . . _ => return None, + . . . . }; + . . . . } + . . . . Some(Class::Bytes(cls)) +-- line 2960 ---------------------------------------- +-- line 2961 ---------------------------------------- + . . . . } + . . . . + . . . . /// Given a sequence of HIR values where each value corresponds to a literal + . . . . /// that is a single `char`, return that sequence of `char`s. Otherwise return + . . . . /// None. No deduplication is done. + . . . . fn singleton_chars(hirs: &[Hir]) -> Option> { + . . . . let mut singletons = vec![]; + . . . . for hir in hirs.iter() { + 4,146 ( 0.00%) . . . let literal = match *hir.kind() { + . . . . HirKind::Literal(Literal(ref bytes)) => bytes, + . . . . _ => return None, + . . . . }; + 4,590 ( 0.00%) . . . let ch = match crate::debug::utf8_decode(literal) { + 7,718 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/debug.rs:regex_syntax::debug::utf8_decode (454x) + . . . . None => return None, + . . . . Some(Err(_)) => return None, + . . . . Some(Ok(ch)) => ch, + . . . . }; + 918 ( 0.00%) . . . if literal.len() != ch.len_utf8() { + . . . . return None; + . . . . } + . . . . singletons.push(ch); + . . . . } + 1 ( 0.00%) . . . Some(singletons) + . . . . } + . . . . + . . . . /// Given a sequence of HIR values where each value corresponds to a literal + . . . . /// that is a single byte, return that sequence of bytes. Otherwise return + . . . . /// None. No deduplication is done. + . . . . fn singleton_bytes(hirs: &[Hir]) -> Option> { + . . . . let mut singletons = vec![]; + . . . . for hir in hirs.iter() { + 4,710 ( 0.00%) . . . let literal = match *hir.kind() { + . . . . HirKind::Literal(Literal(ref bytes)) => bytes, + . . . . _ => return None, + . . . . }; + 908 ( 0.00%) . . . if literal.len() != 1 { + . . . . return None; + . . . . } + 78 ( 0.00%) . . . singletons.push(literal[0]); + . . . . } + . . . . Some(singletons) + . . . . } + . . . . + . . . . /// Looks for a common prefix in the list of alternation branches given. If one + . . . . /// is found, then an equivalent but (hopefully) simplified Hir is returned. + . . . . /// Otherwise, the original given list of branches is returned unmodified. + . . . . /// + . . . . /// This is not quite as good as it could be. Right now, it requires that + . . . . /// all branches are 'Concat' expressions. It also doesn't do well with + . . . . /// literals. For example, given 'foofoo|foobar', it will not refactor it to + . . . . /// 'foo(?:foo|bar)' because literals are flattened into their own special + . . . . /// concatenation. (One wonders if perhaps 'Literal' should be a single atom + . . . . /// instead of a string of bytes because of this. Otherwise, handling the + . . . . /// current representation in this routine will be pretty gnarly. Sigh.) + 4,632 ( 0.00%) . . . fn lift_common_prefix(hirs: Vec) -> Result> { + 1,158 ( 0.00%) . . . if hirs.len() <= 1 { + . . . . return Err(hirs); + . . . . } + 1,737 ( 0.00%) . . . let mut prefix = match hirs[0].kind() { + . . . . HirKind::Concat(ref xs) => &**xs, + . . . . _ => return Err(hirs), + . . . . }; + 206 ( 0.00%) . . . if prefix.is_empty() { + . . . . return Err(hirs); + . . . . } + . . . . for h in hirs.iter().skip(1) { + 232 ( 0.00%) . . . let concat = match h.kind() { + . . . . HirKind::Concat(ref xs) => xs, + . . . . _ => return Err(hirs), + . . . . }; + . . . . let common_len = prefix + . . . . .iter() + . . . . .zip(concat.iter()) + . . . . .take_while(|(x, y)| x == y) + . . . . .count(); + . . . . prefix = &prefix[..common_len]; + 48 ( 0.00%) . . . if prefix.is_empty() { + . . . . return Err(hirs); + . . . . } + . . . . } + . . . . let len = prefix.len(); + . . . . assert_ne!(0, len); + . . . . let mut prefix_concat = vec![]; + . . . . let mut suffix_alts = vec![]; + 40 ( 0.00%) . . . for h in hirs { + 10 ( 0.00%) . . . let mut concat = match h.into_kind() { + . . . . HirKind::Concat(xs) => xs, + . . . . // We required all sub-expressions to be + . . . . // concats above, so we're only here if we + . . . . // have a concat. + . . . . _ => unreachable!(), + . . . . }; + 15 ( 0.00%) . . . suffix_alts.push(Hir::concat(concat.split_off(len))); + 5,492 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (5x) + 9 ( 0.00%) . . . if prefix_concat.is_empty() { + . . . . prefix_concat = concat; + . . . . } + . . . . } + 3 ( 0.00%) . . . let mut concat = prefix_concat; + 8 ( 0.00%) . . . concat.push(Hir::alternation(suffix_alts)); + 4,832 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation'2 (1x) + 7 ( 0.00%) . . . Ok(Hir::concat(concat)) + 1,040 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (1x) + 4,632 ( 0.00%) . . . } + . . . . + . . . . #[cfg(test)] + . . . . mod tests { + . . . . use super::*; + . . . . + . . . . fn uclass(ranges: &[(char, char)]) -> ClassUnicode { + . . . . let ranges: Vec = ranges + . . . . .iter() +-- line 3069 ---------------------------------------- + +656,469 ( 0.19%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/lib.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 252 ---------------------------------------- + . . . . /// assert!(is_meta_character('#')); + . . . . /// + . . . . /// assert!(!is_meta_character('%')); + . . . . /// assert!(!is_meta_character('/')); + . . . . /// assert!(!is_meta_character('!')); + . . . . /// assert!(!is_meta_character('"')); + . . . . /// assert!(!is_meta_character('e')); + . . . . /// ``` +1,607 ( 0.00%) . . . pub fn is_meta_character(c: char) -> bool { +4,821 ( 0.00%) . . . match c { + . . . . '\\' | '.' | '+' | '*' | '?' | '(' | ')' | '|' | '[' | ']' | '{' + . . . . | '}' | '^' | '$' | '#' | '&' | '-' | '~' => true, + . . . . _ => false, + . . . . } +1,607 ( 0.00%) . . . } + . . . . + . . . . /// Returns true if the given character can be escaped in a regex. + . . . . /// + . . . . /// This returns true in all cases that `is_meta_character` returns true, but + . . . . /// also returns true in some cases where `is_meta_character` returns false. + . . . . /// For example, `%` is not a meta character, but it is escapeable. That is, + . . . . /// `%` and `\%` both match a literal `%` in all contexts. + . . . . /// +-- line 274 ---------------------------------------- +-- line 302 ---------------------------------------- + . . . . /// ``` + . . . . pub fn is_escapeable_character(c: char) -> bool { + . . . . // Certainly escapeable if it's a meta character. + . . . . if is_meta_character(c) { + . . . . return true; + . . . . } + . . . . // Any character that isn't ASCII is definitely not escapeable. There's + . . . . // no real need to allow things like \☃ right? + 1 ( 0.00%) . . . if !c.is_ascii() { + . . . . return false; + . . . . } + . . . . // Otherwise, we basically say that everything is escapeable unless it's a + . . . . // letter or digit. Things like \3 are either octal (when enabled) or an + . . . . // error, and we should keep it that way. Otherwise, letters are reserved + . . . . // for adding new syntax in a backwards compatible way. + . . . . match c { + 9 ( 0.00%) . . . '0'..='9' | 'A'..='Z' | 'a'..='z' => false, + . . . . // While not currently supported, we keep these as not escapeable to + . . . . // give us some flexibility with respect to supporting the \< and + . . . . // \> word boundary assertions in the future. By rejecting them as + . . . . // escapeable, \< and \> will result in a parse error. Thus, we can + . . . . // turn them into something else in the future without it being a + . . . . // backwards incompatible change. + . . . . // + . . . . // OK, now we support \< and \>, and we need to retain them as *not* +-- line 326 ---------------------------------------- + +8,037 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 126 ---------------------------------------- + . . . . /// to the pattern's index (starting at 0). + . . . . Match { pattern_id: PatternID }, + . . . . } + . . . . + . . . . impl State { + . . . . /// If this state is an unconditional epsilon transition, then this returns + . . . . /// the target of the transition. + . . . . fn goto(&self) -> Option { + 366,650 ( 0.11%) . . . match *self { + 5,208 ( 0.00%) . . . State::Empty { next } => Some(next), + . . . . State::Union { ref alternates } if alternates.len() == 1 => { + . . . . Some(alternates[0]) + . . . . } + . . . . State::UnionReverse { ref alternates } + . . . . if alternates.len() == 1 => + . . . . { + . . . . Some(alternates[0]) + . . . . } +-- line 143 ---------------------------------------- +-- line 151 ---------------------------------------- + . . . . State::Empty { .. } + . . . . | State::ByteRange { .. } + . . . . | State::Look { .. } + . . . . | State::CaptureStart { .. } + . . . . | State::CaptureEnd { .. } + . . . . | State::Fail + . . . . | State::Match { .. } => 0, + . . . . State::Sparse { ref transitions } => { + 13,263 ( 0.00%) . . . transitions.len() * mem::size_of::() + . . . . } + . . . . State::Union { ref alternates } => { + . . . . alternates.len() * mem::size_of::() + . . . . } + . . . . State::UnionReverse { ref alternates } => { + . . . . alternates.len() * mem::size_of::() + . . . . } + . . . . } +-- line 167 ---------------------------------------- +-- line 304 ---------------------------------------- + . . . . /// let mut cache = re.create_cache(); + . . . . /// let mut caps = re.create_captures(); + . . . . /// let expected = Some(Match::must(0, 0..3)); + . . . . /// re.captures(&mut cache, "foo0", &mut caps); + . . . . /// assert_eq!(expected, caps.get_match()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 3,370 ( 0.00%) . . . #[derive(Clone, Debug, Default)] + . . . . pub struct Builder { + . . . . /// The ID of the pattern that we're currently building. + . . . . /// + . . . . /// Callers are required to set (and unset) this by calling + . . . . /// {start,finish}_pattern. Otherwise, most methods will panic. + . . . . pattern_id: Option, + . . . . /// A sequence of intermediate NFA states. Once a state is added to this + . . . . /// sequence, it is assigned a state ID equivalent to its index. Once a +-- line 320 ---------------------------------------- +-- line 363 ---------------------------------------- + . . . . } + . . . . + . . . . /// Clear this builder. + . . . . /// + . . . . /// Clearing removes all state associated with building an NFA, but does + . . . . /// not reset configuration (such as size limits and whether the NFA + . . . . /// should only match UTF-8). After clearing, the builder can be reused to + . . . . /// assemble an entirely new NFA. + 1,400 ( 0.00%) . . . pub fn clear(&mut self) { + 175 ( 0.00%) . . . self.pattern_id = None; + . . . . self.states.clear(); + . . . . self.start_pattern.clear(); + . . . . self.captures.clear(); + 175 ( 0.00%) . . . self.memory_states = 0; + 1,400 ( 0.00%) . . . } + . . . . + . . . . /// Assemble a [`NFA`] from the states added so far. + . . . . /// + . . . . /// After building an NFA, more states may be added and `build` may be + . . . . /// called again. To reuse a builder to produce an entirely new NFA from + . . . . /// scratch, call the [`clear`](Builder::clear) method first. + . . . . /// + . . . . /// `start_anchored` refers to the ID of the starting state that anchored +-- line 385 ---------------------------------------- +-- line 402 ---------------------------------------- + . . . . /// # Panics + . . . . /// + . . . . /// If `start_pattern` was called, then `finish_pattern` must be called + . . . . /// before `build`, otherwise this panics. + . . . . /// + . . . . /// This may panic for other invalid uses of a builder. For example, if + . . . . /// a "start capture" state was added without a corresponding "end capture" + . . . . /// state. + 1,400 ( 0.00%) . . . pub fn build( + . . . . &self, + . . . . start_anchored: StateID, + . . . . start_unanchored: StateID, + . . . . ) -> Result { + 175 ( 0.00%) . . . assert!(self.pattern_id.is_none(), "must call 'finish_pattern' first"); + . . . . debug!( + . . . . "intermediate NFA compilation via builder is complete, \ + . . . . intermediate NFA size: {} states, {} bytes on heap", + . . . . self.states.len(), + . . . . self.memory_usage(), + . . . . ); + . . . . + . . . . let mut nfa = nfa::Inner::default(); + 175 ( 0.00%) . . . nfa.set_utf8(self.utf8); + 175 ( 0.00%) . . . nfa.set_reverse(self.reverse); + . . . . nfa.set_look_matcher(self.look_matcher.clone()); + . . . . // A set of compiler internal state IDs that correspond to states + . . . . // that are exclusively epsilon transitions, i.e., goto instructions, + . . . . // combined with the state that they point to. This is used to + . . . . // record said states while transforming the compiler's internal NFA + . . . . // representation to the external form. + . . . . let mut empties = vec![]; + . . . . // A map used to re-map state IDs when translating this builder's +-- line 433 ---------------------------------------- +-- line 437 ---------------------------------------- + . . . . + . . . . nfa.set_starts(start_anchored, start_unanchored, &self.start_pattern); + . . . . nfa.set_captures(&self.captures).map_err(BuildError::captures)?; + . . . . // The idea here is to convert our intermediate states to their final + . . . . // form. The only real complexity here is the process of converting + . . . . // transitions, which are expressed in terms of state IDs. The new + . . . . // set of states will be smaller because of partial epsilon removal, + . . . . // so the state IDs will not be the same. + 175 ( 0.00%) . . . for (sid, state) in self.states.iter().with_state_ids() { + 445,860 ( 0.13%) . . . match *state { + 10,258 ( 0.00%) . . . State::Empty { next } => { + . . . . // Since we're removing empty states, we need to handle + . . . . // them later since we don't yet know which new state this + . . . . // empty state will be mapped to. + . . . . empties.push((sid, next)); + . . . . } + 42,490 ( 0.01%) . . . State::ByteRange { trans } => { + 212,450 ( 0.06%) . . . remap[sid] = nfa.add(nfa::State::ByteRange { trans }); +4,108,097 ( 1.19%) 2,036 ( 0.25%) 6 ( 1.94%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (42,490x) + . . . . } + . . . . State::Sparse { ref transitions } => { + 53,052 ( 0.02%) . . . remap[sid] = match transitions.len() { + . . . . 0 => nfa.add(nfa::State::Fail), + 8,622 ( 0.00%) . . . 1 => nfa.add(nfa::State::ByteRange { + 5,748 ( 0.00%) . . . trans: transitions[0], + . . . . }), + . . . . _ => { + . . . . let transitions = + 41,556 ( 0.01%) . . . transitions.to_vec().into_boxed_slice(); + . . . . let sparse = SparseTransitions { transitions }; + 31,167 ( 0.01%) . . . nfa.add(nfa::State::Sparse(sparse)) + . . . . } + . . . . } + . . . . } + 245 ( 0.00%) . . . State::Look { look, next } => { + 1,225 ( 0.00%) . . . remap[sid] = nfa.add(nfa::State::Look { look, next }); + 41,774 ( 0.01%) 32 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (245x) + . . . . } + 774 ( 0.00%) . . . State::CaptureStart { pattern_id, group_index, next } => { + . . . . // We can't remove this empty state because of the side + . . . . // effect of capturing an offset for this capture slot. + 774 ( 0.00%) . . . let slot = nfa + . . . . .group_info() + . . . . .slot(pattern_id, group_index.as_usize()) + . . . . .expect("invalid capture index"); + . . . . let slot = + . . . . SmallIndex::new(slot).expect("a small enough slot"); + 6,192 ( 0.00%) . . . remap[sid] = nfa.add(nfa::State::Capture { + 54,438 ( 0.02%) 40 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (774x) + . . . . next, + . . . . pattern_id, + . . . . group_index, + . . . . slot, + . . . . }); + . . . . } + 774 ( 0.00%) . . . State::CaptureEnd { pattern_id, group_index, next } => { + . . . . // We can't remove this empty state because of the side + . . . . // effect of capturing an offset for this capture slot. + . . . . // Also, this always succeeds because we check that all + . . . . // slot indices are valid for all capture indices when they + . . . . // are initially added. + 774 ( 0.00%) . . . let slot = nfa + . . . . .group_info() + . . . . .slot(pattern_id, group_index.as_usize()) + . . . . .expect("invalid capture index") + . . . . .checked_add(1) + . . . . .unwrap(); + . . . . let slot = + . . . . SmallIndex::new(slot).expect("a small enough slot"); + 6,192 ( 0.00%) . . . remap[sid] = nfa.add(nfa::State::Capture { + 46,368 ( 0.01%) 66 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (774x) + . . . . next, + . . . . pattern_id, + . . . . group_index, + . . . . slot, + . . . . }); + . . . . } + . . . . State::Union { ref alternates } => { + 97,328 ( 0.03%) . . . if alternates.is_empty() { + . . . . remap[sid] = nfa.add(nfa::State::Fail); + . . . . } else if alternates.len() == 1 { + 29,170 ( 0.01%) . . . empties.push((sid, alternates[0])); + . . . . remap[sid] = alternates[0]; + . . . . } else if alternates.len() == 2 { + 25,190 ( 0.01%) . . . remap[sid] = nfa.add(nfa::State::BinaryUnion { + 325,253 ( 0.09%) 506 ( 0.06%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (5,038x) + 10,076 ( 0.00%) . . . alt1: alternates[0], + . . . . alt2: alternates[1], + . . . . }); + . . . . } else { + . . . . let alternates = + 5,840 ( 0.00%) . . . alternates.to_vec().into_boxed_slice(); + 8,760 ( 0.00%) . . . remap[sid] = nfa.add(nfa::State::Union { alternates }); + 109,527 ( 0.03%) 90 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (1,460x) + . . . . } + . . . . } + . . . . State::UnionReverse { ref alternates } => { + 660 ( 0.00%) . . . if alternates.is_empty() { + . . . . remap[sid] = nfa.add(nfa::State::Fail); + . . . . } else if alternates.len() == 1 { + . . . . empties.push((sid, alternates[0])); + . . . . remap[sid] = alternates[0]; + . . . . } else if alternates.len() == 2 { + 660 ( 0.00%) . . . remap[sid] = nfa.add(nfa::State::BinaryUnion { + 18,301 ( 0.01%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (110x) + 110 ( 0.00%) . . . alt1: alternates[1], + 110 ( 0.00%) . . . alt2: alternates[0], + . . . . }); + . . . . } else { + . . . . let mut alternates = + . . . . alternates.to_vec().into_boxed_slice(); + . . . . alternates.reverse(); + . . . . remap[sid] = nfa.add(nfa::State::Union { alternates }); + . . . . } + . . . . } + . . . . State::Fail => { + . . . . remap[sid] = nfa.add(nfa::State::Fail); + . . . . } + 175 ( 0.00%) . . . State::Match { pattern_id } => { + 875 ( 0.00%) . . . remap[sid] = nfa.add(nfa::State::Match { pattern_id }); + 9,165 ( 0.00%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::add (175x) + . . . . } + . . . . } + . . . . } + . . . . // Some of the new states still point to empty state IDs, so we need to + . . . . // follow each of them and remap the empty state IDs to their non-empty + . . . . // state IDs. + . . . . // + . . . . // We also keep track of which states we've already mapped. This helps + . . . . // avoid quadratic behavior in a long chain of empty states. For + . . . . // example, in 'a{0}{50000}'. + . . . . let mut remapped = vec![false; self.states.len()]; + 24,843 ( 0.01%) . . . for &(empty_id, empty_next) in empties.iter() { + 49,686 ( 0.01%) . . . if remapped[empty_id] { + . . . . continue; + . . . . } + . . . . // empty states can point to other empty states, forming a chain. + . . . . // So we must follow the chain until the end, which must end at + . . . . // a non-empty state, and therefore, a state that is correctly + . . . . // remapped. We are guaranteed to terminate because our compiler + . . . . // never builds a loop among only empty states. + . . . . let mut new_next = empty_next; + . . . . while let Some(next) = self.states[new_next].goto() { + . . . . new_next = next; + . . . . } + 47,708 ( 0.01%) . . . remap[empty_id] = remap[new_next]; + 71,562 ( 0.02%) . . . remapped[empty_id] = true; + . . . . + . . . . // Now that we've remapped the main 'empty_id' above, we re-follow + . . . . // the chain from above and remap every empty state we found along + . . . . // the way to our ultimate non-empty target. We are careful to set + . . . . // 'remapped' to true for each such state. We thus will not need + . . . . // to re-compute this chain for any subsequent empty states in + . . . . // 'empties' that are part of this chain. + . . . . let mut next2 = empty_next; + . . . . while let Some(next) = self.states[next2].goto() { + 5,694 ( 0.00%) . . . remap[next2] = remap[new_next]; + 2,847 ( 0.00%) . . . remapped[next2] = true; + . . . . next2 = next; + . . . . } + . . . . } + . . . . // Finally remap all of the state IDs. + 700 ( 0.00%) . . . nfa.remap(&remap); +1,235,032 ( 0.36%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::remap (175x) + 1,050 ( 0.00%) . . . let final_nfa = nfa.into_nfa(); +1,560,608 ( 0.45%) 1,238 ( 0.15%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::Inner::into_nfa (175x) + 11,375 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) + . . . . debug!( + . . . . "NFA compilation via builder complete, \ + . . . . final NFA size: {} states, {} bytes on heap, \ + . . . . has empty? {:?}, utf8? {:?}", + . . . . final_nfa.states().len(), + . . . . final_nfa.memory_usage(), + . . . . final_nfa.has_empty(), + . . . . final_nfa.is_utf8(), + . . . . ); + 350 ( 0.00%) . . . Ok(final_nfa) + 1,575 ( 0.00%) . . . } + . . . . + . . . . /// Start the assembly of a pattern in this NFA. + . . . . /// + . . . . /// Upon success, this returns the identifier for the new pattern. + . . . . /// Identifiers start at `0` and are incremented by 1 for each new pattern. + . . . . /// + . . . . /// It is necessary to call this routine before adding capturing states. + . . . . /// Otherwise, any other NFA state may be added before starting a pattern. +-- line 611 ---------------------------------------- +-- line 615 ---------------------------------------- + . . . . /// If the pattern identifier space is exhausted, then this returns an + . . . . /// error. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// If this is called while assembling another pattern (i.e., before + . . . . /// `finish_pattern` is called), then this panics. + . . . . pub fn start_pattern(&mut self) -> Result { + 175 ( 0.00%) . . . assert!(self.pattern_id.is_none(), "must call 'finish_pattern' first"); + . . . . + . . . . let proposed = self.start_pattern.len(); + . . . . let pid = PatternID::new(proposed) + . . . . .map_err(|_| BuildError::too_many_patterns(proposed))?; + 350 ( 0.00%) . . . self.pattern_id = Some(pid); + . . . . // This gets filled in when 'finish_pattern' is called. + . . . . self.start_pattern.push(StateID::ZERO); + . . . . Ok(pid) + . . . . } + . . . . + . . . . /// Finish the assembly of a pattern in this NFA. + . . . . /// + . . . . /// Upon success, this returns the identifier for the new pattern. +-- line 636 ---------------------------------------- +-- line 650 ---------------------------------------- + . . . . /// + . . . . /// If this is called without a corresponding `start_pattern` call, then + . . . . /// this panics. + . . . . pub fn finish_pattern( + . . . . &mut self, + . . . . start_id: StateID, + . . . . ) -> Result { + . . . . let pid = self.current_pattern_id(); + 175 ( 0.00%) . . . self.start_pattern[pid] = start_id; + 175 ( 0.00%) . . . self.pattern_id = None; + . . . . Ok(pid) + . . . . } + . . . . + . . . . /// Returns the pattern identifier of the current pattern. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// If this doesn't occur after a `start_pattern` call and before the + . . . . /// corresponding `finish_pattern` call, then this panics. + . . . . pub fn current_pattern_id(&self) -> PatternID { + 1,124 ( 0.00%) . . . self.pattern_id.expect("must call 'start_pattern' first") + . . . . } + . . . . + . . . . /// Returns the number of patterns added to this builder so far. + . . . . /// + . . . . /// This only includes patterns that have had `finish_pattern` called + . . . . /// for them. + . . . . pub fn pattern_len(&self) -> usize { + . . . . self.start_pattern.len() +-- line 678 ---------------------------------------- +-- line 685 ---------------------------------------- + . . . . /// building the final [`NFA`] (which has no such "empty" states), but they + . . . . /// can be quite useful in the construction process of an NFA. + . . . . /// + . . . . /// # Errors + . . . . /// + . . . . /// This returns an error if the state identifier space is exhausted, or if + . . . . /// the configured heap size limit has been exceeded. + . . . . pub fn add_empty(&mut self) -> Result { + 51,229 ( 0.01%) . . . self.add(State::Empty { next: StateID::ZERO }) + 14,889 ( 0.00%) 44 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (65x) + . . . . } + . . . . + . . . . /// Add a "union" NFA state. + . . . . /// + . . . . /// A "union" NFA state that contains zero or more unconditional epsilon + . . . . /// transitions to other NFA states. The order of these transitions + . . . . /// reflects a priority order where earlier transitions are preferred over + . . . . /// later transitions. +-- line 701 ---------------------------------------- +-- line 709 ---------------------------------------- + . . . . /// # Errors + . . . . /// + . . . . /// This returns an error if the state identifier space is exhausted, or if + . . . . /// the configured heap size limit has been exceeded. + . . . . pub fn add_union( + . . . . &mut self, + . . . . alternates: Vec, + . . . . ) -> Result { + 107,413 ( 0.03%) . . . self.add(State::Union { alternates }) + 40,399 ( 0.01%) 84 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (539x) + . . . . } + . . . . + . . . . /// Add a "reverse union" NFA state. + . . . . /// + . . . . /// A "reverse union" NFA state contains zero or more unconditional epsilon + . . . . /// transitions to other NFA states. The order of these transitions + . . . . /// reflects a priority order where later transitions are preferred + . . . . /// over earlier transitions. This is an inverted priority order when +-- line 725 ---------------------------------------- +-- line 735 ---------------------------------------- + . . . . /// # Errors + . . . . /// + . . . . /// This returns an error if the state identifier space is exhausted, or if + . . . . /// the configured heap size limit has been exceeded. + . . . . pub fn add_union_reverse( + . . . . &mut self, + . . . . alternates: Vec, + . . . . ) -> Result { + 440 ( 0.00%) . . . self.add(State::UnionReverse { alternates }) + . . . . } + . . . . + . . . . /// Add a "range" NFA state. + . . . . /// + . . . . /// A "range" NFA state is a state with one outgoing transition to another + . . . . /// state, where that transition may only be followed if the current input + . . . . /// byte falls between a range of bytes given. + . . . . /// +-- line 751 ---------------------------------------- +-- line 752 ---------------------------------------- + . . . . /// # Errors + . . . . /// + . . . . /// This returns an error if the state identifier space is exhausted, or if + . . . . /// the configured heap size limit has been exceeded. + . . . . pub fn add_range( + . . . . &mut self, + . . . . trans: Transition, + . . . . ) -> Result { + 204,073 ( 0.06%) . . . self.add(State::ByteRange { trans }) +2,461,079 ( 0.71%) 1,809 ( 0.22%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (31,981x) + . . . . } + . . . . + . . . . /// Add a "sparse" NFA state. + . . . . /// + . . . . /// A "sparse" NFA state contains zero or more outgoing transitions, where + . . . . /// the transition to be followed (if any) is chosen based on whether the + . . . . /// current input byte falls in the range of one such transition. The + . . . . /// transitions given *must* be non-overlapping and in ascending order. (A +-- line 768 ---------------------------------------- +-- line 789 ---------------------------------------- + . . . . /// # Panics + . . . . /// + . . . . /// This routine _may_ panic if the transitions given overlap or are not + . . . . /// in ascending order. + . . . . pub fn add_sparse( + . . . . &mut self, + . . . . transitions: Vec, + . . . . ) -> Result { + 69,490 ( 0.02%) . . . self.add(State::Sparse { transitions }) + 86,591 ( 0.03%) 26 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (758x) + . . . . } + . . . . + . . . . /// Add a "look" NFA state. + . . . . /// + . . . . /// A "look" NFA state corresponds to a state with exactly one + . . . . /// *conditional* epsilon transition to another NFA state. Namely, it + . . . . /// represents one of a small set of simplistic look-around operators. + . . . . /// +-- line 805 ---------------------------------------- +-- line 810 ---------------------------------------- + . . . . /// + . . . . /// This returns an error if the state identifier space is exhausted, or if + . . . . /// the configured heap size limit has been exceeded. + . . . . pub fn add_look( + . . . . &mut self, + . . . . next: StateID, + . . . . look: Look, + . . . . ) -> Result { + 490 ( 0.00%) . . . self.add(State::Look { look, next }) + . . . . } + . . . . + . . . . /// Add a "start capture" NFA state. + . . . . /// + . . . . /// A "start capture" NFA state corresponds to a state with exactly one + . . . . /// outgoing unconditional epsilon transition to another state. Unlike + . . . . /// "empty" states, a "start capture" state also carries with it an + . . . . /// instruction for saving the current position of input to a particular +-- line 826 ---------------------------------------- +-- line 983 ---------------------------------------- + . . . . /// assert_eq!(Some(PatternID::must(1)), caps[3].pattern()); + . . . . /// assert_eq!(Some(Span::from(7..8)), caps[3].get_group_by_name("foo")); + . . . . /// + . . . . /// assert_eq!(Some(PatternID::must(1)), caps[4].pattern()); + . . . . /// assert_eq!(Some(Span::from(8..9)), caps[4].get_group_by_name("foo")); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 6,966 ( 0.00%) . . . pub fn add_capture_start( + . . . . &mut self, + . . . . next: StateID, + . . . . group_index: u32, + . . . . name: Option>, + . . . . ) -> Result { + . . . . let pid = self.current_pattern_id(); + . . . . let group_index = match SmallIndex::try_from(group_index) { + . . . . Err(_) => { + . . . . return Err(BuildError::invalid_capture_index(group_index)) + . . . . } + . . . . Ok(group_index) => group_index, + . . . . }; + . . . . // Make sure we have space to insert our (pid,index)|-->name mapping. + 1,548 ( 0.00%) . . . if pid.as_usize() >= self.captures.len() { + 162 ( 0.00%) . . . for _ in 0..=(pid.as_usize() - self.captures.len()) { + . . . . self.captures.push(vec![]); + . . . . } + . . . . } + . . . . // In the case where 'group_index < self.captures[pid].len()', it means + . . . . // that we are adding a duplicate capture group. This is somewhat + . . . . // weird, but permissible because the capture group itself can be + . . . . // repeated in the syntax. For example, '([a-z]){4}' will produce 4 + . . . . // capture groups. In practice, only the last will be set at search + . . . . // time when a match occurs. For duplicates, we don't need to push + . . . . // anything other than a CaptureStart NFA state. + 2,322 ( 0.00%) . . . if group_index.as_usize() >= self.captures[pid].len() { + . . . . // For discontiguous indices, push placeholders for earlier capture + . . . . // groups that weren't explicitly added. + . . . . for _ in 0..(group_index.as_usize() - self.captures[pid].len()) { + . . . . self.captures[pid].push(None); + . . . . } + 1,548 ( 0.00%) . . . self.captures[pid].push(name); + . . . . } + 7,740 ( 0.00%) . . . self.add(State::CaptureStart { pattern_id: pid, group_index, next }) + 52,307 ( 0.02%) 52 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (774x) + 6,966 ( 0.00%) . . . } + . . . . + . . . . /// Add a "end capture" NFA state. + . . . . /// + . . . . /// A "end capture" NFA state corresponds to a state with exactly one + . . . . /// outgoing unconditional epsilon transition to another state. Unlike + . . . . /// "empty" states, a "end capture" state also carries with it an + . . . . /// instruction for saving the current position of input to a particular + . . . . /// location in memory. NFA simulations, like the Pike VM, may use this +-- line 1034 ---------------------------------------- +-- line 1062 ---------------------------------------- + . . . . ) -> Result { + . . . . let pid = self.current_pattern_id(); + . . . . let group_index = match SmallIndex::try_from(group_index) { + . . . . Err(_) => { + . . . . return Err(BuildError::invalid_capture_index(group_index)) + . . . . } + . . . . Ok(group_index) => group_index, + . . . . }; + 6,192 ( 0.00%) . . . self.add(State::CaptureEnd { pattern_id: pid, group_index, next }) + 7,353 ( 0.00%) 12 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (81x) + . . . . } + . . . . + . . . . /// Adds a "fail" NFA state. + . . . . /// + . . . . /// A "fail" state is simply a state that has no outgoing transitions. It + . . . . /// acts as a way to cause a search to stop without reporting a match. + . . . . /// For example, one way to represent an NFA with zero patterns is with a + . . . . /// single "fail" state. +-- line 1078 ---------------------------------------- +-- line 1099 ---------------------------------------- + . . . . /// the configured heap size limit has been exceeded. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This must be called after a `start_pattern` call but before the + . . . . /// corresponding `finish_pattern` call. Otherwise, it panics. + . . . . pub fn add_match(&mut self) -> Result { + . . . . let pattern_id = self.current_pattern_id(); + 1,050 ( 0.00%) . . . let sid = self.add(State::Match { pattern_id })?; + 10,807 ( 0.00%) 12 ( 0.00%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/builder.rs:regex_automata::nfa::thompson::builder::Builder::add (175x) + . . . . Ok(sid) + . . . . } + . . . . + . . . . /// The common implementation of "add a state." It handles the common + . . . . /// error cases of state ID exhausting (by owning state ID allocation) and + . . . . /// whether the size limit has been exceeded. + 624,204 ( 0.18%) . . . fn add(&mut self, state: State) -> Result { + . . . . let id = StateID::new(self.states.len()) + . . . . .map_err(|_| BuildError::too_many_states(self.states.len()))?; + 445,860 ( 0.13%) . . . self.memory_states += state.memory_usage(); + . . . . self.states.push(state); + . . . . self.check_size_limit()?; + 178,344 ( 0.05%) . . . Ok(id) + 535,032 ( 0.15%) . . . } + . . . . + . . . . /// Add a transition from one state to another. + . . . . /// + . . . . /// This routine is called "patch" since it is very common to add the + . . . . /// states you want, typically with "dummy" state ID transitions, and then + . . . . /// "patch" in the real state IDs later. This is because you don't always + . . . . /// know all of the necessary state IDs to add because they might not + . . . . /// exist yet. +-- line 1129 ---------------------------------------- +-- line 1135 ---------------------------------------- + . . . . /// new transition (as in the case of a "union" state). + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics if `from` corresponds to a "sparse" state. When "sparse" + . . . . /// states are added, there is no way to patch them after-the-fact. (If you + . . . . /// have a use case where this would be helpful, please file an issue. It + . . . . /// will likely require a new API.) + 479,568 ( 0.14%) . . . pub fn patch( + . . . . &mut self, + . . . . from: StateID, + . . . . to: StateID, + . . . . ) -> Result<(), BuildError> { + . . . . let old_memory_states = self.memory_states; + 59,946 ( 0.02%) . . . match self.states[from] { + . . . . State::Empty { ref mut next } => { + . . . . *next = to; + . . . . } + . . . . State::ByteRange { ref mut trans } => { + . . . . trans.next = to; + . . . . } + . . . . State::Sparse { .. } => { + . . . . panic!("cannot patch from a sparse NFA state") +-- line 1157 ---------------------------------------- +-- line 1175 ---------------------------------------- + . . . . } + . . . . State::Fail => {} + . . . . State::Match { .. } => {} + . . . . } + . . . . if old_memory_states != self.memory_states { + . . . . self.check_size_limit()?; + . . . . } + . . . . Ok(()) + 539,514 ( 0.16%) . . . } + . . . . + . . . . /// Set whether the NFA produced by this builder should only match UTF-8. + . . . . /// + . . . . /// This should be set when both of the following are true: + . . . . /// + . . . . /// 1. The caller guarantees that the NFA created by this build will only + . . . . /// report non-empty matches with spans that are valid UTF-8. + . . . . /// 2. The caller desires regex engines using this NFA to avoid reporting +-- line 1191 ---------------------------------------- +-- line 1212 ---------------------------------------- + . . . . /// UTF-8, you almost certainly do not want to enable this option. + . . . . /// Similarly, if you are running the NFA on strings that *are* guaranteed + . . . . /// to be valid UTF-8, then you almost certainly want to enable this option + . . . . /// unless you can guarantee that your NFA will never produce a zero-width + . . . . /// match. + . . . . /// + . . . . /// It is disabled by default. + . . . . pub fn set_utf8(&mut self, yes: bool) { + 175 ( 0.00%) . . . self.utf8 = yes; + . . . . } + . . . . + . . . . /// Returns whether UTF-8 mode is enabled for this builder. + . . . . /// + . . . . /// See [`Builder::set_utf8`] for more details about what "UTF-8 mode" is. + . . . . pub fn get_utf8(&self) -> bool { + . . . . self.utf8 + . . . . } +-- line 1228 ---------------------------------------- +-- line 1232 ---------------------------------------- + . . . . /// should be matched by moving backwards through a haystack, from a higher + . . . . /// memory address to a lower memory address. + . . . . /// + . . . . /// See also [`NFA::is_reverse`] for more details. + . . . . /// + . . . . /// This is disabled by default, which means NFAs are by default matched + . . . . /// in the forward direction. + . . . . pub fn set_reverse(&mut self, yes: bool) { + 175 ( 0.00%) . . . self.reverse = yes; + . . . . } + . . . . + . . . . /// Returns whether reverse mode is enabled for this builder. + . . . . /// + . . . . /// See [`Builder::set_reverse`] for more details about what "reverse mode" + . . . . /// is. + . . . . pub fn get_reverse(&self) -> bool { + . . . . self.reverse +-- line 1248 ---------------------------------------- +-- line 1250 ---------------------------------------- + . . . . + . . . . /// Sets the look-around matcher that should be used for the resulting NFA. + . . . . /// + . . . . /// A look-around matcher can be used to configure how look-around + . . . . /// assertions are matched. For example, a matcher might carry + . . . . /// configuration that changes the line terminator used for `(?m:^)` and + . . . . /// `(?m:$)` assertions. + . . . . pub fn set_look_matcher(&mut self, m: LookMatcher) { + 175 ( 0.00%) . . . self.look_matcher = m; + . . . . } + . . . . + . . . . /// Returns the look-around matcher used for this builder. + . . . . /// + . . . . /// If a matcher was not explicitly set, then `LookMatcher::default()` is + . . . . /// returned. + . . . . pub fn get_look_matcher(&self) -> &LookMatcher { + . . . . &self.look_matcher +-- line 1266 ---------------------------------------- +-- line 1272 ---------------------------------------- + . . . . /// fits within the given size limit. If it doesn't, then an error is + . . . . /// returned. + . . . . /// + . . . . /// By default, there is no configured size limit. + . . . . pub fn set_size_limit( + . . . . &mut self, + . . . . limit: Option, + . . . . ) -> Result<(), BuildError> { + 350 ( 0.00%) . . . self.size_limit = limit; + . . . . self.check_size_limit() + . . . . } + . . . . + . . . . /// Return the currently configured size limit. + . . . . /// + . . . . /// By default, this returns `None`, which corresponds to no configured + . . . . /// size limit. + . . . . pub fn get_size_limit(&self) -> Option { +-- line 1288 ---------------------------------------- +-- line 1292 ---------------------------------------- + . . . . /// Returns the heap memory usage, in bytes, used by the NFA states added + . . . . /// so far. + . . . . /// + . . . . /// Note that this is an approximation of how big the final NFA will be. + . . . . /// In practice, the final NFA will likely be a bit smaller because of + . . . . /// its simpler state representation. (For example, using things like + . . . . /// `Box<[StateID]>` instead of `Vec`.) + . . . . pub fn memory_usage(&self) -> usize { + 210,522 ( 0.06%) . . . self.states.len() * mem::size_of::() + self.memory_states + . . . . } + . . . . + . . . . fn check_size_limit(&self) -> Result<(), BuildError> { + 315,608 ( 0.09%) . . . if let Some(limit) = self.size_limit { + 210,522 ( 0.06%) . . . if self.memory_usage() > limit { + . . . . return Err(BuildError::exceeded_size_limit(limit)); + . . . . } + . . . . } + . . . . Ok(()) + . . . . } + . . . . } + . . . . + . . . . #[cfg(test)] +-- line 1313 ---------------------------------------- + +1,504,620 ( 0.43%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/alphabet.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 96 ---------------------------------------- + . . . . /// All possible byte values are legal. However, when creating a haystack + . . . . /// unit for a specific DFA, one should be careful to only construct units + . . . . /// that are in that DFA's alphabet. Namely, one way to compact a DFA's + . . . . /// in-memory representation is to collapse its transitions to a set of + . . . . /// equivalence classes into a set of all possible byte values. If a DFA + . . . . /// uses equivalence classes instead of byte values, then the byte given + . . . . /// here should be the equivalence class. + . . . . pub fn u8(byte: u8) -> Unit { + 113,179 ( 0.03%) . . . Unit(UnitKind::U8(byte)) + . . . . } + . . . . + . . . . /// Create a new "end of input" haystack unit. + . . . . /// + . . . . /// The value given is the sentinel value used by this unit to represent + . . . . /// the "end of input." The value should be the total number of equivalence + . . . . /// classes in the corresponding alphabet. Its maximum value is `256`, + . . . . /// which occurs when every byte is its own equivalence class. +-- line 112 ---------------------------------------- +-- line 115 ---------------------------------------- + . . . . /// + . . . . /// This panics when `num_byte_equiv_classes` is greater than `256`. + . . . . pub fn eoi(num_byte_equiv_classes: usize) -> Unit { + . . . . assert!( + . . . . num_byte_equiv_classes <= 256, + . . . . "max number of byte-based equivalent classes is 256, but got {}", + . . . . num_byte_equiv_classes, + . . . . ); + 702 ( 0.00%) . . . Unit(UnitKind::EOI(u16::try_from(num_byte_equiv_classes).unwrap())) + . . . . } + . . . . + . . . . /// If this unit is not an "end of input" sentinel, then returns its + . . . . /// underlying byte value. Otherwise return `None`. + . . . . pub fn as_u8(self) -> Option { + 120 ( 0.00%) . . . match self.0 { + . . . . UnitKind::U8(b) => Some(b), + . . . . UnitKind::EOI(_) => None, + . . . . } + . . . . } + . . . . + . . . . /// If this unit is an "end of input" sentinel, then return the underlying + . . . . /// sentinel value that was given to [`Unit::eoi`]. Otherwise return + . . . . /// `None`. +-- line 137 ---------------------------------------- +-- line 206 ---------------------------------------- + . . . . /// let classes = nfa.byte_classes(); + . . . . /// // 'a' and 'z' are in the same class for this regex. + . . . . /// assert_eq!(classes.get(b'a'), classes.get(b'z')); + . . . . /// // But 'a' and 'A' are not. + . . . . /// assert_ne!(classes.get(b'a'), classes.get(b'A')); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 1,377 ( 0.00%) . . . #[derive(Clone, Copy)] + . . . . pub struct ByteClasses([u8; 256]); + . . . . + . . . . impl ByteClasses { + . . . . /// Creates a new set of equivalence classes where all bytes are mapped to + . . . . /// the same class. + . . . . #[inline] + . . . . pub fn empty() -> ByteClasses { + 525 ( 0.00%) . . . ByteClasses([0; 256]) + 6,300 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms (175x) + . . . . } + . . . . + . . . . /// Creates a new set of equivalence classes where each byte belongs to + . . . . /// its own equivalence class. + . . . . #[inline] + . . . . pub fn singletons() -> ByteClasses { + . . . . let mut classes = ByteClasses::empty(); + . . . . for b in 0..=255 { +-- line 230 ---------------------------------------- +-- line 281 ---------------------------------------- + . . . . /// Returns the total number of bytes written by `write_to`. + . . . . pub(crate) fn write_to_len(&self) -> usize { + . . . . 256 + . . . . } + . . . . + . . . . /// Set the equivalence class for the given byte. + . . . . #[inline] + . . . . pub fn set(&mut self, byte: u8, class: u8) { + 102,375 ( 0.03%) . . . self.0[usize::from(byte)] = class; + . . . . } + . . . . + . . . . /// Get the equivalence class for the given byte. + . . . . #[inline] + . . . . pub fn get(&self, byte: u8) -> u8 { + 116,748 ( 0.03%) . . . self.0[usize::from(byte)] + . . . . } + . . . . + . . . . /// Get the equivalence class for the given haystack unit and return the + . . . . /// class as a `usize`. + . . . . #[inline] + . . . . pub fn get_by_unit(&self, unit: Unit) -> usize { + 45,262 ( 0.01%) . . . match unit.0 { + . . . . UnitKind::U8(b) => usize::from(self.get(b)), + . . . . UnitKind::EOI(b) => usize::from(b), + . . . . } + . . . . } + . . . . + . . . . /// Create a unit that represents the "end of input" sentinel based on the + . . . . /// number of equivalence classes. + . . . . #[inline] +-- line 310 ---------------------------------------- +-- line 317 ---------------------------------------- + . . . . /// Return the total number of elements in the alphabet represented by + . . . . /// these equivalence classes. Equivalently, this returns the total number + . . . . /// of equivalence classes. + . . . . #[inline] + . . . . pub fn alphabet_len(&self) -> usize { + . . . . // Add one since the number of equivalence classes is one bigger than + . . . . // the last one. But add another to account for the final EOI class + . . . . // that isn't explicitly represented. + 256 ( 0.00%) . . . usize::from(self.0[255]) + 1 + 1 + . . . . } + . . . . + . . . . /// Returns the stride, as a base-2 exponent, required for these + . . . . /// equivalence classes. + . . . . /// + . . . . /// The stride is always the smallest power of 2 that is greater than or + . . . . /// equal to the alphabet length, and the `stride2` returned here is the + . . . . /// exponent applied to `2` to get the smallest power. This is done so that +-- line 333 ---------------------------------------- +-- line 415 ---------------------------------------- + . . . . ) -> ByteClassRepresentatives<'_> { + . . . . use core::ops::Bound; + . . . . + . . . . let cur_byte = match range.start_bound() { + . . . . Bound::Included(&i) => usize::from(i), + . . . . Bound::Excluded(&i) => usize::from(i).checked_add(1).unwrap(), + . . . . Bound::Unbounded => 0, + . . . . }; + 1,451 ( 0.00%) . . . let end_byte = match range.end_bound() { + . . . . Bound::Included(&i) => { + . . . . Some(usize::from(i).checked_add(1).unwrap()) + . . . . } + . . . . Bound::Excluded(&i) => Some(usize::from(i)), + . . . . Bound::Unbounded => None, + . . . . }; + . . . . assert_ne!( + . . . . cur_byte, +-- line 431 ---------------------------------------- +-- line 557 ---------------------------------------- + . . . . end_byte: Option, + . . . . last_class: Option, + . . . . } + . . . . + . . . . impl<'a> Iterator for ByteClassRepresentatives<'a> { + . . . . type Item = Unit; + . . . . + . . . . fn next(&mut self) -> Option { + 300,439 ( 0.09%) . . . while self.cur_byte < self.end_byte.unwrap_or(256) { + . . . . let byte = u8::try_from(self.cur_byte).unwrap(); + . . . . let class = self.classes.get(byte); + 92,114 ( 0.03%) . . . self.cur_byte += 1; + . . . . + . . . . if self.last_class != Some(class) { + . . . . self.last_class = Some(class); + . . . . return Some(Unit::u8(byte)); + . . . . } + . . . . } + 1,404 ( 0.00%) . . . if self.cur_byte != usize::MAX && self.end_byte.is_none() { + . . . . // Using usize::MAX as a sentinel is OK because we ban usize::MAX + . . . . // from appearing as a start bound in iterator construction. But + . . . . // why do it this way? Well, we want to return the EOI class + . . . . // whenever the end of the given range is unbounded because EOI + . . . . // isn't really a "byte" per se, so the only way it should be + . . . . // excluded is if there is a bounded end to the range. Therefore, + . . . . // when the end is unbounded, we just need to know whether we've + . . . . // reported EOI or not. When we do, we set cur_byte to a value it + . . . . // can never otherwise be. + . . . . self.cur_byte = usize::MAX; + 351 ( 0.00%) . . . return Some(self.classes.eoi()); + . . . . } + . . . . None + 23,817 ( 0.01%) . . . } + . . . . } + . . . . + . . . . /// An iterator over all elements in an equivalence class. + . . . . /// + . . . . /// This is created by the [`ByteClasses::elements`] method. + . . . . /// + . . . . /// The lifetime `'a` refers to the lifetime of the byte classes that this + . . . . /// iterator was created from. +-- line 597 ---------------------------------------- +-- line 698 ---------------------------------------- + . . . . pub(crate) fn empty() -> Self { + . . . . ByteClassSet(ByteSet::empty()) + . . . . } + . . . . + . . . . /// Indicate the the range of byte given (inclusive) can discriminate a + . . . . /// match between it and all other bytes outside of the range. + . . . . pub(crate) fn set_range(&mut self, start: u8, end: u8) { + . . . . debug_assert!(start <= end); + 167,676 ( 0.05%) . . . if start > 0 { + 83,605 ( 0.02%) . . . self.0.add(start - 1); + . . . . } + . . . . self.0.add(end); + . . . . } + . . . . + . . . . /// Add the contiguous ranges in the set given to this byte class set. + . . . . pub(crate) fn add_set(&mut self, set: &ByteSet) { + . . . . for (start, end) in set.iter_ranges() { + . . . . self.set_range(start, end); +-- line 715 ---------------------------------------- +-- line 720 ---------------------------------------- + . . . . /// corresponding equivalence class. The last mapping indicates the largest + . . . . /// equivalence class identifier (which is never bigger than 255). + . . . . pub(crate) fn byte_classes(&self) -> ByteClasses { + . . . . let mut classes = ByteClasses::empty(); + . . . . let mut class = 0u8; + . . . . let mut b = 0u8; + . . . . loop { + . . . . classes.set(b, class); + 178,500 ( 0.05%) . . . if b == 255 { + . . . . break; + . . . . } + 89,250 ( 0.03%) . . . if self.0.contains(b) { + . . . . class = class.checked_add(1).unwrap(); + . . . . } + . . . . b = b.checked_add(1).unwrap(); + . . . . } + . . . . classes + . . . . } + . . . . } + . . . . + . . . . /// A simple set of bytes that is reasonably cheap to copy and allocation free. + 700 ( 0.00%) . . . #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] + . . . . pub(crate) struct ByteSet { + . . . . bits: BitSet, + . . . . } + . . . . + . . . . /// The representation of a byte set. Split out so that we can define a + . . . . /// convenient Debug impl for it while keeping "ByteSet" in the output. + . . . . #[derive(Clone, Copy, Default, Eq, PartialEq)] + . . . . struct BitSet([u128; 2]); + . . . . + . . . . impl ByteSet { + . . . . /// Create an empty set of bytes. + . . . . pub(crate) fn empty() -> ByteSet { + 700 ( 0.00%) . . . ByteSet { bits: BitSet([0; 2]) } + . . . . } + . . . . + . . . . /// Add a byte to this set. + . . . . /// + . . . . /// If the given byte already belongs to this set, then this is a no-op. + . . . . pub(crate) fn add(&mut self, byte: u8) { + 167,210 ( 0.05%) . . . let bucket = byte / 128; + . . . . let bit = byte % 128; +1,835,327 ( 0.53%) . . . self.bits.0[usize::from(bucket)] |= 1 << bit; + . . . . } + . . . . + . . . . /// Remove a byte from this set. + . . . . /// + . . . . /// If the given byte is not in this set, then this is a no-op. + . . . . pub(crate) fn remove(&mut self, byte: u8) { + . . . . let bucket = byte / 128; + . . . . let bit = byte % 128; + . . . . self.bits.0[usize::from(bucket)] &= !(1 << bit); + . . . . } + . . . . + . . . . /// Return true if and only if the given byte is in this set. + . . . . pub(crate) fn contains(&self, byte: u8) -> bool { + . . . . let bucket = byte / 128; + . . . . let bit = byte % 128; +1,160,250 ( 0.34%) . . . self.bits.0[usize::from(bucket)] & (1 << bit) > 0 + . . . . } + . . . . + . . . . /// Return true if and only if the given inclusive range of bytes is in + . . . . /// this set. + . . . . pub(crate) fn contains_range(&self, start: u8, end: u8) -> bool { + . . . . (start..=end).all(|b| self.contains(b)) + . . . . } + . . . . +-- line 787 ---------------------------------------- + + 396,615 ( 0.11%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/map.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 120 ---------------------------------------- + . . . . assert!(capacity > 0); + . . . . Utf8BoundedMap { version: 0, capacity, map: vec![] } + . . . . } + . . . . + . . . . /// Clear this map of all entries, but permit the reuse of allocation + . . . . /// if possible. + . . . . /// + . . . . /// This must be called before the map can be used. + 1,008 ( 0.00%) . . . pub fn clear(&mut self) { + 252 ( 0.00%) . . . if self.map.is_empty() { + 67 ( 0.00%) . . . self.map = vec![Utf8BoundedEntry::default(); self.capacity]; + . . . . } else { + 59 ( 0.00%) . . . self.version = self.version.wrapping_add(1); + . . . . // If we loop back to version 0, then we forcefully clear the + . . . . // entire map. Otherwise, it might be possible to incorrectly + . . . . // match entries used to generate other NFAs. + 59 ( 0.00%) . . . if self.version == 0 { + . . . . self.map = vec![Utf8BoundedEntry::default(); self.capacity]; + . . . . } + . . . . } + 1,008 ( 0.00%) . . . } + . . . . + . . . . /// Return a hash of the given transitions. + . . . . pub fn hash(&self, key: &[Transition]) -> usize { + . . . . let mut h = INIT; + . . . . for t in key { + 5,394 ( 0.00%) . . . h = (h ^ u64::from(t.start)).wrapping_mul(PRIME); + 5,394 ( 0.00%) . . . h = (h ^ u64::from(t.end)).wrapping_mul(PRIME); + 2,697 ( 0.00%) . . . h = (h ^ t.next.as_u64()).wrapping_mul(PRIME); + . . . . } + 8,395 ( 0.00%) . . . (h % self.map.len().as_u64()).as_usize() + . . . . } + . . . . + . . . . /// Retrieve the cached state ID corresponding to the given key. The hash + . . . . /// given must have been computed with `hash` using the same key value. + . . . . /// + . . . . /// If there is no cached state with the given transitions, then None is + . . . . /// returned. + . . . . pub fn get(&mut self, key: &[Transition], hash: usize) -> Option { + 1,679 ( 0.00%) . . . let entry = &self.map[hash]; + 8,395 ( 0.00%) . . . if entry.version != self.version { + . . . . return None; + . . . . } + . . . . // There may be a hash collision, so we need to confirm real equality. + 2,482 ( 0.00%) . . . if entry.key != key { + . . . . return None; + . . . . } + 921 ( 0.00%) . . . Some(entry.val) + . . . . } + . . . . + . . . . /// Add a cached state to this map with the given key. Callers should + . . . . /// ensure that `state_id` points to a state that contains precisely the + . . . . /// NFA transitions given. + . . . . /// + . . . . /// `hash` must have been computed using the `hash` method with the same + . . . . /// key. + . . . . pub fn set( + . . . . &mut self, + . . . . key: Vec, + . . . . hash: usize, + . . . . state_id: StateID, + . . . . ) { + 6,064 ( 0.00%) . . . self.map[hash] = + 758 ( 0.00%) . . . Utf8BoundedEntry { version: self.version, key, val: state_id }; + . . . . } + . . . . } + . . . . + . . . . /// A cache of suffixes used to modestly compress UTF-8 automata for large + . . . . /// Unicode character classes. + . . . . #[derive(Clone, Debug)] + . . . . pub struct Utf8SuffixMap { + . . . . /// The current version of this map. Only entries with matching versions +-- line 191 ---------------------------------------- +-- line 200 ---------------------------------------- + . . . . } + . . . . + . . . . /// A key that uniquely identifies an NFA state. It is a triple that represents + . . . . /// a transition from one state for a particular byte range. + . . . . #[derive(Clone, Debug, Default, Eq, PartialEq)] + . . . . pub struct Utf8SuffixKey { + . . . . pub from: StateID, + . . . . pub start: u8, + 3,422 ( 0.00%) . . . pub end: u8, + . . . . } + . . . . + . . . . /// An entry in this map. + . . . . #[derive(Clone, Debug, Default)] + . . . . struct Utf8SuffixEntry { + . . . . /// The version of the map used to produce this entry. If this entry's + . . . . /// version does not match the current version of the map, then the map + . . . . /// should behave as if this entry does not exist. +-- line 216 ---------------------------------------- +-- line 227 ---------------------------------------- + . . . . /// + . . . . /// Note that this does not allocate. Instead, callers must call `clear` + . . . . /// before using this map. `clear` will allocate space if necessary. + . . . . /// + . . . . /// This avoids the need to pay for the allocation of this map when + . . . . /// compiling regexes that lack large Unicode character classes. + . . . . pub fn new(capacity: usize) -> Utf8SuffixMap { + . . . . assert!(capacity > 0); + 3,370 ( 0.00%) . . . Utf8SuffixMap { version: 0, capacity, map: vec![] } + . . . . } + . . . . + . . . . /// Clear this map of all entries, but permit the reuse of allocation + . . . . /// if possible. + . . . . /// + . . . . /// This must be called before the map can be used. + 762 ( 0.00%) . . . pub fn clear(&mut self) { + 127 ( 0.00%) . . . if self.map.is_empty() { + 68 ( 0.00%) . . . self.map = vec![Utf8SuffixEntry::default(); self.capacity]; + . . . . } else { + 59 ( 0.00%) . . . self.version = self.version.wrapping_add(1); + 59 ( 0.00%) . . . if self.version == 0 { + . . . . self.map = vec![Utf8SuffixEntry::default(); self.capacity]; + . . . . } + . . . . } + 762 ( 0.00%) . . . } + . . . . + . . . . /// Return a hash of the given transition. + . . . . pub fn hash(&self, key: &Utf8SuffixKey) -> usize { + . . . . // Basic FNV-1a hash as described: + . . . . // https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + . . . . const PRIME: u64 = 1099511628211; + . . . . const INIT: u64 = 14695981039346656037; + . . . . + . . . . let mut h = INIT; + 9,366 ( 0.00%) . . . h = (h ^ key.from.as_u64()).wrapping_mul(PRIME); + 3,122 ( 0.00%) . . . h = (h ^ u64::from(key.start)).wrapping_mul(PRIME); + 3,122 ( 0.00%) . . . h = (h ^ u64::from(key.end)).wrapping_mul(PRIME); +18,268 ( 0.01%) . . . (h % self.map.len().as_u64()).as_usize() + . . . . } + . . . . + . . . . /// Retrieve the cached state ID corresponding to the given key. The hash + . . . . /// given must have been computed with `hash` using the same key value. + . . . . /// + . . . . /// If there is no cached state with the given key, then None is returned. + . . . . pub fn get( + . . . . &mut self, + . . . . key: &Utf8SuffixKey, + . . . . hash: usize, + . . . . ) -> Option { + 3,122 ( 0.00%) . . . let entry = &self.map[hash]; + 9,366 ( 0.00%) . . . if entry.version != self.version { + . . . . return None; + . . . . } + 394 ( 0.00%) . . . if key != &entry.key { + . . . . return None; + . . . . } + 394 ( 0.00%) . . . Some(entry.val) + . . . . } + . . . . + . . . . /// Add a cached state to this map with the given key. Callers should + . . . . /// ensure that `state_id` points to a state that contains precisely the + . . . . /// NFA transition given. + . . . . /// + . . . . /// `hash` must have been computed using the `hash` method with the same + . . . . /// key. + . . . . pub fn set(&mut self, key: Utf8SuffixKey, hash: usize, state_id: StateID) { +16,368 ( 0.00%) . . . self.map[hash] = + 2,728 ( 0.00%) . . . Utf8SuffixEntry { version: self.version, key, val: state_id }; + . . . . } + . . . . } + +24,918 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 83 ---------------------------------------- + . . . . /// A mapper from state index to state ID (and back). + . . . . idxmap: IndexMapper, + . . . . } + . . . . + . . . . impl Remapper { + . . . . /// Create a new remapper from the given remappable implementation. The + . . . . /// remapper can then be used to swap states. The remappable value given + . . . . /// here must the same one given to `swap` and `remap`. + 6 ( 0.00%) . . . pub(super) fn new(r: &impl Remappable) -> Remapper { + . . . . let idxmap = IndexMapper { stride2: r.stride2() }; + . . . . let map = (0..r.state_len()).map(|i| idxmap.to_state_id(i)).collect(); + 1 ( 0.00%) . . . Remapper { map, idxmap } + 7 ( 0.00%) . . . } + . . . . + . . . . /// Swap two states. Once this is called, callers must follow through to + . . . . /// call `remap`, or else it's possible for the underlying remappable + . . . . /// value to be in a corrupt state. + 3 ( 0.00%) . . . pub(super) fn swap( + . . . . &mut self, + . . . . r: &mut impl Remappable, + . . . . id1: StateID, + . . . . id2: StateID, + . . . . ) { + 1 ( 0.00%) . . . if id1 == id2 { + . . . . return; + . . . . } + . . . . r.swap_states(id1, id2); + 1 ( 0.00%) . . . self.map.swap(self.idxmap.to_index(id1), self.idxmap.to_index(id2)); + 4 ( 0.00%) . . . } + . . . . + . . . . /// Complete the remapping process by rewriting all state IDs in the + . . . . /// remappable value according to the swaps performed. + 9 ( 0.00%) . . . pub(super) fn remap(mut self, r: &mut impl Remappable) { + . . . . // Update the map to account for states that have been swapped + . . . . // multiple times. For example, if (A, C) and (C, G) are swapped, then + . . . . // transitions previously pointing to A should now point to G. But if + . . . . // we don't update our map, they will erroneously be set to C. All we + . . . . // do is follow the swaps in our map until we see our original state + . . . . // ID. + . . . . // + . . . . // The intuition here is to think about how changes are made to the +-- line 123 ---------------------------------------- +-- line 128 ---------------------------------------- + . . . . // + . . . . // We are also careful to clone the map before starting in order to + . . . . // freeze it. We use the frozen map to find our loops, since we need to + . . . . // update our map as well. Without freezing it, our updates could break + . . . . // the loops referenced above and produce incorrect results. + . . . . let oldmap = self.map.clone(); + . . . . for i in 0..r.state_len() { + . . . . let cur_id = self.idxmap.to_state_id(i); + 74 ( 0.00%) . . . let mut new_id = oldmap[i]; + 76 ( 0.00%) . . . if cur_id == new_id { + . . . . continue; + . . . . } + . . . . loop { + 2 ( 0.00%) . . . let id = oldmap[self.idxmap.to_index(new_id)]; + 2 ( 0.00%) . . . if cur_id == id { + 6 ( 0.00%) . . . self.map[i] = new_id; + . . . . break; + . . . . } + . . . . new_id = id; + . . . . } + . . . . } + 7 ( 0.00%) . . . r.remap(|next| self.map[self.idxmap.to_index(next)]); +102,562 ( 0.03%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::onepass::::remap (1x) + . . . . } + . . . . } + . . . . + . . . . /// A simple type for mapping between state indices and state IDs. + . . . . /// + . . . . /// The reason why this exists is because state IDs are "premultiplied." That + . . . . /// is, in order to get to the transitions for a particular state, one need + . . . . /// only use the state ID as-is, instead of having to multiple it by transition +-- line 157 ---------------------------------------- +-- line 171 ---------------------------------------- + . . . . /// transition table. 'id >> stride2' de-multiplies an ID while 'index << + . . . . /// stride2' pre-multiplies an index to an ID. + . . . . stride2: usize, + . . . . } + . . . . + . . . . impl IndexMapper { + . . . . /// Convert a state ID to a state index. + . . . . fn to_index(&self, id: StateID) -> usize { +11,995 ( 0.00%) . . . id.as_usize() >> self.stride2 + . . . . } + . . . . + . . . . /// Convert a state index to a state ID. + . . . . fn to_state_id(&self, index: usize) -> StateID { + . . . . // CORRECTNESS: If the given index is not valid, then it is not + . . . . // required for this to panic or return a valid state ID. We'll "just" + . . . . // wind up with panics or silent logic errors at some other point. + 296 ( 0.00%) . . . StateID::new_unchecked(index << self.stride2) + . . . . } + . . . . } + . . . . + . . . . #[cfg(feature = "dfa-build")] + . . . . mod dense { + . . . . use crate::{dfa::dense::OwnedDFA, util::primitives::StateID}; + . . . . + . . . . use super::Remappable; +-- line 195 ---------------------------------------- +-- line 230 ---------------------------------------- + . . . . // equivalent. + . . . . 0 + . . . . } + . . . . + . . . . fn swap_states(&mut self, id1: StateID, id2: StateID) { + . . . . DFA::swap_states(self, id1, id2) + . . . . } + . . . . + 9 ( 0.00%) . . . fn remap(&mut self, map: impl Fn(StateID) -> StateID) { + . . . . DFA::remap(self, map) + 8 ( 0.00%) . . . } + . . . . } + . . . . } + + 78 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 88 ---------------------------------------- + . . . . /// not rely on this property for safety. Callers may choose to rely on this + . . . . /// property for correctness however. For example, creating a `SmallIndex` with + . . . . /// an invalid value can be done in entirely safe code. This may in turn result + . . . . /// in panics or silent logical errors. + . . . . #[derive( + . . . . Clone, Copy, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord, + . . . . )] + . . . . #[repr(transparent)] +542,668 ( 0.16%) . . . pub(crate) struct SmallIndex(u32); + . . . . + . . . . impl SmallIndex { + . . . . /// The maximum index value. + . . . . #[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))] + . . . . pub const MAX: SmallIndex = + . . . . // FIXME: Use as_usize() once const functions in traits are stable. + . . . . SmallIndex::new_unchecked(core::i32::MAX as usize - 1); + . . . . +-- line 104 ---------------------------------------- +-- line 117 ---------------------------------------- + . . . . pub const SIZE: usize = core::mem::size_of::(); + . . . . + . . . . /// Create a new small index. + . . . . /// + . . . . /// If the given index exceeds [`SmallIndex::MAX`], then this returns + . . . . /// an error. + . . . . #[inline] + . . . . pub fn new(index: usize) -> Result { + 8,364 ( 0.00%) . . . SmallIndex::try_from(index) + 19,516 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:>::try_from (2,788x) + . . . . } + . . . . + . . . . /// Create a new small index without checking whether the given value + . . . . /// exceeds [`SmallIndex::MAX`]. + . . . . /// + . . . . /// Using this routine with an invalid index value will result in + . . . . /// unspecified behavior, but *not* undefined behavior. In particular, an + . . . . /// invalid index value is likely to cause panics or possibly even silent + . . . . /// logical errors. + . . . . /// + . . . . /// Callers must never rely on a `SmallIndex` to be within a certain range + . . . . /// for memory safety. + . . . . #[inline] + . . . . pub const fn new_unchecked(index: usize) -> SmallIndex { + . . . . // FIXME: Use as_u32() once const functions in traits are stable. + 2,768 ( 0.00%) . . . SmallIndex::from_u32_unchecked(index as u32) + . . . . } + . . . . + . . . . /// Create a new small index from a `u32` without checking whether the + . . . . /// given value exceeds [`SmallIndex::MAX`]. + . . . . /// + . . . . /// Using this routine with an invalid index value will result in + . . . . /// unspecified behavior, but *not* undefined behavior. In particular, an + . . . . /// invalid index value is likely to cause panics or possibly even silent +-- line 149 ---------------------------------------- +-- line 162 ---------------------------------------- + . . . . SmallIndex::new(index).expect("invalid small index") + . . . . } + . . . . + . . . . /// Return this small index as a `usize`. This is guaranteed to never + . . . . /// overflow `usize`. + . . . . #[inline] + . . . . pub const fn as_usize(&self) -> usize { + . . . . // FIXME: Use as_usize() once const functions in traits are stable. +429,720 ( 0.12%) . . . self.0 as usize + . . . . } + . . . . + . . . . /// Return this small index as a `u64`. This is guaranteed to never + . . . . /// overflow. + . . . . #[inline] + . . . . pub const fn as_u64(&self) -> u64 { + . . . . // FIXME: Use u64::from() once const functions in traits are stable. + . . . . self.0 as u64 +-- line 178 ---------------------------------------- +-- line 317 ---------------------------------------- + . . . . } + . . . . Ok(SmallIndex::new_unchecked(index.as_usize())) + . . . . } + . . . . } + . . . . + . . . . impl TryFrom for SmallIndex { + . . . . type Error = SmallIndexError; + . . . . + 2,788 ( 0.00%) . . . fn try_from(index: usize) -> Result { +151,300 ( 0.04%) . . . if index > SmallIndex::MAX.as_usize() { + . . . . return Err(SmallIndexError { attempted: index.as_u64() }); + . . . . } + 5,576 ( 0.00%) . . . Ok(SmallIndex::new_unchecked(index)) + 2,788 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// This error occurs when a small index could not be constructed. + . . . . /// + . . . . /// This occurs when given an integer exceeding the maximum small index value. + . . . . /// + . . . . /// When the `std` feature is enabled, this implements the `Error` trait. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] +-- line 338 ---------------------------------------- +-- line 365 ---------------------------------------- + . . . . pub(crate) struct SmallIndexIter { + . . . . rng: core::ops::Range, + . . . . } + . . . . + . . . . impl Iterator for SmallIndexIter { + . . . . type Item = SmallIndex; + . . . . + . . . . fn next(&mut self) -> Option { + 5,248 ( 0.00%) . . . if self.rng.start >= self.rng.end { + . . . . return None; + . . . . } + . . . . let next_id = self.rng.start + 1; + . . . . let id = core::mem::replace(&mut self.rng.start, next_id); + . . . . // new_unchecked is OK since we asserted that the number of + . . . . // elements in this iterator will fit in an ID at construction. + . . . . Some(SmallIndex::new_unchecked(id)) + . . . . } +-- line 381 ---------------------------------------- +-- line 544 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . impl core::ops::Index<$name> for Vec { + . . . . type Output = T; + . . . . + . . . . #[inline] + . . . . fn index(&self, index: $name) -> &T { +185,884 ( 0.05%) . . . &self[index.as_usize()] + . . . . } + . . . . } + . . . . + . . . . impl core::ops::IndexMut<$name> for Vec { + . . . . #[inline] + . . . . fn index_mut(&mut self, index: $name) -> &mut T { +120,882 ( 0.03%) . . . &mut self[index.as_usize()] + . . . . } + . . . . } + . . . . + . . . . impl From for $name { + . . . . fn from(index: SmallIndex) -> $name { + . . . . $name(index) + . . . . } + . . . . } +-- line 567 ---------------------------------------- +-- line 636 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . #[derive(Clone, Debug)] + . . . . pub(crate) struct $iter(SmallIndexIter); + . . . . + . . . . impl $iter { + . . . . fn new(len: usize) -> $iter { + 48 ( 0.00%) . . . assert!( + 48 ( 0.00%) . . . len <= $name::LIMIT, + . . . . "cannot create iterator for {} when number of \ + . . . . elements exceed {:?}", + . . . . stringify!($name), + . . . . $name::LIMIT, + . . . . ); + . . . . $iter(SmallIndexIter { rng: 0..len }) + . . . . } + . . . . } +-- line 653 ---------------------------------------- + + 94,898 ( 0.03%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 345 ---------------------------------------- + . . . . /// + . . . . /// A position encodes one half of a span, and include the byte offset, line + . . . . /// number and column number. + . . . . #[derive(Clone, Copy, Eq, PartialEq)] + . . . . #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] + . . . . pub struct Position { + . . . . /// The absolute offset of this position, starting at `0` from the + . . . . /// beginning of the regular expression pattern string. + 2,837 ( 0.00%) . . . pub offset: usize, + . . . . /// The line number, starting at `1`. + . . . . pub line: usize, + . . . . /// The approximate column number, starting at `1`. + 5,181 ( 0.00%) . . . pub column: usize, + . . . . } + . . . . + . . . . impl core::fmt::Debug for Position { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + . . . . write!( + . . . . f, + . . . . "Position(o: {:?}, l: {:?}, c: {:?})", + . . . . self.offset, self.line, self.column +-- line 365 ---------------------------------------- +-- line 377 ---------------------------------------- + . . . . fn partial_cmp(&self, other: &Position) -> Option { + . . . . Some(self.cmp(other)) + . . . . } + . . . . } + . . . . + . . . . impl Span { + . . . . /// Create a new span with the given positions. + . . . . pub fn new(start: Position, end: Position) -> Span { +154,632 ( 0.04%) . . . Span { start, end } + . . . . } + . . . . + . . . . /// Create a new span using the given position as the start and end. + . . . . pub fn splat(pos: Position) -> Span { + 92,683 ( 0.03%) . . . Span::new(pos, pos) + . . . . } + . . . . + . . . . /// Create a new span by replacing the starting the position with the one + . . . . /// given. + . . . . pub fn with_start(self, pos: Position) -> Span { + . . . . Span { start: pos, ..self } + . . . . } + . . . . + . . . . /// Create a new span by replacing the ending the position with the one + . . . . /// given. + . . . . pub fn with_end(self, pos: Position) -> Span { + 7,540 ( 0.00%) . . . Span { end: pos, ..self } + . . . . } + . . . . + . . . . /// Returns true if and only if this span occurs on a single line. + . . . . pub fn is_one_line(&self) -> bool { + . . . . self.start.line == self.end.line + . . . . } + . . . . + . . . . /// Returns true if and only if this span is empty. That is, it points to +-- line 410 ---------------------------------------- +-- line 492 ---------------------------------------- + . . . . /// An alternation of regular expressions. + . . . . Alternation(Box), + . . . . /// A concatenation of regular expressions. + . . . . Concat(Box), + . . . . } + . . . . + . . . . impl Ast { + . . . . /// Create an "empty" AST item. + 1,386 ( 0.00%) . . . pub fn empty(span: Span) -> Ast { + . . . . Ast::Empty(Box::new(span)) + 2,079 ( 0.00%) . . . } + . . . . + . . . . /// Create a "flags" AST item. + . . . . pub fn flags(e: SetFlags) -> Ast { + . . . . Ast::Flags(Box::new(e)) + . . . . } + . . . . + . . . . /// Create a "literal" AST item. + . . . . pub fn literal(e: Literal) -> Ast { +-- line 510 ---------------------------------------- +-- line 532 ---------------------------------------- + . . . . } + . . . . + . . . . /// Create a "bracketed class" AST item. + . . . . pub fn class_bracketed(e: ClassBracketed) -> Ast { + . . . . Ast::ClassBracketed(Box::new(e)) + . . . . } + . . . . + . . . . /// Create a "repetition" AST item. + 344 ( 0.00%) . . . pub fn repetition(e: Repetition) -> Ast { + . . . . Ast::Repetition(Box::new(e)) + 516 ( 0.00%) . . . } + . . . . + . . . . /// Create a "group" AST item. + . . . . pub fn group(e: Group) -> Ast { + . . . . Ast::Group(Box::new(e)) + . . . . } + . . . . + . . . . /// Create a "alternation" AST item. + . . . . pub fn alternation(e: Alternation) -> Ast { +-- line 550 ---------------------------------------- +-- line 553 ---------------------------------------- + . . . . + . . . . /// Create a "concat" AST item. + . . . . pub fn concat(e: Concat) -> Ast { + . . . . Ast::Concat(Box::new(e)) + . . . . } + . . . . + . . . . /// Return the span of this abstract syntax tree. + . . . . pub fn span(&self) -> &Span { + 4,286 ( 0.00%) . . . match *self { + . . . . Ast::Empty(ref span) => span, + . . . . Ast::Flags(ref x) => &x.span, + . . . . Ast::Literal(ref x) => &x.span, + . . . . Ast::Dot(ref span) => span, + . . . . Ast::Assertion(ref x) => &x.span, + . . . . Ast::ClassUnicode(ref x) => &x.span, + . . . . Ast::ClassPerl(ref x) => &x.span, + . . . . Ast::ClassBracketed(ref x) => &x.span, + . . . . Ast::Repetition(ref x) => &x.span, + . . . . Ast::Group(ref x) => &x.span, + . . . . Ast::Alternation(ref x) => &x.span, + . . . . Ast::Concat(ref x) => &x.span, + . . . . } + 172 ( 0.00%) . . . } + . . . . + . . . . /// Return true if and only if this Ast is empty. + . . . . pub fn is_empty(&self) -> bool { + . . . . match *self { + . . . . Ast::Empty(_) => true, + . . . . _ => false, + . . . . } + . . . . } +-- line 583 ---------------------------------------- +-- line 628 ---------------------------------------- + . . . . } + . . . . + . . . . impl Alternation { + . . . . /// Return this alternation as an AST. + . . . . /// + . . . . /// If this alternation contains zero ASTs, then `Ast::empty` is returned. + . . . . /// If this alternation contains exactly 1 AST, then the corresponding AST + . . . . /// is returned. Otherwise, `Ast::alternation` is returned. + 2,048 ( 0.00%) . . . pub fn into_ast(mut self) -> Ast { + 2,048 ( 0.00%) . . . match self.asts.len() { + . . . . 0 => Ast::empty(self.span), + . . . . 1 => self.asts.pop().unwrap(), + . . . . _ => Ast::alternation(self), + . . . . } + 3,072 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A concatenation of regular expressions. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] + . . . . pub struct Concat { + . . . . /// The span of this concatenation. + . . . . pub span: Span, +-- line 650 ---------------------------------------- +-- line 653 ---------------------------------------- + . . . . } + . . . . + . . . . impl Concat { + . . . . /// Return this concatenation as an AST. + . . . . /// + . . . . /// If this alternation contains zero ASTs, then `Ast::empty` is returned. + . . . . /// If this alternation contains exactly 1 AST, then the corresponding AST + . . . . /// is returned. Otherwise, `Ast::concat` is returned. + 66,812 ( 0.02%) . . . pub fn into_ast(mut self) -> Ast { + 66,812 ( 0.02%) . . . match self.asts.len() { + . . . . 0 => Ast::empty(self.span), + . . . . 1 => self.asts.pop().unwrap(), + . . . . _ => Ast::concat(self), + . . . . } +100,218 ( 0.03%) . . . } + . . . . } + . . . . + . . . . /// A single literal expression. + . . . . /// + . . . . /// A literal corresponds to a single Unicode scalar value. Literals may be + . . . . /// represented in their literal form, e.g., `a` or in their escaped form, + . . . . /// e.g., `\x61`. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] +-- line 675 ---------------------------------------- +-- line 857 ---------------------------------------- + . . . . /// The name given should correspond to the lowercase version of the + . . . . /// variant name. e.g., `cntrl` is the name for `ClassAsciiKind::Cntrl`. + . . . . /// + . . . . /// If no variant with the corresponding name exists, then `None` is + . . . . /// returned. + . . . . pub fn from_name(name: &str) -> Option { + . . . . use self::ClassAsciiKind::*; + . . . . match name { + 769 ( 0.00%) . . . "alnum" => Some(Alnum), + 759 ( 0.00%) . . . "alpha" => Some(Alpha), + 747 ( 0.00%) . . . "ascii" => Some(Ascii), + 747 ( 0.00%) . . . "blank" => Some(Blank), + 513 ( 0.00%) . . . "cntrl" => Some(Cntrl), + 513 ( 0.00%) . . . "digit" => Some(Digit), + . . . . "graph" => Some(Graph), + . . . . "lower" => Some(Lower), + . . . . "print" => Some(Print), + . . . . "punct" => Some(Punct), + . . . . "space" => Some(Space), + . . . . "upper" => Some(Upper), + 2 ( 0.00%) . . . "word" => Some(Word), + . . . . "xdigit" => Some(Xdigit), + . . . . _ => None, + . . . . } + 770 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A Unicode character class. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] + . . . . pub struct ClassUnicode { + . . . . /// The span of this class. + . . . . pub span: Span, +-- line 889 ---------------------------------------- +-- line 1134 ---------------------------------------- + . . . . Item(ClassSetItem), + . . . . /// A single binary operation (i.e., &&, -- or ~~). + . . . . BinaryOp(ClassSetBinaryOp), + . . . . } + . . . . + . . . . impl ClassSet { + . . . . /// Build a set from a union. + . . . . pub fn union(ast: ClassSetUnion) -> ClassSet { + 25,416 ( 0.01%) . . . ClassSet::Item(ClassSetItem::Union(ast)) + . . . . } + . . . . + . . . . /// Return the span of this character class set. + . . . . pub fn span(&self) -> &Span { + . . . . match *self { + . . . . ClassSet::Item(ref x) => x.span(), + . . . . ClassSet::BinaryOp(ref x) => &x.span, + . . . . } + . . . . } + . . . . + . . . . /// Return true if and only if this class set is empty. + . . . . fn is_empty(&self) -> bool { + 353 ( 0.00%) . . . match *self { + . . . . ClassSet::Item(ClassSetItem::Empty(_)) => true, + . . . . _ => false, + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// A single component of a character class set. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] +-- line 1163 ---------------------------------------- +-- line 1185 ---------------------------------------- + . . . . Bracketed(Box), + . . . . /// A union of items. + . . . . Union(ClassSetUnion), + . . . . } + . . . . + . . . . impl ClassSetItem { + . . . . /// Return the span of this character class set item. + . . . . pub fn span(&self) -> &Span { + 7,513 ( 0.00%) . . . match *self { + . . . . ClassSetItem::Empty(ref span) => span, + . . . . ClassSetItem::Literal(ref x) => &x.span, + . . . . ClassSetItem::Range(ref x) => &x.span, + . . . . ClassSetItem::Ascii(ref x) => &x.span, + . . . . ClassSetItem::Perl(ref x) => &x.span, + . . . . ClassSetItem::Unicode(ref x) => &x.span, + . . . . ClassSetItem::Bracketed(ref x) => &x.span, + . . . . ClassSetItem::Union(ref x) => &x.span, +-- line 1201 ---------------------------------------- +-- line 1243 ---------------------------------------- + . . . . /// position of the span of the item given. If the union is empty, then + . . . . /// the starting position of this union is set to the starting position + . . . . /// of this item. + . . . . /// + . . . . /// In other words, if you only use this method to add items to a union + . . . . /// and you set the spans on each item correctly, then you should never + . . . . /// need to adjust the span of the union directly. + . . . . pub fn push(&mut self, item: ClassSetItem) { + 4,391 ( 0.00%) . . . if self.items.is_empty() { + 11,296 ( 0.00%) . . . self.span.start = item.span().start; + . . . . } + 32,529 ( 0.01%) . . . self.span.end = item.span().end; + . . . . self.items.push(item); + . . . . } + . . . . + . . . . /// Return this union as a character class set item. + . . . . /// + . . . . /// If this union contains zero items, then an empty union is + . . . . /// returned. If this concatenation contains exactly 1 item, then the + . . . . /// corresponding item is returned. Otherwise, ClassSetItem::Union is + . . . . /// returned. + . . . . pub fn into_item(mut self) -> ClassSetItem { + 11,296 ( 0.00%) . . . match self.items.len() { + . . . . 0 => ClassSetItem::Empty(self.span), + . . . . 1 => self.items.pop().unwrap(), + 5,775 ( 0.00%) . . . _ => ClassSetItem::Union(self), + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// A Unicode character class set operation. + . . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] + . . . . pub struct ClassSetBinaryOp { +-- line 1276 ---------------------------------------- +-- line 1394 ---------------------------------------- + . . . . } + . . . . + . . . . impl RepetitionRange { + . . . . /// Returns true if and only if this repetition range is valid. + . . . . /// + . . . . /// The only case where a repetition range is invalid is if it is bounded + . . . . /// and its start is greater than its end. + . . . . pub fn is_valid(&self) -> bool { + 688 ( 0.00%) . . . match *self { + . . . . RepetitionRange::Bounded(s, e) if s > e => false, + . . . . _ => true, + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// A grouped regular expression. + . . . . /// +-- line 1410 ---------------------------------------- +-- line 1422 ---------------------------------------- + . . . . /// The regular expression in this group. + . . . . pub ast: Box, + . . . . } + . . . . + . . . . impl Group { + . . . . /// If this group is non-capturing, then this returns the (possibly empty) + . . . . /// set of flags. Otherwise, `None` is returned. + . . . . pub fn flags(&self) -> Option<&Flags> { + 1,386 ( 0.00%) . . . match self.kind { + . . . . GroupKind::NonCapturing(ref flags) => Some(flags), + . . . . _ => None, + . . . . } + . . . . } + . . . . + . . . . /// Returns true if and only if this group is capturing. + . . . . pub fn is_capturing(&self) -> bool { + . . . . match self.kind { +-- line 1438 ---------------------------------------- +-- line 1469 ---------------------------------------- + . . . . /// `(?:a)` and `(?i:a)` + . . . . NonCapturing(Flags), + . . . . } + . . . . + . . . . /// A capture name. + . . . . /// + . . . . /// This corresponds to the name itself between the angle brackets in, e.g., + . . . . /// `(?Pexpr)`. + 4,688 ( 0.00%) . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . pub struct CaptureName { + . . . . /// The span of this capture name. + . . . . pub span: Span, + . . . . /// The capture name. + 586 ( 0.00%) . . . pub name: String, + 65,930 ( 0.02%) 69 ( 0.01%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::clone (586x) + . . . . /// The capture index. + . . . . pub index: u32, + . . . . } + . . . . + . . . . #[cfg(feature = "arbitrary")] + . . . . impl arbitrary::Arbitrary<'_> for CaptureName { + . . . . fn arbitrary( + . . . . u: &mut arbitrary::Unstructured, +-- line 1490 ---------------------------------------- +-- line 1539 ---------------------------------------- + . . . . impl Flags { + . . . . /// Add the given item to this sequence of flags. + . . . . /// + . . . . /// If the item was added successfully, then `None` is returned. If the + . . . . /// given item is a duplicate, then `Some(i)` is returned, where + . . . . /// `items[i].kind == item.kind`. + . . . . pub fn add_item(&mut self, item: FlagsItem) -> Option { + . . . . for (i, x) in self.items.iter().enumerate() { + 10 ( 0.00%) . . . if x.kind == item.kind { + . . . . return Some(i); + . . . . } + . . . . } + . . . . self.items.push(item); + . . . . None + . . . . } + . . . . + . . . . /// Returns the state of the given flag in this set. +-- line 1555 ---------------------------------------- +-- line 1559 ---------------------------------------- + . . . . /// + . . . . /// If the given flag is in the set and is not negated, then `Some(true)` + . . . . /// is returned. + . . . . /// + . . . . /// Otherwise, `None` is returned. + . . . . pub fn flag_state(&self, flag: Flag) -> Option { + . . . . let mut negated = false; + . . . . for x in &self.items { + 240 ( 0.00%) . . . match x.kind { + . . . . FlagsItemKind::Negation => { + . . . . negated = true; + . . . . } + . . . . FlagsItemKind::Flag(ref xflag) if xflag == &flag => { + . . . . return Some(!negated); + . . . . } + . . . . _ => {} + . . . . } +-- line 1575 ---------------------------------------- +-- line 1584 ---------------------------------------- + . . . . pub struct FlagsItem { + . . . . /// The span of this item. + . . . . pub span: Span, + . . . . /// The kind of this item. + . . . . pub kind: FlagsItemKind, + . . . . } + . . . . + . . . . /// The kind of an item in a group of flags. + 50 ( 0.00%) . . . #[derive(Clone, Debug, Eq, PartialEq)] + . . . . #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] + . . . . pub enum FlagsItemKind { + . . . . /// A negation operator applied to all subsequent flags in the enclosing + . . . . /// group. + . . . . Negation, + . . . . /// A single flag in a group. + . . . . Flag(Flag), + . . . . } +-- line 1600 ---------------------------------------- +-- line 1627 ---------------------------------------- + . . . . CRLF, + . . . . /// `x` + . . . . IgnoreWhitespace, + . . . . } + . . . . + . . . . /// A custom `Drop` impl is used for `Ast` such that it uses constant stack + . . . . /// space but heap space proportional to the depth of the `Ast`. + . . . . impl Drop for Ast { +522,256 ( 0.15%) . . . fn drop(&mut self) { + . . . . use core::mem; + . . . . +223,824 ( 0.06%) . . . match *self { + . . . . Ast::Empty(_) + . . . . | Ast::Flags(_) + . . . . | Ast::Literal(_) + . . . . | Ast::Dot(_) + . . . . | Ast::Assertion(_) + . . . . | Ast::ClassUnicode(_) + . . . . | Ast::ClassPerl(_) + . . . . // Bracketed classes are recursive, they get their own Drop impl. + . . . . | Ast::ClassBracketed(_) => return, + 3,770 ( 0.00%) . . . Ast::Repetition(ref x) if !x.ast.has_subexprs() => return, + 1,386 ( 0.00%) . . . Ast::Group(ref x) if !x.ast.has_subexprs() => return, + . . . . Ast::Alternation(ref x) if x.asts.is_empty() => return, + . . . . Ast::Concat(ref x) if x.asts.is_empty() => return, + . . . . _ => {} + . . . . } + . . . . + . . . . let empty_span = || Span::splat(Position::new(0, 0, 0)); + . . . . let empty_ast = || Ast::empty(empty_span()); + 243 ( 0.00%) . . . let mut stack = vec![mem::replace(self, empty_ast())]; +142,512 ( 0.04%) . . . while let Some(mut ast) = stack.pop() { +142,512 ( 0.04%) . . . match ast { + . . . . Ast::Empty(_) + . . . . | Ast::Flags(_) + . . . . | Ast::Literal(_) + . . . . | Ast::Dot(_) + . . . . | Ast::Assertion(_) + . . . . | Ast::ClassUnicode(_) + . . . . | Ast::ClassPerl(_) + . . . . // Bracketed classes are recursive, so they get their own Drop + . . . . // impl. + . . . . | Ast::ClassBracketed(_) => {} + . . . . Ast::Repetition(ref mut x) => { + 1,885 ( 0.00%) . . . stack.push(mem::replace(&mut x.ast, empty_ast())); + . . . . } + . . . . Ast::Group(ref mut x) => { + 693 ( 0.00%) . . . stack.push(mem::replace(&mut x.ast, empty_ast())); + . . . . } + . . . . Ast::Alternation(ref mut x) => { + 1,024 ( 0.00%) . . . stack.extend(x.asts.drain(..)); + . . . . } + . . . . Ast::Concat(ref mut x) => { + 31,572 ( 0.01%) . . . stack.extend(x.asts.drain(..)); + . . . . } + . . . . } +142,512 ( 0.04%) . . . } +22,055,897 ( 6.37%) 100,995 (12.47%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place'2 (71,256x) +596,864 ( 0.17%) . . . } + . . . . } + . . . . + . . . . /// A custom `Drop` impl is used for `ClassSet` such that it uses constant + . . . . /// stack space but heap space proportional to the depth of the `ClassSet`. + . . . . impl Drop for ClassSet { + 58,842 ( 0.02%) . . . fn drop(&mut self) { + . . . . use core::mem; + . . . . + 40,996 ( 0.01%) . . . match *self { + . . . . ClassSet::Item(ref item) => match *item { + . . . . ClassSetItem::Empty(_) + . . . . | ClassSetItem::Literal(_) + . . . . | ClassSetItem::Range(_) + . . . . | ClassSetItem::Ascii(_) + . . . . | ClassSetItem::Unicode(_) + . . . . | ClassSetItem::Perl(_) => return, + . . . . ClassSetItem::Bracketed(ref x) => { + 141 ( 0.00%) . . . if x.kind.is_empty() { + . . . . return; + . . . . } + . . . . } + . . . . ClassSetItem::Union(ref x) => { + . . . . if x.items.is_empty() { + . . . . return; + . . . . } + . . . . } +-- line 1710 ---------------------------------------- +-- line 1713 ---------------------------------------- + . . . . if op.lhs.is_empty() && op.rhs.is_empty() { + . . . . return; + . . . . } + . . . . } + . . . . } + . . . . + . . . . let empty_span = || Span::splat(Position::new(0, 0, 0)); + . . . . let empty_set = || ClassSet::Item(ClassSetItem::Empty(empty_span())); + 595 ( 0.00%) . . . let mut stack = vec![mem::replace(self, empty_set())]; + 19,306 ( 0.01%) . . . while let Some(mut set) = stack.pop() { + 82,740 ( 0.02%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,758x) + 7,162 ( 0.00%) . . . match set { + . . . . ClassSet::Item(ref mut item) => match *item { + . . . . ClassSetItem::Empty(_) + . . . . | ClassSetItem::Literal(_) + . . . . | ClassSetItem::Range(_) + . . . . | ClassSetItem::Ascii(_) + . . . . | ClassSetItem::Unicode(_) + . . . . | ClassSetItem::Perl(_) => {} + . . . . ClassSetItem::Bracketed(ref mut x) => { + 142 ( 0.00%) . . . stack.push(mem::replace(&mut x.kind, empty_set())); + . . . . } + . . . . ClassSetItem::Union(ref mut x) => { + . . . . stack.extend(x.items.drain(..).map(ClassSet::Item)); + . . . . } + . . . . }, + . . . . ClassSet::BinaryOp(ref mut op) => { + . . . . stack.push(mem::replace(&mut op.lhs, empty_set())); + . . . . stack.push(mem::replace(&mut op.rhs, empty_set())); + . . . . } + . . . . } + . . . . } + 67,248 ( 0.02%) . . . } + . . . . } + . . . . + . . . . #[cfg(test)] + . . . . mod tests { + . . . . use super::*; + . . . . + . . . . // We use a thread with an explicit stack size to test that our destructor + . . . . // for Ast can handle arbitrarily sized expressions in constant stack +-- line 1752 ---------------------------------------- + +385,603 ( 0.11%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/prefilter.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 131 ---------------------------------------- + . . . . } + . . . . + . . . . impl Builder { + . . . . /// Create a new builder for constructing the best possible prefilter. + . . . . pub(crate) fn new(kind: MatchKind) -> Builder { + . . . . let pbuilder = kind + . . . . .as_packed() + . . . . .map(|kind| packed::Config::new().match_kind(kind).builder()); + 384 ( 0.00%) . . . Builder { + 1,728 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms (48x) + . . . . count: 0, + . . . . ascii_case_insensitive: false, + . . . . start_bytes: StartBytesBuilder::new(), + . . . . rare_bytes: RareBytesBuilder::new(), + . . . . memmem: MemmemBuilder::default(), + 96 ( 0.00%) . . . packed: pbuilder, + . . . . enabled: true, + . . . . } + . . . . } + . . . . + . . . . /// Enable ASCII case insensitivity. When set, byte strings added to this + . . . . /// builder will be interpreted without respect to ASCII case. + . . . . pub(crate) fn ascii_case_insensitive(mut self, yes: bool) -> Builder { + . . . . self.ascii_case_insensitive = yes; + . . . . self.start_bytes = self.start_bytes.ascii_case_insensitive(yes); + . . . . self.rare_bytes = self.rare_bytes.ascii_case_insensitive(yes); + 288 ( 0.00%) . . . self + 3,120 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) + . . . . } + . . . . + . . . . /// Return a prefilter suitable for quickly finding potential matches. + . . . . /// + . . . . /// All patterns added to an Aho-Corasick automaton should be added to this + . . . . /// builder before attempting to construct the prefilter. + 480 ( 0.00%) . . . pub(crate) fn build(&self) -> Option { + 96 ( 0.00%) . . . if !self.enabled { + . . . . debug!("prefilter not enabled, skipping"); + . . . . return None; + . . . . } + . . . . // If we only have one pattern, then deferring to memmem is always + . . . . // the best choice. This is kind of a weird case, because, well, why + . . . . // use Aho-Corasick if you only have one pattern? But maybe you don't + . . . . // know exactly how many patterns you'll get up front, and you need to + . . . . // support the option of multiple patterns. So instead of relying on + . . . . // the caller to branch and use memmem explicitly, we just do it for + . . . . // them. + 240 ( 0.00%) . . . if !self.ascii_case_insensitive { + . . . . if let Some(pre) = self.memmem.build() { + . . . . debug!("using memmem prefilter"); + . . . . return Some(pre); + . . . . } + . . . . } + 192 ( 0.00%) . . . let (packed, patlen, minlen) = if self.ascii_case_insensitive { + . . . . (None, usize::MAX, 0) + . . . . } else { + 48 ( 0.00%) . . . let patlen = self.packed.as_ref().map_or(usize::MAX, |p| p.len()); + . . . . let minlen = self.packed.as_ref().map_or(0, |p| p.minimum_len()); + . . . . let packed = + 48 ( 0.00%) . . . self.packed.as_ref().and_then(|b| b.build()).map(|s| { + 1,152 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/api.rs:aho_corasick::packed::api::Builder::build (48x) + . . . . let memory_usage = s.memory_usage(); + . . . . debug!( + . . . . "built packed prefilter (len: {}, \ + . . . . minimum pattern len: {}, memory usage: {}) \ + . . . . for consideration", + . . . . patlen, minlen, memory_usage, + . . . . ); + . . . . Prefilter { finder: Arc::new(Packed(s)), memory_usage } + . . . . }); + . . . . (packed, patlen, minlen) + . . . . }; + 576 ( 0.00%) . . . match (self.start_bytes.build(), self.rare_bytes.build()) { + . . . . // If we could build both start and rare prefilters, then there are + . . . . // a few cases in which we'd want to use the start-byte prefilter + . . . . // over the rare-byte prefilter, since the former has lower + . . . . // overhead. + . . . . (prestart @ Some(_), prerare @ Some(_)) => { + . . . . debug!( + . . . . "both start (len={}, rank={}) and \ + . . . . rare (len={}, rank={}) byte prefilters \ +-- line 207 ---------------------------------------- +-- line 281 ---------------------------------------- + . . . . return packed; + . . . . } + . . . . debug!( + . . . . "have rare byte prefilter but not start byte prefilter, \ + . . . . so using rare byte prefilter", + . . . . ); + . . . . prerare + . . . . } + 48 ( 0.00%) . . . (None, None) if self.ascii_case_insensitive => { + . . . . debug!( + . . . . "no start or rare byte prefilter and ASCII case \ + . . . . insensitivity was enabled, so skipping prefilter", + . . . . ); + . . . . None + . . . . } + . . . . (None, None) => { + . . . . if packed.is_some() { + . . . . debug!("falling back to packed prefilter"); + . . . . } else { + . . . . debug!("no prefilter available"); + . . . . } + 192 ( 0.00%) . . . packed + . . . . } + . . . . } + 432 ( 0.00%) . . . } + . . . . + . . . . /// Add a literal string to this prefilter builder. + . . . . pub(crate) fn add(&mut self, bytes: &[u8]) { + . . . . if bytes.is_empty() { + . . . . self.enabled = false; + . . . . } + . . . . if !self.enabled { + . . . . return; +-- line 313 ---------------------------------------- +-- line 343 ---------------------------------------- + . . . . /// The singular pattern to search for. This is only set when count==1. + . . . . one: Option>, + . . . . } + . . . . + . . . . impl MemmemBuilder { + . . . . fn build(&self) -> Option { + . . . . #[cfg(all(feature = "std", feature = "perf-literal"))] + . . . . fn imp(builder: &MemmemBuilder) -> Option { + 48 ( 0.00%) . . . let pattern = builder.one.as_ref()?; + . . . . assert_eq!(1, builder.count); + . . . . let finder = Arc::new(Memmem( + . . . . memchr::memmem::Finder::new(pattern).into_owned(), + . . . . )); + . . . . let memory_usage = pattern.len(); + . . . . Some(Prefilter { finder, memory_usage }) + . . . . } + . . . . +-- line 359 ---------------------------------------- +-- line 538 ---------------------------------------- + . . . . /// Build the rare bytes prefilter. + . . . . /// + . . . . /// If there are more than 3 distinct rare bytes found, or if heuristics + . . . . /// otherwise determine that this prefilter should not be used, then `None` + . . . . /// is returned. + . . . . fn build(&self) -> Option { + . . . . #[cfg(feature = "perf-literal")] + . . . . fn imp(builder: &RareBytesBuilder) -> Option { + 240 ( 0.00%) . . . if !builder.available || builder.count > 3 { + . . . . return None; + . . . . } + 96 ( 0.00%) . . . let (mut bytes, mut len) = ([0; 3], 0); + . . . . for b in 0..=255 { +24,624 ( 0.01%) . . . if builder.rare_set.contains(b) { + . . . . bytes[len] = b as u8; + . . . . len += 1; + . . . . } + . . . . } + 96 ( 0.00%) . . . let finder: Arc = match len { + . . . . 0 => return None, + . . . . 1 => Arc::new(RareBytesOne { + . . . . byte1: bytes[0], + . . . . offset: builder.byte_offsets.set[bytes[0] as usize], + . . . . }), + . . . . 2 => Arc::new(RareBytesTwo { + . . . . offsets: builder.byte_offsets, + . . . . byte1: bytes[0], +-- line 564 ---------------------------------------- +-- line 777 ---------------------------------------- + . . . . /// Build the starting bytes prefilter. + . . . . /// + . . . . /// If there are more than 3 distinct starting bytes, or if heuristics + . . . . /// otherwise determine that this prefilter should not be used, then `None` + . . . . /// is returned. + . . . . fn build(&self) -> Option { + . . . . #[cfg(feature = "perf-literal")] + . . . . fn imp(builder: &StartBytesBuilder) -> Option { + 240 ( 0.00%) . . . if builder.count > 3 { + . . . . return None; + . . . . } + . . . . let (mut bytes, mut len) = ([0; 3], 0); + . . . . for b in 0..256 { +30,720 ( 0.01%) . . . if !builder.byteset[b] { + . . . . continue; + . . . . } + . . . . // We don't handle non-ASCII bytes for now. Getting non-ASCII + . . . . // bytes right is trickier, since we generally don't want to put + . . . . // a leading UTF-8 code unit into a prefilter that isn't ASCII, + . . . . // since they can frequently. Instead, it would be better to use a + . . . . // continuation byte, but this requires more sophisticated analysis + . . . . // of the automaton and a richer prefilter API. +-- line 798 ---------------------------------------- + +13,152 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/search.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 800 ---------------------------------------- + . . . . /// ``` + . . . . /// use aho_corasick::Anchored; + . . . . /// + . . . . /// assert!(!Anchored::No.is_anchored()); + . . . . /// assert!(Anchored::Yes.is_anchored()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn is_anchored(&self) -> bool { +89,172 ( 0.03%) . . . matches!(*self, Anchored::Yes) + . . . . } + . . . . } + . . . . + . . . . /// A representation of a match reported by an Aho-Corasick searcher. + . . . . /// + . . . . /// A match has two essential pieces of information: the [`PatternID`] that + . . . . /// matches, and the [`Span`] of the match in a haystack. + . . . . /// +-- line 816 ---------------------------------------- +-- line 851 ---------------------------------------- + . . . . /// let m = Match::new(PatternID::ZERO, 5..10); + . . . . /// assert_eq!(0, m.pattern().as_usize()); + . . . . /// assert_eq!(5, m.start()); + . . . . /// assert_eq!(10, m.end()); + . . . . /// ``` + . . . . #[inline] + . . . . pub fn new>(pattern: PatternID, span: S) -> Match { + . . . . let span = span.into(); + 2 ( 0.00%) . . . assert!(span.start <= span.end, "invalid match span"); + . . . . Match { pattern, span } + . . . . } + . . . . + . . . . /// Create a new match from a pattern ID and a byte offset span. + . . . . /// + . . . . /// This constructor is generic over how a span is provided. While + . . . . /// a [`Span`] may be given directly, one may also provide a + . . . . /// `std::ops::Range`. +-- line 867 ---------------------------------------- +-- line 1083 ---------------------------------------- + . . . . impl MatchKind { + . . . . #[inline] + . . . . pub(crate) fn is_standard(&self) -> bool { + . . . . matches!(*self, MatchKind::Standard) + . . . . } + . . . . + . . . . #[inline] + . . . . pub(crate) fn is_leftmost(&self) -> bool { + 96 ( 0.00%) . . . matches!(*self, MatchKind::LeftmostFirst | MatchKind::LeftmostLongest) + . . . . } + . . . . + . . . . #[inline] + . . . . pub(crate) fn is_leftmost_first(&self) -> bool { + . . . . matches!(*self, MatchKind::LeftmostFirst) + . . . . } + . . . . + . . . . /// Convert this match kind into a packed match kind. If this match kind + . . . . /// corresponds to standard semantics, then this returns None, since + . . . . /// packed searching does not support standard semantics. + . . . . #[inline] + . . . . pub(crate) fn as_packed(&self) -> Option { + 144 ( 0.00%) . . . match *self { + . . . . MatchKind::Standard => None, + . . . . MatchKind::LeftmostFirst => { + . . . . Some(crate::packed::MatchKind::LeftmostFirst) + . . . . } + . . . . MatchKind::LeftmostLongest => { + . . . . Some(crate::packed::MatchKind::LeftmostLongest) + . . . . } + . . . . } +-- line 1112 ---------------------------------------- + + 48 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/pattern.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 11 ---------------------------------------- + . . . . /// + . . . . /// This collection of patterns is what is passed around to both execute + . . . . /// searches and to construct the searchers themselves. Namely, this permits + . . . . /// searches to avoid copying all of the patterns, and allows us to keep only + . . . . /// one copy throughout all packed searchers. + . . . . /// + . . . . /// Note that this collection is not a set. The same pattern can appear more + . . . . /// than once. + 240 ( 0.00%) . . . #[derive(Clone, Debug)] + . . . . pub(crate) struct Patterns { + . . . . /// The match semantics supported by this collection of patterns. + . . . . /// + . . . . /// The match semantics determines the order of the iterator over patterns. + . . . . /// For leftmost-first, patterns are provided in the same order as were + . . . . /// provided by the caller. For leftmost-longest, patterns are provided in + . . . . /// descending order of length, with ties broken by the order in which they + . . . . /// were provided by the caller. + . . . . kind: MatchKind, + . . . . /// The collection of patterns, indexed by their identifier. + 144 ( 0.00%) . . . by_id: Vec>, +413,153 ( 0.12%) 2,724 ( 0.34%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs: as core::clone::Clone>::clone (48x) + . . . . /// The order of patterns defined for iteration, given by pattern + . . . . /// identifiers. The order of `by_id` and `order` is always the same for + . . . . /// leftmost-first semantics, but may be different for leftmost-longest + . . . . /// semantics. + . . . . order: Vec, + . . . . /// The length of the smallest pattern, in bytes. + . . . . minimum_len: usize, + . . . . /// The total number of pattern bytes across the entire collection. This +-- line 38 ---------------------------------------- +-- line 50 ---------------------------------------- + . . . . /// Create a new collection of patterns for the given match semantics. The + . . . . /// ID of each pattern is the index of the pattern at which it occurs in + . . . . /// the `by_id` slice. + . . . . /// + . . . . /// If any of the patterns in the slice given are empty, then this panics. + . . . . /// Similarly, if the number of patterns given is zero, then this also + . . . . /// panics. + . . . . pub(crate) fn new() -> Patterns { + 576 ( 0.00%) . . . Patterns { + . . . . kind: MatchKind::default(), + . . . . by_id: vec![], + . . . . order: vec![], + . . . . minimum_len: usize::MAX, + . . . . total_pattern_bytes: 0, + . . . . } + . . . . } + . . . . + . . . . /// Add a pattern to this collection. + . . . . /// + . . . . /// This panics if the pattern given is empty. +6,970 ( 0.00%) . . . pub(crate) fn add(&mut self, bytes: &[u8]) { +1,394 ( 0.00%) . . . assert!(!bytes.is_empty()); +2,788 ( 0.00%) . . . assert!(self.by_id.len() <= u16::MAX as usize); + . . . . + . . . . let id = PatternID::new(self.by_id.len()).unwrap(); + 180 ( 0.00%) . . . self.order.push(id); + . . . . self.by_id.push(bytes.to_vec()); +2,788 ( 0.00%) . . . self.minimum_len = cmp::min(self.minimum_len, bytes.len()); +1,394 ( 0.00%) . . . self.total_pattern_bytes += bytes.len(); +8,364 ( 0.00%) . . . } + . . . . + . . . . /// Set the match kind semantics for this collection of patterns. + . . . . /// + . . . . /// If the kind is not set, then the default is leftmost-first. + . . . . pub(crate) fn set_match_kind(&mut self, kind: MatchKind) { + 48 ( 0.00%) . . . self.kind = kind; + 48 ( 0.00%) . . . match self.kind { + . . . . MatchKind::LeftmostFirst => { + . . . . self.order.sort(); + . . . . } + . . . . MatchKind::LeftmostLongest => { + . . . . let (order, by_id) = (&mut self.order, &mut self.by_id); + . . . . order.sort_by(|&id1, &id2| { + . . . . by_id[id1].len().cmp(&by_id[id2].len()).reverse() + . . . . }); +-- line 94 ---------------------------------------- +-- line 96 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . /// Return the number of patterns in this collection. + . . . . /// + . . . . /// This is guaranteed to be greater than zero. + . . . . pub(crate) fn len(&self) -> usize { + . . . . self.by_id.len() +2,788 ( 0.00%) . . . } + . . . . + . . . . /// Returns true if and only if this collection of patterns is empty. + . . . . pub(crate) fn is_empty(&self) -> bool { + . . . . self.len() == 0 + . . . . } + . . . . + . . . . /// Returns the approximate total amount of heap used by these patterns, in + . . . . /// units of bytes. +-- line 112 ---------------------------------------- +-- line 124 ---------------------------------------- + . . . . self.order.clear(); + . . . . self.minimum_len = usize::MAX; + . . . . } + . . . . + . . . . /// Returns the length, in bytes, of the smallest pattern. + . . . . /// + . . . . /// This is guaranteed to be at least one. + . . . . pub(crate) fn minimum_len(&self) -> usize { +1,285 ( 0.00%) . . . self.minimum_len + . . . . } + . . . . + . . . . /// Returns the match semantics used by these patterns. + . . . . pub(crate) fn match_kind(&self) -> &MatchKind { + . . . . &self.kind + . . . . } + . . . . + . . . . /// Return the pattern with the given identifier. If such a pattern does +-- line 140 ---------------------------------------- +-- line 189 ---------------------------------------- + . . . . patterns: &'p Patterns, + . . . . i: usize, + . . . . } + . . . . + . . . . impl<'p> Iterator for PatternIter<'p> { + . . . . type Item = (PatternID, Pattern<'p>); + . . . . + . . . . fn next(&mut self) -> Option<(PatternID, Pattern<'p>)> { +5,166 ( 0.00%) . . . if self.i >= self.patterns.len() { + . . . . return None; + . . . . } +7,434 ( 0.00%) . . . let id = self.patterns.order[self.i]; + . . . . let p = self.patterns.get(id); + . . . . self.i += 1; + . . . . Some((id, p)) + . . . . } + . . . . } + . . . . + . . . . /// A pattern that is used in packed searching. + . . . . #[derive(Clone)] +-- line 208 ---------------------------------------- +-- line 225 ---------------------------------------- + . . . . /// Returns the bytes of this pattern. + . . . . pub(crate) fn bytes(&self) -> &[u8] { + . . . . &self.0 + . . . . } + . . . . + . . . . /// Returns the first `len` low nybbles from this pattern. If this pattern + . . . . /// is shorter than `len`, then this panics. + . . . . pub(crate) fn low_nybbles(&self, len: usize) -> Box<[u8]> { +1,084 ( 0.00%) . . . let mut nybs = vec![0; len].into_boxed_slice(); + . . . . for (i, byte) in self.bytes().iter().take(len).enumerate() { +3,072 ( 0.00%) . . . nybs[i] = byte & 0xF; + . . . . } + . . . . nybs + . . . . } + . . . . + . . . . /// Returns true if this pattern is a prefix of the given bytes. + . . . . #[inline(always)] + . . . . pub(crate) fn is_prefix(&self, bytes: &[u8]) -> bool { + . . . . is_prefix(bytes, self.bytes()) +-- line 243 ---------------------------------------- +-- line 264 ---------------------------------------- + . . . . #[inline(always)] + . . . . pub(crate) unsafe fn is_prefix_raw( + . . . . &self, + . . . . start: *const u8, + . . . . end: *const u8, + . . . . ) -> bool { + . . . . let patlen = self.bytes().len(); + . . . . let haylen = end.distance(start); + 100 ( 0.00%) . . . if patlen > haylen { + . . . . return false; + . . . . } + . . . . // SAFETY: We've checked that the haystack has length at least equal + . . . . // to this pattern. All other safety concerns are the responsibility + . . . . // of the caller. + . . . . is_equal_raw(start, self.bytes().as_ptr(), patlen) + . . . . } + . . . . } +-- line 280 ---------------------------------------- +-- line 365 ---------------------------------------- + . . . . /// * The distance being in bounds must not rely on "wrapping around" the + . . . . /// address space. + . . . . #[inline(always)] + . . . . unsafe fn is_equal_raw(mut x: *const u8, mut y: *const u8, n: usize) -> bool { + . . . . // If we don't have enough bytes to do 4-byte at a time loads, then + . . . . // handle each possible length specially. Note that I used to have a + . . . . // byte-at-a-time loop here and that turned out to be quite a bit slower + . . . . // for the memmem/pathological/defeat-simple-vector-alphabet benchmark. + 100 ( 0.00%) . . . if n < 4 { + 50 ( 0.00%) . . . return match n { + . . . . 0 => true, + . . . . 1 => x.read() == y.read(), + . . . . 2 => { + . . . . x.cast::().read_unaligned() + . . . . == y.cast::().read_unaligned() + . . . . } + . . . . // I also tried copy_nonoverlapping here and it looks like the + . . . . // codegen is the same. +-- line 382 ---------------------------------------- + +7,395 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + + . . . . use crate::util::int::Usize; + . . . . + . . . . /// A representation of byte oriented equivalence classes. + . . . . /// + . . . . /// This is used in finite state machines to reduce the size of the transition + . . . . /// table. This can have a particularly large impact not only on the total size + . . . . /// of an FSM, but also on FSM build times because it reduces the number of + . . . . /// transitions that need to be visited/set. + 1,536 ( 0.00%) . . . #[derive(Clone, Copy)] + . . . . pub(crate) struct ByteClasses([u8; 256]); + . . . . + . . . . impl ByteClasses { + . . . . /// Creates a new set of equivalence classes where all bytes are mapped to + . . . . /// the same class. + . . . . pub(crate) fn empty() -> ByteClasses { + . . . . ByteClasses([0; 256]) + . . . . } +-- line 17 ---------------------------------------- +-- line 24 ---------------------------------------- + . . . . classes.set(b, b); + . . . . } + . . . . classes + . . . . } + . . . . + . . . . /// Set the equivalence class for the given byte. + . . . . #[inline] + . . . . pub(crate) fn set(&mut self, byte: u8, class: u8) { + 13,296 ( 0.00%) . . . self.0[usize::from(byte)] = class; + . . . . } + . . . . + . . . . /// Get the equivalence class for the given byte. + . . . . #[inline] + . . . . pub(crate) fn get(&self, byte: u8) -> u8 { +696,714 ( 0.20%) . . . self.0[usize::from(byte)] + . . . . } + . . . . + . . . . /// Return the total number of elements in the alphabet represented by + . . . . /// these equivalence classes. Equivalently, this returns the total number + . . . . /// of equivalence classes. + . . . . #[inline] + . . . . pub(crate) fn alphabet_len(&self) -> usize { + . . . . // Add one since the number of equivalence classes is one bigger than + . . . . // the last one. + 5,068 ( 0.00%) . . . usize::from(self.0[255]) + 1 + . . . . } + . . . . + . . . . /// Returns the stride, as a base-2 exponent, required for these + . . . . /// equivalence classes. + . . . . /// + . . . . /// The stride is always the smallest power of 2 that is greater than or + . . . . /// equal to the alphabet length. This is done so that converting between + . . . . /// state IDs and indices can be done with shifts alone, which is much +-- line 56 ---------------------------------------- +-- line 60 ---------------------------------------- + . . . . let zeros = self.alphabet_len().next_power_of_two().trailing_zeros(); + . . . . usize::try_from(zeros).unwrap() + . . . . } + . . . . + . . . . /// Returns the stride for these equivalence classes, which corresponds + . . . . /// to the smallest power of 2 greater than or equal to the number of + . . . . /// equivalence classes. + . . . . pub(crate) fn stride(&self) -> usize { + 144 ( 0.00%) . . . 1 << self.stride2() + . . . . } + . . . . + . . . . /// Returns true if and only if every byte in this class maps to its own + . . . . /// equivalence class. Equivalently, there are 257 equivalence classes + . . . . /// and each class contains exactly one byte (plus the special EOI class). + . . . . #[inline] + . . . . pub(crate) fn is_singleton(&self) -> bool { + . . . . self.alphabet_len() == 256 +-- line 76 ---------------------------------------- +-- line 216 ---------------------------------------- + . . . . /// Create a new set of byte classes where all bytes are part of the same + . . . . /// equivalence class. + . . . . pub(crate) fn empty() -> Self { + . . . . ByteClassSet(ByteSet::empty()) + . . . . } + . . . . + . . . . /// Indicate the the range of byte given (inclusive) can discriminate a + . . . . /// match between it and all other bytes outside of the range. + 3,680 ( 0.00%) . . . pub(crate) fn set_range(&mut self, start: u8, end: u8) { + . . . . debug_assert!(start <= end); + 7,360 ( 0.00%) . . . if start > 0 { + 3,680 ( 0.00%) . . . self.0.add(start - 1); + . . . . } + . . . . self.0.add(end); + 3,680 ( 0.00%) . . . } + . . . . + . . . . /// Convert this boolean set to a map that maps all byte values to their + . . . . /// corresponding equivalence class. The last mapping indicates the largest + . . . . /// equivalence class identifier (which is never bigger than 255). + 48 ( 0.00%) . . . pub(crate) fn byte_classes(&self) -> ByteClasses { + . . . . let mut classes = ByteClasses::empty(); + . . . . let mut class = 0u8; + . . . . let mut b = 0u8; + . . . . loop { + . . . . classes.set(b, class); + 24,480 ( 0.01%) . . . if b == 255 { + . . . . break; + . . . . } + 12,240 ( 0.00%) . . . if self.0.contains(b) { + . . . . class = class.checked_add(1).unwrap(); + . . . . } + . . . . b = b.checked_add(1).unwrap(); + . . . . } + . . . . classes + 144 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A simple set of bytes that is reasonably cheap to copy and allocation free. + . . . . #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] + . . . . pub(crate) struct ByteSet { + . . . . bits: BitSet, + . . . . } + . . . . +-- line 258 ---------------------------------------- +-- line 259 ---------------------------------------- + . . . . /// The representation of a byte set. Split out so that we can define a + . . . . /// convenient Debug impl for it while keeping "ByteSet" in the output. + . . . . #[derive(Clone, Copy, Default, Eq, PartialEq)] + . . . . struct BitSet([u128; 2]); + . . . . + . . . . impl ByteSet { + . . . . /// Create an empty set of bytes. + . . . . pub(crate) fn empty() -> ByteSet { + 96 ( 0.00%) . . . ByteSet { bits: BitSet([0; 2]) } + . . . . } + . . . . + . . . . /// Add a byte to this set. + . . . . /// + . . . . /// If the given byte already belongs to this set, then this is a no-op. + . . . . pub(crate) fn add(&mut self, byte: u8) { + 11,040 ( 0.00%) . . . let bucket = byte / 128; + . . . . let bit = byte % 128; + 73,600 ( 0.02%) . . . self.bits.0[usize::from(bucket)] |= 1 << bit; + . . . . } + . . . . + . . . . /// Return true if and only if the given byte is in this set. + . . . . pub(crate) fn contains(&self, byte: u8) -> bool { + 24,480 ( 0.01%) . . . let bucket = byte / 128; + . . . . let bit = byte % 128; +294,144 ( 0.08%) . . . self.bits.0[usize::from(bucket)] & (1 << bit) > 0 + . . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for BitSet { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . let mut fmtd = f.debug_set(); + . . . . for b in 0u8..=255 { + . . . . if (ByteSet { bits: *self }).contains(b) { +-- line 291 ---------------------------------------- + +526,827 ( 0.15%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 56 ---------------------------------------- + . . . . impl Eq for IntervalSet {} + . . . . + . . . . // We implement PartialEq manually so that we don't consider the set's internal + . . . . // 'folded' property to be part of its identity. The 'folded' property is + . . . . // strictly an optimization. + . . . . impl PartialEq for IntervalSet { + . . . . fn eq(&self, other: &IntervalSet) -> bool { + . . . . self.ranges.eq(&other.ranges) + 64 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl IntervalSet { + . . . . /// Create a new set from a sequence of intervals. Each interval is + . . . . /// specified as a pair of bounds, where both bounds are inclusive. + . . . . /// + . . . . /// The given ranges do not need to be in any specific order, and ranges + . . . . /// may overlap. + 15 ( 0.00%) . . . pub fn new>(intervals: T) -> IntervalSet { + . . . . let ranges: Vec = intervals.into_iter().collect(); + . . . . // An empty set is case folded. + . . . . let folded = ranges.is_empty(); +27,588 ( 0.01%) . . . let mut set = IntervalSet { ranges, folded }; + 5,996 ( 0.00%) . . . set.canonicalize(); +19,125 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (1,125x) + . . . . set + 17 ( 0.00%) . . . } + . . . . + . . . . /// Add a new interval to this set. + . . . . pub fn push(&mut self, interval: I) { + . . . . // TODO: This could be faster. e.g., Push the interval such that + . . . . // it preserves canonicalization. + . . . . self.ranges.push(interval); + 220 ( 0.00%) . . . self.canonicalize(); + 2,310 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (110x) + . . . . // We don't know whether the new interval added here is considered + . . . . // case folded, so we conservatively assume that the entire set is + . . . . // no longer case folded if it was previously. + 110 ( 0.00%) . . . self.folded = false; + . . . . } + . . . . + . . . . /// Return an iterator over all intervals in this set. + . . . . /// + . . . . /// The iterator yields intervals in ascending order. + . . . . pub fn iter(&self) -> IntervalSetIter<'_, I> { + . . . . IntervalSetIter(self.ranges.iter()) + . . . . } +-- line 99 ---------------------------------------- +-- line 108 ---------------------------------------- + . . . . /// Expand this interval set such that it contains all case folded + . . . . /// characters. For example, if this class consists of the range `a-z`, + . . . . /// then applying case folding will result in the class containing both the + . . . . /// ranges `a-z` and `A-Z`. + . . . . /// + . . . . /// This returns an error if the necessary case mapping data is not + . . . . /// available. + . . . . pub fn case_fold_simple(&mut self) -> Result<(), unicode::CaseFoldError> { + 2,660 ( 0.00%) . . . if self.folded { + . . . . return Ok(()); + . . . . } + . . . . let len = self.ranges.len(); + . . . . for i in 0..len { + 4,760 ( 0.00%) . . . let range = self.ranges[i]; + 5,950 ( 0.00%) . . . if let Err(err) = range.case_fold_simple(&mut self.ranges) { +928,541 ( 0.27%) 2,240 ( 0.28%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:::case_fold_simple (1,120x) + . . . . self.canonicalize(); + . . . . return Err(err); + . . . . } + . . . . } + 2,310 ( 0.00%) . . . self.canonicalize(); +38,420 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (1,120x) + 1,190 ( 0.00%) . . . self.folded = true; + . . . . Ok(()) + . . . . } + . . . . + . . . . /// Union this set with the given set, in place. + 290 ( 0.00%) . . . pub fn union(&mut self, other: &IntervalSet) { + 2,596 ( 0.00%) . . . if other.ranges.is_empty() || self.ranges == other.ranges { + . . . . return; + . . . . } + . . . . // This could almost certainly be done more efficiently. + . . . . self.ranges.extend(&other.ranges); + 1,871 ( 0.00%) . . . self.canonicalize(); + 2,526 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/interval.rs:regex_syntax::hir::interval::IntervalSet::canonicalize (58x) + 3,487 ( 0.00%) . . . self.folded = self.folded && other.folded; + 348 ( 0.00%) . . . } + . . . . + . . . . /// Intersect this set with the given set, in place. + . . . . pub fn intersect(&mut self, other: &IntervalSet) { + . . . . if self.ranges.is_empty() { + . . . . return; + . . . . } + . . . . if other.ranges.is_empty() { + . . . . self.ranges.clear(); +-- line 149 ---------------------------------------- +-- line 288 ---------------------------------------- + . . . . self.union(other); + . . . . self.difference(&intersection); + . . . . } + . . . . + . . . . /// Negate this interval set. + . . . . /// + . . . . /// For all `x` where `x` is any element, if `x` was in this set, then it + . . . . /// will not be in this set after negation. + 366 ( 0.00%) . . . pub fn negate(&mut self) { + 61 ( 0.00%) . . . if self.ranges.is_empty() { + . . . . let (min, max) = (I::Bound::min_value(), I::Bound::max_value()); + . . . . self.ranges.push(I::create(min, max)); + . . . . // The set containing everything must case folded. + . . . . self.folded = true; + . . . . return; + . . . . } + . . . . + . . . . // There should be a way to do this in-place with constant memory, + . . . . // but I couldn't figure out a simple way to do it. So just append + . . . . // the negation to the end of this range, and then drain it before + . . . . // we're done. + . . . . let drain_end = self.ranges.len(); + . . . . + . . . . // We do checked arithmetic below because of the canonical ordering + . . . . // invariant. + 427 ( 0.00%) . . . if self.ranges[0].lower() > I::Bound::min_value() { + . . . . let upper = self.ranges[0].lower().decrement(); + . . . . self.ranges.push(I::create(I::Bound::min_value(), upper)); + . . . . } + . . . . for i in 1..drain_end { + 102 ( 0.00%) . . . let lower = self.ranges[i - 1].upper().increment(); + 34 ( 0.00%) . . . let upper = self.ranges[i].lower().decrement(); + . . . . self.ranges.push(I::create(lower, upper)); + . . . . } + 244 ( 0.00%) . . . if self.ranges[drain_end - 1].upper() < I::Bound::max_value() { + . . . . let lower = self.ranges[drain_end - 1].upper().increment(); + . . . . self.ranges.push(I::create(lower, I::Bound::max_value())); + . . . . } + . . . . self.ranges.drain(..drain_end); + . . . . // We don't need to update whether this set is folded or not, because + . . . . // it is conservatively preserved through negation. Namely, if a set + . . . . // is not folded, then it is possible that its negation is folded, for + . . . . // example, [^☃]. But we're fine with assuming that the set is not +-- line 330 ---------------------------------------- +-- line 332 ---------------------------------------- + . . . . // positives.) + . . . . // + . . . . // But what about when a set is folded, is its negation also + . . . . // necessarily folded? Yes. Because if a set is folded, then for every + . . . . // character in the set, it necessarily included its equivalence class + . . . . // of case folded characters. Negating it in turn means that all + . . . . // equivalence classes in the set are negated, and any equivalence + . . . . // class that was previously not in the set is now entirely in the set. + 366 ( 0.00%) . . . } + . . . . + . . . . /// Converts this set into a canonical ordering. +60,317 ( 0.02%) . . . fn canonicalize(&mut self) { +23,486 ( 0.01%) . . . if self.is_canonical() { + . . . . return; + . . . . } + . . . . self.ranges.sort(); + 1,318 ( 0.00%) . . . assert!(!self.ranges.is_empty()); + . . . . + . . . . // Is there a way to do this in-place with constant memory? I couldn't + . . . . // figure out a way to do it. So just append the canonicalization to + . . . . // the end of this range, and then drain it before we're done. + . . . . let drain_end = self.ranges.len(); + . . . . for oldi in 0..drain_end { + . . . . // If we've added at least one new range, then check if we can + . . . . // merge this range in the previously added range. + 5,770 ( 0.00%) . . . if self.ranges.len() > drain_end { + . . . . let (last, rest) = self.ranges.split_last_mut().unwrap(); + 3,134 ( 0.00%) . . . if let Some(union) = last.union(&rest[oldi]) { + 2,064 ( 0.00%) . . . *last = union; + . . . . continue; + . . . . } + . . . . } + 3,706 ( 0.00%) . . . let range = self.ranges[oldi]; + . . . . self.ranges.push(range); + . . . . } + . . . . self.ranges.drain(..drain_end); +60,317 ( 0.02%) . . . } + . . . . + . . . . /// Returns true if and only if this class is in a canonical ordering. + . . . . fn is_canonical(&self) -> bool { +35,229 ( 0.01%) . . . for pair in self.ranges.windows(2) { + 9,082 ( 0.00%) . . . if pair[0] >= pair[1] { + . . . . return false; + . . . . } + 8,224 ( 0.00%) . . . if pair[0].is_contiguous(&pair[1]) { + . . . . return false; + . . . . } + . . . . } + . . . . true + . . . . } + . . . . } + . . . . + . . . . /// An iterator over intervals. +-- line 384 ---------------------------------------- +-- line 405 ---------------------------------------- + . . . . fn case_fold_simple( + . . . . &self, + . . . . intervals: &mut Vec, + . . . . ) -> Result<(), unicode::CaseFoldError>; + . . . . + . . . . /// Create a new interval. + . . . . fn create(lower: Self::Bound, upper: Self::Bound) -> Self { + . . . . let mut int = Self::default(); +11,283 ( 0.00%) . . . if lower <= upper { + . . . . int.set_lower(lower); + . . . . int.set_upper(upper); + . . . . } else { + . . . . int.set_lower(upper); + . . . . int.set_upper(lower); + . . . . } + . . . . int + . . . . } + . . . . + . . . . /// Union the given overlapping range into this range. + . . . . /// + . . . . /// If the two ranges aren't contiguous, then this returns `None`. + . . . . fn union(&self, other: &Self) -> Option { + 1,567 ( 0.00%) . . . if !self.is_contiguous(other) { + . . . . return None; + . . . . } + . . . . let lower = cmp::min(self.lower(), other.lower()); + . . . . let upper = cmp::max(self.upper(), other.upper()); + . . . . Some(Self::create(lower, upper)) + . . . . } + . . . . + . . . . /// Intersect this range with the given range and return the result. +-- line 435 ---------------------------------------- +-- line 495 ---------------------------------------- + . . . . }; + . . . . union.difference(&intersection) + . . . . } + . . . . + . . . . /// Returns true if and only if the two ranges are contiguous. Two ranges + . . . . /// are contiguous if and only if the ranges are either overlapping or + . . . . /// adjacent. + . . . . fn is_contiguous(&self, other: &Self) -> bool { + 1,567 ( 0.00%) . . . let lower1 = self.lower().as_u32(); + 5,679 ( 0.00%) . . . let upper1 = self.upper().as_u32(); + 1,567 ( 0.00%) . . . let lower2 = other.lower().as_u32(); + 5,679 ( 0.00%) . . . let upper2 = other.upper().as_u32(); + 5,679 ( 0.00%) . . . cmp::max(lower1, lower2) <= cmp::min(upper1, upper2).saturating_add(1) + . . . . } + . . . . + . . . . /// Returns true if and only if the intersection of this range and the + . . . . /// other range is empty. + . . . . fn is_intersection_empty(&self, other: &Self) -> bool { + . . . . let (lower1, upper1) = (self.lower(), self.upper()); + . . . . let (lower2, upper2) = (other.lower(), other.upper()); + . . . . cmp::max(lower1, lower2) > cmp::min(upper1, upper2) +-- line 515 ---------------------------------------- +-- line 559 ---------------------------------------- + . . . . fn max_value() -> Self { + . . . . '\u{10FFFF}' + . . . . } + . . . . fn as_u32(self) -> u32 { + . . . . u32::from(self) + . . . . } + . . . . + . . . . fn increment(self) -> Self { + 190 ( 0.00%) . . . match self { + . . . . '\u{D7FF}' => '\u{E000}', + . . . . c => char::from_u32(u32::from(c).checked_add(1).unwrap()).unwrap(), + . . . . } + . . . . } + . . . . + . . . . fn decrement(self) -> Self { + 136 ( 0.00%) . . . match self { + . . . . '\u{E000}' => '\u{D7FF}', + . . . . c => char::from_u32(u32::from(c).checked_sub(1).unwrap()).unwrap(), + . . . . } + . . . . } + . . . . } + . . . . + . . . . // Tests for interval sets are written in src/hir.rs against the public API. + +12,439 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 193 ---------------------------------------- + . . . . // sense to put it on the heap by default anyway. Second is that, for Arc + . . . . // specifically, this enables cheap clones. This tends to be useful because + . . . . // several structures (the backtracker, the Pike VM, the hybrid NFA/DFA) + . . . . // all want to hang on to an NFA for use during search time. We could + . . . . // provide the NFA at search time via a function argument, but this makes + . . . . // for an unnecessarily annoying API. Instead, we just let each structure + . . . . // share ownership of the NFA. Using a deep clone would not be smart, since + . . . . // the NFA can use quite a bit of heap space. + 162 ( 0.00%) . . . Arc, + . . . . ); + . . . . + . . . . impl NFA { + . . . . /// Parse the given regular expression using a default configuration and + . . . . /// build an NFA from it. + . . . . /// + . . . . /// If you want a non-default configuration, then use the NFA + . . . . /// [`Compiler`] with a [`Config`]. +-- line 209 ---------------------------------------- +-- line 398 ---------------------------------------- + . . . . /// assert_eq!(pids, vec![ + . . . . /// PatternID::must(0), + . . . . /// PatternID::must(1), + . . . . /// PatternID::must(2), + . . . . /// ]); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 81 ( 0.00%) . . . pub fn patterns(&self) -> PatternIter<'_> { + . . . . PatternIter { + . . . . it: PatternID::iter(self.pattern_len()), + . . . . _marker: core::marker::PhantomData, + . . . . } + 243 ( 0.00%) . . . } + . . . . + . . . . /// Returns the total number of regex patterns in this NFA. + . . . . /// + . . . . /// This may return zero if the NFA was constructed with no patterns. In + . . . . /// this case, the NFA can never produce a match for any input. + . . . . /// + . . . . /// This is guaranteed to be no bigger than [`PatternID::LIMIT`] because + . . . . /// NFA construction will fail if too many patterns are added. +-- line 419 ---------------------------------------- +-- line 466 ---------------------------------------- + . . . . /// } + . . . . /// _ => unreachable!("unexpected state"), + . . . . /// } + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn start_anchored(&self) -> StateID { + 8 ( 0.00%) . . . self.0.start_anchored + . . . . } + . . . . + . . . . /// Return the state identifier of the initial unanchored state of this + . . . . /// NFA. + . . . . /// + . . . . /// This is equivalent to the identifier returned by + . . . . /// [`NFA::start_anchored`] when the NFA has no unanchored starting state. + . . . . /// +-- line 482 ---------------------------------------- +-- line 625 ---------------------------------------- + . . . . /// } + . . . . /// _ => unreachable!("unexpected state"), + . . . . /// } + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn state(&self, id: StateID) -> &State { + 1,434 ( 0.00%) . . . &self.states()[id] + . . . . } + . . . . + . . . . /// Returns a slice of all states in this NFA. + . . . . /// + . . . . /// The slice returned is indexed by `StateID`. This provides a convenient + . . . . /// way to access states while following transitions among those states. + . . . . /// + . . . . /// # Example +-- line 641 ---------------------------------------- +-- line 811 ---------------------------------------- + . . . . /// // and thus does not match the empty string. + . . . . /// let nfa = NFA::new("[a&&b]+")?; + . . . . /// assert!(!nfa.has_empty(), "+ on never-match still matches nothing"); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn has_empty(&self) -> bool { + 57 ( 0.00%) . . . self.0.has_empty + . . . . } + . . . . + . . . . /// Whether UTF-8 mode is enabled for this NFA or not. + . . . . /// + . . . . /// When UTF-8 mode is enabled, all matches reported by a regex engine + . . . . /// derived from this NFA are guaranteed to correspond to spans of valid + . . . . /// UTF-8. This includes zero-width matches. For example, the regex engine + . . . . /// must guarantee that the empty regex will not match at the positions +-- line 827 ---------------------------------------- +-- line 901 ---------------------------------------- + . . . . /// how the state machine is constructed, and thus needs to be altered + . . . . /// based on the direction of the search. + . . . . /// + . . . . /// This is automatically set when using a [`Compiler`] with a configuration + . . . . /// where [`Config::reverse`] is enabled. If you're building your own NFA + . . . . /// by hand via a [`Builder`] + . . . . #[inline] + . . . . pub fn is_reverse(&self) -> bool { + 259 ( 0.00%) . . . self.0.reverse + . . . . } + . . . . + . . . . /// Returns true if and only if all starting states for this NFA correspond + . . . . /// to the beginning of an anchored search. + . . . . /// + . . . . /// Typically, an NFA will have both an anchored and an unanchored starting + . . . . /// state. Namely, because it tends to be useful to have both and the cost + . . . . /// of having an unanchored starting state is almost zero (for an NFA). +-- line 917 ---------------------------------------- +-- line 1052 ---------------------------------------- + . . . . /// assert!(nfa.look_set_any().contains_word()); + . . . . /// assert!(!nfa.look_set_any().contains_word_unicode()); + . . . . /// assert!(nfa.look_set_any().contains_word_ascii()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn look_set_any(&self) -> LookSet { + 677 ( 0.00%) . . . self.0.look_set_any + . . . . } + . . . . + . . . . /// Returns the union of all prefix look-around assertions for every + . . . . /// pattern in this NFA. When the returned set is empty, it implies none of + . . . . /// the patterns require moving through a conditional epsilon transition + . . . . /// before inspecting the first byte in the haystack. + . . . . /// + . . . . /// This can be useful for determining what kinds of assertions need to be +-- line 1068 ---------------------------------------- +-- line 1186 ---------------------------------------- + . . . . /// The "inner" part of the NFA. We split this part out so that we can easily + . . . . /// wrap it in an `Arc` above in the definition of `NFA`. + . . . . /// + . . . . /// See builder.rs for the code that actually builds this type. This module + . . . . /// does provide (internal) mutable methods for adding things to this + . . . . /// NFA before finalizing it, but the high level construction process is + . . . . /// controlled by the builder abstraction. (Which is complicated enough to + . . . . /// get its own module.) + 875 ( 0.00%) . . . #[derive(Default)] + . . . . pub(super) struct Inner { + . . . . /// The state sequence. This sequence is guaranteed to be indexable by all + . . . . /// starting state IDs, and it is also guaranteed to contain at most one + . . . . /// `Match` state for each pattern compiled into this NFA. (A pattern may + . . . . /// not have a corresponding `Match` state if a `Match` state is impossible + . . . . /// to reach.) + . . . . states: Vec, + . . . . /// The anchored starting state of this NFA. +-- line 1202 ---------------------------------------- +-- line 1264 ---------------------------------------- + . . . . /// various capturing group representations above). Since each state + . . . . /// might use a different amount of heap, we need to keep track of this + . . . . /// incrementally. + . . . . memory_extra: usize, + . . . . } + . . . . + . . . . impl Inner { + . . . . /// Runs any last finalization bits and turns this into a full NFA. + 1,400 ( 0.00%) . . . pub(super) fn into_nfa(mut self) -> NFA { + 700 ( 0.00%) . . . self.byte_classes = self.byte_class_set.byte_classes(); + 5,250 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) + . . . . // Do epsilon closure from the start state of every pattern in order + . . . . // to compute various properties such as look-around assertions and + . . . . // whether the empty string can be matched. + . . . . let mut stack = vec![]; + . . . . let mut seen = SparseSet::new(self.states.len()); + 175 ( 0.00%) . . . for &start_id in self.start_pattern.iter() { + . . . . stack.push(start_id); + . . . . seen.clear(); + . . . . // let mut prefix_all = LookSet::full(); + . . . . let mut prefix_any = LookSet::empty(); + . . . . while let Some(sid) = stack.pop() { + 2,113 ( 0.00%) . . . if !seen.insert(sid) { + . . . . continue; + . . . . } + 2,113 ( 0.00%) . . . match self.states[sid] { + . . . . State::ByteRange { .. } + . . . . | State::Dense { .. } + . . . . | State::Fail => continue, + . . . . State::Sparse(_) => { + . . . . // This snippet below will rewrite this sparse state + . . . . // as a dense state. By doing it here, we apply this + . . . . // optimization to all hot "sparse" states since these + . . . . // are the states that are reachable from the start +-- line 1296 ---------------------------------------- +-- line 1309 ---------------------------------------- + . . . . // is a large re-design and will require API breaking + . . . . // changes. + . . . . // self.memory_extra -= self.states[sid].memory_usage(); + . . . . // let trans = DenseTransitions::from_sparse(sparse); + . . . . // self.states[sid] = State::Dense(trans); + . . . . // self.memory_extra += self.states[sid].memory_usage(); + . . . . continue; + . . . . } + 4 ( 0.00%) . . . State::Match { .. } => self.has_empty = true, + . . . . State::Look { look, next } => { + . . . . prefix_any = prefix_any.insert(look); + . . . . stack.push(next); + . . . . } + . . . . State::Union { ref alternates } => { + . . . . // Order doesn't matter here, since we're just dealing + . . . . // with look-around sets. But if we do richer analysis + . . . . // here that needs to care about preference order, then + . . . . // this should be done in reverse. + 192 ( 0.00%) . . . stack.extend(alternates.iter()); + . . . . } + 158 ( 0.00%) . . . State::BinaryUnion { alt1, alt2 } => { + . . . . stack.push(alt2); + . . . . stack.push(alt1); + . . . . } + . . . . State::Capture { next, .. } => { + . . . . stack.push(next); + . . . . } + . . . . } + . . . . } + 175 ( 0.00%) . . . self.look_set_prefix_any = + . . . . self.look_set_prefix_any.union(prefix_any); + . . . . } + . . . . NFA(Arc::new(self)) + 1,575 ( 0.00%) . . . } + . . . . + . . . . /// Returns the capturing group info for this NFA. + . . . . pub(super) fn group_info(&self) -> &GroupInfo { + 86 ( 0.00%) . . . &self.group_info + . . . . } + . . . . + . . . . /// Add the given state to this NFA after allocating a fresh identifier for + . . . . /// it. + . . . . /// + . . . . /// This panics if too many states are added such that a fresh identifier + . . . . /// could not be created. (Currently, the only caller of this routine is + . . . . /// a `Builder`, and it upholds this invariant.) +578,961 ( 0.17%) . . . pub(super) fn add(&mut self, state: State) -> StateID { +321,645 ( 0.09%) . . . match state { + . . . . State::ByteRange { ref trans } => { +136,092 ( 0.04%) . . . self.byte_class_set.set_range(trans.start, trans.end); + . . . . } + . . . . State::Sparse(ref sparse) => { + 10,389 ( 0.00%) . . . for trans in sparse.transitions.iter() { + 76,948 ( 0.02%) . . . self.byte_class_set.set_range(trans.start, trans.end); + . . . . } + . . . . } + . . . . State::Dense { .. } => unreachable!(), + 245 ( 0.00%) . . . State::Look { look, .. } => { + 735 ( 0.00%) . . . self.look_matcher + 4,900 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/look.rs:regex_automata::util::look::LookMatcher::add_to_byteset (245x) + 245 ( 0.00%) . . . .add_to_byteset(look, &mut self.byte_class_set); + 490 ( 0.00%) . . . self.look_set_any = self.look_set_any.insert(look); + . . . . } + . . . . State::Capture { .. } => { + 3,096 ( 0.00%) . . . self.has_capture = true; + . . . . } + . . . . State::Union { .. } + . . . . | State::BinaryUnion { .. } + . . . . | State::Fail + . . . . | State::Match { .. } => {} + . . . . } + . . . . + . . . . let id = StateID::new(self.states.len()).unwrap(); +192,987 ( 0.06%) . . . self.memory_extra += state.memory_usage(); + . . . . self.states.push(state); + . . . . id +578,961 ( 0.17%) . . . } + . . . . + . . . . /// Set the starting state identifiers for this NFA. + . . . . /// + . . . . /// `start_anchored` and `start_unanchored` may be equivalent. When they + . . . . /// are, then the NFA can only execute anchored searches. This might + . . . . /// occur, for example, for patterns that are unconditionally anchored. + . . . . /// e.g., `^foo`. + . . . . pub(super) fn set_starts( + . . . . &mut self, + . . . . start_anchored: StateID, + . . . . start_unanchored: StateID, + . . . . start_pattern: &[StateID], + . . . . ) { + 175 ( 0.00%) . . . self.start_anchored = start_anchored; + 175 ( 0.00%) . . . self.start_unanchored = start_unanchored; + 525 ( 0.00%) . . . self.start_pattern = start_pattern.to_vec(); + . . . . } + . . . . + . . . . /// Sets the UTF-8 mode of this NFA. + . . . . pub(super) fn set_utf8(&mut self, yes: bool) { + 175 ( 0.00%) . . . self.utf8 = yes; + . . . . } + . . . . + . . . . /// Sets the reverse mode of this NFA. + . . . . pub(super) fn set_reverse(&mut self, yes: bool) { + 175 ( 0.00%) . . . self.reverse = yes; + . . . . } + . . . . + . . . . /// Sets the look-around assertion matcher for this NFA. + . . . . pub(super) fn set_look_matcher(&mut self, m: LookMatcher) { + 175 ( 0.00%) . . . self.look_matcher = m; + . . . . } + . . . . + . . . . /// Set the capturing groups for this NFA. + . . . . /// + . . . . /// The given slice should contain the capturing groups for each pattern, + . . . . /// The capturing groups in turn should correspond to the total number of + . . . . /// capturing groups in the pattern, including the anonymous first capture + . . . . /// group for each pattern. If a capturing group does have a name, then it +-- line 1423 ---------------------------------------- +-- line 1424 ---------------------------------------- + . . . . /// should be provided as a Arc. + . . . . /// + . . . . /// This returns an error if a corresponding `GroupInfo` could not be + . . . . /// built. + . . . . pub(super) fn set_captures( + . . . . &mut self, + . . . . captures: &[Vec>>], + . . . . ) -> Result<(), GroupInfoError> { + 350 ( 0.00%) . . . self.group_info = GroupInfo::new( +883,512 ( 0.26%) 2,456 ( 0.30%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::util::captures::GroupInfo::new (175x) + . . . . captures.iter().map(|x| x.iter().map(|y| y.as_ref())), + . . . . )?; + . . . . Ok(()) + . . . . } + . . . . + . . . . /// Remap the transitions in every state of this NFA using the given map. + . . . . /// The given map should be indexed according to state ID namespace used by + . . . . /// the transitions of the states currently in this NFA. + . . . . /// + . . . . /// This is particularly useful to the NFA builder, since it is convenient + . . . . /// to add NFA states in order to produce their final IDs. Then, after all + . . . . /// of the intermediate "empty" states (unconditional epsilon transitions) + . . . . /// have been removed from the builder's representation, we can re-map all + . . . . /// of the transitions in the states already added to their final IDs. + 175 ( 0.00%) . . . pub(super) fn remap(&mut self, old_to_new: &[StateID]) { + . . . . for state in &mut self.states { + . . . . state.remap(old_to_new); + . . . . } + 525 ( 0.00%) . . . self.start_anchored = old_to_new[self.start_anchored]; + 525 ( 0.00%) . . . self.start_unanchored = old_to_new[self.start_unanchored]; + . . . . for id in self.start_pattern.iter_mut() { + 525 ( 0.00%) . . . *id = old_to_new[*id]; + . . . . } + 350 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl fmt::Debug for Inner { + . . . . fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + . . . . writeln!(f, "thompson::NFA(")?; + . . . . for (sid, state) in self.states.iter().with_state_ids() { + . . . . let status = if sid == self.start_anchored { + . . . . '^' +-- line 1464 ---------------------------------------- +-- line 1648 ---------------------------------------- + . . . . /// trans: Transition { start: b'a', end: b'z', next: StateID::ZERO }, + . . . . /// }; + . . . . /// assert!(!state.is_epsilon()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn is_epsilon(&self) -> bool { + 705 ( 0.00%) . . . match *self { + . . . . State::ByteRange { .. } + . . . . | State::Sparse { .. } + . . . . | State::Dense { .. } + . . . . | State::Fail + . . . . | State::Match { .. } => false, + . . . . State::Look { .. } + . . . . | State::Union { .. } + . . . . | State::BinaryUnion { .. } + . . . . | State::Capture { .. } => true, + . . . . } + . . . . } + . . . . + . . . . /// Returns the heap memory usage of this NFA state in bytes. + . . . . fn memory_usage(&self) -> usize { +321,645 ( 0.09%) . . . match *self { + . . . . State::ByteRange { .. } + . . . . | State::Look { .. } + . . . . | State::BinaryUnion { .. } + . . . . | State::Capture { .. } + . . . . | State::Match { .. } + . . . . | State::Fail => 0, + . . . . State::Sparse(SparseTransitions { ref transitions }) => { + 20,778 ( 0.01%) . . . transitions.len() * mem::size_of::() + . . . . } + . . . . State::Dense { .. } => 256 * mem::size_of::(), + . . . . State::Union { ref alternates } => { + 1,460 ( 0.00%) . . . alternates.len() * mem::size_of::() + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Remap the transitions in this state using the given map. Namely, the + . . . . /// given map should be indexed according to the transitions currently + . . . . /// in this state. + . . . . /// + . . . . /// This is used during the final phase of the NFA compiler, which turns + . . . . /// its intermediate NFA into the final NFA. + . . . . fn remap(&mut self, remap: &[StateID]) { +257,316 ( 0.07%) . . . match *self { + . . . . State::ByteRange { ref mut trans } => { + 45,364 ( 0.01%) . . . trans.next = remap[trans.next] + . . . . } + . . . . State::Sparse(SparseTransitions { ref mut transitions }) => { + 10,389 ( 0.00%) . . . for t in transitions.iter_mut() { +115,422 ( 0.03%) . . . t.next = remap[t.next]; + . . . . } + . . . . } + . . . . State::Dense(DenseTransitions { ref mut transitions }) => { + . . . . for sid in transitions.iter_mut() { + . . . . *sid = remap[*sid]; + . . . . } + . . . . } + 245 ( 0.00%) . . . State::Look { ref mut next, .. } => *next = remap[*next], + . . . . State::Union { ref mut alternates } => { + 1,460 ( 0.00%) . . . for alt in alternates.iter_mut() { + 31,287 ( 0.01%) . . . *alt = remap[*alt]; + . . . . } + . . . . } + . . . . State::BinaryUnion { ref mut alt1, ref mut alt2 } => { + 15,444 ( 0.00%) . . . *alt1 = remap[*alt1]; + 20,592 ( 0.01%) . . . *alt2 = remap[*alt2]; + . . . . } + 1,548 ( 0.00%) . . . State::Capture { ref mut next, .. } => *next = remap[*next], + . . . . State::Fail => {} + . . . . State::Match { .. } => {} + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl fmt::Debug for State { + . . . . fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +-- line 1727 ---------------------------------------- +-- line 1814 ---------------------------------------- + . . . . /// range (there is at most one) corresponding to the position `at` in + . . . . /// `haystack`. If the given alphabet unit is [`EOI`](alphabet::Unit::eoi), + . . . . /// then this always returns `None`. + . . . . #[inline] + . . . . pub(crate) fn matches_unit( + . . . . &self, + . . . . unit: alphabet::Unit, + . . . . ) -> Option { + 292 ( 0.00%) . . . unit.as_u8().map_or(None, |byte| self.matches_byte(byte)) + . . . . } + . . . . + . . . . /// This follows the matching transition for a particular byte. + . . . . /// + . . . . /// The matching transition is found by looking for a matching byte range + . . . . /// (there is at most one) corresponding to the byte given. + . . . . #[inline] + . . . . pub fn matches_byte(&self, byte: u8) -> Option { + 488 ( 0.00%) . . . for t in self.transitions.iter() { + 1,064 ( 0.00%) . . . if t.start > byte { + . . . . break; + 1,391 ( 0.00%) . . . } else if t.matches_byte(byte) { + 40 ( 0.00%) . . . return Some(t.next); + . . . . } + . . . . } + . . . . None + . . . . + . . . . /* + . . . . // This is an alternative implementation that uses binary search. In + . . . . // some ad hoc experiments, like + . . . . // +-- line 1843 ---------------------------------------- +-- line 1960 ---------------------------------------- + . . . . + . . . . /// A single transition to another state. + . . . . /// + . . . . /// This transition may only be followed if the current byte in the haystack + . . . . /// falls in the inclusive range of bytes specified. + . . . . #[derive(Clone, Copy, Eq, Hash, PartialEq)] + . . . . pub struct Transition { + . . . . /// The inclusive start of the byte range. + 1,854 ( 0.00%) . . . pub start: u8, + . . . . /// The inclusive end of the byte range. + 4,635 ( 0.00%) . . . pub end: u8, + . . . . /// The identifier of the state to transition to. + 1,854 ( 0.00%) . . . pub next: StateID, + . . . . } + . . . . + . . . . impl Transition { + . . . . /// Returns true if the position `at` in `haystack` falls in this + . . . . /// transition's range of bytes. + . . . . /// + . . . . /// If `at >= haystack.len()`, then this returns `false`. + . . . . pub fn matches(&self, haystack: &[u8], at: usize) -> bool { +-- line 1980 ---------------------------------------- +-- line 1986 ---------------------------------------- + . . . . /// this returns `false`. + . . . . pub fn matches_unit(&self, unit: alphabet::Unit) -> bool { + . . . . unit.as_u8().map_or(false, |byte| self.matches_byte(byte)) + . . . . } + . . . . + . . . . /// Returns true if the given byte falls in this transition's range of + . . . . /// bytes. + . . . . pub fn matches_byte(&self, byte: u8) -> bool { + 1,750 ( 0.00%) . . . self.start <= byte && byte <= self.end + . . . . } + . . . . } + . . . . + . . . . impl fmt::Debug for Transition { + . . . . fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + . . . . use crate::util::escape::DebugByte; + . . . . + . . . . let Transition { start, end, next } = *self; +-- line 2002 ---------------------------------------- + +258,637 ( 0.07%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 47 ---------------------------------------- + . . . . Primitive::Dot(ref span) => span, + . . . . Primitive::Perl(ref x) => &x.span, + . . . . Primitive::Unicode(ref x) => &x.span, + . . . . } + . . . . } + . . . . + . . . . /// Convert this primitive into a proper AST. + . . . . fn into_ast(self) -> Ast { + 496,070 ( 0.14%) . . . match self { + . . . . Primitive::Literal(lit) => Ast::literal(lit), + . . . . Primitive::Assertion(assert) => Ast::assertion(assert), + . . . . Primitive::Dot(span) => Ast::dot(span), + . . . . Primitive::Perl(cls) => Ast::class_perl(cls), + . . . . Primitive::Unicode(cls) => Ast::class_unicode(cls), + . . . . } + . . . . } + . . . . +-- line 63 ---------------------------------------- +-- line 67 ---------------------------------------- + . . . . /// then return an error. + . . . . fn into_class_set_item>( + . . . . self, + . . . . p: &ParserI<'_, P>, + . . . . ) -> Result { + . . . . use self::Primitive::*; + . . . . use crate::ast::ClassSetItem; + . . . . + 24,858 ( 0.01%) . . . match self { + 35,440 ( 0.01%) . . . Literal(lit) => Ok(ClassSetItem::Literal(lit)), + 50 ( 0.00%) . . . Perl(cls) => Ok(ClassSetItem::Perl(cls)), + . . . . Unicode(cls) => Ok(ClassSetItem::Unicode(cls)), + . . . . x => Err(p.error(*x.span(), ast::ErrorKind::ClassEscapeInvalid)), + . . . . } + . . . . } + . . . . + . . . . /// Convert this primitive into a literal in a character class. In + . . . . /// particular, literals are the only valid items that can appear in + . . . . /// ranges. +-- line 85 ---------------------------------------- +-- line 105 ---------------------------------------- + . . . . } + . . . . + . . . . /// Returns true if the given character is a valid in a capture group name. + . . . . /// + . . . . /// If `first` is true, then `c` is treated as the first character in the + . . . . /// group name (which must be alphabetic or underscore). + . . . . fn is_capture_char(c: char, first: bool) -> bool { + . . . . if first { + 1,172 ( 0.00%) . . . c == '_' || c.is_alphabetic() + . . . . } else { + 6,753 ( 0.00%) . . . c == '_' || c == '.' || c == '[' || c == ']' || c.is_alphanumeric() + . . . . } + . . . . } + . . . . + . . . . /// A builder for a regular expression parser. + . . . . /// + . . . . /// This builder permits modifying configuration options for the parser. + . . . . #[derive(Clone, Debug)] + . . . . pub struct ParserBuilder { +-- line 123 ---------------------------------------- +-- line 135 ---------------------------------------- + . . . . impl ParserBuilder { + . . . . /// Create a new parser builder with a default configuration. + . . . . pub fn new() -> ParserBuilder { + . . . . ParserBuilder { + . . . . ignore_whitespace: false, + . . . . nest_limit: 250, + . . . . octal: false, + . . . . } + 162 ( 0.00%) . . . } + . . . . + . . . . /// Build a parser from this configuration with the given pattern. + 81 ( 0.00%) . . . pub fn build(&self) -> Parser { + 1,944 ( 0.00%) . . . Parser { + . . . . pos: Cell::new(Position { offset: 0, line: 1, column: 1 }), + . . . . capture_index: Cell::new(0), + 81 ( 0.00%) . . . nest_limit: self.nest_limit, + 81 ( 0.00%) . . . octal: self.octal, + 81 ( 0.00%) . . . initial_ignore_whitespace: self.ignore_whitespace, + . . . . ignore_whitespace: Cell::new(self.ignore_whitespace), + . . . . comments: RefCell::new(vec![]), + . . . . stack_group: RefCell::new(vec![]), + . . . . stack_class: RefCell::new(vec![]), + . . . . capture_names: RefCell::new(vec![]), + . . . . scratch: RefCell::new(String::new()), + . . . . } + 81 ( 0.00%) . . . } + . . . . + . . . . /// Set the nesting limit for this parser. + . . . . /// + . . . . /// The nesting limit controls how deep the abstract syntax tree is allowed + . . . . /// to be. If the AST exceeds the given limit (e.g., with too many nested + . . . . /// groups), then an error is returned by the parser. + . . . . /// + . . . . /// The purpose of this limit is to act as a heuristic to prevent stack +-- line 168 ---------------------------------------- +-- line 179 ---------------------------------------- + . . . . /// length of the pattern string. + . . . . /// + . . . . /// Note that a nest limit of `0` will return a nest limit error for most + . . . . /// patterns but not all. For example, a nest limit of `0` permits `a` but + . . . . /// not `ab`, since `ab` requires a concatenation, which results in a nest + . . . . /// depth of `1`. In general, a nest limit is not something that manifests + . . . . /// in an obvious way in the concrete syntax, therefore, it should not be + . . . . /// used in a granular way. + 81 ( 0.00%) . . . pub fn nest_limit(&mut self, limit: u32) -> &mut ParserBuilder { + 81 ( 0.00%) . . . self.nest_limit = limit; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Whether to support octal syntax or not. + . . . . /// + . . . . /// Octal syntax is a little-known way of uttering Unicode codepoints in + . . . . /// a regular expression. For example, `a`, `\x61`, `\u0061` and + . . . . /// `\141` are all equivalent regular expressions, where the last example + . . . . /// shows octal syntax. + . . . . /// +-- line 198 ---------------------------------------- +-- line 199 ---------------------------------------- + . . . . /// While supporting octal syntax isn't in and of itself a problem, it does + . . . . /// make good error messages harder. That is, in PCRE based regex engines, + . . . . /// syntax like `\0` invokes a backreference, which is explicitly + . . . . /// unsupported in Rust's regex engine. However, many users expect it to + . . . . /// be supported. Therefore, when octal support is disabled, the error + . . . . /// message will explicitly mention that backreferences aren't supported. + . . . . /// + . . . . /// Octal syntax is disabled by default. + 81 ( 0.00%) . . . pub fn octal(&mut self, yes: bool) -> &mut ParserBuilder { + 81 ( 0.00%) . . . self.octal = yes; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable verbose mode in the regular expression. + . . . . /// + . . . . /// When enabled, verbose mode permits insignificant whitespace in many + . . . . /// places in the regular expression, as well as comments. Comments are + . . . . /// started using `#` and continue until the end of the line. + . . . . /// + . . . . /// By default, this is disabled. It may be selectively enabled in the + . . . . /// regular expression by using the `x` flag regardless of this setting. + 81 ( 0.00%) . . . pub fn ignore_whitespace(&mut self, yes: bool) -> &mut ParserBuilder { + 81 ( 0.00%) . . . self.ignore_whitespace = yes; + . . . . self + 81 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A regular expression parser. + . . . . /// + . . . . /// This parses a string representation of a regular expression into an + . . . . /// abstract syntax tree. The size of the tree is proportional to the length + . . . . /// of the regular expression pattern. + . . . . /// +-- line 231 ---------------------------------------- +-- line 336 ---------------------------------------- + . . . . /// methods. The parse methods return an abstract syntax tree. + . . . . /// + . . . . /// To set configuration options on the parser, use [`ParserBuilder`]. + . . . . pub fn new() -> Parser { + . . . . ParserBuilder::new().build() + . . . . } + . . . . + . . . . /// Parse the regular expression into an abstract syntax tree. + 648 ( 0.00%) . . . pub fn parse(&mut self, pattern: &str) -> Result { + . . . . ParserI::new(self, pattern).parse() + 729 ( 0.00%) . . . } + . . . . + . . . . /// Parse the regular expression and return an abstract syntax tree with + . . . . /// all of the comments found in the pattern. + . . . . pub fn parse_with_comments( + . . . . &mut self, + . . . . pattern: &str, + . . . . ) -> Result { + . . . . ParserI::new(self, pattern).parse_with_comments() +-- line 354 ---------------------------------------- +-- line 358 ---------------------------------------- + . . . . /// + . . . . /// This is called at the beginning of every parse. This prevents the + . . . . /// parser from running with inconsistent state (say, if a previous + . . . . /// invocation returned an error and the parser is reused). + . . . . fn reset(&self) { + . . . . // These settings should be in line with the construction + . . . . // in `ParserBuilder::build`. + . . . . self.pos.set(Position { offset: 0, line: 1, column: 1 }); + 81 ( 0.00%) . . . self.ignore_whitespace.set(self.initial_ignore_whitespace); + . . . . self.comments.borrow_mut().clear(); + . . . . self.stack_group.borrow_mut().clear(); + . . . . self.stack_class.borrow_mut().clear(); + . . . . } + . . . . } + . . . . + . . . . impl<'s, P: Borrow> ParserI<'s, P> { + . . . . /// Build an internal parser from a parser configuration and a pattern. + . . . . fn new(parser: P, pattern: &'s str) -> ParserI<'s, P> { + 243 ( 0.00%) . . . ParserI { parser, pattern } + . . . . } + . . . . + . . . . /// Return a reference to the parser state. + . . . . fn parser(&self) -> &Parser { + . . . . self.parser.borrow() + . . . . } + . . . . + . . . . /// Return a reference to the pattern being parsed. +-- line 384 ---------------------------------------- +-- line 391 ---------------------------------------- + . . . . ast::Error { kind, pattern: self.pattern().to_string(), span } + . . . . } + . . . . + . . . . /// Return the current offset of the parser. + . . . . /// + . . . . /// The offset starts at `0` from the beginning of the regular expression + . . . . /// pattern string. + . . . . fn offset(&self) -> usize { + 586 ( 0.00%) . . . self.parser().pos.get().offset + . . . . } + . . . . + . . . . /// Return the current line number of the parser. + . . . . /// + . . . . /// The line number starts at `1`. + . . . . fn line(&self) -> usize { + . . . . self.parser().pos.get().line + . . . . } +-- line 407 ---------------------------------------- +-- line 450 ---------------------------------------- + . . . . /// Return whether the parser should ignore whitespace or not. + . . . . fn ignore_whitespace(&self) -> bool { + . . . . self.parser().ignore_whitespace.get() + . . . . } + . . . . + . . . . /// Return the character at the current position of the parser. + . . . . /// + . . . . /// This panics if the current position does not point to a valid char. + 981,248 ( 0.28%) . . . fn char(&self) -> char { +1,471,872 ( 0.43%) . . . self.char_at(self.offset()) + 981,248 ( 0.28%) . . . } + . . . . + . . . . /// Return the character at the given position. + . . . . /// + . . . . /// This panics if the given position does not point to a valid char. + . . . . fn char_at(&self, i: usize) -> char { + . . . . self.pattern()[i..] + . . . . .chars() + . . . . .next() + . . . . .unwrap_or_else(|| panic!("expected char at offset {}", i)) + . . . . } + . . . . + . . . . /// Bump the parser to the next Unicode scalar value. + . . . . /// + . . . . /// If the end of the input has been reached, then `false` is returned. + 646,961 ( 0.19%) . . . fn bump(&self) -> bool { + 92,423 ( 0.03%) . . . if self.is_eof() { + . . . . return false; + . . . . } + . . . . let Position { mut offset, mut line, mut column } = self.pos(); + 277,269 ( 0.08%) . . . if self.char() == '\n' { +1,848,736 ( 0.53%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (92,423x) + . . . . line = line.checked_add(1).unwrap(); + . . . . column = 1; + . . . . } else { + . . . . column = column.checked_add(1).unwrap(); + . . . . } + 184,846 ( 0.05%) . . . offset += self.char().len_utf8(); +1,848,736 ( 0.53%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (92,423x) + . . . . self.parser().pos.set(Position { offset, line, column }); + 92,423 ( 0.03%) . . . self.pattern()[self.offset()..].chars().next().is_some() + 739,384 ( 0.21%) . . . } + . . . . + . . . . /// If the substring starting at the current position of the parser has + . . . . /// the given prefix, then bump the parser to the character immediately + . . . . /// following the prefix and return true. Otherwise, don't bump the parser + . . . . /// and return false. + . . . . fn bump_if(&self, prefix: &str) -> bool { + 6,015 ( 0.00%) . . . if self.pattern()[self.offset()..].starts_with(prefix) { + . . . . for _ in 0..prefix.chars().count() { + 6,636 ( 0.00%) . . . self.bump(); + 158,242 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,778x) + . . . . } + . . . . true + . . . . } else { + . . . . false + . . . . } + . . . . } + . . . . + . . . . /// Returns true if and only if the parser is positioned at a look-around +-- line 506 ---------------------------------------- +-- line 515 ---------------------------------------- + . . . . || self.bump_if("?!") + . . . . || self.bump_if("?<=") + . . . . || self.bump_if("? bool { + 13,910 ( 0.00%) . . . if !self.bump() { + 21,271 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (239x) + . . . . return false; + . . . . } + 6,954 ( 0.00%) . . . self.bump_space(); + 4,302 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (239x) + . . . . !self.is_eof() + 478 ( 0.00%) . . . } + . . . . + . . . . /// If the `x` flag is enabled (i.e., whitespace insensitivity with + . . . . /// comments), then this will advance the parser through all whitespace + . . . . /// and comments to the next non-whitespace non-comment byte. + . . . . /// + . . . . /// If the `x` flag is disabled, then this is a no-op. + . . . . /// + . . . . /// This should be used selectively throughout the parser where + . . . . /// arbitrary whitespace is permitted when the `x` flag is enabled. For + . . . . /// example, `{ 5 , 6}` is equivalent to `{5,6}`. + 625,569 ( 0.18%) . . . fn bump_space(&self) { + 178,734 ( 0.05%) . . . if !self.ignore_whitespace() { + . . . . return; + . . . . } + . . . . while !self.is_eof() { + . . . . if self.char().is_whitespace() { + . . . . self.bump(); + . . . . } else if self.char() == '#' { + . . . . let start = self.pos(); + . . . . let mut comment_text = String::new(); +-- line 549 ---------------------------------------- +-- line 560 ---------------------------------------- + . . . . span: Span::new(start, self.pos()), + . . . . comment: comment_text, + . . . . }; + . . . . self.parser().comments.borrow_mut().push(comment); + . . . . } else { + . . . . break; + . . . . } + . . . . } + 714,936 ( 0.21%) . . . } + . . . . + . . . . /// Peek at the next character in the input without advancing the parser. + . . . . /// + . . . . /// If the input has been exhausted, then this returns `None`. + . . . . fn peek(&self) -> Option { + . . . . if self.is_eof() { + . . . . return None; + . . . . } +-- line 576 ---------------------------------------- +-- line 600 ---------------------------------------- + . . . . break; + . . . . } + . . . . } + . . . . self.pattern()[start..].chars().next() + . . . . } + . . . . + . . . . /// Returns true if the next call to `bump` would return false. + . . . . fn is_eof(&self) -> bool { + 382,230 ( 0.11%) . . . self.offset() == self.pattern().len() + . . . . } + . . . . + . . . . /// Return the current position of the parser, which includes the offset, + . . . . /// line and column. + . . . . fn pos(&self) -> Position { + 7,182 ( 0.00%) . . . self.parser().pos.get() + . . . . } + . . . . + . . . . /// Create a span at the current position of the parser. Both the start + . . . . /// and end of the span are set. + . . . . fn span(&self) -> Span { + . . . . Span::splat(self.pos()) + . . . . } + . . . . + . . . . /// Create a span that covers the current character. + . . . . fn span_char(&self) -> Span { + . . . . let mut next = Position { + 107,261 ( 0.03%) . . . offset: self.offset().checked_add(self.char().len_utf8()).unwrap(), + 14,244 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (713x) + . . . . line: self.line(), + . . . . column: self.column().checked_add(1).unwrap(), + . . . . }; + 417,701 ( 0.12%) . . . if self.char() == '\n' { + 14,244 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (713x) + . . . . next.line += 1; + . . . . next.column = 1; + . . . . } + . . . . Span::new(self.pos(), next) + . . . . } + . . . . + . . . . /// Parse and push a single alternation on to the parser's internal stack. + . . . . /// If the top of the stack already has an alternation, then add to that +-- line 638 ---------------------------------------- +-- line 639 ---------------------------------------- + . . . . /// instead of pushing a new one. + . . . . /// + . . . . /// The concatenation given corresponds to a single alternation branch. + . . . . /// The concatenation returned starts the next branch and is empty. + . . . . /// + . . . . /// This assumes the parser is currently positioned at `|` and will advance + . . . . /// the parser to the character following `|`. + . . . . #[inline(never)] + 159,290 ( 0.05%) . . . fn push_alternate(&self, mut concat: ast::Concat) -> Result { + 79,645 ( 0.02%) . . . assert_eq!(self.char(), '|'); + 318,580 ( 0.09%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (15,929x) + 15,929 ( 0.00%) . . . concat.span.end = self.pos(); + 191,148 ( 0.06%) . . . self.push_or_add_alternation(concat); + 31,858 ( 0.01%) . . . self.bump(); +1,417,681 ( 0.41%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (15,929x) + 63,716 ( 0.02%) . . . Ok(ast::Concat { span: self.span(), asts: vec![] }) + 127,432 ( 0.04%) . . . } + . . . . + . . . . /// Pushes or adds the given branch of an alternation to the parser's + . . . . /// internal stack of state. + . . . . fn push_or_add_alternation(&self, concat: ast::Concat) { + . . . . use self::GroupState::*; + . . . . + . . . . let mut stack = self.parser().stack_group.borrow_mut(); + 31,858 ( 0.01%) . . . if let Some(&mut Alternation(ref mut alts)) = stack.last_mut() { + 32,279 ( 0.01%) . . . alts.asts.push(concat.into_ast()); +3,577,023 ( 1.03%) 21,174 ( 2.61%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (15,417x) + . . . . return; + . . . . } + 3,072 ( 0.00%) . . . stack.push(Alternation(ast::Alternation { + 2,048 ( 0.00%) . . . span: Span::new(concat.span.start, self.pos()), + 2,048 ( 0.00%) . . . asts: vec![concat.into_ast()], + 101,567 ( 0.03%) 488 ( 0.06%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (512x) + . . . . })); + 15,929 ( 0.00%) . . . } + . . . . + . . . . /// Parse and push a group AST (and its parent concatenation) on to the + . . . . /// parser's internal stack. Return a fresh concatenation corresponding + . . . . /// to the group's sub-AST. + . . . . /// + . . . . /// If a set of flags was found (with no group), then the concatenation + . . . . /// is returned with that set of flags added. + . . . . /// + . . . . /// This assumes that the parser is currently positioned on the opening + . . . . /// parenthesis. It advances the parser to the character at the start + . . . . /// of the sub-expression (or adjoining expression). + . . . . /// + . . . . /// If there was a problem parsing the start of the group, then an error + . . . . /// is returned. + . . . . #[inline(never)] + 7,130 ( 0.00%) . . . fn push_group(&self, mut concat: ast::Concat) -> Result { + 3,565 ( 0.00%) . . . assert_eq!(self.char(), '('); + 14,244 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (713x) + 3,565 ( 0.00%) . . . match self.parse_group()? { +1,447,519 ( 0.42%) 689 ( 0.09%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_group (713x) + . . . . Either::Left(set) => { + . . . . let ignore = set.flags.flag_state(ast::Flag::IgnoreWhitespace); + . . . . if let Some(v) = ignore { + . . . . self.parser().ignore_whitespace.set(v); + . . . . } + . . . . + 10 ( 0.00%) . . . concat.asts.push(Ast::flags(set)); + 200 ( 0.00%) . . . Ok(concat) + . . . . } + . . . . Either::Right(group) => { + 693 ( 0.00%) . . . let old_ignore_whitespace = self.ignore_whitespace(); + . . . . let new_ignore_whitespace = group + . . . . .flags() + . . . . .and_then(|f| f.flag_state(ast::Flag::IgnoreWhitespace)) + . . . . .unwrap_or(old_ignore_whitespace); + 81 ( 0.00%) . . . self.parser().stack_group.borrow_mut().push( + 6,930 ( 0.00%) . . . GroupState::Group { + . . . . concat, + . . . . group, + . . . . ignore_whitespace: old_ignore_whitespace, + . . . . }, + . . . . ); + . . . . self.parser().ignore_whitespace.set(new_ignore_whitespace); + 2,079 ( 0.00%) . . . Ok(ast::Concat { span: self.span(), asts: vec![] }) + . . . . } + . . . . } + 5,704 ( 0.00%) . . . } + . . . . + . . . . /// Pop a group AST from the parser's internal stack and set the group's + . . . . /// AST to the given concatenation. Return the concatenation containing + . . . . /// the group. + . . . . /// + . . . . /// This assumes that the parser is currently positioned on the closing + . . . . /// parenthesis and advances the parser to the character following the `)`. + . . . . /// + . . . . /// If no such group could be popped, then an unopened group error is + . . . . /// returned. + . . . . #[inline(never)] + 6,930 ( 0.00%) . . . fn pop_group(&self, mut group_concat: ast::Concat) -> Result { + . . . . use self::GroupState::*; + . . . . + 3,465 ( 0.00%) . . . assert_eq!(self.char(), ')'); + 13,860 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (693x) + 693 ( 0.00%) . . . let mut stack = self.parser().stack_group.borrow_mut(); + 24,948 ( 0.01%) . . . let (mut prior_concat, mut group, ignore_whitespace, alt) = match stack + . . . . .pop() + . . . . { + 5,249 ( 0.00%) . . . Some(Group { concat, group, ignore_whitespace }) => { + . . . . (concat, group, ignore_whitespace, None) + . . . . } + 3,072 ( 0.00%) . . . Some(Alternation(alt)) => match stack.pop() { + 14,848 ( 0.00%) . . . Some(Group { concat, group, ignore_whitespace }) => { + 3,584 ( 0.00%) . . . (concat, group, ignore_whitespace, Some(alt)) + . . . . } + . . . . None | Some(Alternation(_)) => { + . . . . return Err(self.error( + . . . . self.span_char(), + . . . . ast::ErrorKind::GroupUnopened, + . . . . )); + . . . . } + . . . . }, + . . . . None => { + . . . . return Err(self + . . . . .error(self.span_char(), ast::ErrorKind::GroupUnopened)); + . . . . } + . . . . }; + . . . . self.parser().ignore_whitespace.set(ignore_whitespace); + 2,772 ( 0.00%) . . . group_concat.span.end = self.pos(); + 693 ( 0.00%) . . . self.bump(); + 61,445 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (693x) + . . . . group.span.end = self.pos(); + 1,386 ( 0.00%) . . . match alt { + 4,096 ( 0.00%) . . . Some(mut alt) => { + 2,048 ( 0.00%) . . . alt.span.end = group_concat.span.end; + 7,680 ( 0.00%) . . . alt.asts.push(group_concat.into_ast()); + 111,302 ( 0.03%) 575 ( 0.07%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (512x) + 6,144 ( 0.00%) . . . group.ast = Box::new(alt.into_ast()); + 106,628 ( 0.03%) 584 ( 0.07%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Alternation::into_ast (512x) + . . . . } + . . . . None => { + 2,172 ( 0.00%) . . . group.ast = Box::new(group_concat.into_ast()); + 45,733 ( 0.01%) 260 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (181x) + . . . . } + . . . . } + . . . . prior_concat.asts.push(Ast::group(group)); + 6,930 ( 0.00%) . . . Ok(prior_concat) + 5,544 ( 0.00%) . . . } + . . . . + . . . . /// Pop the last state from the parser's internal stack, if it exists, and + . . . . /// add the given concatenation to it. There either must be no state or a + . . . . /// single alternation item on the stack. Any other scenario produces an + . . . . /// error. + . . . . /// + . . . . /// This assumes that the parser has advanced to the end. + . . . . #[inline(never)] + 567 ( 0.00%) . . . fn pop_group_end(&self, mut concat: ast::Concat) -> Result { + 405 ( 0.00%) . . . concat.span.end = self.pos(); + . . . . let mut stack = self.parser().stack_group.borrow_mut(); + . . . . let ast = match stack.pop() { + 1,134 ( 0.00%) . . . None => Ok(concat.into_ast()), + 23,172 ( 0.01%) 134 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Concat::into_ast (81x) + . . . . Some(GroupState::Alternation(mut alt)) => { + . . . . alt.span.end = self.pos(); + . . . . alt.asts.push(concat.into_ast()); + . . . . Ok(Ast::alternation(alt)) + . . . . } + . . . . Some(GroupState::Group { group, .. }) => { + . . . . return Err( + . . . . self.error(group.span, ast::ErrorKind::GroupUnclosed) + . . . . ); + . . . . } + . . . . }; + . . . . // If we try to pop again, there should be nothing. + . . . . match stack.pop() { + 1,296 ( 0.00%) . . . None => ast, + . . . . Some(GroupState::Alternation(_)) => { + . . . . // This unreachable is unfortunate. This case can't happen + . . . . // because the only way we can be here is if there were two + . . . . // `GroupState::Alternation`s adjacent in the parser's stack, + . . . . // which we guarantee to never happen because we never push a + . . . . // `GroupState::Alternation` if one is already at the top of + . . . . // the stack. + . . . . unreachable!() + . . . . } + . . . . Some(GroupState::Group { group, .. }) => { + . . . . Err(self.error(group.span, ast::ErrorKind::GroupUnclosed)) + . . . . } + . . . . } + 648 ( 0.00%) . . . } + . . . . + . . . . /// Parse the opening of a character class and push the current class + . . . . /// parsing context onto the parser's stack. This assumes that the parser + . . . . /// is positioned at an opening `[`. The given union should correspond to + . . . . /// the union of set items built up before seeing the `[`. + . . . . /// + . . . . /// If there was a problem parsing the opening of the class, then an error + . . . . /// is returned. Otherwise, a new union of set items for the class is + . . . . /// returned (which may be populated with either a `]` or a `-`). + . . . . #[inline(never)] + 25,416 ( 0.01%) . . . fn push_class_open( + . . . . &self, + . . . . parent_union: ast::ClassSetUnion, + . . . . ) -> Result { + 14,120 ( 0.00%) . . . assert_eq!(self.char(), '['); + 56,432 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,824x) + . . . . + 50,832 ( 0.01%) . . . let (nested_set, nested_union) = self.parse_set_class_open()?; + 850,317 ( 0.25%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_open (2,824x) + 2,824 ( 0.00%) . . . self.parser() + . . . . .stack_class + . . . . .borrow_mut() + . . . . .push(ClassState::Open { union: parent_union, set: nested_set }); + 31,064 ( 0.01%) . . . Ok(nested_union) + 19,768 ( 0.01%) . . . } + . . . . + . . . . /// Parse the end of a character class set and pop the character class + . . . . /// parser stack. The union given corresponds to the last union built + . . . . /// before seeing the closing `]`. The union returned corresponds to the + . . . . /// parent character class set with the nested class added to it. + . . . . /// + . . . . /// This assumes that the parser is positioned at a `]` and will advance + . . . . /// the parser to the byte immediately following the `]`. +-- line 841 ---------------------------------------- +-- line 842 ---------------------------------------- + . . . . /// + . . . . /// If the stack is empty after popping, then this returns the final + . . . . /// "top-level" character class AST (where a "top-level" character class + . . . . /// is one that is not nested inside any other character class). + . . . . /// + . . . . /// If there is no corresponding opening bracket on the parser's stack, + . . . . /// then an error is returned. + . . . . #[inline(never)] + 28,240 ( 0.01%) . . . fn pop_class( + . . . . &self, + . . . . nested_union: ast::ClassSetUnion, + . . . . ) -> Result> { + 14,120 ( 0.00%) . . . assert_eq!(self.char(), ']'); + 56,480 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,824x) + . . . . + . . . . let item = ast::ClassSet::Item(nested_union.into_item()); + 8,472 ( 0.00%) . . . let prevset = self.pop_class_op(item); + 516,792 ( 0.15%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class_op (2,824x) + . . . . let mut stack = self.parser().stack_class.borrow_mut(); + 11,296 ( 0.00%) . . . match stack.pop() { + . . . . None => { + . . . . // We can never observe an empty stack: + . . . . // + . . . . // 1) We are guaranteed to start with a non-empty stack since + . . . . // the character class parser is only initiated when it sees + . . . . // a `[`. + . . . . // 2) If we ever observe an empty stack while popping after + . . . . // seeing a `]`, then we signal the character class parser +-- line 867 ---------------------------------------- +-- line 872 ---------------------------------------- + . . . . // This panic is unfortunate, but this case is impossible + . . . . // since we already popped the Op state if one exists above. + . . . . // Namely, every push to the class parser stack is guarded by + . . . . // whether an existing Op is already on the top of the stack. + . . . . // If it is, the existing Op is modified. That is, the stack + . . . . // can never have consecutive Op states. + . . . . panic!("unexpected ClassState::Op") + . . . . } + 42,360 ( 0.01%) . . . Some(ClassState::Open { mut union, mut set }) => { + 84,720 ( 0.02%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) + 5,648 ( 0.00%) . . . self.bump(); + 251,256 ( 0.07%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (2,824x) + . . . . set.span.end = self.pos(); + 19,768 ( 0.01%) . . . set.kind = prevset; + 84,720 ( 0.02%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) + 172,264 ( 0.05%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (2,824x) + 2,824 ( 0.00%) . . . if stack.is_empty() { + 8,259 ( 0.00%) . . . Ok(Either::Right(set)) + 82,590 ( 0.02%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,753x) + . . . . } else { + 142 ( 0.00%) . . . union.push(ast::ClassSetItem::Bracketed(Box::new(set))); + 2,130 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (71x) + 923 ( 0.00%) . . . Ok(Either::Left(union)) + . . . . } + . . . . } + . . . . } + 22,592 ( 0.01%) . . . } + . . . . + . . . . /// Return an "unclosed class" error whose span points to the most + . . . . /// recently opened class. + . . . . /// + . . . . /// This should only be called while parsing a character class. + . . . . #[inline(never)] + . . . . fn unclosed_class_error(&self) -> ast::Error { + . . . . for state in self.parser().stack_class.borrow().iter().rev() { +-- line 900 ---------------------------------------- +-- line 928 ---------------------------------------- + . . . . } + . . . . + . . . . /// Pop a character class set from the character class parser stack. If the + . . . . /// top of the stack is just an item (not an operation), then return the + . . . . /// given set unchanged. If the top of the stack is an operation, then the + . . . . /// given set will be used as the rhs of the operation on the top of the + . . . . /// stack. In that case, the binary operation is returned as a set. + . . . . #[inline(never)] + 22,592 ( 0.01%) . . . fn pop_class_op(&self, rhs: ast::ClassSet) -> ast::ClassSet { + . . . . let mut stack = self.parser().stack_class.borrow_mut(); + 11,296 ( 0.00%) . . . let (kind, lhs) = match stack.pop() { + . . . . Some(ClassState::Op { kind, lhs }) => (kind, lhs), + 50,832 ( 0.01%) . . . Some(state @ ClassState::Open { .. }) => { + 84,720 ( 0.02%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) + . . . . stack.push(state); + 14,120 ( 0.00%) . . . return rhs; + 84,720 ( 0.02%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (2,824x) + . . . . } + . . . . None => unreachable!(), + . . . . }; + . . . . let span = Span::new(lhs.span().start, rhs.span().end); + . . . . ast::ClassSet::BinaryOp(ast::ClassSetBinaryOp { + . . . . span, + . . . . kind, + . . . . lhs: Box::new(lhs), + . . . . rhs: Box::new(rhs), + . . . . }) + 25,416 ( 0.01%) . . . } + . . . . } + . . . . + . . . . impl<'s, P: Borrow> ParserI<'s, P> { + . . . . /// Parse the regular expression into an abstract syntax tree. + . . . . fn parse(&self) -> Result { + 81 ( 0.00%) . . . self.parse_with_comments().map(|astc| astc.ast) +59,197,629 (17.10%) 142,225 (17.56%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_with_comments (81x) + . . . . } + . . . . + . . . . /// Parse the regular expression and return an abstract syntax tree with + . . . . /// all of the comments found in the pattern. + 567 ( 0.00%) . . . fn parse_with_comments(&self) -> Result { + 324 ( 0.00%) . . . assert_eq!(self.offset(), 0, "parser can only be used once"); + . . . . self.parser().reset(); + 1,053 ( 0.00%) . . . let mut concat = ast::Concat { span: self.span(), asts: vec![] }; + . . . . loop { + 143,322 ( 0.04%) . . . self.bump_space(); +1,289,898 ( 0.37%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (71,661x) + 71,661 ( 0.02%) . . . if self.is_eof() { + . . . . break; + . . . . } + 502,156 ( 0.15%) . . . match self.char() { +1,431,276 ( 0.41%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (71,580x) + 10,695 ( 0.00%) . . . '(' => concat = self.push_group(concat)?, +1,561,216 ( 0.45%) 691 ( 0.09%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_group (713x) + 10,395 ( 0.00%) . . . ')' => concat = self.pop_group(concat)?, + 922,916 ( 0.27%) 2,262 ( 0.28%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group (693x) + 238,935 ( 0.07%) . . . '|' => concat = self.push_alternate(concat)?, +7,601,358 ( 2.20%) 26,127 ( 3.23%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_alternate (15,929x) + . . . . '[' => { + 52,307 ( 0.02%) . . . let class = self.parse_set_class()?; +8,247,277 ( 2.38%) 1,236 ( 0.15%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class (2,753x) + . . . . concat.asts.push(Ast::class_bracketed(class)); + . . . . } + . . . . '?' => { + . . . . concat = self.parse_uncounted_repetition( + 16,370 ( 0.00%) . . . concat, + 1,637 ( 0.00%) . . . ast::RepetitionKind::ZeroOrOne, + . . . . )?; + . . . . } + . . . . '*' => { + . . . . concat = self.parse_uncounted_repetition( + 170 ( 0.00%) . . . concat, + 34 ( 0.00%) . . . ast::RepetitionKind::ZeroOrMore, + . . . . )?; + . . . . } + . . . . '+' => { + . . . . concat = self.parse_uncounted_repetition( + 590 ( 0.00%) . . . concat, + 118 ( 0.00%) . . . ast::RepetitionKind::OneOrMore, + . . . . )?; + . . . . } + . . . . '{' => { + 2,580 ( 0.00%) . . . concat = self.parse_counted_repetition(concat)?; + 250,967 ( 0.07%) 134 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_counted_repetition (172x) + . . . . } + . . . . _ => concat.asts.push(self.parse_primitive()?.into_ast()), + . . . . } + . . . . } + 1,458 ( 0.00%) . . . let ast = self.pop_group_end(concat)?; + 28,437 ( 0.01%) 134 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_group_end (81x) + 162 ( 0.00%) . . . NestLimiter::new(self).check(&ast)?; +5,820,805 ( 1.68%) 301 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::NestLimiter

::check (81x) + 162 ( 0.00%) . . . Ok(ast::WithComments { + 81 ( 0.00%) . . . ast, + . . . . comments: mem::replace( + . . . . &mut *self.parser().comments.borrow_mut(), + . . . . vec![], + . . . . ), + . . . . }) + 648 ( 0.00%) . . . } + . . . . + . . . . /// Parses an uncounted repetition operation. An uncounted repetition + . . . . /// operator includes ?, * and +, but does not include the {m,n} syntax. + . . . . /// The given `kind` should correspond to the operator observed by the + . . . . /// caller. + . . . . /// + . . . . /// This assumes that the parser is currently positioned at the repetition + . . . . /// operator and advances the parser to the first character after the + . . . . /// operator. (Note that the operator may include a single additional `?`, + . . . . /// which makes the operator ungreedy.) + . . . . /// + . . . . /// The caller should include the concatenation that is being built. The + . . . . /// concatenation returned includes the repetition operator applied to the + . . . . /// last expression in the given concatenation. + . . . . #[inline(never)] + 18,843 ( 0.01%) . . . fn parse_uncounted_repetition( + . . . . &self, + . . . . mut concat: ast::Concat, + . . . . kind: ast::RepetitionKind, + . . . . ) -> Result { + 59 ( 0.00%) . . . assert!( + 7,333 ( 0.00%) . . . self.char() == '?' || self.char() == '*' || self.char() == '+' + 36,960 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (1,848x) + . . . . ); + 1,713 ( 0.00%) . . . let op_start = self.pos(); + 1,713 ( 0.00%) . . . let ast = match concat.asts.pop() { + 3,426 ( 0.00%) . . . Some(ast) => ast, + . . . . None => { + . . . . return Err( + . . . . self.error(self.span(), ast::ErrorKind::RepetitionMissing) + . . . . ) + . . . . } + . . . . }; + 3,426 ( 0.00%) . . . match ast { + . . . . Ast::Empty(_) | Ast::Flags(_) => { + . . . . return Err( + . . . . self.error(self.span(), ast::ErrorKind::RepetitionMissing) + . . . . ) + . . . . } + . . . . _ => {} + . . . . } + . . . . let mut greedy = true; + 17,118 ( 0.00%) . . . if self.bump() && self.char() == '?' { + 152,445 ( 0.04%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,713x) + 34,200 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (1,710x) + . . . . greedy = false; + . . . . self.bump(); + . . . . } + 23,982 ( 0.01%) . . . concat.asts.push(Ast::repetition(ast::Repetition { + . . . . span: ast.span().with_end(self.pos()), + 6,852 ( 0.00%) . . . op: ast::RepetitionOp { + 6,852 ( 0.00%) . . . span: Span::new(op_start, self.pos()), + . . . . kind, + . . . . }, + . . . . greedy, + . . . . ast: Box::new(ast), + . . . . })); + 18,843 ( 0.01%) . . . Ok(concat) + 13,704 ( 0.00%) . . . } + . . . . + . . . . /// Parses a counted repetition operation. A counted repetition operator + . . . . /// corresponds to the {m,n} syntax, and does not include the ?, * or + + . . . . /// operators. + . . . . /// + . . . . /// This assumes that the parser is currently positioned at the opening `{` + . . . . /// and advances the parser to the first character after the operator. + . . . . /// (Note that the operator may include a single additional `?`, which + . . . . /// makes the operator ungreedy.) + . . . . /// + . . . . /// The caller should include the concatenation that is being built. The + . . . . /// concatenation returned includes the repetition operator applied to the + . . . . /// last expression in the given concatenation. + . . . . #[inline(never)] + 1,720 ( 0.00%) . . . fn parse_counted_repetition( + . . . . &self, + . . . . mut concat: ast::Concat, + . . . . ) -> Result { + 688 ( 0.00%) . . . assert!(self.char() == '{'); + 3,440 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (172x) + 172 ( 0.00%) . . . let start = self.pos(); + 172 ( 0.00%) . . . let ast = match concat.asts.pop() { + 344 ( 0.00%) . . . Some(ast) => ast, + . . . . None => { + . . . . return Err( + . . . . self.error(self.span(), ast::ErrorKind::RepetitionMissing) + . . . . ) + . . . . } + . . . . }; + 344 ( 0.00%) . . . match ast { + . . . . Ast::Empty(_) | Ast::Flags(_) => { + . . . . return Err( + . . . . self.error(self.span(), ast::ErrorKind::RepetitionMissing) + . . . . ) + . . . . } + . . . . _ => {} + . . . . } + 172 ( 0.00%) . . . if !self.bump_and_bump_space() { + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::RepetitionCountUnclosed, + . . . . )); + . . . . } + 344 ( 0.00%) . . . let count_start = specialize_err( + 5,676 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::specialize_err (172x) + 516 ( 0.00%) . . . self.parse_decimal(), + 78,456 ( 0.02%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (172x) + 172 ( 0.00%) . . . ast::ErrorKind::DecimalEmpty, + 688 ( 0.00%) . . . ast::ErrorKind::RepetitionCountDecimalEmpty, + . . . . )?; + . . . . let mut range = ast::RepetitionRange::Exactly(count_start); + 172 ( 0.00%) . . . if self.is_eof() { + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::RepetitionCountUnclosed, + . . . . )); + . . . . } + 1,032 ( 0.00%) . . . if self.char() == ',' { + 3,440 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (172x) + 268 ( 0.00%) . . . if !self.bump_and_bump_space() { + 8,040 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_and_bump_space (67x) + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::RepetitionCountUnclosed, + . . . . )); + . . . . } + 268 ( 0.00%) . . . if self.char() != '}' { + 1,340 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (67x) + 134 ( 0.00%) . . . let count_end = specialize_err( + 2,211 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::specialize_err (67x) + 134 ( 0.00%) . . . self.parse_decimal(), + 27,943 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_decimal (67x) + 67 ( 0.00%) . . . ast::ErrorKind::DecimalEmpty, + 268 ( 0.00%) . . . ast::ErrorKind::RepetitionCountDecimalEmpty, + . . . . )?; + . . . . range = ast::RepetitionRange::Bounded(count_start, count_end); + . . . . } else { + . . . . range = ast::RepetitionRange::AtLeast(count_start); + . . . . } + . . . . } + 1,032 ( 0.00%) . . . if self.is_eof() || self.char() != '}' { + 3,440 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (172x) + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::RepetitionCountUnclosed, + . . . . )); + . . . . } + . . . . + . . . . let mut greedy = true; + 1,720 ( 0.00%) . . . if self.bump_and_bump_space() && self.char() == '?' { + 20,640 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_and_bump_space (172x) + 3,440 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (172x) + . . . . greedy = false; + . . . . self.bump(); + . . . . } + . . . . + 688 ( 0.00%) . . . let op_span = Span::new(start, self.pos()); + 172 ( 0.00%) . . . if !range.is_valid() { + . . . . return Err( + . . . . self.error(op_span, ast::ErrorKind::RepetitionCountInvalid) + . . . . ); + . . . . } + 1,892 ( 0.00%) . . . concat.asts.push(Ast::repetition(ast::Repetition { + 23,583 ( 0.01%) 80 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::repetition (172x) + 3,096 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::push (172x) + 172 ( 0.00%) . . . span: ast.span().with_end(self.pos()), + 1,204 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::span (172x) + . . . . op: ast::RepetitionOp { + 1,032 ( 0.00%) . . . span: op_span, + . . . . kind: ast::RepetitionKind::Range(range), + . . . . }, + . . . . greedy, + . . . . ast: Box::new(ast), + . . . . })); + 2,064 ( 0.00%) . . . Ok(concat) + 1,376 ( 0.00%) . . . } + . . . . + . . . . /// Parse a group (which contains a sub-expression) or a set of flags. + . . . . /// + . . . . /// If a group was found, then it is returned with an empty AST. If a set + . . . . /// of flags is found, then that set is returned. + . . . . /// + . . . . /// The parser should be positioned at the opening parenthesis. + . . . . /// +-- line 1180 ---------------------------------------- +-- line 1185 ---------------------------------------- + . . . . /// # Errors + . . . . /// + . . . . /// If flags are given and incorrectly specified, then a corresponding + . . . . /// error is returned. + . . . . /// + . . . . /// If a capture name is given and it is incorrectly specified, then a + . . . . /// corresponding error is returned. + . . . . #[inline(never)] + 6,417 ( 0.00%) . . . fn parse_group(&self) -> Result> { + 3,565 ( 0.00%) . . . assert_eq!(self.char(), '('); + 14,244 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (713x) + . . . . let open_span = self.span_char(); + 1,426 ( 0.00%) . . . self.bump(); + 63,425 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (713x) + 1,426 ( 0.00%) . . . self.bump_space(); + 12,834 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (713x) + . . . . if self.is_lookaround_prefix() { + . . . . return Err(self.error( + . . . . Span::new(open_span.start, self.span().end), + . . . . ast::ErrorKind::UnsupportedLookAround, + . . . . )); + . . . . } + . . . . let inner_span = self.span(); + . . . . let mut starts_with_p = true; + . . . . if self.bump_if("?P<") || { + . . . . starts_with_p = false; + . . . . self.bump_if("?<") + . . . . } { + . . . . let capture_index = self.next_capture_index(open_span)?; + 4,102 ( 0.00%) . . . let name = self.parse_capture_name(capture_index)?; + 843,071 ( 0.24%) 314 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_capture_name (586x) + 15,822 ( 0.00%) . . . Ok(Either::Right(ast::Group { + . . . . span: open_span, + 2,930 ( 0.00%) . . . kind: ast::GroupKind::CaptureName { starts_with_p, name }, + 1,758 ( 0.00%) . . . ast: Box::new(Ast::empty(self.span())), + 42,661 ( 0.01%) 12 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::empty (586x) + . . . . })) + . . . . } else if self.bump_if("?") { + 20 ( 0.00%) . . . if self.is_eof() { + . . . . return Err( + . . . . self.error(open_span, ast::ErrorKind::GroupUnclosed) + . . . . ); + . . . . } + 160 ( 0.00%) . . . let flags = self.parse_flags()?; + 16,800 ( 0.00%) 20 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_flags (20x) + 80 ( 0.00%) . . . let char_end = self.char(); + 400 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (20x) + 40 ( 0.00%) . . . self.bump(); + 1,780 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (20x) + 40 ( 0.00%) . . . if char_end == ')' { + . . . . // We don't allow empty flags, e.g., `(?)`. We instead + . . . . // interpret it as a repetition operator missing its argument. + 20 ( 0.00%) . . . if flags.items.is_empty() { + . . . . return Err(self.error( + . . . . inner_span, + . . . . ast::ErrorKind::RepetitionMissing, + . . . . )); + . . . . } + 240 ( 0.00%) . . . Ok(Either::Left(ast::SetFlags { + 80 ( 0.00%) . . . span: Span { end: self.pos(), ..open_span }, + 140 ( 0.00%) . . . flags, + . . . . })) + . . . . } else { + . . . . assert_eq!(char_end, ':'); + . . . . Ok(Either::Right(ast::Group { + . . . . span: open_span, + . . . . kind: ast::GroupKind::NonCapturing(flags), + . . . . ast: Box::new(Ast::empty(self.span())), + . . . . })) + . . . . } + . . . . } else { + . . . . let capture_index = self.next_capture_index(open_span)?; + 1,605 ( 0.00%) . . . Ok(Either::Right(ast::Group { + . . . . span: open_span, + . . . . kind: ast::GroupKind::CaptureIndex(capture_index), + 321 ( 0.00%) . . . ast: Box::new(Ast::empty(self.span())), + 10,237 ( 0.00%) 24 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/mod.rs:regex_syntax::ast::Ast::empty (107x) + . . . . })) + . . . . } + 5,704 ( 0.00%) . . . } + . . . . + . . . . /// Parses a capture group name. Assumes that the parser is positioned at + . . . . /// the first character in the name following the opening `<` (and may + . . . . /// possibly be EOF). This advances the parser to the first character + . . . . /// following the closing `>`. + . . . . /// + . . . . /// The caller must provide the capture index of the group for this name. + . . . . #[inline(never)] + 5,274 ( 0.00%) . . . fn parse_capture_name( + . . . . &self, + . . . . capture_index: u32, + . . . . ) -> Result { + 586 ( 0.00%) . . . if self.is_eof() { + . . . . return Err(self + . . . . .error(self.span(), ast::ErrorKind::GroupNameUnexpectedEof)); + . . . . } + . . . . let start = self.pos(); + . . . . loop { + 13,692 ( 0.00%) . . . if self.char() == '>' { + 68,460 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (3,423x) + . . . . break; + . . . . } + 8,511 ( 0.00%) . . . if !is_capture_char(self.char(), self.pos() == start) { + 56,740 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,837x) + . . . . return Err(self.error( + . . . . self.span_char(), + . . . . ast::ErrorKind::GroupNameInvalid, + . . . . )); + . . . . } + 11,348 ( 0.00%) . . . if !self.bump() { + 252,493 ( 0.07%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (2,837x) + . . . . break; + . . . . } + . . . . } + . . . . let end = self.pos(); + 586 ( 0.00%) . . . if self.is_eof() { + . . . . return Err(self + . . . . .error(self.span(), ast::ErrorKind::GroupNameUnexpectedEof)); + . . . . } + 2,930 ( 0.00%) . . . assert_eq!(self.char(), '>'); + 11,720 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (586x) + 1,172 ( 0.00%) . . . self.bump(); + 52,154 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (586x) + 586 ( 0.00%) . . . let name = &self.pattern()[start.offset..end.offset]; + 1,172 ( 0.00%) . . . if name.is_empty() { + . . . . return Err(self.error( + . . . . Span::new(start, start), + . . . . ast::ErrorKind::GroupNameEmpty, + . . . . )); + . . . . } + 5,274 ( 0.00%) . . . let capname = ast::CaptureName { + . . . . span: Span::new(start, end), + . . . . name: name.to_string(), + . . . . index: capture_index, + . . . . }; + . . . . self.add_capture_name(&capname)?; + 7,032 ( 0.00%) . . . Ok(capname) + 4,688 ( 0.00%) . . . } + . . . . + . . . . /// Parse a sequence of flags starting at the current character. + . . . . /// + . . . . /// This advances the parser to the character immediately following the + . . . . /// flags, which is guaranteed to be either `:` or `)`. + . . . . /// + . . . . /// # Errors + . . . . /// +-- line 1316 ---------------------------------------- +-- line 1317 ---------------------------------------- + . . . . /// If any flags are duplicated, then an error is returned. + . . . . /// + . . . . /// If the negation operator is used more than once, then an error is + . . . . /// returned. + . . . . /// + . . . . /// If no flags could be found or if the negation operation is not followed + . . . . /// by any flags, then an error is returned. + . . . . #[inline(never)] + 180 ( 0.00%) . . . fn parse_flags(&self) -> Result { + 80 ( 0.00%) . . . let mut flags = ast::Flags { span: self.span(), items: vec![] }; + . . . . let mut last_was_negation = None; + 450 ( 0.00%) . . . while self.char() != ':' && self.char() != ')' { + 2,000 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (100x) + 120 ( 0.00%) . . . if self.char() == '-' { + 600 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (30x) + . . . . last_was_negation = Some(self.span_char()); + . . . . let item = ast::FlagsItem { + . . . . span: self.span_char(), + . . . . kind: ast::FlagsItemKind::Negation, + . . . . }; + . . . . if let Some(i) = flags.add_item(item) { + . . . . return Err(self.error( + . . . . self.span_char(), + . . . . ast::ErrorKind::FlagRepeatedNegation { + . . . . original: flags.items[i].span, + . . . . }, + . . . . )); + . . . . } + . . . . } else { + . . . . last_was_negation = None; + 80 ( 0.00%) . . . let item = ast::FlagsItem { + . . . . span: self.span_char(), + 60 ( 0.00%) . . . kind: ast::FlagsItemKind::Flag(self.parse_flag()?), + 980 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_flag (20x) + . . . . }; + . . . . if let Some(i) = flags.add_item(item) { + . . . . return Err(self.error( + . . . . self.span_char(), + . . . . ast::ErrorKind::FlagDuplicate { + . . . . original: flags.items[i].span, + . . . . }, + . . . . )); + . . . . } + . . . . } + 120 ( 0.00%) . . . if !self.bump() { + 2,670 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (30x) + . . . . return Err( + . . . . self.error(self.span(), ast::ErrorKind::FlagUnexpectedEof) + . . . . ); + . . . . } + . . . . } + 60 ( 0.00%) . . . if let Some(span) = last_was_negation { + . . . . return Err(self.error(span, ast::ErrorKind::FlagDanglingNegation)); + . . . . } + . . . . flags.span.end = self.pos(); + 240 ( 0.00%) . . . Ok(flags) + 160 ( 0.00%) . . . } + . . . . + . . . . /// Parse the current character as a flag. Do not advance the parser. + . . . . /// + . . . . /// # Errors + . . . . /// + . . . . /// If the flag is not recognized, then an error is returned. + . . . . #[inline(never)] + 180 ( 0.00%) . . . fn parse_flag(&self) -> Result { + 100 ( 0.00%) . . . match self.char() { + 400 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (20x) + 40 ( 0.00%) . . . 'i' => Ok(ast::Flag::CaseInsensitive), + . . . . 'm' => Ok(ast::Flag::MultiLine), + . . . . 's' => Ok(ast::Flag::DotMatchesNewLine), + . . . . 'U' => Ok(ast::Flag::SwapGreed), + . . . . 'u' => Ok(ast::Flag::Unicode), + . . . . 'R' => Ok(ast::Flag::CRLF), + . . . . 'x' => Ok(ast::Flag::IgnoreWhitespace), + . . . . _ => { + . . . . Err(self + . . . . .error(self.span_char(), ast::ErrorKind::FlagUnrecognized)) + . . . . } + . . . . } + 160 ( 0.00%) . . . } + . . . . + . . . . /// Parse a primitive AST. e.g., A literal, non-set character class or + . . . . /// assertion. + . . . . /// + . . . . /// This assumes that the parser expects a primitive at the current + . . . . /// location. i.e., All other non-primitive cases have been handled. + . . . . /// For example, if the parser's position is at `|`, then `|` will be + . . . . /// treated as a literal (e.g., inside a character class). + . . . . /// + . . . . /// This advances the parser to the first character immediately following + . . . . /// the primitive. + . . . . fn parse_primitive(&self) -> Result { + 446,351 ( 0.13%) . . . match self.char() { + 991,880 ( 0.29%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (49,607x) + . . . . '\\' => self.parse_escape(), + . . . . '.' => { + . . . . let ast = Primitive::Dot(self.span_char()); + 10 ( 0.00%) . . . self.bump(); + 445 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (5x) + . . . . Ok(ast) + . . . . } + . . . . '^' => { + . . . . let ast = Primitive::Assertion(ast::Assertion { + . . . . span: self.span_char(), + . . . . kind: ast::AssertionKind::StartLine, + . . . . }); + 132 ( 0.00%) . . . self.bump(); + 5,354 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (66x) + 132 ( 0.00%) . . . Ok(ast) + . . . . } + . . . . '$' => { + . . . . let ast = Primitive::Assertion(ast::Assertion { + . . . . span: self.span_char(), + . . . . kind: ast::AssertionKind::EndLine, + . . . . }); + 112 ( 0.00%) . . . self.bump(); + 4,984 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (56x) + 112 ( 0.00%) . . . Ok(ast) + . . . . } + . . . . c => { + . . . . let ast = Primitive::Literal(ast::Literal { + . . . . span: self.span_char(), + . . . . kind: ast::LiteralKind::Verbatim, + . . . . c, + . . . . }); + 98,960 ( 0.03%) . . . self.bump(); +4,403,720 ( 1.27%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (49,480x) + 148,440 ( 0.04%) . . . Ok(ast) + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Parse an escape sequence as a primitive AST. + . . . . /// + . . . . /// This assumes the parser is positioned at the start of the escape + . . . . /// sequence, i.e., `\`. It advances the parser to the first position + . . . . /// immediately following the escape sequence. + . . . . #[inline(never)] + 14,508 ( 0.00%) . . . fn parse_escape(&self) -> Result { + 8,060 ( 0.00%) . . . assert_eq!(self.char(), '\\'); + 32,240 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (1,612x) + 1,612 ( 0.00%) . . . let start = self.pos(); + 6,448 ( 0.00%) . . . if !self.bump() { + 143,468 ( 0.04%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,612x) + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::EscapeUnexpectedEof, + . . . . )); + . . . . } + 4,836 ( 0.00%) . . . let c = self.char(); + 32,240 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (1,612x) + . . . . // Put some of the more complicated routines into helpers. + 4,836 ( 0.00%) . . . match c { + 4,836 ( 0.00%) . . . '0'..='7' => { + . . . . if !self.parser().octal { + . . . . return Err(self.error( + . . . . Span::new(start, self.span_char().end), + . . . . ast::ErrorKind::UnsupportedBackreference, + . . . . )); + . . . . } + . . . . let mut lit = self.parse_octal(); + . . . . lit.span.start = start; + . . . . return Ok(Primitive::Literal(lit)); + . . . . } + 6,448 ( 0.00%) . . . '8'..='9' if !self.parser().octal => { + . . . . return Err(self.error( + . . . . Span::new(start, self.span_char().end), + . . . . ast::ErrorKind::UnsupportedBackreference, + . . . . )); + . . . . } + . . . . 'x' | 'u' | 'U' => { + . . . . let mut lit = self.parse_hex()?; + . . . . lit.span.start = start; +-- line 1476 ---------------------------------------- +-- line 1477 ---------------------------------------- + . . . . return Ok(Primitive::Literal(lit)); + . . . . } + . . . . 'p' | 'P' => { + . . . . let mut cls = self.parse_unicode_class()?; + . . . . cls.span.start = start; + . . . . return Ok(Primitive::Unicode(cls)); + . . . . } + . . . . 'd' | 's' | 'w' | 'D' | 'S' | 'W' => { + 10 ( 0.00%) . . . let mut cls = self.parse_perl_class(); + 1,085 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_perl_class (5x) + 20 ( 0.00%) . . . cls.span.start = start; + 50 ( 0.00%) . . . return Ok(Primitive::Perl(cls)); + . . . . } + . . . . _ => {} + . . . . } + . . . . + . . . . // Handle all of the one letter sequences inline. + 3,214 ( 0.00%) . . . self.bump(); + 143,183 ( 0.04%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,607x) + 6,428 ( 0.00%) . . . let span = Span::new(start, self.pos()); + 6,428 ( 0.00%) . . . if is_meta_character(c) { + 16,069 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/lib.rs:regex_syntax::is_meta_character (1,607x) + 3,212 ( 0.00%) . . . return Ok(Primitive::Literal(ast::Literal { + 9,636 ( 0.00%) . . . span, + . . . . kind: ast::LiteralKind::Meta, + . . . . c, + . . . . })); + . . . . } + . . . . if is_escapeable_character(c) { + . . . . return Ok(Primitive::Literal(ast::Literal { + . . . . span, + . . . . kind: ast::LiteralKind::Superfluous, + . . . . c, + . . . . })); + . . . . } + . . . . let special = |kind, c| { + 2 ( 0.00%) . . . Ok(Primitive::Literal(ast::Literal { + 6 ( 0.00%) . . . span, + . . . . kind: ast::LiteralKind::Special(kind), + . . . . c, + . . . . })) + . . . . }; + 3 ( 0.00%) . . . match c { + . . . . 'a' => special(ast::SpecialLiteralKind::Bell, '\x07'), + . . . . 'f' => special(ast::SpecialLiteralKind::FormFeed, '\x0C'), + . . . . 't' => special(ast::SpecialLiteralKind::Tab, '\t'), + . . . . 'n' => special(ast::SpecialLiteralKind::LineFeed, '\n'), + . . . . 'r' => special(ast::SpecialLiteralKind::CarriageReturn, '\r'), + . . . . 'v' => special(ast::SpecialLiteralKind::VerticalTab, '\x0B'), + . . . . 'A' => Ok(Primitive::Assertion(ast::Assertion { + . . . . span, +-- line 1524 ---------------------------------------- +-- line 1554 ---------------------------------------- + . . . . kind: ast::AssertionKind::WordBoundaryStartAngle, + . . . . })), + . . . . '>' => Ok(Primitive::Assertion(ast::Assertion { + . . . . span, + . . . . kind: ast::AssertionKind::WordBoundaryEndAngle, + . . . . })), + . . . . _ => Err(self.error(span, ast::ErrorKind::EscapeUnrecognized)), + . . . . } + 12,896 ( 0.00%) . . . } + . . . . + . . . . /// Attempt to parse a specialty word boundary. That is, `\b{start}`, + . . . . /// `\b{end}`, `\b{start-half}` or `\b{end-half}`. + . . . . /// + . . . . /// This is similar to `maybe_parse_ascii_class` in that, in most cases, + . . . . /// if it fails it will just return `None` with no error. This is done + . . . . /// because `\b{5}` is a valid expression and we want to let that be parsed + . . . . /// by the existing counted repetition parsing code. (I thought about just +-- line 1570 ---------------------------------------- +-- line 1801 ---------------------------------------- + . . . . /// whitespace. + . . . . /// + . . . . /// This expects the parser to be positioned at the first position where + . . . . /// a decimal digit could occur. This will advance the parser to the byte + . . . . /// immediately following the last contiguous decimal digit. + . . . . /// + . . . . /// If no decimal digit could be found or if there was a problem parsing + . . . . /// the complete set of digits into a u32, then an error is returned. + 1,673 ( 0.00%) . . . fn parse_decimal(&self) -> Result { + 239 ( 0.00%) . . . let mut scratch = self.parser().scratch.borrow_mut(); + . . . . scratch.clear(); + . . . . + 717 ( 0.00%) . . . while !self.is_eof() && self.char().is_whitespace() { + 4,780 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (239x) + . . . . self.bump(); + . . . . } + . . . . let start = self.pos(); + 4,043 ( 0.00%) . . . while !self.is_eof() && '0' <= self.char() && self.char() <= '9' { + 17,820 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (891x) + 720 ( 0.00%) . . . scratch.push(self.char()); + 4,800 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (240x) + . . . . self.bump_and_bump_space(); + . . . . } + 956 ( 0.00%) . . . let span = Span::new(start, self.pos()); + 717 ( 0.00%) . . . while !self.is_eof() && self.char().is_whitespace() { + 4,780 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (239x) + . . . . self.bump_and_bump_space(); + . . . . } + . . . . let digits = scratch.as_str(); + 478 ( 0.00%) . . . if digits.is_empty() { + . . . . return Err(self.error(span, ast::ErrorKind::DecimalEmpty)); + . . . . } + 956 ( 0.00%) . . . match u32::from_str_radix(digits, 10).ok() { + 10,764 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs:core::num::::from_str_radix (239x) + 717 ( 0.00%) . . . Some(n) => Ok(n), + . . . . None => Err(self.error(span, ast::ErrorKind::DecimalInvalid)), + . . . . } + 2,151 ( 0.00%) . . . } + . . . . + . . . . /// Parse a standard character class consisting primarily of characters or + . . . . /// character ranges, but can also contain nested character classes of + . . . . /// any type (sans `.`). + . . . . /// + . . . . /// This assumes the parser is positioned at the opening `[`. If parsing + . . . . /// is successful, then the parser is advanced to the position immediately + . . . . /// following the closing `]`. + . . . . #[inline(never)] + 24,777 ( 0.01%) . . . fn parse_set_class(&self) -> Result { + 13,765 ( 0.00%) . . . assert_eq!(self.char(), '['); + 55,012 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,753x) + . . . . + . . . . let mut union = + 44,048 ( 0.01%) . . . ast::ClassSetUnion { span: self.span(), items: vec![] }; + . . . . loop { + 19,934 ( 0.01%) . . . self.bump_space(); + 179,406 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (9,967x) + 9,967 ( 0.00%) . . . if self.is_eof() { + . . . . return Err(self.unclosed_class_error()); + . . . . } + 75,934 ( 0.02%) . . . match self.char() { + 199,892 ( 0.06%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (9,967x) + . . . . '[' => { + . . . . // If we've already parsed the opening bracket, then + . . . . // attempt to treat this as the beginning of an ASCII + . . . . // class. If ASCII class parsing fails, then the parser + . . . . // backs up to `[`. + 3,594 ( 0.00%) . . . if !self.parser().stack_class.borrow().is_empty() { + 10,365 ( 0.00%) . . . if let Some(cls) = self.maybe_parse_ascii_class() { + 938,404 ( 0.27%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::maybe_parse_ascii_class (841x) + . . . . union.push(ast::ClassSetItem::Ascii(cls)); + . . . . continue; + . . . . } + . . . . } + 70,600 ( 0.02%) . . . union = self.push_class_open(union)?; +1,971,018 ( 0.57%) 320 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::push_class_open (2,824x) + . . . . } + 45,184 ( 0.01%) . . . ']' => match self.pop_class(union)? { +2,062,644 ( 0.60%) 28 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::pop_class (2,824x) + 781 ( 0.00%) . . . Either::Left(nested_union) => { + . . . . union = nested_union; + . . . . } + 88,096 ( 0.03%) . . . Either::Right(class) => return Ok(class), + . . . . }, + . . . . '&' if self.peek() == Some('&') => { + . . . . assert!(self.bump_if("&&")); + . . . . union = self.push_class_op( + . . . . ast::ClassSetBinaryOpKind::Intersection, + . . . . union, + . . . . ); + . . . . } +-- line 1879 ---------------------------------------- +-- line 1887 ---------------------------------------- + . . . . '~' if self.peek() == Some('~') => { + . . . . assert!(self.bump_if("~~")); + . . . . union = self.push_class_op( + . . . . ast::ClassSetBinaryOpKind::SymmetricDifference, + . . . . union, + . . . . ); + . . . . } + . . . . _ => { + 70,980 ( 0.02%) . . . union.push(self.parse_set_class_range()?); +1,370,130 ( 0.40%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_range (3,549x) + . . . . } + . . . . } + . . . . } + 22,024 ( 0.01%) . . . } + . . . . + . . . . /// Parse a single primitive item in a character class set. The item to + . . . . /// be parsed can either be one of a simple literal character, a range + . . . . /// between two simple literal characters or a "primitive" character + . . . . /// class like \w or \p{Greek}. + . . . . /// + . . . . /// If an invalid escape is found, or if a character class is found where + . . . . /// a simple literal is expected (e.g., in a range), then an error is + . . . . /// returned. + . . . . #[inline(never)] + 35,490 ( 0.01%) . . . fn parse_set_class_range(&self) -> Result { + 28,392 ( 0.01%) . . . let prim1 = self.parse_set_class_item()?; +1,000,419 ( 0.29%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_set_class_item (3,549x) + 7,098 ( 0.00%) . . . self.bump_space(); + 63,882 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump_space (3,549x) + 3,549 ( 0.00%) . . . if self.is_eof() { + . . . . return Err(self.unclosed_class_error()); + . . . . } + . . . . // If the next char isn't a `-`, then we don't have a range. + . . . . // There are two exceptions. If the char after a `-` is a `]`, then + . . . . // `-` is interpreted as a literal `-`. Alternatively, if the char + . . . . // after a `-` is a `-`, then `--` corresponds to a "difference" + . . . . // operation. + 14,196 ( 0.00%) . . . if self.char() != '-' + 71,580 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (3,549x) + . . . . || self.peek_space() == Some(']') + . . . . || self.peek_space() == Some('-') + . . . . { + 3,549 ( 0.00%) . . . return prim1.into_class_set_item(self); + . . . . } + . . . . // OK, now we're parsing a range, so bump past the `-` and parse the + . . . . // second half of the range. + . . . . if !self.bump_and_bump_space() { + . . . . return Err(self.unclosed_class_error()); + . . . . } + . . . . let prim2 = self.parse_set_class_item()?; + . . . . let range = ast::ClassSetRange { +-- line 1933 ---------------------------------------- +-- line 1936 ---------------------------------------- + . . . . end: prim2.into_class_literal(self)?, + . . . . }; + . . . . if !range.is_valid() { + . . . . return Err( + . . . . self.error(range.span, ast::ErrorKind::ClassRangeInvalid) + . . . . ); + . . . . } + . . . . Ok(ast::ClassSetItem::Range(range)) + 28,392 ( 0.01%) . . . } + . . . . + . . . . /// Parse a single item in a character class as a primitive, where the + . . . . /// primitive either consists of a verbatim literal or a single escape + . . . . /// sequence. + . . . . /// + . . . . /// This assumes the parser is positioned at the beginning of a primitive, + . . . . /// and advances the parser to the first position after the primitive if + . . . . /// successful. + . . . . /// + . . . . /// Note that it is the caller's responsibility to report an error if an + . . . . /// illegal primitive was parsed. + . . . . #[inline(never)] + 31,941 ( 0.01%) . . . fn parse_set_class_item(&self) -> Result { + 14,196 ( 0.00%) . . . if self.char() == '\\' { + 71,580 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (3,549x) + 16,120 ( 0.00%) . . . self.parse_escape() + 481,513 ( 0.14%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::parse_escape (1,612x) + . . . . } else { + . . . . let x = Primitive::Literal(ast::Literal { + . . . . span: self.span_char(), + . . . . kind: ast::LiteralKind::Verbatim, + 5,811 ( 0.00%) . . . c: self.char(), + 39,340 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (1,937x) + . . . . }); + 3,874 ( 0.00%) . . . self.bump(); + 173,833 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (1,937x) + 7,748 ( 0.00%) . . . Ok(x) + . . . . } + 15,496 ( 0.00%) . . . } + . . . . + . . . . /// Parses the opening of a character class set. This includes the opening + . . . . /// bracket along with `^` if present to indicate negation. This also + . . . . /// starts parsing the opening set of unioned items if applicable, since + . . . . /// there are special rules applied to certain characters in the opening + . . . . /// of a character class. For example, `[^]]` is the class of all + . . . . /// characters not equal to `]`. (`]` would need to be escaped in any other + . . . . /// position.) Similarly for `-`. +-- line 1977 ---------------------------------------- +-- line 1980 ---------------------------------------- + . . . . /// empty union. This empty union should be replaced with the actual item + . . . . /// when it is popped from the parser's stack. + . . . . /// + . . . . /// This assumes the parser is positioned at the opening `[` and advances + . . . . /// the parser to the first non-special byte of the character class. + . . . . /// + . . . . /// An error is returned if EOF is found. + . . . . #[inline(never)] + 25,416 ( 0.01%) . . . fn parse_set_class_open( + . . . . &self, + . . . . ) -> Result<(ast::ClassBracketed, ast::ClassSetUnion)> { + 14,120 ( 0.00%) . . . assert_eq!(self.char(), '['); + 56,432 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,824x) + 2,824 ( 0.00%) . . . let start = self.pos(); + 2,824 ( 0.00%) . . . if !self.bump_and_bump_space() { + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::ClassUnclosed, + . . . . )); + . . . . } + . . . . + 16,944 ( 0.00%) . . . let negated = if self.char() != '^' { + 56,480 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,824x) + . . . . false + . . . . } else { + 1 ( 0.00%) . . . if !self.bump_and_bump_space() { + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::ClassUnclosed, + . . . . )); + . . . . } + . . . . true + . . . . }; + . . . . // Accept any number of `-` as literal `-`. + . . . . let mut union = + 16,944 ( 0.00%) . . . ast::ClassSetUnion { span: self.span(), items: vec![] }; + 11,300 ( 0.00%) . . . while self.char() == '-' { + 56,500 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,825x) + . . . . union.push(ast::ClassSetItem::Literal(ast::Literal { + . . . . span: self.span_char(), + . . . . kind: ast::LiteralKind::Verbatim, + . . . . c: '-', + . . . . })); + 1 ( 0.00%) . . . if !self.bump_and_bump_space() { + . . . . return Err(self.error( + . . . . Span::new(start, start), + . . . . ast::ErrorKind::ClassUnclosed, + . . . . )); + . . . . } + . . . . } + . . . . // If `]` is the *first* char in a set, then interpret it as a literal + . . . . // `]`. That is, an empty class is impossible to write. + 14,116 ( 0.00%) . . . if union.items.is_empty() && self.char() == ']' { + 56,460 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (2,823x) + . . . . union.push(ast::ClassSetItem::Literal(ast::Literal { + . . . . span: self.span_char(), + . . . . kind: ast::LiteralKind::Verbatim, + . . . . c: ']', + . . . . })); + . . . . if !self.bump_and_bump_space() { + . . . . return Err(self.error( + . . . . Span::new(start, self.pos()), + . . . . ast::ErrorKind::ClassUnclosed, + . . . . )); + . . . . } + . . . . } + . . . . let set = ast::ClassBracketed { + 11,296 ( 0.00%) . . . span: Span::new(start, self.pos()), + . . . . negated, + . . . . kind: ast::ClassSet::union(ast::ClassSetUnion { + 16,944 ( 0.00%) . . . span: Span::new(union.span.start, union.span.start), + . . . . items: vec![], + . . . . }), + . . . . }; + 62,128 ( 0.02%) . . . Ok((set, union)) + 22,592 ( 0.01%) . . . } + . . . . + . . . . /// Attempt to parse an ASCII character class, e.g., `[:alnum:]`. + . . . . /// + . . . . /// This assumes the parser is positioned at the opening `[`. + . . . . /// + . . . . /// If no valid ASCII character class could be found, then this does not + . . . . /// advance the parser and `None` is returned. Otherwise, the parser is + . . . . /// advanced to the first byte following the closing `]` and the + . . . . /// corresponding ASCII class is returned. + . . . . #[inline(never)] + 7,569 ( 0.00%) . . . fn maybe_parse_ascii_class(&self) -> Option { + . . . . // ASCII character classes are interesting from a parsing perspective + . . . . // because parsing cannot fail with any interesting error. For example, + . . . . // in order to use an ASCII character class, it must be enclosed in + . . . . // double brackets, e.g., `[[:alnum:]]`. Alternatively, you might think + . . . . // of it as "ASCII character classes have the syntax `[:NAME:]` which + . . . . // can only appear within character brackets." This means that things + . . . . // like `[[:lower:]A]` are legal constructs. + . . . . // +-- line 2070 ---------------------------------------- +-- line 2074 ---------------------------------------- + . . . . // should return an error instead since the repeated colons give away + . . . . // the intent to write an ASCII class. But what if the user typed + . . . . // `[[:lower]]` instead? How can we tell that was intended to be an + . . . . // ASCII class and not just a normal nested class? + . . . . // + . . . . // Reasonable people can probably disagree over this, but for better + . . . . // or worse, we implement semantics that never fails at the expense + . . . . // of better failure modes. + 4,205 ( 0.00%) . . . assert_eq!(self.char(), '['); + 16,820 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (841x) + . . . . // If parsing fails, then we back up the parser to this starting point. + 841 ( 0.00%) . . . let start = self.pos(); + . . . . let mut negated = false; + 6,728 ( 0.00%) . . . if !self.bump() || self.char() != ':' { + 74,849 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (841x) + 16,820 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (841x) + . . . . self.parser().pos.set(start); + . . . . return None; + . . . . } + 3,080 ( 0.00%) . . . if !self.bump() { + 68,530 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (770x) + . . . . self.parser().pos.set(start); + . . . . return None; + . . . . } + 4,620 ( 0.00%) . . . if self.char() == '^' { + 15,400 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (770x) + . . . . negated = true; + 220 ( 0.00%) . . . if !self.bump() { + 4,895 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (55x) + . . . . self.parser().pos.set(start); + . . . . return None; + . . . . } + . . . . } + . . . . let name_start = self.offset(); + 33,872 ( 0.01%) . . . while self.char() != ':' && self.bump() {} + 342,561 ( 0.10%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (3,849x) + 92,380 ( 0.03%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (4,619x) + 770 ( 0.00%) . . . if self.is_eof() { + . . . . self.parser().pos.set(start); + . . . . return None; + . . . . } + 770 ( 0.00%) . . . let name = &self.pattern()[name_start..self.offset()]; + . . . . if !self.bump_if(":]") { + . . . . self.parser().pos.set(start); + . . . . return None; + . . . . } + 3,080 ( 0.00%) . . . let kind = match ast::ClassAsciiKind::from_name(name) { + 31,216 ( 0.01%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs:regex_syntax::ast::ClassAsciiKind::from_name (770x) + . . . . Some(kind) => kind, + . . . . None => { + . . . . self.parser().pos.set(start); + . . . . return None; + . . . . } + . . . . }; + 2,310 ( 0.00%) . . . Some(ast::ClassAscii { + 3,080 ( 0.00%) . . . span: Span::new(start, self.pos()), + . . . . kind, + . . . . negated, + . . . . }) + 6,728 ( 0.00%) . . . } + . . . . + . . . . /// Parse a Unicode class in either the single character notation, `\pN` + . . . . /// or the multi-character bracketed notation, `\p{Greek}`. This assumes + . . . . /// the parser is positioned at the `p` (or `P` for negation) and will + . . . . /// advance the parser to the character immediately following the class. + . . . . /// + . . . . /// Note that this does not check whether the class name is valid or not. + . . . . #[inline(never)] +-- line 2132 ---------------------------------------- +-- line 2204 ---------------------------------------- + . . . . kind, + . . . . }) + . . . . } + . . . . + . . . . /// Parse a Perl character class, e.g., `\d` or `\W`. This assumes the + . . . . /// parser is currently at a valid character class name and will be + . . . . /// advanced to the character immediately following the class. + . . . . #[inline(never)] + 45 ( 0.00%) . . . fn parse_perl_class(&self) -> ast::ClassPerl { + 10 ( 0.00%) . . . let c = self.char(); + 100 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::char (5x) + . . . . let span = self.span_char(); + 15 ( 0.00%) . . . self.bump(); + 445 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs:regex_syntax::ast::parse::ParserI

::bump (5x) + 15 ( 0.00%) . . . let (negated, kind) = match c { + . . . . 'd' => (false, ast::ClassPerlKind::Digit), + . . . . 'D' => (true, ast::ClassPerlKind::Digit), + . . . . 's' => (false, ast::ClassPerlKind::Space), + . . . . 'S' => (true, ast::ClassPerlKind::Space), + . . . . 'w' => (false, ast::ClassPerlKind::Word), + . . . . 'W' => (true, ast::ClassPerlKind::Word), + . . . . c => panic!("expected valid Perl class but got '{}'", c), + . . . . }; + 45 ( 0.00%) . . . ast::ClassPerl { span, kind, negated } + 40 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A type that traverses a fully parsed Ast and checks whether its depth + . . . . /// exceeds the specified nesting limit. If it does, then an error is returned. + . . . . #[derive(Debug)] + . . . . struct NestLimiter<'p, 's, P> { + . . . . /// The parser that is checking the nest limit. + . . . . p: &'p ParserI<'s, P>, +-- line 2234 ---------------------------------------- +-- line 2237 ---------------------------------------- + . . . . } + . . . . + . . . . impl<'p, 's, P: Borrow> NestLimiter<'p, 's, P> { + . . . . fn new(p: &'p ParserI<'s, P>) -> NestLimiter<'p, 's, P> { + . . . . NestLimiter { p, depth: 0 } + . . . . } + . . . . + . . . . #[inline(never)] + 81 ( 0.00%) . . . fn check(self, ast: &Ast) -> Result<()> { + 324 ( 0.00%) . . . ast::visit(ast, self) +5,820,400 ( 1.68%) 301 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (81x) + . . . . } + . . . . + . . . . fn increment_depth(&mut self, span: &Span) -> Result<()> { + 44,450 ( 0.01%) . . . let new = self.depth.checked_add(1).ok_or_else(|| { + . . . . self.p.error( + . . . . span.clone(), + . . . . ast::ErrorKind::NestLimitExceeded(u32::MAX), + . . . . ) + . . . . })?; + 44,450 ( 0.01%) . . . let limit = self.p.parser().nest_limit; + 44,450 ( 0.01%) . . . if new > limit { + . . . . return Err(self.p.error( + . . . . span.clone(), + . . . . ast::ErrorKind::NestLimitExceeded(limit), + . . . . )); + . . . . } + 22,821 ( 0.01%) . . . self.depth = new; + 43,258 ( 0.01%) . . . Ok(()) + . . . . } + . . . . + . . . . fn decrement_depth(&mut self) { + . . . . // Assuming the correctness of the visitor, this should never drop + . . . . // below 0. + 57,805 ( 0.02%) . . . self.depth = self.depth.checked_sub(1).unwrap(); + . . . . } + . . . . } + . . . . + . . . . impl<'p, 's, P: Borrow> ast::Visitor for NestLimiter<'p, 's, P> { + . . . . type Output = (); + . . . . type Err = ast::Error; + . . . . + . . . . fn finish(self) -> Result<()> { + 81 ( 0.00%) . . . Ok(()) + . . . . } + . . . . + 570,048 ( 0.16%) . . . fn visit_pre(&mut self, ast: &Ast) -> Result<()> { + 356,280 ( 0.10%) . . . let span = match *ast { + . . . . Ast::Empty(_) + . . . . | Ast::Flags(_) + . . . . | Ast::Literal(_) + . . . . | Ast::Dot(_) + . . . . | Ast::Assertion(_) + . . . . | Ast::ClassUnicode(_) + . . . . | Ast::ClassPerl(_) => { + . . . . // These are all base cases, so we don't increment depth. + 99,254 ( 0.03%) . . . return Ok(()); + . . . . } + . . . . Ast::ClassBracketed(ref x) => &x.span, + 3,770 ( 0.00%) . . . Ast::Repetition(ref x) => &x.span, + . . . . Ast::Group(ref x) => &x.span, + . . . . Ast::Alternation(ref x) => &x.span, + . . . . Ast::Concat(ref x) => &x.span, + . . . . }; + . . . . self.increment_depth(span) + 641,304 ( 0.19%) . . . } + . . . . + . . . . fn visit_post(&mut self, ast: &Ast) -> Result<()> { + 43,258 ( 0.01%) . . . match *ast { + . . . . Ast::Empty(_) + . . . . | Ast::Flags(_) + . . . . | Ast::Literal(_) + . . . . | Ast::Dot(_) + . . . . | Ast::Assertion(_) + . . . . | Ast::ClassUnicode(_) + . . . . | Ast::ClassPerl(_) => { + . . . . // These are all base cases, so we don't decrement depth. +-- line 2312 ---------------------------------------- +-- line 2318 ---------------------------------------- + . . . . | Ast::Alternation(_) + . . . . | Ast::Concat(_) => { + . . . . self.decrement_depth(); + . . . . Ok(()) + . . . . } + . . . . } + . . . . } + . . . . + 39,328 ( 0.01%) . . . fn visit_class_set_item_pre( + . . . . &mut self, + . . . . ast: &ast::ClassSetItem, + . . . . ) -> Result<()> { + 15,940 ( 0.00%) . . . let span = match *ast { + . . . . ast::ClassSetItem::Empty(_) + . . . . | ast::ClassSetItem::Literal(_) + . . . . | ast::ClassSetItem::Range(_) + . . . . | ast::ClassSetItem::Ascii(_) + . . . . | ast::ClassSetItem::Unicode(_) + . . . . | ast::ClassSetItem::Perl(_) => { + . . . . // These are all base cases, so we don't increment depth. + . . . . return Ok(()); + . . . . } + 71 ( 0.00%) . . . ast::ClassSetItem::Bracketed(ref x) => &x.span, + 525 ( 0.00%) . . . ast::ClassSetItem::Union(ref x) => &x.span, + . . . . }; + . . . . self.increment_depth(span) + 44,244 ( 0.01%) . . . } + . . . . + . . . . fn visit_class_set_item_post( + . . . . &mut self, + . . . . ast: &ast::ClassSetItem, + . . . . ) -> Result<()> { + 1,192 ( 0.00%) . . . match *ast { + . . . . ast::ClassSetItem::Empty(_) + . . . . | ast::ClassSetItem::Literal(_) + . . . . | ast::ClassSetItem::Range(_) + . . . . | ast::ClassSetItem::Ascii(_) + . . . . | ast::ClassSetItem::Unicode(_) + . . . . | ast::ClassSetItem::Perl(_) => { + . . . . // These are all base cases, so we don't decrement depth. + . . . . Ok(()) +-- line 2358 ---------------------------------------- +-- line 2378 ---------------------------------------- + . . . . self.decrement_depth(); + . . . . Ok(()) + . . . . } + . . . . } + . . . . + . . . . /// When the result is an error, transforms the ast::ErrorKind from the source + . . . . /// Result into another one. This function is used to return clearer error + . . . . /// messages when possible. + 1,434 ( 0.00%) . . . fn specialize_err( + . . . . result: Result, + . . . . from: ast::ErrorKind, + . . . . to: ast::ErrorKind, + . . . . ) -> Result { + 717 ( 0.00%) . . . if let Err(e) = result { + . . . . if e.kind == from { + . . . . Err(ast::Error { kind: to, pattern: e.pattern, span: e.span }) + . . . . } else { + . . . . Err(e) + . . . . } + . . . . } else { + 2,868 ( 0.00%) . . . result + . . . . } + 1,673 ( 0.00%) . . . } + . . . . + . . . . #[cfg(test)] + . . . . mod tests { + . . . . use core::ops::Range; + . . . . + . . . . use alloc::format; + . . . . + . . . . use crate::ast::{self, Ast, Position, Span}; +-- line 2408 ---------------------------------------- + +1,675,153 ( 0.48%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/id.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 161 ---------------------------------------- + . . . . /// assert_eq!(mat.pattern().as_usize(), 1); + . . . . /// assert_eq!(mat.offset(), 5); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[derive( + . . . . Clone, Copy, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord, + . . . . )] + 234 ( 0.00%) . . . pub struct LazyStateID(u32); + . . . . + . . . . impl LazyStateID { + . . . . #[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))] + . . . . const MAX_BIT: usize = 31; + . . . . + . . . . #[cfg(target_pointer_width = "16")] + . . . . const MAX_BIT: usize = 15; + . . . . +-- line 177 ---------------------------------------- +-- line 183 ---------------------------------------- + . . . . const MAX: usize = LazyStateID::MASK_MATCH - 1; + . . . . + . . . . /// Create a new lazy state ID. + . . . . /// + . . . . /// If the given identifier exceeds [`LazyStateID::MAX`], then this returns + . . . . /// an error. + . . . . #[inline] + . . . . pub(crate) fn new(id: usize) -> Result { + 1,950 ( 0.00%) . . . if id > LazyStateID::MAX { + . . . . let attempted = u64::try_from(id).unwrap(); + . . . . return Err(LazyStateIDError { attempted }); + . . . . } + . . . . Ok(LazyStateID::new_unchecked(id)) + . . . . } + . . . . + . . . . /// Create a new lazy state ID without checking whether the given value + . . . . /// exceeds [`LazyStateID::MAX`]. +-- line 199 ---------------------------------------- +-- line 208 ---------------------------------------- + . . . . + . . . . /// Return this lazy state ID as an untagged `usize`. + . . . . /// + . . . . /// If this lazy state ID is tagged, then the usize returned is the state + . . . . /// ID without the tag. If the ID was not tagged, then the usize returned + . . . . /// is equivalent to the state ID. + . . . . #[inline] + . . . . pub(crate) fn as_usize_untagged(&self) -> usize { +68,638 ( 0.02%) . . . self.as_usize_unchecked() & LazyStateID::MAX + . . . . } + . . . . + . . . . /// Return this lazy state ID as its raw internal `usize` value, which may + . . . . /// be tagged (and thus greater than LazyStateID::MAX). + . . . . #[inline] + . . . . pub(crate) const fn as_usize_unchecked(&self) -> usize { + . . . . // FIXME: Use as_usize() once const functions in traits are stable. + 232 ( 0.00%) . . . self.0 as usize + . . . . } + . . . . + . . . . #[inline] + . . . . pub(crate) const fn to_unknown(&self) -> LazyStateID { + . . . . LazyStateID::new_unchecked( + . . . . self.as_usize_unchecked() | LazyStateID::MASK_UNKNOWN, + . . . . ) + . . . . } + . . . . + . . . . #[inline] + . . . . pub(crate) const fn to_dead(&self) -> LazyStateID { + . . . . LazyStateID::new_unchecked( + 117 ( 0.00%) . . . self.as_usize_unchecked() | LazyStateID::MASK_DEAD, + . . . . ) + . . . . } + . . . . + . . . . #[inline] + . . . . pub(crate) const fn to_quit(&self) -> LazyStateID { + . . . . LazyStateID::new_unchecked( + 117 ( 0.00%) . . . self.as_usize_unchecked() | LazyStateID::MASK_QUIT, + . . . . ) + . . . . } + . . . . + . . . . /// Return this lazy state ID as a state ID that is tagged as a start + . . . . /// state. + . . . . #[inline] + . . . . pub(crate) const fn to_start(&self) -> LazyStateID { + . . . . LazyStateID::new_unchecked( +-- line 252 ---------------------------------------- +-- line 264 ---------------------------------------- + . . . . } + . . . . + . . . . /// Return true if and only if this lazy state ID is tagged. + . . . . /// + . . . . /// When a lazy state ID is tagged, then one can conclude that it is one + . . . . /// of a match, start, dead, quit or unknown state. + . . . . #[inline] + . . . . pub const fn is_tagged(&self) -> bool { + 727 ( 0.00%) . . . self.as_usize_unchecked() > LazyStateID::MAX + . . . . } + . . . . + . . . . /// Return true if and only if this represents a lazy state ID that is + . . . . /// "unknown." That is, the state has not yet been created. When a caller + . . . . /// sees this state ID, it generally means that a state has to be computed + . . . . /// in order to proceed. + . . . . #[inline] + . . . . pub const fn is_unknown(&self) -> bool { + 500 ( 0.00%) . . . self.as_usize_unchecked() & LazyStateID::MASK_UNKNOWN > 0 + . . . . } + . . . . + . . . . /// Return true if and only if this represents a dead state. A dead state + . . . . /// is a state that can never transition to any other state except the + . . . . /// dead state. When a dead state is seen, it generally indicates that a + . . . . /// search should stop. + . . . . #[inline] + . . . . pub const fn is_dead(&self) -> bool { + 43 ( 0.00%) . . . self.as_usize_unchecked() & LazyStateID::MASK_DEAD > 0 + . . . . } + . . . . + . . . . /// Return true if and only if this represents a quit state. A quit state + . . . . /// is a state that is representationally equivalent to a dead state, + . . . . /// except it indicates the automaton has reached a point at which it can + . . . . /// no longer determine whether a match exists or not. In general, this + . . . . /// indicates an error during search and the caller must either pass this + . . . . /// error up or use a different search technique. +-- line 298 ---------------------------------------- +-- line 305 ---------------------------------------- + . . . . /// start state. + . . . . /// + . . . . /// Note that if + . . . . /// [`Config::specialize_start_states`](crate::hybrid::dfa::Config) is + . . . . /// disabled (which is the default), then this will always return false + . . . . /// since start states won't be tagged. + . . . . #[inline] + . . . . pub const fn is_start(&self) -> bool { + 1 ( 0.00%) . . . self.as_usize_unchecked() & LazyStateID::MASK_START > 0 + . . . . } + . . . . + . . . . /// Return true if and only if this lazy state ID has been tagged as a + . . . . /// match state. + . . . . #[inline] + . . . . pub const fn is_match(&self) -> bool { + 48 ( 0.00%) . . . self.as_usize_unchecked() & LazyStateID::MASK_MATCH > 0 + . . . . } + . . . . } + . . . . + . . . . /// This error occurs when a lazy state ID could not be constructed. + . . . . /// + . . . . /// This occurs when given an integer exceeding the maximum lazy state ID + . . . . /// value. + . . . . /// +-- line 328 ---------------------------------------- + + 400 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 27 ---------------------------------------- + . . . . pid: PatternID, + . . . . start: *const u8, + . . . . end: *const u8, + . . . . } + . . . . + . . . . impl Match { + . . . . /// Returns the ID of the pattern that matched. + . . . . pub(crate) fn pattern(&self) -> PatternID { + 1 ( 0.00%) . . . self.pid + 1 ( 0.00%) . . . } + . . . . + . . . . /// Returns a pointer into the haystack at which the match starts. + . . . . pub(crate) fn start(&self) -> *const u8 { + 1 ( 0.00%) . . . self.start + 1 ( 0.00%) . . . } + . . . . + . . . . /// Returns a pointer into the haystack at which the match ends. + . . . . pub(crate) fn end(&self) -> *const u8 { + 1 ( 0.00%) . . . self.end + 1 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A "slim" Teddy implementation that is generic over both the vector type + . . . . /// and the minimum length of the patterns being searched for. + . . . . /// + . . . . /// Only 1, 2, 3 and 4 bytes are supported as minimum lengths. + . . . . #[derive(Clone, Debug)] + . . . . pub(crate) struct Slim { +-- line 54 ---------------------------------------- +-- line 71 ---------------------------------------- + . . . . /// Callers must ensure that this is okay to call in the current target for + . . . . /// the current CPU. + . . . . #[inline(always)] + . . . . pub(crate) unsafe fn new(patterns: Arc) -> Slim { + . . . . assert!( + . . . . 1 <= BYTES && BYTES <= 4, + . . . . "only 1, 2, 3 or 4 bytes are supported" + . . . . ); + 90 ( 0.00%) . . . let teddy = Teddy::new(patterns); +84,368 ( 0.02%) 310 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (24x) + . . . . let masks = SlimMaskBuilder::from_teddy(&teddy); + 441 ( 0.00%) . . . Slim { teddy, masks } + . . . . } + . . . . + . . . . /// Returns the approximate total amount of heap used by this type, in + . . . . /// units of bytes. + . . . . #[inline(always)] + . . . . pub(crate) fn memory_usage(&self) -> usize { + . . . . self.teddy.memory_usage() + . . . . } +-- line 89 ---------------------------------------- +-- line 243 ---------------------------------------- + . . . . start: *const u8, + . . . . end: *const u8, + . . . . ) -> Option { + . . . . let len = end.distance(start); + . . . . debug_assert!(len >= self.minimum_len()); + . . . . let mut cur = start.add(2); + . . . . let mut prev0 = V::splat(0xFF); + . . . . let mut prev1 = V::splat(0xFF); + 18 ( 0.00%) . . . while cur <= end.sub(V::BYTES) { + . . . . if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { + . . . . return Some(m); + . . . . } + . . . . cur = cur.add(V::BYTES); + . . . . } + 4 ( 0.00%) . . . if cur < end { + . . . . cur = end.sub(V::BYTES); + . . . . prev0 = V::splat(0xFF); + . . . . prev1 = V::splat(0xFF); + . . . . if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { + . . . . return Some(m); + . . . . } + . . . . } + . . . . None +-- line 265 ---------------------------------------- +-- line 270 ---------------------------------------- + . . . . unsafe fn find_one( + . . . . &self, + . . . . cur: *const u8, + . . . . end: *const u8, + . . . . prev0: &mut V, + . . . . prev1: &mut V, + . . . . ) -> Option { + . . . . let c = self.candidate(cur, prev0, prev1); + 5 ( 0.00%) . . . if !c.is_zero() { + . . . . if let Some(m) = self.teddy.verify(cur.sub(2), end, c) { + . . . . return Some(m); + . . . . } + . . . . } + . . . . None + . . . . } + . . . . + . . . . /// See Slim::candidate. +-- line 286 ---------------------------------------- +-- line 287 ---------------------------------------- + . . . . #[inline(always)] + . . . . unsafe fn candidate( + . . . . &self, + . . . . cur: *const u8, + . . . . prev0: &mut V, + . . . . prev1: &mut V, + . . . . ) -> V { + . . . . let chunk = V::load_unaligned(cur); + 12 ( 0.00%) . . . let (res0, res1, res2) = Mask::members3(chunk, self.masks); + . . . . let res0prev0 = res0.shift_in_two_bytes(*prev0); + . . . . let res1prev1 = res1.shift_in_one_byte(*prev1); + . . . . let res = res0prev0.and(res1prev1).and(res2); + . . . . *prev0 = res0; + . . . . *prev1 = res1; + . . . . res + . . . . } + . . . . } +-- line 303 ---------------------------------------- +-- line 404 ---------------------------------------- + . . . . /// Callers must ensure that this is okay to call in the current target for + . . . . /// the current CPU. + . . . . #[inline(always)] + . . . . pub(crate) unsafe fn new(patterns: Arc) -> Fat { + . . . . assert!( + . . . . 1 <= BYTES && BYTES <= 4, + . . . . "only 1, 2, 3 or 4 bytes are supported" + . . . . ); + 21 ( 0.00%) . . . let teddy = Teddy::new(patterns); +717,161 ( 0.21%) 2,454 ( 0.30%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/generic.rs:aho_corasick::packed::teddy::generic::Teddy<_>::new (21x) + . . . . let masks = FatMaskBuilder::from_teddy(&teddy); + 63 ( 0.00%) . . . Fat { teddy, masks } + 1,365 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (21x) + . . . . } + . . . . + . . . . /// Returns the approximate total amount of heap used by this type, in + . . . . /// units of bytes. + . . . . #[inline(always)] + . . . . pub(crate) fn memory_usage(&self) -> usize { + . . . . self.teddy.memory_usage() + . . . . } +-- line 422 ---------------------------------------- +-- line 576 ---------------------------------------- + . . . . start: *const u8, + . . . . end: *const u8, + . . . . ) -> Option { + . . . . let len = end.distance(start); + . . . . debug_assert!(len >= self.minimum_len()); + . . . . let mut cur = start.add(2); + . . . . let mut prev0 = V::splat(0xFF); + . . . . let mut prev1 = V::splat(0xFF); + 45 ( 0.00%) . . . while cur <= end.sub(V::Half::BYTES) { + . . . . if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { + . . . . return Some(m); + . . . . } + . . . . cur = cur.add(V::Half::BYTES); + . . . . } + 18 ( 0.00%) . . . if cur < end { + . . . . cur = end.sub(V::Half::BYTES); + . . . . prev0 = V::splat(0xFF); + . . . . prev1 = V::splat(0xFF); + . . . . if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { + . . . . return Some(m); + . . . . } + . . . . } + . . . . None +-- line 598 ---------------------------------------- +-- line 603 ---------------------------------------- + . . . . unsafe fn find_one( + . . . . &self, + . . . . cur: *const u8, + . . . . end: *const u8, + . . . . prev0: &mut V, + . . . . prev1: &mut V, + . . . . ) -> Option { + . . . . let c = self.candidate(cur, prev0, prev1); + 18 ( 0.00%) . . . if !c.is_zero() { + 1 ( 0.00%) . . . if let Some(m) = self.teddy.verify(cur.sub(2), end, c) { + . . . . return Some(m); + . . . . } + . . . . } + . . . . None + . . . . } + . . . . + . . . . /// See `Fat::candidate`. + . . . . #[inline(always)] + . . . . unsafe fn candidate( + . . . . &self, + . . . . cur: *const u8, + . . . . prev0: &mut V, + . . . . prev1: &mut V, + . . . . ) -> V { + . . . . let chunk = V::load_half_unaligned(cur); + 54 ( 0.00%) . . . let (res0, res1, res2) = Mask::members3(chunk, self.masks); + . . . . let res0prev0 = res0.half_shift_in_two_bytes(*prev0); + . . . . let res1prev1 = res1.half_shift_in_one_byte(*prev1); + . . . . let res = res0prev0.and(res1prev1).and(res2); + . . . . *prev0 = res0; + . . . . *prev1 = res1; + . . . . res + . . . . } + . . . . } +-- line 636 ---------------------------------------- +-- line 743 ---------------------------------------- + . . . . // + . . . . // One other avenue I haven't explored is some kind of hashing trick + . . . . // that let's us do another high-confidence check before launching into + . . . . // `memcmp`. + . . . . } + . . . . + . . . . impl Teddy { + . . . . /// Create a new generic data structure for Teddy verification. + 456 ( 0.00%) . . . fn new(patterns: Arc) -> Teddy { + 171 ( 0.00%) . . . assert_ne!(0, patterns.len(), "Teddy requires at least one pattern"); + 114 ( 0.00%) . . . assert_ne!( + . . . . 0, + 57 ( 0.00%) . . . patterns.minimum_len(), + . . . . "Teddy does not support zero-length patterns" + . . . . ); + . . . . assert!( + . . . . BUCKETS == 8 || BUCKETS == 16, + . . . . "Teddy only supports 8 or 16 buckets" + . . . . ); + . . . . // MSRV(1.63): Use core::array::from_fn below instead of allocating a + . . . . // superfluous outer Vec. Not a big deal (especially given the BTreeMap + . . . . // allocation below), but nice to not do it. + . . . . let buckets = + 114 ( 0.00%) . . . <[Vec; BUCKETS]>::try_from(vec![vec![]; BUCKETS]) +20,142 ( 0.01%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::from_elem (57x) + . . . . .unwrap(); + 57 ( 0.00%) . . . let mut t = Teddy { patterns, buckets }; + . . . . + . . . . let mut map: BTreeMap, usize> = BTreeMap::new(); + . . . . for (id, pattern) in t.patterns.iter() { + . . . . // We try to be slightly clever in how we assign patterns into + . . . . // buckets. Generally speaking, we want patterns with the same + . . . . // prefix to be in the same bucket, since it minimizes the amount + . . . . // of time we spend churning through buckets in the verification + . . . . // step. +-- line 776 ---------------------------------------- +-- line 788 ---------------------------------------- + . . . . // same bucket, we ensure that we preserve correct leftmost-first + . . . . // and leftmost-longest match semantics. In addition to the fact + . . . . // that `patterns.iter()` iterates in the correct order, this + . . . . // guarantees that all possible ambiguous matches will occur in + . . . . // the same bucket. The verification routine could be adjusted to + . . . . // support correct leftmost match semantics regardless of bucket + . . . . // allocation, but that results in a performance hit. It's much + . . . . // nicer to be able to just stop as soon as a match is found. + 1,084 ( 0.00%) . . . let lonybs = pattern.low_nybbles(t.mask_len()); + 678 ( 0.00%) . . . if let Some(&bucket) = map.get(&lonybs) { + 3,390 ( 0.00%) . . . t.buckets[bucket].push(id); + . . . . } else { + . . . . // N.B. We assign buckets in reverse because it shouldn't have + . . . . // any influence on performance, but it does make it harder to + . . . . // get leftmost match semantics accidentally correct. + 812 ( 0.00%) . . . let bucket = (BUCKETS - 1) - (id.as_usize() % BUCKETS); + 1,624 ( 0.00%) . . . t.buckets[bucket].push(id); + 2,436 ( 0.00%) . . . map.insert(lonybs, bucket); +122,962 ( 0.04%) 6 ( 0.00%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs:alloc::collections::btree::map::BTreeMap::insert (406x) + . . . . } + . . . . } + . . . . t + 456 ( 0.00%) . . . } + . . . . + . . . . /// Verify whether there are any matches starting at or after `cur` in the + . . . . /// haystack. The candidate chunk given should correspond to 8-bit bitsets + . . . . /// for N buckets. + . . . . /// + . . . . /// # Safety + . . . . /// + . . . . /// The given pointers representing the haystack must be valid to read +-- line 817 ---------------------------------------- +-- line 818 ---------------------------------------- + . . . . /// from. + . . . . #[inline(always)] + . . . . unsafe fn verify64( + . . . . &self, + . . . . cur: *const u8, + . . . . end: *const u8, + . . . . mut candidate_chunk: u64, + . . . . ) -> Option { + 54 ( 0.00%) . . . while candidate_chunk != 0 { + . . . . let bit = candidate_chunk.trailing_zeros().as_usize(); + . . . . candidate_chunk &= !(1 << bit); + . . . . + . . . . let cur = cur.add(bit / BUCKETS); + 34 ( 0.00%) . . . let bucket = bit % BUCKETS; + . . . . if let Some(m) = self.verify_bucket(cur, end, bucket) { + . . . . return Some(m); + . . . . } + . . . . } + . . . . None + . . . . } + . . . . + . . . . /// Verify whether there are any matches starting at `at` in the given +-- line 839 ---------------------------------------- +-- line 885 ---------------------------------------- + . . . . } + . . . . + . . . . /// Returns the approximate total amount of heap used by this type, in + . . . . /// units of bytes. + . . . . fn memory_usage(&self) -> usize { + . . . . // This is an upper bound rather than a precise accounting. No + . . . . // particular reason, other than it's probably very close to actual + . . . . // memory usage in practice. + 21 ( 0.00%) . . . self.patterns.len() * core::mem::size_of::() + . . . . } + . . . . } + . . . . + . . . . impl Teddy<8> { + . . . . /// Runs the verification routine for "slim" Teddy. + . . . . /// + . . . . /// The candidate given should be a collection of 8-bit bitsets (one bitset + . . . . /// per lane), where the ith bit is set in the jth lane if and only if the +-- line 901 ---------------------------------------- +-- line 1169 ---------------------------------------- + . . . . /// Each byte in the mask corresponds to a 8-bit bitset, where bit `i` is set + . . . . /// if and only if the corresponding nybble is in the ith bucket. The index of + . . . . /// the byte (0-15, inclusive) corresponds to the nybble. + . . . . /// + . . . . /// Each mask is used as the target of a shuffle, where the indices for the + . . . . /// shuffle are taken from the haystack. AND'ing the shuffles for both the + . . . . /// low and high masks together also results in 8-bit bitsets, but where bit + . . . . /// `i` is set if and only if the correspond *byte* is in the ith bucket. + 26 ( 0.00%) . . . #[derive(Clone, Default)] + . . . . struct SlimMaskBuilder { + . . . . lo: [u8; 32], + . . . . hi: [u8; 32], + . . . . } + . . . . + . . . . impl SlimMaskBuilder { + . . . . /// Update this mask by adding the given byte to the given bucket. The + . . . . /// given bucket must be in the range 0-7. +-- line 1185 ---------------------------------------- +-- line 1186 ---------------------------------------- + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// When `bucket >= 8`. + . . . . fn add(&mut self, bucket: usize, byte: u8) { + . . . . assert!(bucket < 8); + . . . . + . . . . let bucket = u8::try_from(bucket).unwrap(); + 606 ( 0.00%) . . . let byte_lo = usize::from(byte & 0xF); + 1,212 ( 0.00%) . . . let byte_hi = usize::from((byte >> 4) & 0xF); + . . . . // When using 256-bit vectors, we need to set this bucket assignment in + . . . . // the low and high 128-bit portions of the mask. This allows us to + . . . . // process 32 bytes at a time. Namely, AVX2 shuffles operate on each + . . . . // of the 128-bit lanes, rather than the full 256-bit vector at once. + 606 ( 0.00%) . . . self.lo[byte_lo] |= 1 << bucket; + 606 ( 0.00%) . . . self.lo[byte_lo + 16] |= 1 << bucket; + 606 ( 0.00%) . . . self.hi[byte_hi] |= 1 << bucket; + 606 ( 0.00%) . . . self.hi[byte_hi + 16] |= 1 << bucket; + . . . . } + . . . . + . . . . /// Turn this builder into a vector mask. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// When `V` represents a vector bigger than what `MaskBytes` can contain. + . . . . /// +-- line 1211 ---------------------------------------- +-- line 1212 ---------------------------------------- + . . . . /// # Safety + . . . . /// + . . . . /// Callers must ensure that this is okay to call in the current target for + . . . . /// the current CPU. + . . . . #[inline(always)] + . . . . unsafe fn build(&self) -> Mask { + . . . . assert!(V::BYTES <= self.lo.len()); + . . . . assert!(V::BYTES <= self.hi.len()); + 4 ( 0.00%) . . . Mask { + . . . . lo: V::load_unaligned(self.lo[..].as_ptr()), + 1 ( 0.00%) . . . hi: V::load_unaligned(self.hi[..].as_ptr()), + . . . . } + . . . . } + . . . . + . . . . /// A convenience function for building `N` vector masks from a slim + . . . . /// `Teddy` value. + . . . . /// + . . . . /// # Panics + . . . . /// +-- line 1230 ---------------------------------------- +-- line 1240 ---------------------------------------- + . . . . ) -> [Mask; BYTES] { + . . . . // MSRV(1.63): Use core::array::from_fn to just build the array here + . . . . // instead of creating a vector and turning it into an array. + . . . . let mut mask_builders = vec![SlimMaskBuilder::default(); BYTES]; + . . . . for (bucket_index, bucket) in teddy.buckets.iter().enumerate() { + . . . . for pid in bucket.iter().copied() { + . . . . let pat = teddy.patterns.get(pid); + . . . . for (i, builder) in mask_builders.iter_mut().enumerate() { + 1,818 ( 0.00%) . . . builder.add(bucket_index, pat.bytes()[i]); + . . . . } + . . . . } + . . . . } + . . . . let array = + . . . . <[SlimMaskBuilder; BYTES]>::try_from(mask_builders).unwrap(); + . . . . array.map(|builder| builder.build()) + . . . . } + . . . . } +-- line 1256 ---------------------------------------- +-- line 1296 ---------------------------------------- + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// When `bucket >= 16`. + . . . . fn add(&mut self, bucket: usize, byte: u8) { + . . . . assert!(bucket < 16); + . . . . + . . . . let bucket = u8::try_from(bucket).unwrap(); + 4,932 ( 0.00%) . . . let byte_lo = usize::from(byte & 0xF); + 2,466 ( 0.00%) . . . let byte_hi = usize::from((byte >> 4) & 0xF); + . . . . // Unlike slim teddy, fat teddy only works with AVX2. For fat teddy, + . . . . // the high 128 bits of our mask correspond to buckets 8-15, while the + . . . . // low 128 bits correspond to buckets 0-7. + 368 ( 0.00%) . . . if bucket < 8 { + 1,206 ( 0.00%) . . . self.lo[byte_lo] |= 1 << bucket; + . . . . self.hi[byte_hi] |= 1 << bucket; + . . . . } else { + 1,260 ( 0.00%) . . . self.lo[byte_lo + 16] |= 1 << (bucket % 8); + . . . . self.hi[byte_hi + 16] |= 1 << (bucket % 8); + . . . . } + . . . . } + . . . . + . . . . /// Turn this builder into a vector mask. + . . . . /// + . . . . /// # Panics + . . . . /// +-- line 1321 ---------------------------------------- +-- line 1352 ---------------------------------------- + . . . . ) -> [Mask; BYTES] { + . . . . // MSRV(1.63): Use core::array::from_fn to just build the array here + . . . . // instead of creating a vector and turning it into an array. + . . . . let mut mask_builders = vec![FatMaskBuilder::default(); BYTES]; + . . . . for (bucket_index, bucket) in teddy.buckets.iter().enumerate() { + . . . . for pid in bucket.iter().copied() { + . . . . let pat = teddy.patterns.get(pid); + . . . . for (i, builder) in mask_builders.iter_mut().enumerate() { + 7,398 ( 0.00%) . . . builder.add(bucket_index, pat.bytes()[i]); + . . . . } + . . . . } + . . . . } + . . . . let array = + . . . . <[FatMaskBuilder; BYTES]>::try_from(mask_builders).unwrap(); + . . . . array.map(|builder| builder.build()) + . . . . } + . . . . } +-- line 1368 ---------------------------------------- + +11,529 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/primitives.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 136 ---------------------------------------- + . . . . /// not rely on this property for safety. Callers may choose to rely on this + . . . . /// property for correctness however. For example, creating a `SmallIndex` with + . . . . /// an invalid value can be done in entirely safe code. This may in turn result + . . . . /// in panics or silent logical errors. + . . . . #[derive( + . . . . Clone, Copy, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord, + . . . . )] + . . . . #[repr(transparent)] + 14,803 ( 0.00%) . . . pub struct SmallIndex(u32); + . . . . + . . . . impl SmallIndex { + . . . . /// The maximum index value. + . . . . #[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))] + . . . . pub const MAX: SmallIndex = + . . . . // FIXME: Use as_usize() once const functions in traits are stable. + . . . . SmallIndex::new_unchecked(core::i32::MAX as usize - 1); + . . . . +-- line 152 ---------------------------------------- +-- line 181 ---------------------------------------- + . . . . /// invalid index value is likely to cause panics or possibly even silent + . . . . /// logical errors. + . . . . /// + . . . . /// Callers must never rely on a `SmallIndex` to be within a certain range + . . . . /// for memory safety. + . . . . #[inline] + . . . . pub const fn new_unchecked(index: usize) -> SmallIndex { + . . . . // FIXME: Use as_u32() once const functions in traits are stable. + 27 ( 0.00%) . . . SmallIndex(index as u32) + . . . . } + . . . . + . . . . /// Like [`SmallIndex::new`], but panics if the given index is not valid. + . . . . #[inline] + . . . . pub fn must(index: usize) -> SmallIndex { + . . . . SmallIndex::new(index).expect("invalid small index") + . . . . } + . . . . + . . . . /// Return this small index as a `usize`. This is guaranteed to never + . . . . /// overflow `usize`. + . . . . #[inline] + . . . . pub const fn as_usize(&self) -> usize { + . . . . // FIXME: Use as_usize() once const functions in traits are stable. +200,644 ( 0.06%) . . . self.0 as usize + . . . . } + . . . . + . . . . /// Return this small index as a `u64`. This is guaranteed to never + . . . . /// overflow. + . . . . #[inline] + . . . . pub const fn as_u64(&self) -> u64 { + . . . . // FIXME: Use u64::from() once const functions in traits are stable. + 11,813 ( 0.00%) . . . self.0 as u64 + . . . . } + . . . . + . . . . /// Return the internal `u32` of this small index. This is guaranteed to + . . . . /// never overflow `u32`. + . . . . #[inline] + . . . . pub const fn as_u32(&self) -> u32 { + . . . . self.0 + . . . . } +-- line 219 ---------------------------------------- +-- line 227 ---------------------------------------- + . . . . } + . . . . + . . . . /// Returns one more than this small index as a usize. + . . . . /// + . . . . /// Since a small index has constraints on its maximum value, adding `1` to + . . . . /// it will always fit in a `usize`, `u32` and a `i32`. + . . . . #[inline] + . . . . pub fn one_more(&self) -> usize { + 2,160 ( 0.00%) . . . self.as_usize() + 1 + . . . . } + . . . . + . . . . /// Decode this small index from the bytes given using the native endian + . . . . /// byte order for the current target. + . . . . /// + . . . . /// If the decoded integer is not representable as a small index for the + . . . . /// current target, then this returns an error. + . . . . #[inline] +-- line 243 ---------------------------------------- +-- line 319 ---------------------------------------- + . . . . Ok(SmallIndex::new_unchecked(index.as_usize())) + . . . . } + . . . . } + . . . . + . . . . impl TryFrom for SmallIndex { + . . . . type Error = SmallIndexError; + . . . . + . . . . fn try_from(index: u32) -> Result { + 3,096 ( 0.00%) . . . if index > SmallIndex::MAX.as_u32() { + . . . . return Err(SmallIndexError { attempted: u64::from(index) }); + . . . . } + . . . . Ok(SmallIndex::new_unchecked(index.as_usize())) + . . . . } + . . . . } + . . . . + . . . . impl TryFrom for SmallIndex { + . . . . type Error = SmallIndexError; +-- line 335 ---------------------------------------- +-- line 341 ---------------------------------------- + . . . . Ok(SmallIndex::new_unchecked(index.as_usize())) + . . . . } + . . . . } + . . . . + . . . . impl TryFrom for SmallIndex { + . . . . type Error = SmallIndexError; + . . . . + . . . . fn try_from(index: usize) -> Result { +400,048 ( 0.12%) . . . if index > SmallIndex::MAX.as_usize() { + . . . . return Err(SmallIndexError { attempted: index.as_u64() }); + . . . . } + . . . . Ok(SmallIndex::new_unchecked(index)) + . . . . } + . . . . } + . . . . + . . . . #[cfg(test)] + . . . . impl quickcheck::Arbitrary for SmallIndex { +-- line 357 ---------------------------------------- +-- line 402 ---------------------------------------- + . . . . pub(crate) struct SmallIndexIter { + . . . . rng: core::ops::Range, + . . . . } + . . . . + . . . . impl Iterator for SmallIndexIter { + . . . . type Item = SmallIndex; + . . . . + . . . . fn next(&mut self) -> Option { +179,078 ( 0.05%) . . . if self.rng.start >= self.rng.end { + . . . . return None; + . . . . } + 81 ( 0.00%) . . . let next_id = self.rng.start + 1; + . . . . let id = core::mem::replace(&mut self.rng.start, next_id); + . . . . // new_unchecked is OK since we asserted that the number of + . . . . // elements in this iterator will fit in an ID at construction. + . . . . Some(SmallIndex::new_unchecked(id)) + . . . . } + . . . . } + . . . . + . . . . macro_rules! index_type_impls { +-- line 421 ---------------------------------------- +-- line 550 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . impl core::ops::Index<$name> for [T] { + . . . . type Output = T; + . . . . + . . . . #[inline] + . . . . fn index(&self, index: $name) -> &T { +244,572 ( 0.07%) . . . &self[index.as_usize()] + . . . . } + . . . . } + . . . . + . . . . impl core::ops::IndexMut<$name> for [T] { + . . . . #[inline] + . . . . fn index_mut(&mut self, index: $name) -> &mut T { + . . . . &mut self[index.as_usize()] + . . . . } +-- line 566 ---------------------------------------- +-- line 567 ---------------------------------------- + . . . . } + . . . . + . . . . #[cfg(feature = "alloc")] + . . . . impl core::ops::Index<$name> for Vec { + . . . . type Output = T; + . . . . + . . . . #[inline] + . . . . fn index(&self, index: $name) -> &T { +199,507 ( 0.06%) . . . &self[index.as_usize()] + . . . . } + . . . . } + . . . . + . . . . #[cfg(feature = "alloc")] + . . . . impl core::ops::IndexMut<$name> for Vec { + . . . . #[inline] + . . . . fn index_mut(&mut self, index: $name) -> &mut T { +266,365 ( 0.08%) . . . &mut self[index.as_usize()] + . . . . } + . . . . } + . . . . + . . . . impl From for $name { + . . . . fn from(value: u8) -> $name { + . . . . $name(SmallIndex::from(value)) + . . . . } + . . . . } +-- line 591 ---------------------------------------- +-- line 661 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . #[derive(Clone, Debug)] + . . . . pub(crate) struct $iter(SmallIndexIter); + . . . . + . . . . impl $iter { + . . . . fn new(len: usize) -> $iter { + 432 ( 0.00%) . . . assert!( + 432 ( 0.00%) . . . len <= $name::LIMIT, + . . . . "cannot create iterator for {} when number of \ + . . . . elements exceed {:?}", + . . . . stringify!($name), + . . . . $name::LIMIT, + . . . . ); + . . . . $iter(SmallIndexIter { rng: 0..len }) + . . . . } + . . . . } +-- line 678 ---------------------------------------- + + 69,496 ( 0.02%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/literal_trie.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 102 ---------------------------------------- + . . . . LiteralTrie { states: vec![root], rev: true } + . . . . } + . . . . + . . . . /// Add the given literal to this trie. + . . . . /// + . . . . /// If the literal could not be added because the `StateID` space was + . . . . /// exhausted, then an error is returned. If an error returns, the trie + . . . . /// is in an unspecified state. +267,110 ( 0.08%) . . . pub(crate) fn add(&mut self, bytes: &[u8]) -> Result<(), BuildError> { + . . . . let mut prev = StateID::ZERO; + . . . . let mut it = bytes.iter().copied(); +221,725 ( 0.06%) . . . while let Some(b) = if self.rev { it.next_back() } else { it.next() } { + . . . . prev = self.get_or_add_state(prev, b)?; + . . . . } + . . . . self.states[prev].add_match(); + 26,711 ( 0.01%) . . . Ok(()) +213,688 ( 0.06%) . . . } + . . . . + . . . . /// If the given transition is defined, then return the next state ID. + . . . . /// Otherwise, add the transition to `from` and point it to a new state. + . . . . /// + . . . . /// If a new state ID could not be allocated, then an error is returned. + . . . . fn get_or_add_state( + . . . . &mut self, + . . . . from: StateID, + . . . . byte: u8, + . . . . ) -> Result { + . . . . let active = self.states[from].active_chunk(); + . . . . match active.binary_search_by_key(&byte, |t| t.byte) { + 30,376 ( 0.01%) . . . Ok(i) => Ok(active[i].next), + . . . . Err(i) => { + . . . . // Add a new state and get its ID. + . . . . let next = StateID::new(self.states.len()).map_err(|_| { + . . . . BuildError::too_many_states(self.states.len()) + . . . . })?; + . . . . self.states.push(State::default()); + . . . . // Offset our position to account for all transitions and not + . . . . // just the ones in the active chunk. + 85,194 ( 0.02%) . . . let i = self.states[from].active_chunk_start() + i; + . . . . let t = Transition { byte, next }; + . . . . self.states[from].transitions.insert(i, t); + . . . . Ok(next) + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Compile this literal trie to the NFA builder given. + . . . . /// + . . . . /// This forwards any errors that may occur while using the given builder. + 4,950 ( 0.00%) . . . pub(crate) fn compile( + . . . . &self, + . . . . builder: &mut Builder, + . . . . ) -> Result { + . . . . // Compilation proceeds via depth-first traversal of the trie. + . . . . // + . . . . // This is overall pretty brutal. The recursive version of this is + . . . . // deliciously simple. (See 'compile_to_hir' below for what it might + . . . . // look like.) But recursion on a trie means your call stack grows +-- line 159 ---------------------------------------- +-- line 164 ---------------------------------------- + . . . . // frame. If someone can simplify this without using recursion, that'd + . . . . // be great. + . . . . + . . . . // 'end' is our match state for this trie, but represented in the the + . . . . // NFA. Any time we see a match in the trie, we insert a transition + . . . . // from the current state we're in to 'end'. + . . . . let end = builder.add_empty()?; + . . . . let mut stack = vec![]; + 495 ( 0.00%) . . . let mut f = Frame::new(&self.states[StateID::ZERO]); + . . . . loop { + . . . . if let Some(t) = f.transitions.next() { + 81,602 ( 0.02%) . . . if self.states[t.next].is_leaf() { + 49,682 ( 0.01%) . . . f.sparse.push(thompson::Transition { + . . . . start: t.byte, + . . . . end: t.byte, + . . . . next: end, + . . . . }); + . . . . } else { + 15,960 ( 0.00%) . . . f.sparse.push(thompson::Transition { + . . . . start: t.byte, + . . . . end: t.byte, + . . . . // This is a little funny, but when the frame we create + . . . . // below completes, it will pop this parent frame off + . . . . // and modify this transition to point to the correct + . . . . // state. + . . . . next: StateID::ZERO, + . . . . }); +223,440 ( 0.06%) . . . stack.push(f); +223,440 ( 0.06%) . . . f = Frame::new(&self.states[t.next]); + . . . . } + . . . . continue; + . . . . } + . . . . // At this point, we have visited all transitions in f.chunk, so + . . . . // add it as a sparse NFA state. Unless the chunk was empty, in + . . . . // which case, we don't do anything. + 52,282 ( 0.02%) . . . if !f.sparse.is_empty() { + . . . . let chunk_id = if f.sparse.len() == 1 { + . . . . builder.add_range(f.sparse.pop().unwrap())? + . . . . } else { + . . . . let sparse = mem::replace(&mut f.sparse, vec![]); + . . . . builder.add_sparse(sparse)? + . . . . }; + . . . . f.union.push(chunk_id); + . . . . } + . . . . // Now we need to look to see if there are other chunks to visit. + 18,325 ( 0.01%) . . . if let Some(chunk) = f.chunks.next() { + . . . . // If we're here, it means we're on the second (or greater) + . . . . // chunk, which implies there is a match at this point. So + . . . . // connect this state to the final end state. + . . . . f.union.push(end); + . . . . // Advance to the next chunk. + 3,740 ( 0.00%) . . . f.transitions = chunk.iter(); + . . . . continue; + . . . . } + . . . . // Now that we are out of chunks, we have completely visited + . . . . // this state. So turn our union of chunks into an NFA union + . . . . // state, and add that union state to the parent state's current + . . . . // sparse state. (If there is no parent, we're done.) + 82,275 ( 0.02%) . . . let start = builder.add_union(f.union)?; + 31,920 ( 0.01%) . . . match stack.pop() { + . . . . None => { + 1,980 ( 0.00%) . . . return Ok(ThompsonRef { start, end }); + . . . . } +191,520 ( 0.06%) . . . Some(mut parent) => { + . . . . // OK because the only way a frame gets pushed on to the + . . . . // stack (aside from the root) is when a transition has + . . . . // been added to 'sparse'. + 15,960 ( 0.00%) . . . parent.sparse.last_mut().unwrap().next = start; +255,360 ( 0.07%) . . . f = parent; + . . . . } + . . . . } + . . . . } + 4,455 ( 0.00%) . . . } + . . . . + . . . . /// Converts this trie to an equivalent HIR expression. + . . . . /// + . . . . /// We don't actually use this, but it's useful for tests. In particular, + . . . . /// it provides a (somewhat) human readable representation of the trie + . . . . /// itself. + . . . . #[cfg(test)] + . . . . fn compile_to_hir(&self) -> regex_syntax::hir::Hir { +-- line 244 ---------------------------------------- +-- line 323 ---------------------------------------- + . . . . /// Create a new stack frame for trie traversal. This initializes the + . . . . /// 'transitions' iterator to the transitions for the first chunk, with the + . . . . /// 'chunks' iterator being every chunk after the first one. + . . . . fn new(state: &'a State) -> Frame<'a> { + . . . . let mut chunks = state.chunks(); + . . . . // every state has at least 1 chunk + . . . . let chunk = chunks.next().unwrap(); + . . . . let transitions = chunk.iter(); + 54,810 ( 0.02%) . . . Frame { chunks, transitions, union: vec![], sparse: vec![] } + . . . . } + . . . . } + . . . . + . . . . /// A state in a trie. + . . . . /// + . . . . /// This uses a sparse representation. Since we don't use literal tries + . . . . /// for searching, and ultimately (and compilation requires visiting every + . . . . /// transition anyway), we use a sparse representation for transitions. This +-- line 339 ---------------------------------------- +-- line 371 ---------------------------------------- + . . . . fn add_match(&mut self) { + . . . . // This is not strictly necessary, but there's no point in recording + . . . . // another match by adding another chunk if the state has no + . . . . // transitions. Note though that we only skip this if we already know + . . . . // this is a match state, which is only true if 'chunks' is not empty. + . . . . // Basically, if we didn't do this, nothing semantically would change, + . . . . // but we'd end up pushing another chunk and potentially triggering an + . . . . // alloc. + 51,747 ( 0.01%) . . . if self.transitions.is_empty() && !self.chunks.is_empty() { + . . . . return; + . . . . } + 80,133 ( 0.02%) . . . let chunk_start = self.active_chunk_start(); + . . . . let chunk_end = self.transitions.len(); + 53,422 ( 0.02%) . . . self.chunks.push((chunk_start, chunk_end)); + . . . . } + . . . . + . . . . /// Returns true if and only if this state is a leaf state. That is, a + . . . . /// state that has no outgoing transitions. + . . . . fn is_leaf(&self) -> bool { + . . . . self.transitions.is_empty() + . . . . } + . . . . +-- line 392 ---------------------------------------- +-- line 399 ---------------------------------------- + . . . . transitions: &*self.transitions, + . . . . chunks: self.chunks.iter(), + . . . . active: Some(self.active_chunk()), + . . . . } + . . . . } + . . . . + . . . . /// Returns the active chunk as a slice of transitions. + . . . . fn active_chunk(&self) -> &[Transition] { + 73,003 ( 0.02%) . . . let start = self.active_chunk_start(); + 71,177 ( 0.02%) . . . &self.transitions[start..] + . . . . } + . . . . + . . . . /// Returns the index into 'transitions' where the active chunk starts. + . . . . fn active_chunk_start(&self) -> usize { + . . . . self.chunks.last().map_or(0, |&(_, end)| end) + . . . . } + . . . . } + . . . . +-- line 416 ---------------------------------------- +-- line 446 ---------------------------------------- + . . . . chunks: core::slice::Iter<'a, (usize, usize)>, + . . . . active: Option<&'a [Transition]>, + . . . . } + . . . . + . . . . impl<'a> Iterator for StateChunksIter<'a> { + . . . . type Item = &'a [Transition]; + . . . . + . . . . fn next(&mut self) -> Option<&'a [Transition]> { + 3,740 ( 0.00%) . . . if let Some(&(start, end)) = self.chunks.next() { + . . . . return Some(&self.transitions[start..end]); + . . . . } + 18,325 ( 0.01%) . . . if let Some(chunk) = self.active.take() { + . . . . return Some(chunk); + . . . . } + . . . . None + . . . . } + . . . . } + . . . . + . . . . /// A single transition in a trie to another state. + . . . . #[derive(Clone, Copy)] +-- line 465 ---------------------------------------- + +568,788 ( 0.16%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/utf8.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 107 ---------------------------------------- + . . . . + . . . . impl Utf8Sequence { + . . . . /// Creates a new UTF-8 sequence from the encoded bytes of a scalar value + . . . . /// range. + . . . . /// + . . . . /// This assumes that `start` and `end` have the same length. + . . . . fn from_encoded_range(start: &[u8], end: &[u8]) -> Self { + . . . . assert_eq!(start.len(), end.len()); + 8,670 ( 0.00%) . . . match start.len() { + . . . . 2 => Utf8Sequence::Two([ + . . . . Utf8Range::new(start[0], end[0]), + . . . . Utf8Range::new(start[1], end[1]), + . . . . ]), + . . . . 3 => Utf8Sequence::Three([ + . . . . Utf8Range::new(start[0], end[0]), + . . . . Utf8Range::new(start[1], end[1]), + . . . . Utf8Range::new(start[2], end[2]), +-- line 123 ---------------------------------------- +-- line 128 ---------------------------------------- + . . . . Utf8Range::new(start[2], end[2]), + . . . . Utf8Range::new(start[3], end[3]), + . . . . ]), + . . . . n => unreachable!("invalid encoded length: {}", n), + . . . . } + . . . . } + . . . . + . . . . /// Returns the underlying sequence of byte ranges as a slice. + 2,300 ( 0.00%) . . . pub fn as_slice(&self) -> &[Utf8Range] { + . . . . use self::Utf8Sequence::*; +11,500 ( 0.00%) . . . match *self { + 1,132 ( 0.00%) . . . One(ref r) => slice::from_ref(r), + 386 ( 0.00%) . . . Two(ref r) => &r[..], + 1,804 ( 0.00%) . . . Three(ref r) => &r[..], + 1,278 ( 0.00%) . . . Four(ref r) => &r[..], + . . . . } + 2,300 ( 0.00%) . . . } + . . . . + . . . . /// Returns the number of byte ranges in this sequence. + . . . . /// + . . . . /// The length is guaranteed to be in the closed interval `[1, 4]`. + . . . . pub fn len(&self) -> usize { + . . . . self.as_slice().len() + . . . . } + . . . . +-- line 152 ---------------------------------------- +-- line 296 ---------------------------------------- + . . . . #[derive(Debug)] + . . . . pub struct Utf8Sequences { + . . . . range_stack: Vec, + . . . . } + . . . . + . . . . impl Utf8Sequences { + . . . . /// Create a new iterator over UTF-8 byte ranges for the scalar value range + . . . . /// given. + 7,896 ( 0.00%) . . . pub fn new(start: char, end: char) -> Self { + 3,948 ( 0.00%) . . . let mut it = Utf8Sequences { range_stack: vec![] }; + . . . . it.push(u32::from(start), u32::from(end)); + . . . . it + 6,580 ( 0.00%) . . . } + . . . . + . . . . /// reset resets the scalar value range. + . . . . /// Any existing state is cleared, but resources may be reused. + . . . . /// + . . . . /// N.B. Benchmarks say that this method is dubious. + . . . . #[doc(hidden)] + . . . . pub fn reset(&mut self, start: char, end: char) { + . . . . self.range_stack.clear(); +-- line 316 ---------------------------------------- +-- line 331 ---------------------------------------- + . . . . fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + . . . . write!(f, "ScalarRange({:X}, {:X})", self.start, self.end) + . . . . } + . . . . } + . . . . + . . . . impl Iterator for Utf8Sequences { + . . . . type Item = Utf8Sequence; + . . . . +32,544 ( 0.01%) . . . fn next(&mut self) -> Option { + . . . . 'TOP: while let Some(mut r) = self.range_stack.pop() { + . . . . 'INNER: loop { + . . . . if let Some((r1, r2)) = r.split() { + . . . . self.push(r2.start, r2.end); + . . . . r.start = r1.start; + . . . . r.end = r1.end; + . . . . continue 'INNER; + . . . . } + 3,161 ( 0.00%) . . . if !r.is_valid() { + . . . . continue 'TOP; + . . . . } + . . . . for i in 1..MAX_UTF8_BYTES { + . . . . let max = max_scalar_value(i); +16,316 ( 0.00%) . . . if r.start <= max && max < r.end { + 369 ( 0.00%) . . . self.push(max + 1, r.end); + . . . . r.end = max; + . . . . continue 'INNER; + . . . . } + . . . . } + . . . . if let Some(ascii_range) = r.as_ascii() { + 2,264 ( 0.00%) . . . return Some(Utf8Sequence::One(ascii_range)); + . . . . } + . . . . for i in 1..MAX_UTF8_BYTES { + . . . . let m = (1 << (6 * i)) - 1; +25,728 ( 0.01%) . . . if (r.start & !m) != (r.end & !m) { + 2,952 ( 0.00%) . . . if (r.start & m) != 0 { + 492 ( 0.00%) . . . self.push((r.start | m) + 1, r.end); + . . . . r.end = r.start | m; + . . . . continue 'INNER; + . . . . } +10,947 ( 0.00%) . . . if (r.end & m) != m { + . . . . self.push(r.end & !m, r.end); + 246 ( 0.00%) . . . r.end = (r.end & !m) - 1; + . . . . continue 'INNER; + . . . . } + . . . . } + . . . . } + . . . . let mut start = [0; MAX_UTF8_BYTES]; + . . . . let mut end = [0; MAX_UTF8_BYTES]; + . . . . let n = r.encode(&mut start, &mut end); +15,606 ( 0.00%) . . . return Some(Utf8Sequence::from_encoded_range( + . . . . &start[0..n], + . . . . &end[0..n], + . . . . )); + . . . . } + . . . . } + 2,632 ( 0.00%) . . . None +28,928 ( 0.01%) . . . } + . . . . } + . . . . + . . . . impl FusedIterator for Utf8Sequences {} + . . . . + . . . . impl ScalarRange { + . . . . /// split splits this range if it overlaps with a surrogate codepoint. + . . . . /// + . . . . /// Either or both ranges may be invalid. + . . . . fn split(&self) -> Option<(ScalarRange, ScalarRange)> { + 7,570 ( 0.00%) . . . if self.start < 0xE000 && self.end > 0xD7FF { + . . . . Some(( + . . . . ScalarRange { start: self.start, end: 0xD7FF }, + . . . . ScalarRange { start: 0xE000, end: self.end }, + . . . . )) + . . . . } else { + . . . . None + . . . . } + . . . . } + . . . . + . . . . /// is_valid returns true if and only if start <= end. + . . . . fn is_valid(&self) -> bool { + 3,161 ( 0.00%) . . . self.start <= self.end + . . . . } + . . . . + . . . . /// as_ascii returns this range as a Utf8Range if and only if all scalar + . . . . /// values in this range can be encoded as a single byte. + . . . . fn as_ascii(&self) -> Option { + 2,792 ( 0.00%) . . . if self.is_ascii() { + . . . . let start = u8::try_from(self.start).unwrap(); + . . . . let end = u8::try_from(self.end).unwrap(); + . . . . Some(Utf8Range::new(start, end)) + . . . . } else { + . . . . None + . . . . } + . . . . } + . . . . +-- line 423 ---------------------------------------- +-- line 428 ---------------------------------------- + . . . . } + . . . . + . . . . /// encode writes the UTF-8 encoding of the start and end of this range + . . . . /// to the corresponding destination slices, and returns the number of + . . . . /// bytes written. + . . . . /// + . . . . /// The slices should have room for at least `MAX_UTF8_BYTES`. + . . . . fn encode(&self, start: &mut [u8], end: &mut [u8]) -> usize { + 5,202 ( 0.00%) . . . let cs = char::from_u32(self.start).unwrap(); + . . . . let ce = char::from_u32(self.end).unwrap(); + . . . . let ss = cs.encode_utf8(start); + . . . . let se = ce.encode_utf8(end); + 3,468 ( 0.00%) . . . assert_eq!(ss.len(), se.len()); + . . . . ss.len() + . . . . } + . . . . } + . . . . + . . . . fn max_scalar_value(nbytes: usize) -> u32 { + . . . . match nbytes { + . . . . 1 => 0x007F, + . . . . 2 => 0x07FF, +-- line 448 ---------------------------------------- + +24,424 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 248 ---------------------------------------- + . . . . &self.special + . . . . } + . . . . + . . . . /// Swaps the states at `id1` and `id2`. + . . . . /// + . . . . /// This does not update the transitions of any state to account for the + . . . . /// state swap. + . . . . pub(crate) fn swap_states(&mut self, id1: StateID, id2: StateID) { + 1,446 ( 0.00%) . . . self.states.swap(id1.as_usize(), id2.as_usize()); + . . . . } + . . . . + . . . . /// Re-maps all state IDs in this NFA according to the `map` function + . . . . /// given. + . . . . pub(crate) fn remap(&mut self, map: impl Fn(StateID) -> StateID) { + . . . . let alphabet_len = self.byte_classes.alphabet_len(); + . . . . for state in self.states.iter_mut() { + 5,248 ( 0.00%) . . . state.fail = map(state.fail); + . . . . let mut link = state.sparse; + 42,682 ( 0.01%) . . . while link != StateID::ZERO { + . . . . let t = &mut self.sparse[link]; +116,412 ( 0.03%) . . . t.next = map(t.next); + . . . . link = t.link; + . . . . } + 2,624 ( 0.00%) . . . if state.dense != StateID::ZERO { + . . . . let start = state.dense.as_usize(); + . . . . for next in self.dense[start..][..alphabet_len].iter_mut() { +186,694 ( 0.05%) . . . *next = map(*next); + . . . . } + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Iterate over all of the transitions for the given state ID. + 7,360 ( 0.00%) . . . pub(crate) fn iter_trans( + . . . . &self, + . . . . sid: StateID, + . . . . ) -> impl Iterator + '_ { + 6,286 ( 0.00%) . . . let mut link = self.states[sid].sparse; + . . . . core::iter::from_fn(move || { + 42,786 ( 0.01%) . . . if link == StateID::ZERO { + . . . . return None; + . . . . } +139,664 ( 0.04%) . . . let t = self.sparse[link]; + . . . . link = t.link; +178,218 ( 0.05%) . . . Some(t) + . . . . }) + 7,360 ( 0.00%) . . . } + . . . . + . . . . /// Iterate over all of the matches for the given state ID. + . . . . pub(crate) fn iter_matches( + . . . . &self, + . . . . sid: StateID, + . . . . ) -> impl Iterator + '_ { + 5,064 ( 0.00%) . . . let mut link = self.states[sid].matches; + . . . . core::iter::from_fn(move || { + 5,505 ( 0.00%) . . . if link == StateID::ZERO { + . . . . return None; + . . . . } + 3,670 ( 0.00%) . . . let m = self.matches[link]; + . . . . link = m.link; + . . . . Some(m.pid) + . . . . }) + . . . . } + . . . . + . . . . /// Return the link following the one given. If the one given is the last + . . . . /// link for the given state, then return `None`. + . . . . /// +-- line 314 ---------------------------------------- +-- line 320 ---------------------------------------- + . . . . /// the NFA during iteration. Namely, one can access the transition pointed + . . . . /// to by the link via `self.sparse[link]`. + . . . . fn next_link( + . . . . &self, + . . . . sid: StateID, + . . . . prev: Option, + . . . . ) -> Option { + . . . . let link = +107,950 ( 0.03%) . . . prev.map_or(self.states[sid].sparse, |p| self.sparse[p].link); + . . . . if link == StateID::ZERO { + . . . . None + . . . . } else { + . . . . Some(link) + . . . . } + . . . . } + . . . . + . . . . /// Follow the transition for the given byte in the given state. If no such +-- line 336 ---------------------------------------- +-- line 346 ---------------------------------------- + . . . . // since we only do this for a small number of states (by default), the + . . . . // memory usage is usually minimal. + . . . . // + . . . . // This has *massive* benefit when executing searches because the + . . . . // unanchored starting state is by far the hottest state and is + . . . . // frequently visited. Moreover, the 'for' loop below that works + . . . . // decently on an actually sparse state is disastrous on a state that + . . . . // is nearly or completely dense. + 8,886 ( 0.00%) . . . if s.dense == StateID::ZERO { + . . . . self.follow_transition_sparse(sid, byte) + . . . . } else { + . . . . let class = usize::from(self.byte_classes.get(byte)); + 1,454 ( 0.00%) . . . self.dense[s.dense.as_usize() + class] + . . . . } + . . . . } + . . . . + . . . . /// Like `follow_transition`, but always uses the sparse representation. + . . . . #[inline(always)] + . . . . fn follow_transition_sparse(&self, sid: StateID, byte: u8) -> StateID { + 11,040 ( 0.00%) . . . for t in self.iter_trans(sid) { + 40,480 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::iter_trans (3,680x) +210,436 ( 0.06%) . . . if byte <= t.byte { + 4,108 ( 0.00%) . . . if byte == t.byte { + . . . . return t.next; + . . . . } + . . . . break; + . . . . } + . . . . } + . . . . NFA::FAIL + . . . . } + . . . . + . . . . /// Set the transition for the given byte to the state ID given. + . . . . /// + . . . . /// Note that one should not set transitions to the FAIL state. It is not + . . . . /// technically incorrect, but it wastes space. If a transition is not + . . . . /// defined, then it is automatically assumed to lead to the FAIL state. + 24,320 ( 0.01%) . . . fn add_transition( + . . . . &mut self, + . . . . prev: StateID, + . . . . byte: u8, + . . . . next: StateID, + . . . . ) -> Result<(), BuildError> { + 7,296 ( 0.00%) . . . if self.states[prev].dense != StateID::ZERO { + . . . . let dense = self.states[prev].dense; + . . . . let class = usize::from(self.byte_classes.get(byte)); + . . . . self.dense[dense.as_usize() + class] = next; + . . . . } + . . . . + 4,864 ( 0.00%) . . . let head = self.states[prev].sparse; + 5,076 ( 0.00%) . . . if head == StateID::ZERO || byte < self.sparse[head].byte { + . . . . let new_link = self.alloc_transition()?; + 4,140 ( 0.00%) . . . self.sparse[new_link] = Transition { byte, next, link: head }; + 1,380 ( 0.00%) . . . self.states[prev].sparse = new_link; + . . . . return Ok(()); + 1,052 ( 0.00%) . . . } else if byte == self.sparse[head].byte { + . . . . self.sparse[head].next = next; + . . . . return Ok(()); + . . . . } + . . . . + . . . . // We handled the only cases where the beginning of the transition + . . . . // chain needs to change. At this point, we now know that there is + . . . . // at least one entry in the transition chain and the byte for that + . . . . // transition is less than the byte for the transition we're adding. + . . . . let (mut link_prev, mut link_next) = (head, self.sparse[head].link); +166,004 ( 0.05%) . . . while link_next != StateID::ZERO && byte > self.sparse[link_next].byte + . . . . { + . . . . link_prev = link_next; + . . . . link_next = self.sparse[link_next].link; + . . . . } + 536 ( 0.00%) . . . if link_next == StateID::ZERO || byte < self.sparse[link_next].byte { + . . . . let link = self.alloc_transition()?; + 1,680 ( 0.00%) . . . self.sparse[link] = Transition { byte, next, link: link_next }; + 1,680 ( 0.00%) . . . self.sparse[link_prev].link = link; + . . . . } else { + 492 ( 0.00%) . . . assert_eq!(byte, self.sparse[link_next].byte); + . . . . self.sparse[link_next].next = next; + . . . . } + . . . . Ok(()) + 21,888 ( 0.01%) . . . } + . . . . + . . . . /// This sets every possible transition (all 255 of them) for the given + . . . . /// state to the name `next` value. + . . . . /// + . . . . /// This is useful for efficiently initializing start/dead states. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This requires that the state has no transitions added to it already. + . . . . /// If it has any transitions, then this panics. It will also panic if + . . . . /// the state has been densified prior to calling this. + 1,152 ( 0.00%) . . . fn init_full_state( + . . . . &mut self, + . . . . prev: StateID, + . . . . next: StateID, + . . . . ) -> Result<(), BuildError> { + 144 ( 0.00%) . . . assert_eq!( + . . . . StateID::ZERO, + . . . . self.states[prev].dense, + . . . . "state must not be dense yet" + . . . . ); + 144 ( 0.00%) . . . assert_eq!( + . . . . StateID::ZERO, + . . . . self.states[prev].sparse, + . . . . "state must have zero transitions" + . . . . ); + . . . . let mut prev_link = StateID::ZERO; + . . . . for byte in 0..=255 { + . . . . let new_link = self.alloc_transition()?; +110,592 ( 0.03%) . . . self.sparse[new_link] = + . . . . Transition { byte, next, link: StateID::ZERO }; + 36,864 ( 0.01%) . . . if prev_link == StateID::ZERO { + 144 ( 0.00%) . . . self.states[prev].sparse = new_link; + . . . . } else { + 73,440 ( 0.02%) . . . self.sparse[prev_link].link = new_link; + . . . . } + . . . . prev_link = new_link; + . . . . } + 144 ( 0.00%) . . . Ok(()) + 1,152 ( 0.00%) . . . } + . . . . + . . . . /// Add a match for the given pattern ID to the state for the given ID. + 11,152 ( 0.00%) . . . fn add_match( + . . . . &mut self, + . . . . sid: StateID, + . . . . pid: PatternID, + . . . . ) -> Result<(), BuildError> { + 1,394 ( 0.00%) . . . let head = self.states[sid].matches; + . . . . let mut link = head; + 1,394 ( 0.00%) . . . while self.matches[link].link != StateID::ZERO { + . . . . link = self.matches[link].link; + . . . . } + . . . . let new_match_link = self.alloc_match()?; + 1,394 ( 0.00%) . . . self.matches[new_match_link].pid = pid; + 1,394 ( 0.00%) . . . if link == StateID::ZERO { + 2,788 ( 0.00%) . . . self.states[sid].matches = new_match_link; + . . . . } else { + . . . . self.matches[link].link = new_match_link; + . . . . } + . . . . Ok(()) + 12,546 ( 0.00%) . . . } + . . . . + . . . . /// Copy matches from the `src` state to the `dst` state. This is useful + . . . . /// when a match state can be reached via a failure transition. In which + . . . . /// case, you'll want to copy the matches (if any) from the state reached + . . . . /// by the failure transition to the original state you were at. + 5,768 ( 0.00%) . . . fn copy_matches( + . . . . &mut self, + . . . . src: StateID, + . . . . dst: StateID, + . . . . ) -> Result<(), BuildError> { + 2,163 ( 0.00%) . . . let head_dst = self.states[dst].matches; + . . . . let mut link_dst = head_dst; + 721 ( 0.00%) . . . while self.matches[link_dst].link != StateID::ZERO { + . . . . link_dst = self.matches[link_dst].link; + . . . . } + 721 ( 0.00%) . . . let mut link_src = self.states[src].matches; + 721 ( 0.00%) . . . while link_src != StateID::ZERO { + . . . . let new_match_link = + . . . . StateID::new(self.matches.len()).map_err(|e| { + . . . . BuildError::state_id_overflow( + . . . . StateID::MAX.as_u64(), + . . . . e.attempted(), + . . . . ) + . . . . })?; + . . . . self.matches.push(Match { +-- line 509 ---------------------------------------- +-- line 515 ---------------------------------------- + . . . . } else { + . . . . self.matches[link_dst].link = new_match_link; + . . . . } + . . . . + . . . . link_dst = new_match_link; + . . . . link_src = self.matches[link_src].link; + . . . . } + . . . . Ok(()) + 5,768 ( 0.00%) . . . } + . . . . + . . . . /// Create a new entry in `NFA::trans`, if there's room, and return that + . . . . /// entry's ID. If there's no room, then an error is returned. + . . . . fn alloc_transition(&mut self) -> Result { + 1,940 ( 0.00%) . . . let id = StateID::new(self.sparse.len()).map_err(|e| { + . . . . BuildError::state_id_overflow(StateID::MAX.as_u64(), e.attempted()) + . . . . })?; + . . . . self.sparse.push(Transition::default()); + . . . . Ok(id) + . . . . } + . . . . + . . . . /// Create a new entry in `NFA::matches`, if there's room, and return that + . . . . /// entry's ID. If there's no room, then an error is returned. +-- line 536 ---------------------------------------- +-- line 560 ---------------------------------------- + . . . . .take(self.byte_classes.alphabet_len()), + . . . . ); + . . . . Ok(id) + . . . . } + . . . . + . . . . /// Allocate and add a fresh state to the underlying NFA and return its + . . . . /// ID (guaranteed to be one more than the ID of the previously allocated + . . . . /// state). If the ID would overflow `StateID`, then this returns an error. + 18,368 ( 0.01%) . . . fn alloc_state(&mut self, depth: usize) -> Result { + . . . . // This is OK because we error when building the trie if we see a + . . . . // pattern whose length cannot fit into a 'SmallIndex', and the longest + . . . . // possible depth corresponds to the length of the longest pattern. + . . . . let depth = SmallIndex::new(depth) + . . . . .expect("patterns longer than SmallIndex::MAX are not allowed"); + . . . . let id = StateID::new(self.states.len()).map_err(|e| { + . . . . BuildError::state_id_overflow(StateID::MAX.as_u64(), e.attempted()) + . . . . })?; + . . . . self.states.push(State { + . . . . sparse: StateID::ZERO, + . . . . dense: StateID::ZERO, + . . . . matches: StateID::ZERO, + 2,624 ( 0.00%) . . . fail: self.special.start_unanchored_id, + . . . . depth, + . . . . }); + 5,248 ( 0.00%) . . . Ok(id) + 20,992 ( 0.01%) . . . } + . . . . } + . . . . + . . . . // SAFETY: 'start_state' always returns a valid state ID, 'next_state' always + . . . . // returns a valid state ID given a valid state ID. We otherwise claim that + . . . . // all other methods are correct as well. + . . . . unsafe impl Automaton for NFA { + . . . . #[inline(always)] + . . . . fn start_state(&self, anchored: Anchored) -> Result { +-- line 593 ---------------------------------------- +-- line 606 ---------------------------------------- + . . . . ) -> StateID { + . . . . // This terminates since: + . . . . // + . . . . // 1. state.fail never points to the FAIL state. + . . . . // 2. All state.fail values point to a state closer to the start state. + . . . . // 3. The start state has no transitions to the FAIL state. + . . . . loop { + . . . . let next = self.follow_transition(sid, byte); + 90 ( 0.00%) . . . if next != NFA::FAIL { + . . . . return next; + . . . . } + . . . . // For an anchored search, we never follow failure transitions + . . . . // because failure transitions lead us down a path to matching + . . . . // a *proper* suffix of the path we were on. Thus, it can only + . . . . // produce matches that appear after the beginning of the search. + . . . . if anchored.is_anchored() { + . . . . return NFA::DEAD; +-- line 622 ---------------------------------------- +-- line 647 ---------------------------------------- + . . . . #[inline(always)] + . . . . fn is_start(&self, sid: StateID) -> bool { + . . . . sid == self.special.start_unanchored_id + . . . . || sid == self.special.start_anchored_id + . . . . } + . . . . + . . . . #[inline(always)] + . . . . fn match_kind(&self) -> MatchKind { + 48 ( 0.00%) . . . self.match_kind + . . . . } + . . . . + . . . . #[inline(always)] + . . . . fn patterns_len(&self) -> usize { + . . . . self.pattern_lens.len() + . . . . } + . . . . + . . . . #[inline(always)] + . . . . fn pattern_len(&self, pid: PatternID) -> usize { + . . . . self.pattern_lens[pid].as_usize() + . . . . } + . . . . + . . . . #[inline(always)] + . . . . fn min_pattern_len(&self) -> usize { + 48 ( 0.00%) . . . self.min_pattern_len + . . . . } + . . . . + . . . . #[inline(always)] + . . . . fn max_pattern_len(&self) -> usize { + . . . . self.max_pattern_len + . . . . } + . . . . + . . . . #[inline(always)] +-- line 678 ---------------------------------------- +-- line 692 ---------------------------------------- + . . . . + self.matches.len() * core::mem::size_of::() + . . . . + self.dense.len() * StateID::SIZE + . . . . + self.pattern_lens.len() * SmallIndex::SIZE + . . . . + self.prefilter.as_ref().map_or(0, |p| p.memory_usage()) + . . . . } + . . . . + . . . . #[inline(always)] + . . . . fn prefilter(&self) -> Option<&Prefilter> { + 48 ( 0.00%) . . . self.prefilter.as_ref() + . . . . } + . . . . } + . . . . + . . . . /// A representation of a sparse NFA state for an Aho-Corasick automaton. + . . . . /// + . . . . /// It contains the transitions to the next state, a failure transition for + . . . . /// cases where there exists no other transition for the current input byte + . . . . /// and the matches implied by visiting this state (if any). +-- line 708 ---------------------------------------- +-- line 745 ---------------------------------------- + . . . . /// this is really the only convenient place to compute and store this + . . . . /// information, which we need when building the contiguous NFA. + . . . . depth: SmallIndex, + . . . . } + . . . . + . . . . impl State { + . . . . /// Return true if and only if this state is a match state. + . . . . pub(crate) fn is_match(&self) -> bool { + 4,420 ( 0.00%) . . . self.matches != StateID::ZERO + 3,680 ( 0.00%) . . . } + . . . . + . . . . /// Returns the failure transition for this state. + . . . . pub(crate) fn fail(&self) -> StateID { + 12,132 ( 0.00%) . . . self.fail + . . . . } + . . . . + . . . . /// Returns the depth of this state. That is, the number of transitions + . . . . /// this state is from the start state of the NFA. + . . . . pub(crate) fn depth(&self) -> SmallIndex { + . . . . self.depth + . . . . } + . . . . } +-- line 766 ---------------------------------------- +-- line 777 ---------------------------------------- + . . . . impl Transition { + . . . . /// Return the byte for which this transition is defined. + . . . . pub(crate) fn byte(&self) -> u8 { + . . . . self.byte + . . . . } + . . . . + . . . . /// Return the ID of the state that this transition points to. + . . . . pub(crate) fn next(&self) -> StateID { + 12,288 ( 0.00%) . . . self.next + . . . . } + . . . . + . . . . /// Return the ID of the next transition. + . . . . fn link(&self) -> StateID { + . . . . self.link + . . . . } + . . . . } + . . . . +-- line 793 ---------------------------------------- +-- line 843 ---------------------------------------- + . . . . match_kind: MatchKind, + . . . . prefilter: bool, + . . . . ascii_case_insensitive: bool, + . . . . dense_depth: usize, + . . . . } + . . . . + . . . . impl Default for Builder { + . . . . fn default() -> Builder { + 198 ( 0.00%) . . . Builder { + . . . . match_kind: MatchKind::default(), + . . . . prefilter: true, + . . . . ascii_case_insensitive: false, + . . . . dense_depth: 3, + . . . . } + . . . . } + . . . . } + . . . . +-- line 859 ---------------------------------------- +-- line 862 ---------------------------------------- + . . . . pub fn new() -> Builder { + . . . . Builder::default() + . . . . } + . . . . + . . . . /// Build an Aho-Corasick noncontiguous NFA from the given iterator of + . . . . /// patterns. + . . . . /// + . . . . /// A builder may be reused to create more NFAs. + 528 ( 0.00%) . . . pub fn build(&self, patterns: I) -> Result + . . . . where + . . . . I: IntoIterator, + . . . . P: AsRef<[u8]>, + . . . . { + . . . . debug!("building non-contiguous NFA"); + 336 ( 0.00%) . . . let nfa = Compiler::new(self)?.compile(patterns)?; + 36,067 ( 0.01%) 94 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::new (48x) + 5,424 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) + . . . . debug!( + . . . . "non-contiguous NFA built, ", + . . . . nfa.states.len(), + . . . . nfa.memory_usage() + . . . . ); + 288 ( 0.00%) . . . Ok(nfa) + 432 ( 0.00%) . . . } + . . . . + . . . . /// Set the desired match semantics. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::match_kind`](crate::AhoCorasickBuilder::match_kind) + . . . . /// for more documentation and examples. + . . . . pub fn match_kind(&mut self, kind: MatchKind) -> &mut Builder { + 66 ( 0.00%) . . . self.match_kind = kind; + . . . . self + . . . . } + . . . . + . . . . /// Enable ASCII-aware case insensitive matching. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::ascii_case_insensitive`](crate::AhoCorasickBuilder::ascii_case_insensitive) + . . . . /// for more documentation and examples. +-- line 899 ---------------------------------------- +-- line 914 ---------------------------------------- + . . . . } + . . . . + . . . . /// Enable heuristic prefilter optimizations. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::prefilter`](crate::AhoCorasickBuilder::prefilter) + . . . . /// for more documentation and examples. + . . . . pub fn prefilter(&mut self, yes: bool) -> &mut Builder { + 66 ( 0.00%) . . . self.prefilter = yes; + . . . . self + . . . . } + . . . . } + . . . . + . . . . /// A compiler uses a builder configuration and builds up the NFA formulation + . . . . /// of an Aho-Corasick automaton. This roughly corresponds to the standard + . . . . /// formulation described in textbooks, with some tweaks to support leftmost + . . . . /// searching. +-- line 930 ---------------------------------------- +-- line 932 ---------------------------------------- + . . . . struct Compiler<'a> { + . . . . builder: &'a Builder, + . . . . prefilter: prefilter::Builder, + . . . . nfa: NFA, + . . . . byteset: ByteClassSet, + . . . . } + . . . . + . . . . impl<'a> Compiler<'a> { + 432 ( 0.00%) . . . fn new(builder: &'a Builder) -> Result, BuildError> { + 96 ( 0.00%) . . . let prefilter = prefilter::Builder::new(builder.match_kind) + 48 ( 0.00%) . . . .ascii_case_insensitive(builder.ascii_case_insensitive); + 3,984 ( 0.00%) . . . Ok(Compiler { + 3,120 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) + . . . . builder, + . . . . prefilter, + . . . . nfa: NFA { + . . . . match_kind: builder.match_kind, + . . . . states: vec![], + . . . . sparse: vec![], + . . . . dense: vec![], + . . . . matches: vec![], +-- line 951 ---------------------------------------- +-- line 953 ---------------------------------------- + . . . . prefilter: None, + . . . . byte_classes: ByteClasses::singletons(), + . . . . min_pattern_len: usize::MAX, + . . . . max_pattern_len: 0, + . . . . special: Special::zero(), + . . . . }, + . . . . byteset: ByteClassSet::empty(), + . . . . }) + 432 ( 0.00%) . . . } + . . . . + . . . . fn compile(mut self, patterns: I) -> Result + . . . . where + . . . . I: IntoIterator, + . . . . P: AsRef<[u8]>, + . . . . { + . . . . // Add dummy transition/match links, so that no valid link will point + . . . . // to another link at index 0. + 48 ( 0.00%) . . . self.nfa.sparse.push(Transition::default()); + 48 ( 0.00%) . . . self.nfa.matches.push(Match::default()); + . . . . // Add a dummy dense transition so that no states can have dense==0 + . . . . // represent a valid pointer to dense transitions. This permits + . . . . // dense==0 to be a sentinel indicating "no dense transitions." + 48 ( 0.00%) . . . self.nfa.dense.push(NFA::DEAD); + . . . . // the dead state, only used for leftmost and fixed to id==0 + 144 ( 0.00%) . . . self.nfa.alloc_state(0)?; + 8,405 ( 0.00%) 8 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (48x) + . . . . // the fail state, which is never entered and fixed to id==1 + 144 ( 0.00%) . . . self.nfa.alloc_state(0)?; + 1,728 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (48x) + . . . . // unanchored start state, initially fixed to id==2 but later shuffled + . . . . // to appear after all non-start match states. + 240 ( 0.00%) . . . self.nfa.special.start_unanchored_id = self.nfa.alloc_state(0)?; + 1,728 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (48x) + . . . . // anchored start state, initially fixed to id==3 but later shuffled + . . . . // to appear after unanchored start state. + 288 ( 0.00%) . . . self.nfa.special.start_anchored_id = self.nfa.alloc_state(0)?; + 1,728 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (48x) + . . . . // Initialize the unanchored starting state in order to make it dense, + . . . . // and thus make transition lookups on this state faster. + 48 ( 0.00%) . . . self.init_unanchored_start_state()?; +1,298,137 ( 0.38%) 1,228 ( 0.15%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (48x) + . . . . // Set all transitions on the DEAD state to point to itself. This way, + . . . . // the DEAD state can never be escaped. It MUST be used as a sentinel + . . . . // in any correct search. + 48 ( 0.00%) . . . self.add_dead_state_loop()?; +432,480 ( 0.12%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::add_dead_state_loop (48x) + . . . . // Build the base trie from the given patterns. + . . . . self.build_trie(patterns)?; + 240 ( 0.00%) . . . self.nfa.states.shrink_to_fit(); + 11,184 ( 0.00%) 66 ( 0.01%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::shrink_to_fit (48x) + . . . . // Turn our set of bytes into equivalent classes. This NFA + . . . . // implementation uses byte classes only for states that use a dense + . . . . // representation of transitions. (And that's why this comes before + . . . . // `self.densify()`, as the byte classes need to be set first.) + 384 ( 0.00%) . . . self.nfa.byte_classes = self.byteset.byte_classes(); +224,254 ( 0.06%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::alphabet::ByteClassSet::byte_classes (48x) + 1,440 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) + . . . . // Add transitions (and maybe matches) to the anchored starting state. + . . . . // The anchored starting state is used for anchored searches. The only + . . . . // mechanical difference between it and the unanchored start state is + . . . . // that missing transitions map to the DEAD state instead of the FAIL + . . . . // state. + 96 ( 0.00%) . . . self.set_anchored_start_state()?; +385,392 ( 0.11%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state (48x) + . . . . // Rewrite transitions to the FAIL state on the unanchored start state + . . . . // as self-transitions. This keeps the start state active at all times. + 144 ( 0.00%) . . . self.add_unanchored_start_state_loop(); +158,544 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::add_unanchored_start_state_loop (48x) + . . . . // Make some (possibly zero) states use a dense representation for + . . . . // transitions. It's important to do this right after the states + . . . . // and non-failure transitions are solidified. That way, subsequent + . . . . // accesses (particularly `fill_failure_transitions`) will benefit from + . . . . // the faster transition lookup in densified states. + 96 ( 0.00%) . . . self.densify()?; +941,551 ( 0.27%) 818 ( 0.10%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::densify (48x) + . . . . // The meat of the Aho-Corasick algorithm: compute and write failure + . . . . // transitions. i.e., the state to move to when a transition isn't + . . . . // defined in the current state. These are epsilon transitions and thus + . . . . // make this formulation an NFA. + 48 ( 0.00%) . . . self.fill_failure_transitions()?; +564,049 ( 0.16%) 385 ( 0.05%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (48x) + . . . . // Handle a special case under leftmost semantics when at least one + . . . . // of the patterns is the empty string. + 96 ( 0.00%) . . . self.close_start_state_loop_for_leftmost(); + 816 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::close_start_state_loop_for_leftmost (48x) + . . . . // Shuffle states so that we have DEAD, FAIL, MATCH, ..., START, START, + . . . . // NON-MATCH, ... This permits us to very quickly query the type of + . . . . // the state we're currently in during a search. + 96 ( 0.00%) . . . self.shuffle(); +1,854,743 ( 0.54%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Compiler::shuffle (48x) + 432 ( 0.00%) . . . self.nfa.prefilter = self.prefilter.build(); +350,208 ( 0.10%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/prefilter.rs:aho_corasick::util::prefilter::Builder::build (48x) + . . . . // Store the maximum ID of all *relevant* special states. Start states + . . . . // are only relevant when we have a prefilter, otherwise, there is zero + . . . . // reason to care about whether a state is a start state or not during + . . . . // a search. Indeed, without a prefilter, we are careful to explicitly + . . . . // NOT care about start states, otherwise the search can ping pong + . . . . // between the unrolled loop and the handling of special-status states + . . . . // and destroy perf. + 48 ( 0.00%) . . . self.nfa.special.max_special_id = if self.nfa.prefilter.is_some() { + . . . . // Why the anchored starting state? Because we always put it + . . . . // after the unanchored starting state and it is therefore the + . . . . // maximum. Why put unanchored followed by anchored? No particular + . . . . // reason, but that's how the states are logically organized in the + . . . . // Thompson NFA implementation found in regex-automata. ¯\_(ツ)_/¯ + . . . . self.nfa.special.start_anchored_id + . . . . } else { + . . . . self.nfa.special.max_match_id + . . . . }; + 96 ( 0.00%) . . . self.nfa.sparse.shrink_to_fit(); + 16,713 ( 0.00%) 144 ( 0.02%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::shrink_to_fit (48x) + 96 ( 0.00%) . . . self.nfa.dense.shrink_to_fit(); + 17,644 ( 0.01%) 208 ( 0.03%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::shrink_to_fit (48x) + 96 ( 0.00%) . . . self.nfa.matches.shrink_to_fit(); + 13,590 ( 0.00%) 96 ( 0.01%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::shrink_to_fit (48x) + 96 ( 0.00%) . . . self.nfa.pattern_lens.shrink_to_fit(); + 10,114 ( 0.00%) 85 ( 0.01%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::Vec::shrink_to_fit (48x) + 624 ( 0.00%) . . . Ok(self.nfa) + 3,120 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) + 96 ( 0.00%) . . . } + 9,213 ( 0.00%) 94 ( 0.01%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (48x) + . . . . + . . . . /// This sets up the initial prefix trie that makes up the Aho-Corasick + . . . . /// automaton. Effectively, it creates the basic structure of the + . . . . /// automaton, where every pattern given has a path from the start state to + . . . . /// the end of the pattern. + . . . . fn build_trie(&mut self, patterns: I) -> Result<(), BuildError> + . . . . where + . . . . I: IntoIterator, + . . . . P: AsRef<[u8]>, + . . . . { + 1,394 ( 0.00%) . . . 'PATTERNS: for (i, pat) in patterns.into_iter().enumerate() { + . . . . let pid = PatternID::new(i).map_err(|e| { + . . . . BuildError::pattern_id_overflow( + . . . . PatternID::MAX.as_u64(), + . . . . e.attempted(), + . . . . ) + . . . . })?; + . . . . let pat = pat.as_ref(); + . . . . let patlen = SmallIndex::new(pat.len()) + . . . . .map_err(|_| BuildError::pattern_too_long(pid, pat.len()))?; + 1,394 ( 0.00%) . . . self.nfa.min_pattern_len = + 1,394 ( 0.00%) . . . core::cmp::min(self.nfa.min_pattern_len, pat.len()); + 1,394 ( 0.00%) . . . self.nfa.max_pattern_len = + 1,394 ( 0.00%) . . . core::cmp::max(self.nfa.max_pattern_len, pat.len()); + 4,182 ( 0.00%) . . . assert_eq!( + . . . . i, + . . . . self.nfa.pattern_lens.len(), + . . . . "expected number of patterns to match pattern ID" + . . . . ); + . . . . self.nfa.pattern_lens.push(patlen); + . . . . // We add the pattern to the prefilter here because the pattern + . . . . // ID in the prefilter is determined with respect to the patterns + . . . . // added to the prefilter. That is, it isn't the ID we have here, +-- line 1084 ---------------------------------------- +-- line 1086 ---------------------------------------- + . . . . // To ensure they line up, we add every pattern we see to the + . . . . // prefilter, even if some patterns ultimately are impossible to + . . . . // match (in leftmost-first semantics specifically). + . . . . // + . . . . // Another way of doing this would be to expose an API in the + . . . . // prefilter to permit setting your own pattern IDs. Or to just use + . . . . // our own map and go between them. But this case is sufficiently + . . . . // rare that we don't bother and just make sure they're in sync. + 4,182 ( 0.00%) . . . if self.builder.prefilter { + . . . . self.prefilter.add(pat); + . . . . } + . . . . + 1,394 ( 0.00%) . . . let mut prev = self.nfa.special.start_unanchored_id; + . . . . let mut saw_match = false; + 3,680 ( 0.00%) . . . for (depth, &b) in pat.iter().enumerate() { + . . . . // When leftmost-first match semantics are requested, we + . . . . // specifically stop adding patterns when a previously added + . . . . // pattern is a prefix of it. We avoid adding it because + . . . . // leftmost-first semantics imply that the pattern can never + . . . . // match. This is not just an optimization to save space! It + . . . . // is necessary for correctness. In fact, this is the only + . . . . // difference in the automaton between the implementations for + . . . . // leftmost-first and leftmost-longest. + 14,720 ( 0.00%) . . . saw_match = saw_match || self.nfa.states[prev].is_match(); + 11,040 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/primitives.rs:aho_corasick::nfa::noncontiguous::State::is_match (3,680x) + 7,360 ( 0.00%) . . . if self.builder.match_kind.is_leftmost_first() && saw_match { + . . . . // Skip to the next pattern immediately. This avoids + . . . . // incorrectly adding a match after this loop terminates. + . . . . continue 'PATTERNS; + . . . . } + . . . . + . . . . // Add this byte to our equivalence classes. These don't + . . . . // get used while building the trie, but other Aho-Corasick + . . . . // implementations may use them. + 14,720 ( 0.00%) . . . self.byteset.set_range(b, b); +125,120 ( 0.04%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/alphabet.rs:aho_corasick::util::alphabet::ByteClassSet::set_range (3,680x) + 11,040 ( 0.00%) . . . if self.builder.ascii_case_insensitive { + . . . . let b = opposite_ascii_case(b); + . . . . self.byteset.set_range(b, b); + . . . . } + . . . . + . . . . // If the transition from prev using the current byte already + . . . . // exists, then just move through it. Otherwise, add a new + . . . . // state. We track the depth here so that we can determine + . . . . // how to represent transitions. States near the start state + . . . . // use a dense representation that uses more memory but is + . . . . // faster. Other states use a sparse representation that uses + . . . . // less memory but is slower. + . . . . let next = self.nfa.follow_transition(prev, b); + 1,740 ( 0.00%) . . . if next != NFA::FAIL { + . . . . prev = next; + . . . . } else { + 14,592 ( 0.00%) . . . let next = self.nfa.alloc_state(depth)?; +205,060 ( 0.06%) 616 ( 0.08%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::alloc_state (2,432x) + 14,592 ( 0.00%) . . . self.nfa.add_transition(prev, b, next)?; +739,090 ( 0.21%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::add_transition (2,432x) + 7,296 ( 0.00%) . . . if self.builder.ascii_case_insensitive { + . . . . let b = opposite_ascii_case(b); + . . . . self.nfa.add_transition(prev, b, next)?; + . . . . } + . . . . prev = next; + . . . . } + . . . . } + . . . . // Once the pattern has been added, log the match in the final + . . . . // state that it reached. + 5,576 ( 0.00%) . . . self.nfa.add_match(prev, pid)?; +166,504 ( 0.05%) 302 ( 0.04%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::add_match (1,394x) + . . . . } + . . . . Ok(()) + . . . . } + . . . . + . . . . /// This routine creates failure transitions according to the standard + . . . . /// textbook formulation of the Aho-Corasick algorithm, with a couple small + . . . . /// tweaks to support "leftmost" semantics. + . . . . /// +-- line 1155 ---------------------------------------- +-- line 1267 ---------------------------------------- + . . . . /// N.B. I came up with this algorithm on my own, and after scouring all of + . . . . /// the other AC implementations I know of (Perl, Snort, many on GitHub). + . . . . /// I couldn't find any that implement leftmost semantics like this. + . . . . /// Perl of course needs leftmost-first semantics, but they implement it + . . . . /// with a seeming hack at *search* time instead of encoding it into the + . . . . /// automaton. There are also a couple Java libraries that support leftmost + . . . . /// longest semantics, but they do it by building a queue of matches at + . . . . /// search time, which is even worse than what Perl is doing. ---AG + 432 ( 0.00%) . . . fn fill_failure_transitions(&mut self) -> Result<(), BuildError> { + 48 ( 0.00%) . . . let is_leftmost = self.builder.match_kind.is_leftmost(); + 48 ( 0.00%) . . . let start_uid = self.nfa.special.start_unanchored_id; + . . . . // Initialize the queue for breadth first search with all transitions + . . . . // out of the start state. We handle the start state specially because + . . . . // we only want to follow non-self transitions. If we followed self + . . . . // transitions, then this would never terminate. + . . . . let mut queue = VecDeque::new(); + . . . . let mut seen = self.queued_set(); + . . . . let mut prev_link = None; + 12,336 ( 0.00%) . . . while let Some(link) = self.nfa.next_link(start_uid, prev_link) { + . . . . prev_link = Some(link); + 24,576 ( 0.01%) . . . let t = self.nfa.sparse[link]; + . . . . + . . . . // Skip anything we've seen before and any self-transitions on the + . . . . // start state. + 12,288 ( 0.00%) . . . if start_uid == t.next() || seen.contains(t.next) { + . . . . continue; + . . . . } + . . . . queue.push_back(t.next); + . . . . seen.insert(t.next); + . . . . // Under leftmost semantics, if a state immediately following + . . . . // the start state is a match state, then we never want to + . . . . // follow its failure transition since the failure transition + . . . . // necessarily leads back to the start state, which we never + . . . . // want to do for leftmost matching after a match has been + . . . . // found. + . . . . // + . . . . // We apply the same logic to non-start states below as well. + 540 ( 0.00%) . . . if is_leftmost && self.nfa.states[t.next].is_match() { + 254 ( 0.00%) . . . self.nfa.states[t.next].fail = NFA::DEAD; + . . . . } + . . . . } + . . . . while let Some(id) = queue.pop_front() { + . . . . let mut prev_link = None; + 1,940 ( 0.00%) . . . while let Some(link) = self.nfa.next_link(id, prev_link) { + . . . . prev_link = Some(link); + 3,880 ( 0.00%) . . . let t = self.nfa.sparse[link]; + . . . . + . . . . if seen.contains(t.next) { + . . . . // The only way to visit a duplicate state in a transition + . . . . // list is when ASCII case insensitivity is enabled. In + . . . . // this case, we want to skip it since it's redundant work. + . . . . // But it would also end up duplicating matches, which + . . . . // results in reporting duplicate matches in some cases. + . . . . // See the 'acasei010' regression test. +-- line 1320 ---------------------------------------- +-- line 1339 ---------------------------------------- + . . . . // otherwise require passing through a match state. + . . . . // + . . . . // Note that for correctness, the failure transition has to be + . . . . // set to the dead state for ALL states following a match, not + . . . . // just the match state itself. However, by setting the failure + . . . . // transition to the dead state on all match states, the dead + . . . . // state will automatically propagate to all subsequent states + . . . . // via the failure state computation below. + 3,880 ( 0.00%) . . . if is_leftmost && self.nfa.states[t.next].is_match() { + 2,534 ( 0.00%) . . . self.nfa.states[t.next].fail = NFA::DEAD; + . . . . continue; + . . . . } + . . . . let mut fail = self.nfa.states[id].fail; + . . . . while self.nfa.follow_transition(fail, t.byte) == NFA::FAIL { + . . . . fail = self.nfa.states[fail].fail; + . . . . } + . . . . fail = self.nfa.follow_transition(fail, t.byte); + 1,346 ( 0.00%) . . . self.nfa.states[t.next].fail = fail; + 2,692 ( 0.00%) . . . self.nfa.copy_matches(fail, t.next)?; + 29,612 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::copy_matches (673x) + . . . . } + . . . . // If the start state is a match state, then this automaton can + . . . . // match the empty string. This implies all states are match states + . . . . // since every position matches the empty string, so copy the + . . . . // matches from the start state to every state. Strictly speaking, + . . . . // this is only necessary for overlapping matches since each + . . . . // non-empty non-start match state needs to report empty matches + . . . . // in addition to its own. For the non-overlapping case, such + . . . . // states only report the first match, which is never empty since + . . . . // it isn't a start state. + 2,432 ( 0.00%) . . . if !is_leftmost { + . . . . self.nfa + . . . . .copy_matches(self.nfa.special.start_unanchored_id, id)?; + . . . . } + . . . . } + 48 ( 0.00%) . . . Ok(()) + 864 ( 0.00%) . . . } + 7,398 ( 0.00%) 78 ( 0.01%) . . => ???:__rust_dealloc (48x) + . . . . + . . . . /// Shuffle the states so that they appear in this sequence: + . . . . /// + . . . . /// DEAD, FAIL, MATCH..., START, START, NON-MATCH... + . . . . /// + . . . . /// The idea here is that if we know how special states are laid out in our + . . . . /// transition table, then we can determine what "kind" of state we're in + . . . . /// just by comparing our current state ID with a particular value. In this +-- line 1382 ---------------------------------------- +-- line 1391 ---------------------------------------- + . . . . /// + . . . . /// DEAD, FAIL, START, START, MATCH... NON-MATCH... + . . . . /// + . . . . /// Then it's just a simple matter of swapping the two START states with + . . . . /// the last two MATCH states. + . . . . /// + . . . . /// (This is the same technique used for fully compiled DFAs in + . . . . /// regex-automata.) + 336 ( 0.00%) . . . fn shuffle(&mut self) { + 48 ( 0.00%) . . . let old_start_uid = self.nfa.special.start_unanchored_id; + 48 ( 0.00%) . . . let old_start_aid = self.nfa.special.start_anchored_id; + 48 ( 0.00%) . . . assert!(old_start_uid < old_start_aid); + 96 ( 0.00%) . . . assert_eq!( + . . . . 3, + . . . . old_start_aid.as_usize(), + . . . . "anchored start state should be at index 3" + . . . . ); + . . . . // We implement shuffling by a sequence of pairwise swaps of states. + . . . . // Since we have a number of things referencing states via their + . . . . // IDs and swapping them changes their IDs, we need to record every + . . . . // swap we make so that we can remap IDs. The remapper handles this +-- line 1411 ---------------------------------------- +-- line 1416 ---------------------------------------- + . . . . // START-UNANCHORED, START-ANCHORED, MATCH, ..., NON-MATCH, ... + . . . . // + . . . . // To do that, we proceed forward through all states after + . . . . // START-ANCHORED and swap match states so that they appear before all + . . . . // non-match states. + . . . . let mut next_avail = StateID::from(4u8); + . . . . for i in next_avail.as_usize()..self.nfa.states.len() { + . . . . let sid = StateID::new(i).unwrap(); + 4,864 ( 0.00%) . . . if !self.nfa.states[sid].is_match() { + . . . . continue; + . . . . } + 6,970 ( 0.00%) . . . remapper.swap(&mut self.nfa, sid, next_avail); + 56,920 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::swap (1,394x) + . . . . // The key invariant here is that only non-match states exist + . . . . // between 'next_avail' and 'sid' (with them being potentially + . . . . // equivalent). Thus, incrementing 'next_avail' by 1 is guaranteed + . . . . // to land on the leftmost non-match state. (Unless 'next_avail' + . . . . // and 'sid' are equivalent, in which case, a swap will occur but + . . . . // it is a no-op.) + . . . . next_avail = StateID::new(next_avail.one_more()).unwrap(); + . . . . } +-- line 1435 ---------------------------------------- +-- line 1455 ---------------------------------------- + . . . . // or not. And indeed, if we did check for it, this very hot loop would + . . . . // ping pong between the special state handling and the main state + . . . . // transition logic. This in turn stalls the CPU by killing branch + . . . . // prediction. + . . . . // + . . . . // So essentially, we really want to be able to "forget" that start + . . . . // states even exist and this is why we put them at the end. + . . . . let new_start_aid = + 48 ( 0.00%) . . . StateID::new(next_avail.as_usize().checked_sub(1).unwrap()) + . . . . .unwrap(); + 144 ( 0.00%) . . . remapper.swap(&mut self.nfa, old_start_aid, new_start_aid); + 2,016 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::swap (48x) + . . . . let new_start_uid = + . . . . StateID::new(next_avail.as_usize().checked_sub(2).unwrap()) + . . . . .unwrap(); + 144 ( 0.00%) . . . remapper.swap(&mut self.nfa, old_start_uid, new_start_uid); + 2,016 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::swap (48x) + . . . . let new_max_match_id = + . . . . StateID::new(next_avail.as_usize().checked_sub(3).unwrap()) + . . . . .unwrap(); + 48 ( 0.00%) . . . self.nfa.special.max_match_id = new_max_match_id; + 48 ( 0.00%) . . . self.nfa.special.start_unanchored_id = new_start_uid; + 48 ( 0.00%) . . . self.nfa.special.start_anchored_id = new_start_aid; + . . . . // If one start state is a match state, then they both are. + 48 ( 0.00%) . . . if self.nfa.states[self.nfa.special.start_anchored_id].is_match() { + . . . . self.nfa.special.max_match_id = self.nfa.special.start_anchored_id; + . . . . } + 336 ( 0.00%) . . . remapper.remap(&mut self.nfa); +1,737,105 ( 0.50%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:aho_corasick::util::remapper::Remapper::remap (48x) + 384 ( 0.00%) . . . } + . . . . + . . . . /// Attempts to convert the transition representation of a subset of states + . . . . /// in this NFA from sparse to dense. This can greatly improve search + . . . . /// performance since states with a higher number of transitions tend to + . . . . /// correlate with very active states. + . . . . /// + . . . . /// We generally only densify states that are close to the start state. + . . . . /// These tend to be the most active states and thus benefit from a dense +-- line 1489 ---------------------------------------- +-- line 1492 ---------------------------------------- + . . . . /// This tends to best balance between memory usage and performance. In + . . . . /// particular, the *vast majority* of all states in a typical Aho-Corasick + . . . . /// automaton have only 1 transition and are usually farther from the start + . . . . /// state and thus don't get densified. + . . . . /// + . . . . /// Note that this doesn't remove the sparse representation of transitions + . . . . /// for states that are densified. It could be done, but actually removing + . . . . /// entries from `NFA::sparse` is likely more expensive than it's worth. + 336 ( 0.00%) . . . fn densify(&mut self) -> Result<(), BuildError> { + . . . . for i in 0..self.nfa.states.len() { + . . . . let sid = StateID::new(i).unwrap(); + . . . . // Don't bother densifying states that are only used as sentinels. + 5,248 ( 0.00%) . . . if sid == NFA::DEAD || sid == NFA::FAIL { + . . . . continue; + . . . . } + . . . . // Only densify states that are "close enough" to the start state. + 5,056 ( 0.00%) . . . if self.nfa.states[sid].depth.as_usize() + . . . . >= self.builder.dense_depth + . . . . { + . . . . continue; + . . . . } + . . . . let dense = self.nfa.alloc_dense_state()?; + . . . . let mut prev_link = None; + 86,763 ( 0.03%) . . . while let Some(link) = self.nfa.next_link(sid, prev_link) { + . . . . prev_link = Some(link); + 53,014 ( 0.02%) . . . let t = self.nfa.sparse[link]; + . . . . + . . . . let class = usize::from(self.nfa.byte_classes.get(t.byte)); + 26,507 ( 0.01%) . . . let index = dense.as_usize() + class; + 26,507 ( 0.01%) . . . self.nfa.dense[index] = t.next; + . . . . } + 2,414 ( 0.00%) . . . self.nfa.states[sid].dense = dense; + . . . . } + . . . . Ok(()) + 432 ( 0.00%) . . . } + . . . . + . . . . /// Returns a set that tracked queued states. + . . . . /// + . . . . /// This is only necessary when ASCII case insensitivity is enabled, since + . . . . /// it is the only way to visit the same state twice. Otherwise, this + . . . . /// returns an inert set that nevers adds anything and always reports + . . . . /// `false` for every member test. + . . . . fn queued_set(&self) -> QueuedSet { + 96 ( 0.00%) . . . if self.builder.ascii_case_insensitive { + . . . . QueuedSet::active() + . . . . } else { + . . . . QueuedSet::inert() + . . . . } + . . . . } + . . . . + . . . . /// Initializes the unanchored start state by making it dense. This is + . . . . /// achieved by explicitly setting every transition to the FAIL state. + . . . . /// This isn't necessary for correctness, since any missing transition is + . . . . /// automatically assumed to be mapped to the FAIL state. We do this to + . . . . /// make the unanchored starting state dense, and thus in turn make + . . . . /// transition lookups on it faster. (Which is worth doing because it's + . . . . /// the most active state.) + 240 ( 0.00%) . . . fn init_unanchored_start_state(&mut self) -> Result<(), BuildError> { + 96 ( 0.00%) . . . let start_uid = self.nfa.special.start_unanchored_id; + 48 ( 0.00%) . . . let start_aid = self.nfa.special.start_anchored_id; + 144 ( 0.00%) . . . self.nfa.init_full_state(start_uid, NFA::FAIL)?; +826,614 ( 0.24%) 1,134 ( 0.14%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state (48x) + 192 ( 0.00%) . . . self.nfa.init_full_state(start_aid, NFA::FAIL)?; +469,987 ( 0.14%) 94 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state (48x) + . . . . Ok(()) + 288 ( 0.00%) . . . } + . . . . + . . . . /// Setup the anchored start state by copying all of the transitions and + . . . . /// matches from the unanchored starting state with one change: the failure + . . . . /// transition is changed to the DEAD state, so that for any undefined + . . . . /// transitions, the search will stop. + 240 ( 0.00%) . . . fn set_anchored_start_state(&mut self) -> Result<(), BuildError> { + 48 ( 0.00%) . . . let start_uid = self.nfa.special.start_unanchored_id; + . . . . let start_aid = self.nfa.special.start_anchored_id; + . . . . let (mut uprev_link, mut aprev_link) = (None, None); + . . . . loop { + 12,384 ( 0.00%) . . . let unext = self.nfa.next_link(start_uid, uprev_link); + . . . . let anext = self.nfa.next_link(start_aid, aprev_link); + 24,720 ( 0.01%) . . . let (ulink, alink) = match (unext, anext) { + . . . . (Some(ulink), Some(alink)) => (ulink, alink), + . . . . (None, None) => break, + . . . . _ => unreachable!(), + . . . . }; + . . . . uprev_link = Some(ulink); + . . . . aprev_link = Some(alink); + 49,152 ( 0.01%) . . . self.nfa.sparse[alink].next = self.nfa.sparse[ulink].next; + . . . . } + 96 ( 0.00%) . . . self.nfa.copy_matches(start_uid, start_aid)?; + 2,112 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::copy_matches (48x) + . . . . // This is the main difference between the unanchored and anchored + . . . . // starting states. If a lookup on an anchored starting state fails, + . . . . // then the search should stop. + . . . . // + . . . . // N.B. This assumes that the loop on the unanchored starting state + . . . . // hasn't been created yet. + 96 ( 0.00%) . . . self.nfa.states[start_aid].fail = NFA::DEAD; + . . . . Ok(()) + 336 ( 0.00%) . . . } + . . . . + . . . . /// Set the failure transitions on the start state to loop back to the + . . . . /// start state. This effectively permits the Aho-Corasick automaton to + . . . . /// match at any position. This is also required for finding the next + . . . . /// state to terminate, namely, finding the next state should never return + . . . . /// a fail_id. + . . . . /// + . . . . /// This must be done after building the initial trie, since trie + . . . . /// construction depends on transitions to `fail_id` to determine whether a + . . . . /// state already exists or not. + 96 ( 0.00%) . . . fn add_unanchored_start_state_loop(&mut self) { + 48 ( 0.00%) . . . let start_uid = self.nfa.special.start_unanchored_id; + . . . . let mut prev_link = None; + 37,008 ( 0.01%) . . . while let Some(link) = self.nfa.next_link(start_uid, prev_link) { + . . . . prev_link = Some(link); + 12,288 ( 0.00%) . . . if self.nfa.sparse[link].next() == NFA::FAIL { + 23,592 ( 0.01%) . . . self.nfa.sparse[link].next = start_uid; + . . . . } + . . . . } + 96 ( 0.00%) . . . } + . . . . + . . . . /// Remove the start state loop by rewriting any transitions on the start + . . . . /// state back to the start state with transitions to the dead state. + . . . . /// + . . . . /// The loop is only closed when two conditions are met: the start state + . . . . /// is a match state and the match kind is leftmost-first or + . . . . /// leftmost-longest. + . . . . /// + . . . . /// The reason for this is that under leftmost semantics, a start state + . . . . /// that is also a match implies that we should never restart the search + . . . . /// process. We allow normal transitions out of the start state, but if + . . . . /// none exist, we transition to the dead state, which signals that + . . . . /// searching should stop. + 96 ( 0.00%) . . . fn close_start_state_loop_for_leftmost(&mut self) { + 48 ( 0.00%) . . . let start_uid = self.nfa.special.start_unanchored_id; + . . . . let start = &mut self.nfa.states[start_uid]; + . . . . let dense = start.dense; + 144 ( 0.00%) . . . if self.builder.match_kind.is_leftmost() && start.is_match() { + . . . . let mut prev_link = None; + . . . . while let Some(link) = self.nfa.next_link(start_uid, prev_link) { + . . . . prev_link = Some(link); + . . . . if self.nfa.sparse[link].next() == start_uid { + . . . . self.nfa.sparse[link].next = NFA::DEAD; + . . . . if dense != StateID::ZERO { + . . . . let b = self.nfa.sparse[link].byte; + . . . . let class = usize::from(self.nfa.byte_classes.get(b)); + . . . . self.nfa.dense[dense.as_usize() + class] = NFA::DEAD; + . . . . } + . . . . } + . . . . } + . . . . } + 96 ( 0.00%) . . . } + . . . . + . . . . /// Sets all transitions on the dead state to point back to the dead state. + . . . . /// Normally, missing transitions map back to the failure state, but the + . . . . /// point of the dead state is to act as a sink that can never be escaped. + 144 ( 0.00%) . . . fn add_dead_state_loop(&mut self) -> Result<(), BuildError> { + 192 ( 0.00%) . . . self.nfa.init_full_state(NFA::DEAD, NFA::DEAD)?; +431,712 ( 0.12%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::NFA::init_full_state (48x) + . . . . Ok(()) + 192 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A set of state identifiers used to avoid revisiting the same state multiple + . . . . /// times when filling in failure transitions. + . . . . /// + . . . . /// This set has an "inert" and an "active" mode. When inert, the set never + . . . . /// stores anything and always returns `false` for every member test. This is + . . . . /// useful to avoid the performance and memory overhead of maintaining this +-- line 1654 ---------------------------------------- +-- line 1668 ---------------------------------------- + . . . . /// Return an active set that tracks state ID membership. + . . . . fn active() -> QueuedSet { + . . . . QueuedSet { set: Some(BTreeSet::new()) } + . . . . } + . . . . + . . . . /// Inserts the given state ID into this set. (If the set is inert, then + . . . . /// this is a no-op.) + . . . . fn insert(&mut self, state_id: StateID) { + 4,864 ( 0.00%) . . . if let Some(ref mut set) = self.set { + . . . . set.insert(state_id); + . . . . } + . . . . } + . . . . + . . . . /// Returns true if and only if the given state ID is in this set. If the + . . . . /// set is inert, this always returns false. + . . . . fn contains(&self, state_id: StateID) -> bool { + 4,864 ( 0.00%) . . . match self.set { + . . . . None => false, + . . . . Some(ref set) => set.contains(&state_id), + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for NFA { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +-- line 1692 ---------------------------------------- + +557,991 ( 0.16%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 215 ---------------------------------------- + . . . . range: Utf8Range, + . . . . /// The next state to transition to. + . . . . next_id: StateID, + . . . . } + . . . . + . . . . impl RangeTrie { + . . . . /// Create a new empty range trie. + . . . . pub fn new() -> RangeTrie { +10,784 ( 0.00%) . . . let mut trie = RangeTrie { + . . . . states: vec![], + . . . . free: vec![], + . . . . iter_stack: RefCell::new(vec![]), + . . . . iter_ranges: RefCell::new(vec![]), + . . . . dupe_stack: vec![], + . . . . insert_stack: vec![], + . . . . }; + . . . . trie.clear(); + . . . . trie + . . . . } + . . . . + . . . . /// Clear this range trie such that it is empty. Clearing a range trie + . . . . /// and reusing it can beneficial because this may reuse allocations. + . . . . pub fn clear(&mut self) { + . . . . self.free.extend(self.states.drain(..)); + 1,348 ( 0.00%) . . . self.add_empty(); // final +96,263 ( 0.03%) 4 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs:regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty (674x) + 1,348 ( 0.00%) . . . self.add_empty(); // root +16,850 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/range_trie.rs:regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty (674x) + . . . . } + . . . . + . . . . /// Iterate over all of the sequences of byte ranges in this trie, and + . . . . /// call the provided function for each sequence. Iteration occurs in + . . . . /// lexicographic order. + . . . . pub fn iter Result<(), E>>( + . . . . &self, + . . . . mut f: F, +-- line 248 ---------------------------------------- +-- line 420 ---------------------------------------- + . . . . // no subsequent transitions with any overlap. Therefore, we + . . . . // can stop processing this range and move on to the next one. + . . . . break; + . . . . } + . . . . } + . . . . self.insert_stack = stack; + . . . . } + . . . . + 4,044 ( 0.00%) . . . pub fn add_empty(&mut self) -> StateID { + . . . . let id = match StateID::try_from(self.states.len()) { + . . . . Ok(id) => id, + . . . . Err(_) => { + . . . . // This generally should not happen since a range trie is + . . . . // only ever used to compile a single sequence of Unicode + . . . . // scalar values. If we ever got to this point, we would, at + . . . . // *minimum*, be using 96GB in just the range trie alone. + . . . . panic!("too many sequences added to range trie"); +-- line 436 ---------------------------------------- +-- line 440 ---------------------------------------- + . . . . // more allocations. + . . . . if let Some(mut state) = self.free.pop() { + . . . . state.clear(); + . . . . self.states.push(state); + . . . . } else { + . . . . self.states.push(State { transitions: vec![] }); + . . . . } + . . . . id + 6,740 ( 0.00%) . . . } + . . . . + . . . . /// Performs a deep clone of the given state and returns the duplicate's + . . . . /// state ID. + . . . . /// + . . . . /// A "deep clone" in this context means that the state given along with + . . . . /// recursively all states that it points to are copied. Once complete, + . . . . /// the given state ID and the returned state ID share nothing. + . . . . /// +-- line 456 ---------------------------------------- + + 2,696 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/api.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 18 ---------------------------------------- + . . . . /// and instead only supports leftmost-first or leftmost-longest. Namely, + . . . . /// "standard" semantics cannot be easily supported by packed searchers. + . . . . /// + . . . . /// For more information on the distinction between leftmost-first and + . . . . /// leftmost-longest, see the docs on the top-level `MatchKind` type. + . . . . /// + . . . . /// Unlike the top-level `MatchKind` type, the default match semantics for this + . . . . /// type are leftmost-first. + 192 ( 0.00%) . . . #[derive(Clone, Copy, Debug, Eq, PartialEq)] + . . . . #[non_exhaustive] + . . . . pub enum MatchKind { + . . . . /// Use leftmost-first match semantics, which reports leftmost matches. + . . . . /// When there are multiple possible leftmost matches, the match + . . . . /// corresponding to the pattern that appeared earlier when constructing + . . . . /// the automaton is reported. + . . . . /// + . . . . /// This is the default. +-- line 34 ---------------------------------------- +-- line 78 ---------------------------------------- + . . . . /// # if cfg!(all(feature = "std", any( + . . . . /// # target_arch = "x86_64", target_arch = "aarch64", + . . . . /// # ))) { + . . . . /// # example().unwrap() + . . . . /// # } else { + . . . . /// # assert!(example().is_none()); + . . . . /// # } + . . . . /// ``` + 96 ( 0.00%) . . . #[derive(Clone, Debug)] + . . . . pub struct Config { + . . . . kind: MatchKind, + . . . . force: Option, + . . . . only_teddy_fat: Option, + . . . . only_teddy_256bit: Option, + . . . . heuristic_pattern_limits: bool, + . . . . } + . . . . +-- line 94 ---------------------------------------- +-- line 107 ---------------------------------------- + . . . . fn default() -> Config { + . . . . Config::new() + . . . . } + . . . . } + . . . . + . . . . impl Config { + . . . . /// Create a new default configuration. A default configuration uses + . . . . /// leftmost-first match semantics. + 48 ( 0.00%) . . . pub fn new() -> Config { + . . . . Config { + . . . . kind: MatchKind::LeftmostFirst, + . . . . force: None, + . . . . only_teddy_fat: None, + . . . . only_teddy_256bit: None, + . . . . heuristic_pattern_limits: true, + . . . . } + 48 ( 0.00%) . . . } + . . . . + . . . . /// Create a packed builder from this configuration. The builder can be + . . . . /// used to accumulate patterns and create a [`Searcher`] from them. + 48 ( 0.00%) . . . pub fn builder(&self) -> Builder { + . . . . Builder::from_config(self.clone()) + 48 ( 0.00%) . . . } + . . . . + . . . . /// Set the match semantics for this configuration. + 48 ( 0.00%) . . . pub fn match_kind(&mut self, kind: MatchKind) -> &mut Config { + 48 ( 0.00%) . . . self.kind = kind; + . . . . self + 48 ( 0.00%) . . . } + . . . . + . . . . /// An undocumented method for forcing the use of the Teddy algorithm. + . . . . /// + . . . . /// This is only exposed for more precise testing and benchmarks. Callers + . . . . /// should not use it as it is not part of the API stability guarantees of + . . . . /// this crate. + . . . . #[doc(hidden)] + . . . . pub fn only_teddy(&mut self, yes: bool) -> &mut Config { +-- line 143 ---------------------------------------- +-- line 241 ---------------------------------------- + . . . . impl Builder { + . . . . /// Create a new builder for constructing a multi-pattern searcher. This + . . . . /// constructor uses the default configuration. + . . . . pub fn new() -> Builder { + . . . . Builder::from_config(Config::new()) + . . . . } + . . . . + . . . . fn from_config(config: Config) -> Builder { + 192 ( 0.00%) . . . Builder { config, inert: false, patterns: Patterns::new() } + . . . . } + . . . . + . . . . /// Build a searcher from the patterns added to this builder so far. + 768 ( 0.00%) . . . pub fn build(&self) -> Option { + 384 ( 0.00%) . . . if self.inert || self.patterns.is_empty() { + 96 ( 0.00%) . . . return None; + . . . . } + . . . . let mut patterns = self.patterns.clone(); + 96 ( 0.00%) . . . patterns.set_match_kind(self.config.kind); + 528 ( 0.00%) . . . let patterns = Arc::new(patterns); + 48 ( 0.00%) . . . let rabinkarp = RabinKarp::new(&patterns); +472,398 ( 0.14%) 1,066 ( 0.13%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/rabinkarp.rs:aho_corasick::packed::rabinkarp::RabinKarp::new (48x) + . . . . // Effectively, we only want to return a searcher if we can use Teddy, + . . . . // since Teddy is our only fast packed searcher at the moment. + . . . . // Rabin-Karp is only used when searching haystacks smaller than what + . . . . // Teddy can support. Thus, the only way to get a Rabin-Karp searcher + . . . . // is to force it using undocumented APIs (for tests/benchmarks). + 174 ( 0.00%) . . . let (search_kind, minimum_len) = match self.config.force { + . . . . None | Some(ForceAlgorithm::Teddy) => { + . . . . debug!("trying to build Teddy packed matcher"); + 192 ( 0.00%) . . . let teddy = match self.build_teddy(Arc::clone(&patterns)) { + 9 ( 0.00%) . . . None => return None, + 156 ( 0.00%) . . . Some(teddy) => teddy, + . . . . }; + . . . . let minimum_len = teddy.minimum_len(); + . . . . (SearchKind::Teddy(teddy), minimum_len) + . . . . } + . . . . Some(ForceAlgorithm::RabinKarp) => { + . . . . debug!("using Rabin-Karp packed matcher"); + . . . . (SearchKind::RabinKarp, 0) + . . . . } + . . . . }; + 429 ( 0.00%) . . . Some(Searcher { patterns, rabinkarp, search_kind, minimum_len }) + 864 ( 0.00%) . . . } + . . . . + . . . . fn build_teddy(&self, patterns: Arc) -> Option { + 48 ( 0.00%) . . . teddy::Builder::new() +1,028,919 ( 0.30%) 3,495 ( 0.43%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/teddy/builder.rs:aho_corasick::packed::teddy::builder::Builder::build (48x) + 48 ( 0.00%) . . . .only_256bit(self.config.only_teddy_256bit) + 48 ( 0.00%) . . . .only_fat(self.config.only_teddy_fat) + 48 ( 0.00%) . . . .heuristic_pattern_limits(self.config.heuristic_pattern_limits) + . . . . .build(patterns) + . . . . } + . . . . + . . . . /// Add the given pattern to this set to match. + . . . . /// + . . . . /// The order in which patterns are added is significant. Namely, when + . . . . /// using leftmost-first match semantics, then when multiple patterns can + . . . . /// match at a particular location, the pattern that was added first is + . . . . /// used as the match. + . . . . /// + . . . . /// If the number of patterns added exceeds the amount supported by packed + . . . . /// searchers, then the builder will stop accumulating patterns and render + . . . . /// itself inert. At this point, constructing a searcher will always return + . . . . /// `None`. + . . . . pub fn add>(&mut self, pattern: P) -> &mut Builder { +5,912 ( 0.00%) . . . if self.inert { + . . . . return self; +5,576 ( 0.00%) . . . } else if self.patterns.len() >= PATTERN_LIMIT { +2,788 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::pattern::Patterns::len (1,394x) + . . . . self.inert = true; + . . . . self.patterns.reset(); + . . . . return self; + . . . . } + . . . . // Just in case PATTERN_LIMIT increases beyond u16::MAX. +5,576 ( 0.00%) . . . assert!(self.patterns.len() <= core::u16::MAX as usize); +2,788 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:aho_corasick::packed::pattern::Patterns::len (1,394x) + . . . . + . . . . let pattern = pattern.as_ref(); +2,788 ( 0.00%) . . . if pattern.is_empty() { + . . . . self.inert = true; + . . . . self.patterns.reset(); + . . . . return self; + . . . . } +5,576 ( 0.00%) . . . self.patterns.add(pattern); +620,064 ( 0.18%) 3,085 ( 0.38%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/pattern.rs:aho_corasick::packed::pattern::Patterns::add (1,394x) + . . . . self + . . . . } + . . . . + . . . . /// Add the given iterator of patterns to this set to match. + . . . . /// + . . . . /// The iterator must yield elements that can be converted into a `&[u8]`. + . . . . /// + . . . . /// The order in which patterns are added is significant. Namely, when +-- line 328 ---------------------------------------- +-- line 329 ---------------------------------------- + . . . . /// using leftmost-first match semantics, then when multiple patterns can + . . . . /// match at a particular location, the pattern that was added first is + . . . . /// used as the match. + . . . . /// + . . . . /// If the number of patterns added exceeds the amount supported by packed + . . . . /// searchers, then the builder will stop accumulating patterns and render + . . . . /// itself inert. At this point, constructing a searcher will always return + . . . . /// `None`. + 384 ( 0.00%) . . . pub fn extend(&mut self, patterns: I) -> &mut Builder + . . . . where + . . . . I: IntoIterator, + . . . . P: AsRef<[u8]>, + . . . . { + . . . . for p in patterns { + . . . . self.add(p); + . . . . } + . . . . self + 432 ( 0.00%) . . . } + . . . . + . . . . /// Returns the number of patterns added to this builder. + . . . . pub fn len(&self) -> usize { + . . . . self.patterns.len() + . . . . } + . . . . + . . . . /// Returns the length, in bytes, of the shortest pattern added. + . . . . pub fn minimum_len(&self) -> usize { +-- line 354 ---------------------------------------- +-- line 527 ---------------------------------------- + . . . . /// ``` + . . . . #[inline] + . . . . pub fn find_in>( + . . . . &self, + . . . . haystack: B, + . . . . span: Span, + . . . . ) -> Option { + . . . . let haystack = haystack.as_ref(); + 39 ( 0.00%) . . . match self.search_kind { + . . . . SearchKind::Teddy(ref teddy) => { + 26 ( 0.00%) . . . if haystack[span].len() < teddy.minimum_len() { + 2 ( 0.00%) . . . return self.find_in_slow(haystack, span); + 198 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/api.rs:aho_corasick::packed::api::Searcher::find_in_slow (1x) + . . . . } + . . . . teddy.find(&haystack[..span.end], span.start) + . . . . } + . . . . SearchKind::RabinKarp => { + . . . . self.rabinkarp.find_at(&haystack[..span.end], span.start) + . . . . } + . . . . } + . . . . } +-- line 546 ---------------------------------------- +-- line 638 ---------------------------------------- + . . . . } + . . . . + . . . . /// Use a slow (non-packed) searcher. + . . . . /// + . . . . /// This is useful when a packed searcher could be constructed, but could + . . . . /// not be used to search a specific haystack. For example, if Teddy was + . . . . /// built but the haystack is smaller than ~34 bytes, then Teddy might not + . . . . /// be able to run. + 1 ( 0.00%) . . . fn find_in_slow(&self, haystack: &[u8], span: Span) -> Option { + 3 ( 0.00%) . . . self.rabinkarp.find_at(&haystack[..span.end], span.start) + 188 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/packed/rabinkarp.rs:aho_corasick::packed::rabinkarp::RabinKarp::find_at (1x) + 3 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl SearchKind { + . . . . fn memory_usage(&self) -> usize { + . . . . match *self { + . . . . SearchKind::Teddy(ref ted) => ted.memory_usage(), + . . . . SearchKind::RabinKarp => 0, + . . . . } +-- line 656 ---------------------------------------- + +1,635 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 141 ---------------------------------------- + . . . . P: AsRef<[u8]>, + . . . . { + . . . . DFA::builder().build(patterns) + . . . . } + . . . . + . . . . /// A convenience method for returning a new Aho-Corasick DFA builder. + . . . . /// + . . . . /// This usually permits one to just import the `DFA` type. + 39 ( 0.00%) . . . pub fn builder() -> Builder { + . . . . Builder::new() + 39 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl DFA { + . . . . /// A sentinel state ID indicating that a search should stop once it has + . . . . /// entered this state. When a search stops, it returns a match if one has + . . . . /// been found, otherwise no match. A DFA always has an actual dead state + . . . . /// at this ID. + . . . . /// +-- line 159 ---------------------------------------- +-- line 163 ---------------------------------------- + . . . . /// failure transitions everywhere, such that failure transitions are no + . . . . /// longer used at search time. This, combined with its uniformly dense + . . . . /// representation, are the two most important factors in why it's faster + . . . . /// than the NFAs in this crate. + . . . . const DEAD: StateID = StateID::new_unchecked(0); + . . . . + . . . . /// Adds the given pattern IDs as matches to the given state and also + . . . . /// records the added memory usage. + 16,515 ( 0.00%) . . . fn set_matches( + . . . . &mut self, + . . . . sid: StateID, + . . . . pids: impl Iterator, + . . . . ) { + 3,670 ( 0.00%) . . . let index = (sid.as_usize() >> self.stride2).checked_sub(2).unwrap(); + . . . . let mut at_least_one = false; + . . . . for pid in pids { + . . . . self.matches[index].push(pid); + 1,835 ( 0.00%) . . . self.matches_memory_usage += PatternID::SIZE; + . . . . at_least_one = true; + . . . . } + . . . . assert!(at_least_one, "match state must have non-empty pids"); + 14,680 ( 0.00%) . . . } + . . . . } + . . . . + . . . . // SAFETY: 'start_state' always returns a valid state ID, 'next_state' always + . . . . // returns a valid state ID given a valid state ID. We otherwise claim that + . . . . // all other methods are correct as well. + . . . . unsafe impl Automaton for DFA { + . . . . #[inline(always)] + . . . . fn start_state(&self, anchored: Anchored) -> Result { +-- line 192 ---------------------------------------- +-- line 389 ---------------------------------------- + . . . . pub struct Builder { + . . . . noncontiguous: noncontiguous::Builder, + . . . . start_kind: StartKind, + . . . . byte_classes: bool, + . . . . } + . . . . + . . . . impl Default for Builder { + . . . . fn default() -> Builder { + 48 ( 0.00%) . . . Builder { + . . . . noncontiguous: noncontiguous::Builder::new(), + . . . . start_kind: StartKind::Unanchored, + . . . . byte_classes: true, + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl Builder { +-- line 405 ---------------------------------------- +-- line 411 ---------------------------------------- + . . . . /// Build an Aho-Corasick DFA from the given iterator of patterns. + . . . . /// + . . . . /// A builder may be reused to create more DFAs. + . . . . pub fn build(&self, patterns: I) -> Result + . . . . where + . . . . I: IntoIterator, + . . . . P: AsRef<[u8]>, + . . . . { + 234 ( 0.00%) . . . let nnfa = self.noncontiguous.build(patterns)?; +7,551,757 ( 2.18%) 3,493 ( 0.43%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/nfa/noncontiguous.rs:aho_corasick::nfa::noncontiguous::Builder::build (39x) + 117 ( 0.00%) . . . self.build_from_noncontiguous(&nnfa) +9,372,525 ( 2.71%) 1,120 ( 0.14%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::build_from_noncontiguous (39x) + 78 ( 0.00%) . . . } + 31,216 ( 0.01%) 287 ( 0.04%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (39x) + . . . . + . . . . /// Build an Aho-Corasick DFA from the given noncontiguous NFA. + . . . . /// + . . . . /// Note that when this method is used, only the `start_kind` and + . . . . /// `byte_classes` settings on this builder are respected. The other + . . . . /// settings only apply to the initial construction of the Aho-Corasick + . . . . /// automaton. Since using this method requires that initial construction + . . . . /// has already completed, all settings impacting only initial construction + . . . . /// are no longer relevant. + 432 ( 0.00%) . . . pub fn build_from_noncontiguous( + . . . . &self, + . . . . nnfa: &noncontiguous::NFA, + . . . . ) -> Result { + . . . . debug!("building DFA"); + 96 ( 0.00%) . . . let byte_classes = if self.byte_classes { + . . . . nnfa.byte_classes().clone() + . . . . } else { + . . . . ByteClasses::singletons() + . . . . }; + 288 ( 0.00%) . . . let state_len = match self.start_kind { + . . . . StartKind::Unanchored | StartKind::Anchored => nnfa.states().len(), + . . . . StartKind::Both => { + . . . . // These unwraps are OK because we know that the number of + . . . . // NFA states is < StateID::LIMIT which is in turn less than + . . . . // i32::MAX. Thus, there is always room to multiply by 2. + . . . . // Finally, the number of states is always at least 4 in the + . . . . // NFA (DEAD, FAIL, START-UNANCHORED, START-ANCHORED), so the + . . . . // subtraction of 4 is okay. +-- line 449 ---------------------------------------- +-- line 471 ---------------------------------------- + . . . . }; + . . . . StateID::new(trans_len.checked_sub(byte_classes.stride()).unwrap()) + . . . . .map_err(|e| { + . . . . BuildError::state_id_overflow( + . . . . StateID::MAX.as_u64(), + . . . . e.attempted(), + . . . . ) + . . . . })?; + 48 ( 0.00%) . . . let num_match_states = match self.start_kind { + . . . . StartKind::Unanchored | StartKind::Anchored => { + . . . . nnfa.special().max_match_id.as_usize().checked_sub(1).unwrap() + . . . . } + . . . . StartKind::Both => nnfa + . . . . .special() + . . . . .max_match_id + . . . . .as_usize() + . . . . .checked_sub(1) + . . . . .unwrap() + . . . . .checked_mul(2) + . . . . .unwrap(), + . . . . }; + 1,056 ( 0.00%) . . . let mut dfa = DFA { + . . . . trans: vec![DFA::DEAD; trans_len], + 96 ( 0.00%) . . . matches: vec![vec![]; num_match_states], + 51,361 ( 0.01%) 38 ( 0.00%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs:alloc::vec::from_elem (48x) + . . . . matches_memory_usage: 0, + . . . . pattern_lens: nnfa.pattern_lens_raw().to_vec(), + . . . . prefilter: nnfa.prefilter().map(|p| p.clone()), + . . . . match_kind: nnfa.match_kind(), + . . . . state_len, + . . . . alphabet_len: byte_classes.alphabet_len(), + . . . . stride2: byte_classes.stride2(), + 1,440 ( 0.00%) . . . byte_classes, + . . . . min_pattern_len: nnfa.min_pattern_len(), + . . . . max_pattern_len: nnfa.max_pattern_len(), + . . . . // The special state IDs are set later. + . . . . special: Special::zero(), + . . . . }; + 174 ( 0.00%) . . . match self.start_kind { + . . . . StartKind::Both => { + . . . . self.finish_build_both_starts(nnfa, &mut dfa); + . . . . } + . . . . StartKind::Unanchored => { + . . . . self.finish_build_one_start(Anchored::No, nnfa, &mut dfa); + . . . . } + . . . . StartKind::Anchored => { + 39 ( 0.00%) . . . self.finish_build_one_start(Anchored::Yes, nnfa, &mut dfa) + . . . . } + . . . . } + . . . . debug!( + . . . . "DFA built, ", + . . . . dfa.state_len, + . . . . dfa.memory_usage(), + . . . . dfa.byte_classes.alphabet_len(), +-- line 524 ---------------------------------------- +-- line 531 ---------------------------------------- + . . . . dfa.pattern_lens.shrink_to_fit(); + . . . . dfa.matches.shrink_to_fit(); + . . . . // TODO: We might also want to shrink each Vec inside of `dfa.matches`, + . . . . // or even better, convert it to one contiguous allocation. But I think + . . . . // I went with nested allocs for good reason (can't remember), so this + . . . . // may be tricky to do. I decided not to shrink them here because it + . . . . // might require a fair bit of work to do. It's unclear whether it's + . . . . // worth it. + 144 ( 0.00%) . . . Ok(dfa) + 3,696 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (48x) + 432 ( 0.00%) . . . } + . . . . + . . . . /// Finishes building a DFA for either unanchored or anchored searches, + . . . . /// but NOT both. + 390 ( 0.00%) . . . fn finish_build_one_start( + . . . . &self, + . . . . anchored: Anchored, + . . . . nnfa: &noncontiguous::NFA, + . . . . dfa: &mut DFA, + . . . . ) { + . . . . // This function always succeeds because we check above that all of the + . . . . // states in the NFA can be mapped to DFA state IDs. + 117 ( 0.00%) . . . let stride2 = dfa.stride2; + 39 ( 0.00%) . . . let old2new = |oldsid: StateID| { +193,854 ( 0.06%) . . . StateID::new_unchecked(oldsid.as_usize() << stride2) + . . . . }; + . . . . for (oldsid, state) in nnfa.states().iter().with_state_ids() { + 4,258 ( 0.00%) . . . let newsid = old2new(oldsid); + 2,129 ( 0.00%) . . . if state.is_match() { + 3,812 ( 0.00%) . . . dfa.set_matches(newsid, nnfa.iter_matches(oldsid)); +249,266 ( 0.07%) 896 ( 0.11%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::DFA::set_matches (953x) + . . . . } + . . . . sparse_iter( + . . . . nnfa, + . . . . oldsid, + . . . . &dfa.byte_classes, +585,001 ( 0.17%) . . . |byte, class, mut oldnextsid| { + 93,597 ( 0.03%) . . . if oldnextsid == noncontiguous::NFA::FAIL { +178,188 ( 0.05%) . . . if anchored.is_anchored() { + . . . . oldnextsid = noncontiguous::NFA::DEAD; + . . . . } else if state.fail() == noncontiguous::NFA::DEAD { + . . . . // This is a special case that avoids following + . . . . // DEAD transitions in a non-contiguous NFA. + . . . . // Following these transitions is pretty slow + . . . . // because the non-contiguous NFA will always use + . . . . // a sparse representation for it (because the + . . . . // DEAD state is usually treated as a sentinel). +-- line 575 ---------------------------------------- +-- line 581 ---------------------------------------- + . . . . } else { + . . . . oldnextsid = nnfa.next_state( + . . . . Anchored::No, + . . . . state.fail(), + . . . . byte, + . . . . ); + . . . . } + . . . . } +561,582 ( 0.16%) . . . dfa.trans[newsid.as_usize() + usize::from(class)] = +187,194 ( 0.05%) . . . old2new(oldnextsid); +561,582 ( 0.16%) . . . }, + . . . . ); + . . . . } + . . . . // Now that we've remapped all the IDs in our states, all that's left + . . . . // is remapping the special state IDs. + . . . . let old = nnfa.special(); + . . . . let new = &mut dfa.special; + 78 ( 0.00%) . . . new.max_special_id = old2new(old.max_special_id); + 39 ( 0.00%) . . . new.max_match_id = old2new(old.max_match_id); + 39 ( 0.00%) . . . if anchored.is_anchored() { + 39 ( 0.00%) . . . new.start_unanchored_id = DFA::DEAD; + . . . . new.start_anchored_id = old2new(old.start_anchored_id); + . . . . } else { + . . . . new.start_unanchored_id = old2new(old.start_unanchored_id); + . . . . new.start_anchored_id = DFA::DEAD; + . . . . } + 312 ( 0.00%) . . . } + . . . . + . . . . /// Finishes building a DFA that supports BOTH unanchored and anchored + . . . . /// searches. It works by inter-leaving unanchored states with anchored + . . . . /// states in the same transition table. This way, we avoid needing to + . . . . /// re-shuffle states afterward to ensure that our states still look like + . . . . /// DEAD, MATCH, ..., START-UNANCHORED, START-ANCHORED, NON-MATCH, ... + . . . . /// + . . . . /// Honestly this is pretty inscrutable... Simplifications are most + . . . . /// welcome. + . . . . fn finish_build_both_starts( + . . . . &self, + . . . . nnfa: &noncontiguous::NFA, + . . . . dfa: &mut DFA, + . . . . ) { + . . . . let stride2 = dfa.stride2; + 27 ( 0.00%) . . . let stride = 1 << stride2; + . . . . let mut remap_unanchored = vec![DFA::DEAD; nnfa.states().len()]; + . . . . let mut remap_anchored = vec![DFA::DEAD; nnfa.states().len()]; + . . . . let mut is_anchored = vec![false; dfa.state_len]; + . . . . let mut newsid = DFA::DEAD; + . . . . let next_dfa_id = + . . . . |sid: StateID| StateID::new_unchecked(sid.as_usize() + stride); + . . . . for (oldsid, state) in nnfa.states().iter().with_state_ids() { + 990 ( 0.00%) . . . if oldsid == noncontiguous::NFA::DEAD + . . . . || oldsid == noncontiguous::NFA::FAIL + . . . . { + 18 ( 0.00%) . . . remap_unanchored[oldsid] = newsid; + 18 ( 0.00%) . . . remap_anchored[oldsid] = newsid; + . . . . newsid = next_dfa_id(newsid); + 1,413 ( 0.00%) . . . } else if oldsid == nnfa.special().start_unanchored_id + . . . . || oldsid == nnfa.special().start_anchored_id + . . . . { + 18 ( 0.00%) . . . if oldsid == nnfa.special().start_unanchored_id { + 9 ( 0.00%) . . . remap_unanchored[oldsid] = newsid; + 9 ( 0.00%) . . . remap_anchored[oldsid] = DFA::DEAD; + . . . . } else { + 9 ( 0.00%) . . . remap_unanchored[oldsid] = DFA::DEAD; + 9 ( 0.00%) . . . remap_anchored[oldsid] = newsid; + 36 ( 0.00%) . . . is_anchored[newsid.as_usize() >> stride2] = true; + . . . . } + 27 ( 0.00%) . . . if state.is_match() { + . . . . dfa.set_matches(newsid, nnfa.iter_matches(oldsid)); + . . . . } + . . . . sparse_iter( + . . . . nnfa, + . . . . oldsid, + . . . . &dfa.byte_classes, + . . . . |_, class, oldnextsid| { + . . . . let class = usize::from(class); + 252 ( 0.00%) . . . if oldnextsid == noncontiguous::NFA::FAIL { + . . . . dfa.trans[newsid.as_usize() + class] = DFA::DEAD; + . . . . } else { + . . . . dfa.trans[newsid.as_usize() + class] = oldnextsid; + . . . . } + . . . . }, + . . . . ); + . . . . newsid = next_dfa_id(newsid); + . . . . } else { + 459 ( 0.00%) . . . let unewsid = newsid; + . . . . newsid = next_dfa_id(newsid); + 459 ( 0.00%) . . . let anewsid = newsid; + . . . . newsid = next_dfa_id(newsid); + . . . . + 459 ( 0.00%) . . . remap_unanchored[oldsid] = unewsid; + 918 ( 0.00%) . . . remap_anchored[oldsid] = anewsid; + 918 ( 0.00%) . . . is_anchored[anewsid.as_usize() >> stride2] = true; + 459 ( 0.00%) . . . if state.is_match() { + 882 ( 0.00%) . . . dfa.set_matches(unewsid, nnfa.iter_matches(oldsid)); +154,935 ( 0.04%) 812 ( 0.10%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::DFA::set_matches (441x) + 2,205 ( 0.00%) . . . dfa.set_matches(anewsid, nnfa.iter_matches(oldsid)); +156,788 ( 0.05%) 830 ( 0.10%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::DFA::set_matches (441x) + . . . . } + . . . . sparse_iter( + . . . . nnfa, + . . . . oldsid, + . . . . &dfa.byte_classes, + 35,496 ( 0.01%) . . . |byte, class, oldnextsid| { + . . . . let class = usize::from(class); + 6,273 ( 0.00%) . . . if oldnextsid == noncontiguous::NFA::FAIL { + . . . . let oldnextsid = + 11,979 ( 0.00%) . . . if state.fail() == noncontiguous::NFA::DEAD { + . . . . noncontiguous::NFA::DEAD + . . . . } else { + 18 ( 0.00%) . . . nnfa.next_state( + . . . . Anchored::No, + . . . . state.fail(), + . . . . byte, + . . . . ) + . . . . }; + 23,958 ( 0.01%) . . . dfa.trans[unewsid.as_usize() + class] = oldnextsid; + . . . . } else { + 2,160 ( 0.00%) . . . dfa.trans[unewsid.as_usize() + class] = oldnextsid; + 1,080 ( 0.00%) . . . dfa.trans[anewsid.as_usize() + class] = oldnextsid; + . . . . } + 37,638 ( 0.01%) . . . }, + . . . . ); + . . . . } + . . . . } + 36 ( 0.00%) . . . for i in 0..dfa.state_len { + 1,908 ( 0.00%) . . . let sid = i << stride2; + 1,908 ( 0.00%) . . . if is_anchored[i] { + . . . . for next in dfa.trans[sid..][..stride].iter_mut() { + 22,464 ( 0.01%) . . . *next = remap_anchored[*next]; + . . . . } + . . . . } else { + . . . . for next in dfa.trans[sid..][..stride].iter_mut() { + 23,328 ( 0.01%) . . . *next = remap_unanchored[*next]; + . . . . } + . . . . } + . . . . } + . . . . // Now that we've remapped all the IDs in our states, all that's left + . . . . // is remapping the special state IDs. + . . . . let old = nnfa.special(); + . . . . let new = &mut dfa.special; + 27 ( 0.00%) . . . new.max_special_id = remap_anchored[old.max_special_id]; + 18 ( 0.00%) . . . new.max_match_id = remap_anchored[old.max_match_id]; + 27 ( 0.00%) . . . new.start_unanchored_id = remap_unanchored[old.start_unanchored_id]; + 27 ( 0.00%) . . . new.start_anchored_id = remap_anchored[old.start_anchored_id]; + . . . . } + . . . . + . . . . /// Set the desired match semantics. + . . . . /// + . . . . /// This only applies when using [`Builder::build`] and not + . . . . /// [`Builder::build_from_noncontiguous`]. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::match_kind`](crate::AhoCorasickBuilder::match_kind) + . . . . /// for more documentation and examples. + 39 ( 0.00%) . . . pub fn match_kind(&mut self, kind: MatchKind) -> &mut Builder { + . . . . self.noncontiguous.match_kind(kind); + . . . . self + 39 ( 0.00%) . . . } + . . . . + . . . . /// Enable ASCII-aware case insensitive matching. + . . . . /// + . . . . /// This only applies when using [`Builder::build`] and not + . . . . /// [`Builder::build_from_noncontiguous`]. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::ascii_case_insensitive`](crate::AhoCorasickBuilder::ascii_case_insensitive) +-- line 745 ---------------------------------------- +-- line 752 ---------------------------------------- + . . . . /// Enable heuristic prefilter optimizations. + . . . . /// + . . . . /// This only applies when using [`Builder::build`] and not + . . . . /// [`Builder::build_from_noncontiguous`]. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::prefilter`](crate::AhoCorasickBuilder::prefilter) + . . . . /// for more documentation and examples. + 39 ( 0.00%) . . . pub fn prefilter(&mut self, yes: bool) -> &mut Builder { + . . . . self.noncontiguous.prefilter(yes); + . . . . self + 39 ( 0.00%) . . . } + . . . . + . . . . /// Sets the starting state configuration for the automaton. + . . . . /// + . . . . /// See + . . . . /// [`AhoCorasickBuilder::start_kind`](crate::AhoCorasickBuilder::start_kind) + . . . . /// for more documentation and examples. + 39 ( 0.00%) . . . pub fn start_kind(&mut self, kind: StartKind) -> &mut Builder { + 48 ( 0.00%) . . . self.start_kind = kind; + . . . . self + 39 ( 0.00%) . . . } + . . . . + . . . . /// A debug setting for whether to attempt to shrink the size of the + . . . . /// automaton's alphabet or not. + . . . . /// + . . . . /// This should never be enabled unless you're debugging an automaton. + . . . . /// Namely, disabling byte classes makes transitions easier to reason + . . . . /// about, since they use the actual bytes instead of equivalence classes. + . . . . /// Disabling this confers no performance benefit at search time. +-- line 781 ---------------------------------------- +-- line 802 ---------------------------------------- + . . . . nnfa: &noncontiguous::NFA, + . . . . oldsid: StateID, + . . . . classes: &ByteClasses, + . . . . mut f: F, + . . . . ) { + . . . . let mut prev_class = None; + . . . . let mut byte = 0usize; + . . . . for t in nnfa.iter_trans(oldsid) { +290,756 ( 0.08%) . . . while byte < usize::from(t.byte()) { + . . . . let rep = byte.as_u8(); + . . . . let class = classes.get(rep); +106,520 ( 0.03%) . . . byte += 1; + . . . . if prev_class != Some(class) { +149,751 ( 0.04%) . . . f(rep, class, noncontiguous::NFA::FAIL); +968,160 ( 0.28%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (30,255x) + . . . . prev_class = Some(class); + . . . . } + . . . . } + . . . . let rep = t.byte(); + . . . . let class = classes.get(rep); + . . . . byte += 1; + . . . . if prev_class != Some(class) { + 28,315 ( 0.01%) . . . f(rep, class, t.next()); +153,988 ( 0.04%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (5,375x) + . . . . prev_class = Some(class); + . . . . } + . . . . } + . . . . for b in byte..=255 { + . . . . let rep = b.as_u8(); + . . . . let class = classes.get(rep); + . . . . if prev_class != Some(class) { +327,837 ( 0.09%) . . . f(rep, class, noncontiguous::NFA::FAIL); +1,854,944 ( 0.54%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/dfa.rs:aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (57,967x) + . . . . prev_class = Some(class); + . . . . } + . . . . } + . . . . } + +544,089 ( 0.16%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 90 ---------------------------------------- + . . . . /// + . . . . /// The given stride should be the stride of the transition table expressed + . . . . /// as a power of 2. This stride is used to map between state IDs and state + . . . . /// indices. If state IDs and state indices are equivalent, then provide + . . . . /// a `stride2` of `0`, which acts as an identity. + . . . . pub(crate) fn new(r: &impl Remappable, stride2: usize) -> Remapper { + . . . . let idx = IndexMapper { stride2 }; + . . . . let map = (0..r.state_len()).map(|i| idx.to_state_id(i)).collect(); + 192 ( 0.00%) . . . Remapper { map, idx } + . . . . } + . . . . + . . . . /// Swap two states. Once this is called, callers must follow through to + . . . . /// call `remap`, or else it's possible for the underlying remappable + . . . . /// value to be in a corrupt state. + 1,490 ( 0.00%) . . . pub(crate) fn swap( + . . . . &mut self, + . . . . r: &mut impl Remappable, + . . . . id1: StateID, + . . . . id2: StateID, + . . . . ) { + 1,490 ( 0.00%) . . . if id1 == id2 { + . . . . return; + . . . . } + . . . . r.swap_states(id1, id2); + 1,446 ( 0.00%) . . . self.map.swap(self.idx.to_index(id1), self.idx.to_index(id2)); + 2,980 ( 0.00%) . . . } + . . . . + . . . . /// Complete the remapping process by rewriting all state IDs in the + . . . . /// remappable value according to the swaps performed. + 384 ( 0.00%) . . . pub(crate) fn remap(mut self, r: &mut impl Remappable) { + . . . . // Update the map to account for states that have been swapped + . . . . // multiple times. For example, if (A, C) and (C, G) are swapped, then + . . . . // transitions previously pointing to A should now point to G. But if + . . . . // we don't update our map, they will erroneously be set to C. All we + . . . . // do is follow the swaps in our map until we see our original state + . . . . // ID. + . . . . // + . . . . // The intuition here is to think about how changes are made to the +-- line 127 ---------------------------------------- +-- line 132 ---------------------------------------- + . . . . // + . . . . // We are also careful to clone the map before starting in order to + . . . . // freeze it. We use the frozen map to find our loops, since we need to + . . . . // update our map as well. Without freezing it, our updates could break + . . . . // the loops referenced above and produce incorrect results. + . . . . let oldmap = self.map.clone(); + . . . . for i in 0..r.state_len() { + . . . . let cur_id = self.idx.to_state_id(i); + 2,624 ( 0.00%) . . . let mut new_id = oldmap[i]; + 4,596 ( 0.00%) . . . if cur_id == new_id { + . . . . continue; + . . . . } + . . . . loop { + 23,470 ( 0.01%) . . . let id = oldmap[self.idx.to_index(new_id)]; + 23,470 ( 0.01%) . . . if cur_id == id { + 5,916 ( 0.00%) . . . self.map[i] = new_id; + . . . . break; + . . . . } + . . . . new_id = id; + . . . . } + . . . . } +135,015 ( 0.04%) . . . r.remap(|sid| self.map[self.idx.to_index(sid)]); +1,488,569 ( 0.43%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/aho-corasick-1.1.2/src/util/remapper.rs:::remap (48x) + . . . . } + . . . . } + . . . . + . . . . /// A simple type for mapping between state indices and state IDs. + . . . . /// + . . . . /// The reason why this exists is because state IDs are "premultiplied" in a + . . . . /// DFA. That is, in order to get to the transitions for a particular state, + . . . . /// one need only use the state ID as-is, instead of having to multiply it by +-- line 161 ---------------------------------------- +-- line 179 ---------------------------------------- + . . . . /// transition table. 'id >> stride2' de-multiplies an ID while 'index << + . . . . /// stride2' pre-multiplies an index to an ID. + . . . . stride2: usize, + . . . . } + . . . . + . . . . impl IndexMapper { + . . . . /// Convert a state ID to a state index. + . . . . fn to_index(&self, id: StateID) -> usize { +162,583 ( 0.05%) . . . id.as_usize() >> self.stride2 + . . . . } + . . . . + . . . . /// Convert a state index to a state ID. + . . . . fn to_state_id(&self, index: usize) -> StateID { + . . . . // CORRECTNESS: If the given index is not valid, then it is not + . . . . // required for this to panic or return a valid state ID. We'll "just" + . . . . // wind up with panics or silent logic errors at some other point. But + . . . . // this is OK because if Remappable::state_len is correct and so is + . . . . // 'to_index', then all inputs to 'to_state_id' should be valid indices + . . . . // and thus transform into valid state IDs. + 10,496 ( 0.00%) . . . StateID::new_unchecked(index << self.stride2) + . . . . } + . . . . } + . . . . + . . . . impl Remappable for noncontiguous::NFA { + . . . . fn state_len(&self) -> usize { + . . . . noncontiguous::NFA::states(self).len() + . . . . } + . . . . + . . . . fn swap_states(&mut self, id1: StateID, id2: StateID) { + 2,892 ( 0.00%) . . . noncontiguous::NFA::swap_states(self, id1, id2) + . . . . } + . . . . + 336 ( 0.00%) . . . fn remap(&mut self, map: impl Fn(StateID) -> StateID) { + . . . . noncontiguous::NFA::remap(self, map) + 384 ( 0.00%) . . . } + . . . . } + + 31,966 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 84 ---------------------------------------- + . . . . /// `state` corresponds to the current DFA state on which one wants to compute + . . . . /// the transition for the input `unit`. + . . . . /// + . . . . /// `empty_builder` corresponds to the builder allocation to use to produce a + . . . . /// complete `StateBuilderNFA` state. If the state is not needed (or is already + . . . . /// cached), then it can be cleared and reused without needing to create a new + . . . . /// `State`. The `StateBuilderNFA` state returned is final and ready to be + . . . . /// turned into a `State` if necessary. + 2,616 ( 0.00%) . . . pub(crate) fn next( + . . . . nfa: &thompson::NFA, + . . . . match_kind: MatchKind, + . . . . sparses: &mut SparseSets, + . . . . stack: &mut Vec, + . . . . state: &State, + . . . . unit: alphabet::Unit, + . . . . empty_builder: StateBuilderEmpty, + . . . . ) -> StateBuilderNFA { +-- line 100 ---------------------------------------- +-- line 113 ---------------------------------------- + . . . . // re-compute their epsilon closure. + . . . . // + . . . . // Doing this state shuffling is technically not necessary unless some + . . . . // kind of look-around is used in the DFA. Some ad hoc experiments + . . . . // suggested that avoiding this didn't lead to much of an improvement, + . . . . // but perhaps more rigorous experimentation should be done. And in + . . . . // particular, avoiding this check requires some light refactoring of + . . . . // the code below. + 654 ( 0.00%) . . . state.iter_nfa_state_ids(|nfa_id| { +48,978 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::iter_nfa_state_ids (218x) + 988 ( 0.00%) . . . sparses.set1.insert(nfa_id); + . . . . }); + . . . . + . . . . // Compute look-ahead assertions originating from the current state. Based + . . . . // on the input unit we're transitioning over, some additional set of + . . . . // assertions may be true. Thus, we re-compute this state's epsilon closure + . . . . // (but only if necessary). Notably, when we build a DFA state initially, + . . . . // we don't enable any look-ahead assertions because we don't know whether + . . . . // they're true or not at that point. + 218 ( 0.00%) . . . if !state.look_need().is_empty() { + . . . . // Add look-ahead assertions that are now true based on the current + . . . . // input unit. + . . . . let mut look_have = state.look_have().clone(); + 280 ( 0.00%) . . . match unit.as_u8() { + . . . . Some(b'\r') => { + . . . . if !rev || !state.is_half_crlf() { + . . . . look_have = look_have.insert(Look::EndCRLF); + . . . . } + . . . . } + . . . . Some(b'\n') => { + . . . . if rev || !state.is_half_crlf() { + . . . . look_have = look_have.insert(Look::EndCRLF); +-- line 143 ---------------------------------------- +-- line 146 ---------------------------------------- + . . . . Some(_) => {} + . . . . None => { + . . . . look_have = look_have + . . . . .insert(Look::End) + . . . . .insert(Look::EndLF) + . . . . .insert(Look::EndCRLF); + . . . . } + . . . . } + 80 ( 0.00%) . . . if unit.is_byte(lookm.get_line_terminator()) { + . . . . look_have = look_have.insert(Look::EndLF); + . . . . } + 40 ( 0.00%) . . . if state.is_half_crlf() + . . . . && ((rev && !unit.is_byte(b'\r')) + . . . . || (!rev && !unit.is_byte(b'\n'))) + . . . . { + . . . . look_have = look_have.insert(Look::StartCRLF); + . . . . } + 200 ( 0.00%) . . . if state.is_from_word() == unit.is_word_byte() { + . . . . look_have = look_have + . . . . .insert(Look::WordAsciiNegate) + . . . . .insert(Look::WordUnicodeNegate); + . . . . } else { + . . . . look_have = + . . . . look_have.insert(Look::WordAscii).insert(Look::WordUnicode); + . . . . } + 41 ( 0.00%) . . . if !unit.is_word_byte() { + . . . . look_have = look_have + . . . . .insert(Look::WordEndHalfAscii) + . . . . .insert(Look::WordEndHalfUnicode); + . . . . } + 3 ( 0.00%) . . . if state.is_from_word() && !unit.is_word_byte() { + . . . . look_have = look_have + . . . . .insert(Look::WordEndAscii) + . . . . .insert(Look::WordEndUnicode); + 117 ( 0.00%) . . . } else if !state.is_from_word() && unit.is_word_byte() { + . . . . look_have = look_have + . . . . .insert(Look::WordStartAscii) + . . . . .insert(Look::WordStartUnicode); + . . . . } + . . . . // If we have new assertions satisfied that are among the set of + . . . . // assertions that exist in this state (that is, just because we added + . . . . // an EndLF assertion above doesn't mean there is an EndLF conditional + . . . . // epsilon transition in this state), then we re-compute this state's + . . . . // epsilon closure using the updated set of assertions. + . . . . // + . . . . // Note that since our DFA states omit unconditional epsilon + . . . . // transitions, this check is necessary for correctness. If we re-did + . . . . // the epsilon closure below needlessly, it could change based on the + . . . . // fact that we omitted epsilon states originally. + 40 ( 0.00%) . . . if !look_have + . . . . .subtract(state.look_have()) + . . . . .intersect(state.look_need()) + . . . . .is_empty() + . . . . { + . . . . for nfa_id in sparses.set1.iter() { + . . . . epsilon_closure( + . . . . nfa, + . . . . nfa_id, +-- line 203 ---------------------------------------- +-- line 212 ---------------------------------------- + . . . . } + . . . . + . . . . // Convert our empty builder into one that can record assertions and match + . . . . // pattern IDs. + . . . . let mut builder = empty_builder.into_matches(); + . . . . // Set whether the StartLF look-behind assertion is true for this + . . . . // transition or not. The look-behind assertion for ASCII word boundaries + . . . . // is handled below. + 218 ( 0.00%) . . . if nfa.look_set_any().contains_anchor_line() + . . . . && unit.is_byte(lookm.get_line_terminator()) + . . . . { + . . . . // Why only handle StartLF here and not Start? That's because Start + . . . . // can only impact the starting state, which is special cased in + . . . . // start state handling. + . . . . builder.set_look_have(|have| have.insert(Look::StartLF)); + . . . . } + . . . . // We also need to add StartCRLF to our assertions too, if we can. This +-- line 228 ---------------------------------------- +-- line 240 ---------------------------------------- + . . . . // look-behind byte is not a word char, then the assertions are satisfied. + . . . . if nfa.look_set_any().contains_word() && !unit.is_word_byte() { + . . . . builder.set_look_have(|have| { + . . . . have.insert(Look::WordStartHalfAscii) + . . . . .insert(Look::WordStartHalfUnicode) + . . . . }); + . . . . } + . . . . for nfa_id in sparses.set1.iter() { + 988 ( 0.00%) . . . match *nfa.state(nfa_id) { + . . . . thompson::State::Union { .. } + . . . . | thompson::State::BinaryUnion { .. } + . . . . | thompson::State::Fail + . . . . | thompson::State::Look { .. } + . . . . | thompson::State::Capture { .. } => {} + 3 ( 0.00%) . . . thompson::State::Match { pattern_id } => { + . . . . // Notice here that we are calling the NEW state a match + . . . . // state if the OLD state we are transitioning from + . . . . // contains an NFA match state. This is precisely how we + . . . . // delay all matches by one byte and also what therefore + . . . . // guarantees that starting states cannot be match states. + . . . . // + . . . . // If we didn't delay matches by one byte, then whether + . . . . // a DFA is a matching state or not would be determined +-- line 262 ---------------------------------------- +-- line 275 ---------------------------------------- + . . . . // + . . . . // N.B. We delay matches by 1 byte as a way to hack 1-byte + . . . . // look-around into DFA searches. This lets us support ^, $ + . . . . // and ASCII-only \b. The delay is also why we need a special + . . . . // "end-of-input" (EOI) sentinel and why we need to follow the + . . . . // EOI sentinel at the end of every search. This final EOI + . . . . // transition is necessary to report matches found at the end + . . . . // of a haystack. + 6 ( 0.00%) . . . builder.add_match_pattern_id(pattern_id); + 60 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::StateBuilderMatches::add_match_pattern_id (3x) + 6 ( 0.00%) . . . if !match_kind.continue_past_first_match() { + . . . . break; + . . . . } + . . . . } + . . . . thompson::State::ByteRange { ref trans } => { + 954 ( 0.00%) . . . if trans.matches_unit(unit) { + . . . . epsilon_closure( + . . . . nfa, + . . . . trans.next, + . . . . builder.look_have(), + . . . . stack, + . . . . &mut sparses.set2, + . . . . ); + . . . . } +-- line 297 ---------------------------------------- +-- line 332 ---------------------------------------- + . . . . // a quit byte is seen. Consuming until EOI isn't a correctness problem, + . . . . // but a (serious) perf problem. Hitting a quit byte, however, could be a + . . . . // correctness problem since it could cause search routines to report an + . . . . // error instead of a detected match once the quit state is entered. (The + . . . . // search routine could be made to be a bit smarter by reporting a match + . . . . // if one was detected once it enters a quit state (and indeed, the search + . . . . // routines in this crate do just that), but it seems better to prevent + . . . . // these things by construction if possible.) + 218 ( 0.00%) . . . if !sparses.set2.is_empty() { + . . . . if nfa.look_set_any().contains_word() && unit.is_word_byte() { + . . . . builder.set_is_from_word(); + . . . . } + 175 ( 0.00%) . . . if nfa.look_set_any().contains_anchor_crlf() + . . . . && ((rev && unit.is_byte(b'\n')) || (!rev && unit.is_byte(b'\r'))) + . . . . { + . . . . builder.set_is_half_crlf(); + . . . . } + . . . . } + 654 ( 0.00%) . . . let mut builder_nfa = builder.into_nfa(); + 436 ( 0.00%) . . . add_nfa_states(nfa, &sparses.set2, &mut builder_nfa); +24,097 ( 0.01%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::add_nfa_states (218x) + . . . . builder_nfa + 1,962 ( 0.00%) . . . } + . . . . + . . . . /// Compute the epsilon closure for the given NFA state. The epsilon closure + . . . . /// consists of all NFA state IDs, including `start_nfa_id`, that can be + . . . . /// reached from `start_nfa_id` without consuming any input. These state IDs + . . . . /// are written to `set` in the order they are visited, but only if they are + . . . . /// not already in `set`. `start_nfa_id` must be a valid state ID for the NFA + . . . . /// given. + . . . . /// + . . . . /// `look_have` consists of the satisfied assertions at the current + . . . . /// position. For conditional look-around epsilon transitions, these are + . . . . /// only followed if they are satisfied by `look_have`. + . . . . /// + . . . . /// `stack` must have length 0. It is used as scratch space for depth first + . . . . /// traversal. After returning, it is guaranteed that `stack` will have length + . . . . /// 0. + 1,880 ( 0.00%) . . . pub(crate) fn epsilon_closure( + . . . . nfa: &thompson::NFA, + . . . . start_nfa_id: StateID, + . . . . look_have: LookSet, + . . . . stack: &mut Vec, + . . . . set: &mut SparseSet, + . . . . ) { + 235 ( 0.00%) . . . assert!(stack.is_empty()); + . . . . // If this isn't an epsilon state, then the epsilon closure is always just + . . . . // itself, so there's no need to spin up the machinery below to handle it. + 235 ( 0.00%) . . . if !nfa.state(start_nfa_id).is_epsilon() { + 93 ( 0.00%) . . . set.insert(start_nfa_id); + . . . . return; + . . . . } + . . . . + . . . . stack.push(start_nfa_id); + . . . . while let Some(mut id) = stack.pop() { + . . . . // In many cases, we can avoid stack operations when an NFA state only + . . . . // adds one new state to visit. In that case, we just set our ID to + . . . . // that state and mush on. We only use the stack when an NFA state + . . . . // introduces multiple new states to visit. + . . . . loop { + . . . . // Insert this NFA state, and if it's already in the set and thus + . . . . // already visited, then we can move on to the next one. + 1,150 ( 0.00%) . . . if !set.insert(id) { + . . . . break; + . . . . } + 1,150 ( 0.00%) . . . match *nfa.state(id) { + . . . . thompson::State::ByteRange { .. } + . . . . | thompson::State::Sparse { .. } + . . . . | thompson::State::Dense { .. } + . . . . | thompson::State::Fail + . . . . | thompson::State::Match { .. } => break, + . . . . thompson::State::Look { look, next } => { + 41 ( 0.00%) . . . if !look_have.contains(look) { + . . . . break; + . . . . } + . . . . id = next; + . . . . } + . . . . thompson::State::Union { ref alternates } => { + 68 ( 0.00%) . . . id = match alternates.get(0) { + . . . . None => break, + 34 ( 0.00%) . . . Some(&id) => id, + . . . . }; + . . . . // We need to process our alternates in order to preserve + . . . . // match preferences, so put the earliest alternates closer + . . . . // to the top of the stack. + . . . . stack.extend(alternates[1..].iter().rev()); + . . . . } + 186 ( 0.00%) . . . thompson::State::BinaryUnion { alt1, alt2 } => { + . . . . id = alt1; + . . . . stack.push(alt2); + . . . . } + . . . . thompson::State::Capture { next, .. } => { + . . . . id = next; + . . . . } + . . . . } + . . . . } + . . . . } + 1,880 ( 0.00%) . . . } + . . . . + . . . . /// Add the NFA state IDs in the given `set` to the given DFA builder state. + . . . . /// The order in which states are added corresponds to the order in which they + . . . . /// were added to `set`. + . . . . /// + . . . . /// The DFA builder state given should already have its complete set of match + . . . . /// pattern IDs added (if any) and any look-behind assertions (StartLF, Start + . . . . /// and whether this state is being generated for a transition over a word byte +-- line 436 ---------------------------------------- +-- line 440 ---------------------------------------- + . . . . /// delayed by one byte. The things that should _not_ be set are look-ahead + . . . . /// assertions (EndLF, End and whether the next byte is a word byte or not). + . . . . /// The builder state should also not have anything in `look_need` set, as this + . . . . /// routine will compute that for you. + . . . . /// + . . . . /// The given NFA should be able to resolve all identifiers in `set` to a + . . . . /// particular NFA state. Additionally, `set` must have capacity equivalent + . . . . /// to `nfa.len()`. + 2,072 ( 0.00%) . . . pub(crate) fn add_nfa_states( + . . . . nfa: &thompson::NFA, + . . . . set: &SparseSet, + . . . . builder: &mut StateBuilderNFA, + . . . . ) { + . . . . for nfa_id in set.iter() { + 2,486 ( 0.00%) . . . match *nfa.state(nfa_id) { + . . . . thompson::State::ByteRange { .. } => { + . . . . builder.add_nfa_state_id(nfa_id); + . . . . } + . . . . thompson::State::Sparse { .. } => { + . . . . builder.add_nfa_state_id(nfa_id); + . . . . } + . . . . thompson::State::Dense { .. } => { + . . . . builder.add_nfa_state_id(nfa_id); + . . . . } + 41 ( 0.00%) . . . thompson::State::Look { look, .. } => { + . . . . builder.add_nfa_state_id(nfa_id); + . . . . builder.set_look_need(|need| need.insert(look)); + . . . . } + . . . . thompson::State::Union { .. } + . . . . | thompson::State::BinaryUnion { .. } => { + . . . . // Pure epsilon transitions don't need to be tracked as part + . . . . // of the DFA state. Tracking them is actually superfluous; + . . . . // they won't cause any harm other than making determinization +-- line 472 ---------------------------------------- +-- line 568 ---------------------------------------- + . . . . // match state. See 'next' for how this is handled. + . . . . builder.add_nfa_state_id(nfa_id); + . . . . } + . . . . } + . . . . } + . . . . // If we know this state contains no look-around assertions, then + . . . . // there's no reason to track which look-around assertions were + . . . . // satisfied when this state was created. + 518 ( 0.00%) . . . if builder.look_need().is_empty() { + . . . . builder.set_look_have(|_| LookSet::empty()); + . . . . } + 2,072 ( 0.00%) . . . } + . . . . + . . . . /// Sets the appropriate look-behind assertions on the given state based on + . . . . /// this starting configuration. + 41 ( 0.00%) . . . pub(crate) fn set_lookbehind_from_start( + . . . . nfa: &thompson::NFA, + . . . . start: &Start, + . . . . builder: &mut StateBuilderMatches, + . . . . ) { + . . . . let rev = nfa.is_reverse(); + . . . . let lineterm = nfa.look_matcher().get_line_terminator(); + . . . . let lookset = nfa.look_set_any(); + 41 ( 0.00%) . . . match *start { + . . . . Start::NonWordByte => { + . . . . if lookset.contains_word() { + . . . . builder.set_look_have(|have| { + . . . . have.insert(Look::WordStartHalfAscii) + . . . . .insert(Look::WordStartHalfUnicode) + . . . . }); + . . . . } + . . . . } + . . . . Start::WordByte => { + . . . . if lookset.contains_word() { + . . . . builder.set_is_from_word(); + . . . . } + . . . . } + . . . . Start::Text => { + 41 ( 0.00%) . . . if lookset.contains_anchor_haystack() { + . . . . builder.set_look_have(|have| have.insert(Look::Start)); + . . . . } + 41 ( 0.00%) . . . if lookset.contains_anchor_line() { + . . . . builder.set_look_have(|have| { + . . . . have.insert(Look::StartLF).insert(Look::StartCRLF) + . . . . }); + . . . . } + . . . . if lookset.contains_word() { + . . . . builder.set_look_have(|have| { + . . . . have.insert(Look::WordStartHalfAscii) + . . . . .insert(Look::WordStartHalfUnicode) +-- line 617 ---------------------------------------- +-- line 674 ---------------------------------------- + . . . . builder.set_look_have(|have| { + . . . . have.insert(Look::WordStartHalfAscii) + . . . . .insert(Look::WordStartHalfUnicode) + . . . . }); + . . . . } + . . . . } + . . . . } + . . . . } + 82 ( 0.00%) . . . } + +18,839 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/look.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 137 ---------------------------------------- + . . . . impl Look { + . . . . /// Flip the look-around assertion to its equivalent for reverse searches. + . . . . /// For example, `StartLF` gets translated to `EndLF`. + . . . . /// + . . . . /// Some assertions, such as `WordUnicode`, remain the same since they + . . . . /// match the same positions regardless of the direction of the search. + . . . . #[inline] + . . . . pub const fn reversed(self) -> Look { + 246 ( 0.00%) . . . match self { + . . . . Look::Start => Look::End, + . . . . Look::End => Look::Start, + . . . . Look::StartLF => Look::EndLF, + . . . . Look::EndLF => Look::StartLF, + . . . . Look::StartCRLF => Look::EndCRLF, + . . . . Look::EndCRLF => Look::StartCRLF, + . . . . Look::WordAscii => Look::WordAscii, + . . . . Look::WordAsciiNegate => Look::WordAsciiNegate, +-- line 153 ---------------------------------------- +-- line 175 ---------------------------------------- + . . . . self as u32 + . . . . } + . . . . + . . . . /// Given the underlying representation of a `Look` value, return the + . . . . /// corresponding `Look` value if the representation is valid. Otherwise + . . . . /// `None` is returned. + . . . . #[inline] + . . . . pub const fn from_repr(repr: u32) -> Option { + 244 ( 0.00%) . . . match repr { + . . . . 0b00_0000_0000_0000_0001 => Some(Look::Start), + . . . . 0b00_0000_0000_0000_0010 => Some(Look::End), + . . . . 0b00_0000_0000_0000_0100 => Some(Look::StartLF), + . . . . 0b00_0000_0000_0000_1000 => Some(Look::EndLF), + . . . . 0b00_0000_0000_0001_0000 => Some(Look::StartCRLF), + . . . . 0b00_0000_0000_0010_0000 => Some(Look::EndCRLF), + . . . . 0b00_0000_0000_0100_0000 => Some(Look::WordAscii), + . . . . 0b00_0000_0000_1000_0000 => Some(Look::WordAsciiNegate), +-- line 191 ---------------------------------------- +-- line 284 ---------------------------------------- + . . . . // OK because max value always fits in a u8, which in turn always + . . . . // fits in a usize, regardless of target. + . . . . usize::try_from(self.bits.count_ones()).unwrap() + . . . . } + . . . . + . . . . /// Returns true if and only if this set is empty. + . . . . #[inline] + . . . . pub fn is_empty(self) -> bool { + 477 ( 0.00%) . . . self.len() == 0 + . . . . } + . . . . + . . . . /// Returns true if and only if the given look-around assertion is in this + . . . . /// set. + . . . . #[inline] + . . . . pub fn contains(self, look: Look) -> bool { + 41 ( 0.00%) . . . self.bits & look.as_repr() != 0 + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any anchor assertions. + . . . . /// This includes both "start/end of haystack" and "start/end of line." + . . . . #[inline] + . . . . pub fn contains_anchor(&self) -> bool { + . . . . self.contains_anchor_haystack() || self.contains_anchor_line() + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any "start/end of + . . . . /// haystack" anchors. This doesn't include "start/end of line" anchors. + . . . . #[inline] + . . . . pub fn contains_anchor_haystack(&self) -> bool { + 41 ( 0.00%) . . . self.contains(Look::Start) || self.contains(Look::End) + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any "start/end of line" + . . . . /// anchors. This doesn't include "start/end of haystack" anchors. This + . . . . /// includes both `\n` line anchors and CRLF (`\r\n`) aware line anchors. + . . . . #[inline] + . . . . pub fn contains_anchor_line(&self) -> bool { + 259 ( 0.00%) . . . self.contains(Look::StartLF) + . . . . || self.contains(Look::EndLF) + . . . . || self.contains(Look::StartCRLF) + . . . . || self.contains(Look::EndCRLF) + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any "start/end of line" + . . . . /// anchors that only treat `\n` as line terminators. This does not include + . . . . /// haystack anchors or CRLF aware line anchors. +-- line 329 ---------------------------------------- +-- line 332 ---------------------------------------- + . . . . self.contains(Look::StartLF) || self.contains(Look::EndLF) + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any "start/end of line" + . . . . /// anchors that are CRLF-aware. This doesn't include "start/end of + . . . . /// haystack" or "start/end of line-feed" anchors. + . . . . #[inline] + . . . . pub fn contains_anchor_crlf(&self) -> bool { + 611 ( 0.00%) . . . self.contains(Look::StartCRLF) || self.contains(Look::EndCRLF) + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any word boundary or + . . . . /// negated word boundary assertions. This include both Unicode and ASCII + . . . . /// word boundaries. + . . . . #[inline] + . . . . pub fn contains_word(self) -> bool { + 1,004 ( 0.00%) . . . self.contains_word_unicode() || self.contains_word_ascii() + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any Unicode word boundary + . . . . /// or negated Unicode word boundary assertions. + . . . . #[inline] + . . . . pub fn contains_word_unicode(self) -> bool { + 175 ( 0.00%) . . . self.contains(Look::WordUnicode) + . . . . || self.contains(Look::WordUnicodeNegate) + . . . . || self.contains(Look::WordStartUnicode) + . . . . || self.contains(Look::WordEndUnicode) + . . . . || self.contains(Look::WordStartHalfUnicode) + . . . . || self.contains(Look::WordEndHalfUnicode) + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains any ASCII word boundary +-- line 363 ---------------------------------------- +-- line 378 ---------------------------------------- + . . . . LookSetIter { set: self } + . . . . } + . . . . + . . . . /// Return a new set that is equivalent to the original, but with the given + . . . . /// assertion added to it. If the assertion is already in the set, then the + . . . . /// returned set is equivalent to the original. + . . . . #[inline] + . . . . pub fn insert(self, look: Look) -> LookSet { + 310 ( 0.00%) . . . LookSet { bits: self.bits | look.as_repr() } + . . . . } + . . . . + . . . . /// Updates this set in place with the result of inserting the given + . . . . /// assertion into this set. + . . . . #[inline] + . . . . pub fn set_insert(&mut self, look: Look) { + . . . . *self = self.insert(look); + . . . . } + . . . . + . . . . /// Return a new set that is equivalent to the original, but with the given + . . . . /// assertion removed from it. If the assertion is not in the set, then the + . . . . /// returned set is equivalent to the original. + . . . . #[inline] + . . . . pub fn remove(self, look: Look) -> LookSet { + 366 ( 0.00%) . . . LookSet { bits: self.bits & !look.as_repr() } + . . . . } + . . . . + . . . . /// Updates this set in place with the result of removing the given + . . . . /// assertion from this set. + . . . . #[inline] + . . . . pub fn set_remove(&mut self, look: Look) { + . . . . *self = self.remove(look); + . . . . } + . . . . + . . . . /// Returns a new set that is the result of subtracting the given set from + . . . . /// this set. + . . . . #[inline] + . . . . pub fn subtract(self, other: LookSet) -> LookSet { + 40 ( 0.00%) . . . LookSet { bits: self.bits & !other.bits } + . . . . } + . . . . + . . . . /// Updates this set in place with the result of subtracting the given set + . . . . /// from this set. + . . . . #[inline] + . . . . pub fn set_subtract(&mut self, other: LookSet) { + . . . . *self = self.subtract(other); + . . . . } +-- line 423 ---------------------------------------- +-- line 433 ---------------------------------------- + . . . . #[inline] + . . . . pub fn set_union(&mut self, other: LookSet) { + . . . . *self = self.union(other); + . . . . } + . . . . + . . . . /// Returns a new set that is the intersection of this and the one given. + . . . . #[inline] + . . . . pub fn intersect(self, other: LookSet) -> LookSet { + 40 ( 0.00%) . . . LookSet { bits: self.bits & other.bits } + . . . . } + . . . . + . . . . /// Updates this set in place with the result of intersecting it with the + . . . . /// one given. + . . . . #[inline] + . . . . pub fn set_intersect(&mut self, other: LookSet) { + . . . . *self = self.intersect(other); + . . . . } +-- line 449 ---------------------------------------- +-- line 464 ---------------------------------------- + . . . . /// of the slice given. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics if `slice.len() < 4`. + . . . . #[inline] + . . . . pub fn write_repr(self, slice: &mut [u8]) { + . . . . let raw = self.bits.to_ne_bytes(); + 81 ( 0.00%) . . . slice[0] = raw[0]; + 299 ( 0.00%) . . . slice[1] = raw[1]; + 81 ( 0.00%) . . . slice[2] = raw[2]; + 122 ( 0.00%) . . . slice[3] = raw[3]; + . . . . } + . . . . + . . . . /// Checks that all assertions in this set can be matched. + . . . . /// + . . . . /// Some assertions, such as Unicode word boundaries, require optional (but + . . . . /// enabled by default) tables that may not be available. If there are + . . . . /// assertions in this set that require tables that are not available, then + . . . . /// this will return an error. +-- line 483 ---------------------------------------- +-- line 518 ---------------------------------------- + . . . . set: LookSet, + . . . . } + . . . . + . . . . impl Iterator for LookSetIter { + . . . . type Item = Look; + . . . . + . . . . #[inline] + . . . . fn next(&mut self) -> Option { + 406 ( 0.00%) . . . if self.set.is_empty() { + . . . . return None; + . . . . } + . . . . // We'll never have more than u8::MAX distinct look-around assertions, + . . . . // so 'bit' will always fit into a u16. + . . . . let bit = u16::try_from(self.set.bits.trailing_zeros()).unwrap(); + 244 ( 0.00%) . . . let look = Look::from_repr(1 << bit)?; + . . . . self.set = self.set.remove(look); + . . . . Some(look) + . . . . } + . . . . } + . . . . + . . . . /// A matcher for look-around assertions. + . . . . /// + . . . . /// This matcher permits configuring aspects of how look-around assertions are +-- line 540 ---------------------------------------- +-- line 604 ---------------------------------------- + . . . . /// Returns the line terminator that was configured for this matcher. + . . . . /// + . . . . /// If no line terminator was configured, then this returns `\n`. + . . . . /// + . . . . /// Note that the line terminator should only be used for matching `(?m:^)` + . . . . /// and `(?m:$)` assertions. It specifically should _not_ be used for + . . . . /// matching the CRLF aware assertions `(?Rm:^)` and `(?Rm:$)`. + . . . . pub fn get_line_terminator(&self) -> u8 { + 391 ( 0.00%) . . . self.lineterm.0 + . . . . } + . . . . + . . . . /// Returns true when the position `at` in `haystack` satisfies the given + . . . . /// look-around assertion. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics when testing any Unicode word boundary assertion in this +-- line 620 ---------------------------------------- +-- line 656 ---------------------------------------- + . . . . /// haystack.len()` is legal and guaranteed not to panic. + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . pub(crate) fn matches_inline( + . . . . &self, + . . . . look: Look, + . . . . haystack: &[u8], + . . . . at: usize, + . . . . ) -> bool { + 10 ( 0.00%) . . . match look { + . . . . Look::Start => self.is_start(haystack, at), + . . . . Look::End => self.is_end(haystack, at), + . . . . Look::StartLF => self.is_start_lf(haystack, at), + . . . . Look::EndLF => self.is_end_lf(haystack, at), + . . . . Look::StartCRLF => self.is_start_crlf(haystack, at), + . . . . Look::EndCRLF => self.is_end_crlf(haystack, at), + . . . . Look::WordAscii => self.is_word_ascii(haystack, at), + . . . . Look::WordAsciiNegate => self.is_word_ascii_negate(haystack, at), +-- line 672 ---------------------------------------- +-- line 829 ---------------------------------------- + . . . . } + . . . . } + . . . . true + . . . . } + . . . . + . . . . /// Split up the given byte classes into equivalence classes in a way that + . . . . /// is consistent with this look-around assertion. + . . . . #[cfg(feature = "alloc")] + 980 ( 0.00%) . . . pub(crate) fn add_to_byteset( + . . . . &self, + . . . . look: Look, + . . . . set: &mut crate::util::alphabet::ByteClassSet, + . . . . ) { + 490 ( 0.00%) . . . match look { + . . . . Look::Start | Look::End => {} + . . . . Look::StartLF | Look::EndLF => { + . . . . set.set_range(self.lineterm.0, self.lineterm.0); + . . . . } + . . . . Look::StartCRLF | Look::EndCRLF => { + . . . . set.set_range(b'\r', b'\r'); + . . . . set.set_range(b'\n', b'\n'); + . . . . } +-- line 850 ---------------------------------------- +-- line 889 ---------------------------------------- + . . . . // Subtracting 1 from b2 is always OK because it is always + . . . . // at least 1 greater than b1, and the assert above + . . . . // guarantees that the asu8 conversion will succeed. + . . . . set.set_range(asu8(b1), asu8(b2.checked_sub(1).unwrap())); + . . . . b1 = b2; + . . . . } + . . . . } + . . . . } + 1,225 ( 0.00%) . . . } + . . . . + . . . . /// Returns true when [`Look::Start`] is satisfied `at` the given position + . . . . /// in `haystack`. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This may panic when `at > haystack.len()`. Note that `at == + . . . . /// haystack.len()` is legal and guaranteed not to panic. + . . . . #[inline] + . . . . pub fn is_start(&self, _haystack: &[u8], at: usize) -> bool { + 10 ( 0.00%) . . . at == 0 + . . . . } + . . . . + . . . . /// Returns true when [`Look::End`] is satisfied `at` the given position in + . . . . /// `haystack`. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This may panic when `at > haystack.len()`. Note that `at == +-- line 916 ---------------------------------------- + +22,160 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 209 ---------------------------------------- + . . . . /// assert_eq!(None, caps.get_group_by_name("lower")); + . . . . /// assert_eq!(Some(Span::from(0..3)), caps.get_group_by_name("upper")); + . . . . /// assert_eq!(Some(Span::from(3..6)), caps.get_group_by_name("digits")); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn all(group_info: GroupInfo) -> Captures { + . . . . let slots = group_info.slot_len(); + 417 ( 0.00%) . . . Captures { group_info, pid: None, slots: vec![None; slots] } + . . . . } + . . . . + . . . . /// Create new storage for only the full match spans of a pattern. This + . . . . /// does not include any capturing group offsets. + . . . . /// + . . . . /// It is unspecified behavior to use the returned `Captures` value in a + . . . . /// search with a `GroupInfo` other than the one that is provided to this + . . . . /// constructor. +-- line 225 ---------------------------------------- +-- line 362 ---------------------------------------- + . . . . /// // Recall that offsets are only available when using a non-empty + . . . . /// // Captures value. So even though a match occurred, this returns None! + . . . . /// assert_eq!(None, caps.get_match()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn pattern(&self) -> Option { + 65 ( 0.00%) . . . self.pid + . . . . } + . . . . + . . . . /// Returns the pattern ID and the span of the match, if one occurred. + . . . . /// + . . . . /// This always returns `None` when `Captures` was created with + . . . . /// [`Captures::empty`], even if a match was found. + . . . . /// + . . . . /// If this routine returns a non-`None` value, then `is_match` is +-- line 378 ---------------------------------------- +-- line 451 ---------------------------------------- + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn get_group(&self, index: usize) -> Option { + . . . . let pid = self.pattern()?; + . . . . // There's a little bit of work needed to map captures to slots in the + . . . . // fully general case. But in the overwhelming common case of a single + . . . . // pattern, we can just do some simple arithmetic. + 130 ( 0.00%) . . . let (slot_start, slot_end) = if self.group_info().pattern_len() == 1 { + . . . . (index.checked_mul(2)?, index.checked_mul(2)?.checked_add(1)?) + . . . . } else { + . . . . self.group_info().slots(pid, index)? + . . . . }; + 260 ( 0.00%) . . . let start = self.slots.get(slot_start).copied()??; + 65 ( 0.00%) . . . let end = self.slots.get(slot_end).copied()??; + 260 ( 0.00%) . . . Some(Span { start: start.get(), end: end.get() }) + . . . . } + . . . . + . . . . /// Returns the span of a capturing group match corresponding to the group + . . . . /// name given, only if both the overall pattern matched and the capturing + . . . . /// group participated in that match. + . . . . /// + . . . . /// This returns `None` if `name` does not correspond to a valid capturing + . . . . /// group for the pattern that matched. +-- line 474 ---------------------------------------- +-- line 499 ---------------------------------------- + . . . . /// assert_eq!(Some(Match::must(0, 0..17)), caps.get_match()); + . . . . /// assert_eq!(Some(Span::from(0..5)), caps.get_group_by_name("first")); + . . . . /// assert_eq!(Some(Span::from(6..17)), caps.get_group_by_name("last")); + . . . . /// // Looking for a non-existent capturing group will return None: + . . . . /// assert_eq!(None, caps.get_group_by_name("middle")); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 520 ( 0.00%) . . . pub fn get_group_by_name(&self, name: &str) -> Option { + 130 ( 0.00%) . . . let index = self.group_info().to_index(self.pattern()?, name)?; + . . . . self.get_group(index) + 585 ( 0.00%) . . . } + . . . . + . . . . /// Returns an iterator of possible spans for every capturing group in the + . . . . /// matching pattern. + . . . . /// + . . . . /// If this `Captures` value does not correspond to a match, then the + . . . . /// iterator returned yields no elements. + . . . . /// + . . . . /// Note that the iterator returned yields elements of type `Option`. +-- line 518 ---------------------------------------- +-- line 1127 ---------------------------------------- + . . . . /// Some(6), + . . . . /// Some(17), + . . . . /// ]); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn set_pattern(&mut self, pid: Option) { + 258 ( 0.00%) . . . self.pid = pid; + . . . . } + . . . . + . . . . /// Returns the underlying slots, where each slot stores a single offset. + . . . . /// + . . . . /// Every matching capturing group generally corresponds to two slots: one + . . . . /// slot for the starting position and another for the ending position. + . . . . /// Typically, either both are present or neither are. (The weasel word + . . . . /// "typically" is used here because it really depends on the regex engine +-- line 1143 ---------------------------------------- +-- line 1443 ---------------------------------------- + . . . . /// // you're guaranteed to not get the slots for a different pattern than the + . . . . /// // one requested. + . . . . /// assert_eq!(None, info.slots(PatternID::must(5), 0)); + . . . . /// assert_eq!(None, info.slots(PatternID::must(1), 1)); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[derive(Clone, Debug, Default)] + 139 ( 0.00%) . . . pub struct GroupInfo(Arc); + . . . . + . . . . impl GroupInfo { + . . . . /// Creates a new group info from a sequence of patterns, where each + . . . . /// sequence of patterns yields a sequence of possible group names. The + . . . . /// index of each pattern in the sequence corresponds to its `PatternID`, + . . . . /// and the index of each group in each pattern's sequence corresponds to + . . . . /// its corresponding group index. + . . . . /// +-- line 1459 ---------------------------------------- +-- line 1561 ---------------------------------------- + . . . . /// ]).is_ok()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . /// + . . . . /// There are other ways for building a `GroupInfo` to fail but are + . . . . /// difficult to show. For example, if the number of patterns given would + . . . . /// overflow `PatternID`. +1,400 ( 0.00%) . . . pub fn new(pattern_groups: P) -> Result + . . . . where + . . . . P: IntoIterator, + . . . . G: IntoIterator>, + . . . . N: AsRef, + . . . . { +1,400 ( 0.00%) . . . let mut group_info = GroupInfoInner { + . . . . slot_ranges: vec![], + . . . . name_to_index: vec![], + . . . . index_to_name: vec![], + . . . . memory_extra: 0, + . . . . }; + . . . . for (pattern_index, groups) in pattern_groups.into_iter().enumerate() { + . . . . // If we can't convert the pattern index to an ID, then the caller + . . . . // tried to build capture info for too many patterns. + . . . . let pid = PatternID::new(pattern_index) + . . . . .map_err(GroupInfoError::too_many_patterns)?; + . . . . + . . . . let mut groups_iter = groups.into_iter().enumerate(); + 81 ( 0.00%) . . . match groups_iter.next() { + . . . . None => return Err(GroupInfoError::missing_groups(pid)), + . . . . Some((_, Some(_))) => { + . . . . return Err(GroupInfoError::first_must_be_unnamed(pid)) + . . . . } + . . . . Some((_, None)) => {} + . . . . } + 162 ( 0.00%) . . . group_info.add_first_group(pid); +71,177 ( 0.02%) 294 ( 0.04%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::util::captures::GroupInfoInner::add_first_group (81x) + . . . . // Now iterate over the rest, which correspond to all of the + . . . . // (conventionally) explicit capture groups in a regex pattern. + . . . . for (group_index, maybe_name) in groups_iter { + . . . . // Just like for patterns, if the group index can't be + . . . . // converted to a "small" index, then the caller has given too + . . . . // many groups for a particular pattern. + . . . . let group = SmallIndex::new(group_index).map_err(|_| { + . . . . GroupInfoError::too_many_groups(pid, group_index) + . . . . })?; + . . . . group_info.add_explicit_group(pid, group, maybe_name)?; + . . . . } + . . . . } + 175 ( 0.00%) . . . group_info.fixup_slot_ranges()?; +3,882 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/captures.rs:regex_automata::util::captures::GroupInfoInner::fixup_slot_ranges (175x) +2,275 ( 0.00%) . . . Ok(GroupInfo(Arc::new(group_info))) +1,400 ( 0.00%) . . . } + . . . . + . . . . /// This creates an empty `GroupInfo`. + . . . . /// + . . . . /// This is a convenience routine for calling `GroupInfo::new` with an + . . . . /// iterator that yields no elements. + . . . . /// + . . . . /// # Example + . . . . /// +-- line 1618 ---------------------------------------- +-- line 1897 ---------------------------------------- + . . . . /// nfa.group_info().slot(PatternID::must(0), 0), + . . . . /// nfa.group_info().slot(PatternID::must(1), 0), + . . . . /// ); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn slot(&self, pid: PatternID, group_index: usize) -> Option { +3,096 ( 0.00%) . . . if group_index >= self.group_len(pid) { + . . . . return None; + . . . . } + . . . . // At this point, we know that 'pid' refers to a real pattern and that + . . . . // 'group_index' refers to a real group. We therefore also know that + . . . . // the pattern and group can be combined to return a correct slot. + . . . . // That's why we don't need to use checked arithmetic below. +6,192 ( 0.00%) . . . if group_index == 0 { + . . . . Some(pid.as_usize() * 2) + . . . . } else { + . . . . // As above, we don't need to check that our slot is less than the + . . . . // end of our range since we already know the group index is a + . . . . // valid index for the given pattern. + . . . . let (start, _) = self.0.slot_ranges[pid]; + . . . . Some(start.as_usize() + ((group_index - 1) * 2)) + . . . . } +-- line 1920 ---------------------------------------- +-- line 2092 ---------------------------------------- + . . . . /// assert_eq!(2, info.implicit_slot_len()); + . . . . /// // 2 explicit capturing groups gives us 2*2=4 explicit slots. + . . . . /// assert_eq!(4, info.explicit_slot_len()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn implicit_slot_len(&self) -> usize { + 152 ( 0.00%) . . . self.pattern_len() * 2 + . . . . } + . . . . + . . . . /// Returns the total number of slots for explicit capturing groups. + . . . . /// + . . . . /// This is like [`GroupInfo::slot_len`], except it doesn't include the + . . . . /// implicit slots for each pattern. (There are always 2 implicit slots for + . . . . /// each pattern.) + . . . . /// +-- line 2108 ---------------------------------------- +-- line 2184 ---------------------------------------- + . . . . /// This adds the first unnamed group for the given pattern ID. The given + . . . . /// pattern ID must be zero if this is the first time this method is + . . . . /// called, or must be exactly one more than the pattern ID supplied to the + . . . . /// previous call to this method. (This method panics if this rule is + . . . . /// violated.) + . . . . /// + . . . . /// This can be thought of as initializing the GroupInfo state for the + . . . . /// given pattern and closing off the state for any previous pattern. + 405 ( 0.00%) . . . fn add_first_group(&mut self, pid: PatternID) { + 324 ( 0.00%) . . . assert_eq!(pid.as_usize(), self.slot_ranges.len()); + 162 ( 0.00%) . . . assert_eq!(pid.as_usize(), self.name_to_index.len()); + 162 ( 0.00%) . . . assert_eq!(pid.as_usize(), self.index_to_name.len()); + . . . . // This is the start of our slots for the explicit capturing groups. + . . . . // Note that since the slots for the 0th group for every pattern appear + . . . . // before any slots for the nth group (where n > 0) in any pattern, we + . . . . // will have to fix up the slot ranges once we know how many patterns + . . . . // we've added capture groups for. + . . . . let slot_start = self.small_slot_len(); + . . . . self.slot_ranges.push((slot_start, slot_start)); + . . . . self.name_to_index.push(CaptureNameMap::new()); + 162 ( 0.00%) . . . self.index_to_name.push(vec![None]); + 81 ( 0.00%) . . . self.memory_extra += core::mem::size_of::>>(); + 405 ( 0.00%) . . . } + . . . . + . . . . /// Add an explicit capturing group for the given pattern with the given + . . . . /// index. If the group has a name, then that must be given as well. + . . . . /// + . . . . /// Note that every capturing group except for the first or zeroth group is + . . . . /// explicit. + . . . . /// + . . . . /// This returns an error if adding this group would result in overflowing +-- line 2214 ---------------------------------------- +-- line 2222 ---------------------------------------- + . . . . ) -> Result<(), GroupInfoError> { + . . . . // We also need to check that the slot index generated for + . . . . // this group is also valid. Although, this is a little weird + . . . . // because we offset these indices below, at which point, we'll + . . . . // have to recheck them. Gosh this is annoying. Note that + . . . . // the '+2' below is OK because 'end' is guaranteed to be less + . . . . // than isize::MAX. + . . . . let end = &mut self.slot_ranges[pid].1; +1,386 ( 0.00%) . . . *end = SmallIndex::new(end.as_usize() + 2).map_err(|_| { + . . . . GroupInfoError::too_many_groups(pid, group.as_usize()) + . . . . })?; + 693 ( 0.00%) . . . if let Some(name) = maybe_name { +2,344 ( 0.00%) . . . let name = Arc::::from(name.as_ref()); + . . . . if self.name_to_index[pid].contains_key(&*name) { + . . . . return Err(GroupInfoError::duplicate(pid, &name)); + . . . . } + . . . . let len = name.len(); + . . . . self.name_to_index[pid].insert(Arc::clone(&name), group); +1,172 ( 0.00%) . . . self.index_to_name[pid].push(Some(name)); + . . . . // Adds the memory used by the Arc in both maps. + 586 ( 0.00%) . . . self.memory_extra += + . . . . 2 * (len + core::mem::size_of::>>()); + . . . . // And also the value entry for the 'name_to_index' map. + . . . . // This is probably an underestimate for 'name_to_index' since + . . . . // hashmaps/btrees likely have some non-zero overhead, but we + . . . . // assume here that they have zero overhead. +1,758 ( 0.00%) . . . self.memory_extra += core::mem::size_of::(); + . . . . } else { + . . . . self.index_to_name[pid].push(None); + 214 ( 0.00%) . . . self.memory_extra += core::mem::size_of::>>(); + . . . . } + . . . . // This is a sanity assert that checks that our group index + . . . . // is in line with the number of groups added so far for this + . . . . // pattern. +2,079 ( 0.00%) . . . assert_eq!(group.one_more(), self.group_len(pid)); + . . . . // And is also in line with the 'index_to_name' map. +1,386 ( 0.00%) . . . assert_eq!(group.one_more(), self.index_to_name[pid].len()); + . . . . Ok(()) + . . . . } + . . . . + . . . . /// This corrects the slot ranges to account for the slots corresponding + . . . . /// to the zeroth group of each pattern. That is, every slot range is + . . . . /// offset by 'pattern_len() * 2', since each pattern uses two slots to + . . . . /// represent the zeroth group. + 175 ( 0.00%) . . . fn fixup_slot_ranges(&mut self) -> Result<(), GroupInfoError> { + . . . . use crate::util::primitives::IteratorIndexExt; + . . . . // Since we know number of patterns fits in PatternID and + . . . . // PatternID::MAX < isize::MAX, it follows that multiplying by 2 will + . . . . // never overflow usize. + . . . . let offset = self.pattern_len().checked_mul(2).unwrap(); + . . . . for (pid, &mut (ref mut start, ref mut end)) in + . . . . self.slot_ranges.iter_mut().with_pattern_ids() + . . . . { + . . . . let group_len = 1 + ((end.as_usize() - start.as_usize()) / 2); + 81 ( 0.00%) . . . let new_end = match end.as_usize().checked_add(offset) { + . . . . Some(new_end) => new_end, + . . . . None => { + . . . . return Err(GroupInfoError::too_many_groups( + . . . . pid, group_len, + . . . . )) + . . . . } + . . . . }; + 81 ( 0.00%) . . . *end = SmallIndex::new(new_end).map_err(|_| { + . . . . GroupInfoError::too_many_groups(pid, group_len) + . . . . })?; + . . . . // Since start <= end, if end is valid then start must be too. + 162 ( 0.00%) . . . *start = SmallIndex::new(start.as_usize() + offset).unwrap(); + . . . . } + 175 ( 0.00%) . . . Ok(()) + 525 ( 0.00%) . . . } + . . . . + . . . . /// Return the total number of patterns represented by this capture slot + . . . . /// info. + . . . . fn pattern_len(&self) -> usize { + . . . . self.slot_ranges.len() + . . . . } + . . . . + . . . . /// Return the total number of capturing groups for the given pattern. If + . . . . /// the given pattern isn't valid for this capture slot info, then 0 is + . . . . /// returned. + . . . . fn group_len(&self, pid: PatternID) -> usize { +8,271 ( 0.00%) . . . let (start, end) = match self.slot_ranges.get(pid.as_usize()) { + . . . . None => return 0, + . . . . Some(range) => range, + . . . . }; + . . . . // The difference between any two SmallIndex values always fits in a + . . . . // usize since we know that SmallIndex::MAX <= isize::MAX-1. We also + . . . . // know that start<=end by construction and that the number of groups + . . . . // never exceeds SmallIndex and thus never overflows usize. +5,175 ( 0.00%) . . . 1 + ((end.as_usize() - start.as_usize()) / 2) + . . . . } + . . . . + . . . . /// Return the total number of slots in this capture slot info as a + . . . . /// "small index." + . . . . fn small_slot_len(&self) -> SmallIndex { + . . . . // Since slots are allocated in order of pattern (starting at 0) and + . . . . // then in order of capture group, it follows that the number of slots + . . . . // is the end of the range of slots for the last pattern. This is + . . . . // true even when the last pattern has no capturing groups, since + . . . . // 'slot_ranges' will still represent it explicitly with an empty + . . . . // range. + 327 ( 0.00%) . . . self.slot_ranges.last().map_or(SmallIndex::ZERO, |&(_, end)| end) + . . . . } + . . . . } + . . . . + . . . . /// An error that may occur when building a `GroupInfo`. + . . . . /// + . . . . /// Building a `GroupInfo` does a variety of checks to make sure the + . . . . /// capturing groups satisfy a number of invariants. This includes, but is not + . . . . /// limited to, ensuring that the first capturing group is unnamed and that +-- line 2331 ---------------------------------------- + +3,275 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 339 ---------------------------------------- + . . . . } + . . . . + . . . . impl Builder { + . . . . /// Create a new one-pass DFA builder with the default configuration. + . . . . pub fn new() -> Builder { + . . . . Builder { + . . . . config: Config::default(), + . . . . #[cfg(feature = "syntax")] + 81 ( 0.00%) . . . thompson: thompson::Compiler::new(), +21,951 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (81x) + . . . . } + . . . . } + . . . . + . . . . /// Build a one-pass DFA from the given pattern. + . . . . /// + . . . . /// If there was a problem parsing or compiling the pattern, then an error + . . . . /// is returned. + . . . . #[cfg(feature = "syntax")] +-- line 355 ---------------------------------------- +-- line 387 ---------------------------------------- + . . . . /// .build(r"[a-z0-9]+")?; + . . . . /// let re = DFA::builder().build_from_nfa(nfa)?; + . . . . /// let (mut cache, mut caps) = (re.create_cache(), re.create_captures()); + . . . . /// re.captures(&mut cache, "foo123bar", &mut caps); + . . . . /// assert_eq!(Some(Match::must(0, 0..9)), caps.get_match()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 729 ( 0.00%) . . . pub fn build_from_nfa(&self, nfa: NFA) -> Result { + . . . . // Why take ownership if we're just going to pass a reference to the + . . . . // NFA to our internal builder? Well, the first thing to note is that + . . . . // an NFA uses reference counting internally, so either choice is going + . . . . // to be cheap. So there isn't much cost either way. + . . . . // + . . . . // The real reason is that a one-pass DFA, semantically, shares + . . . . // ownership of an NFA. This is unlike other DFAs that don't share + . . . . // ownership of an NFA at all, primarily because they want to be +-- line 403 ---------------------------------------- +-- line 405 ---------------------------------------- + . . . . // + . . . . // But then why pass a '&nfa' below if we want to share ownership? + . . . . // Well, it turns out that using a '&NFA' in our internal builder + . . . . // separates its lifetime from the DFA we're building, and this turns + . . . . // out to make code a bit more composable. e.g., We can iterate over + . . . . // things inside the NFA while borrowing the builder as mutable because + . . . . // we know the NFA cannot be mutated. So TL;DR --- this weirdness is + . . . . // "because borrow checker." + 243 ( 0.00%) . . . InternalBuilder::new(self.config.clone(), &nfa).build() + 729 ( 0.00%) . . . } + . . . . + . . . . /// Apply the given one-pass DFA configuration options to this builder. + . . . . pub fn configure(&mut self, config: Config) -> &mut Builder { + 405 ( 0.00%) . . . self.config = self.config.overwrite(config); + . . . . self + . . . . } + . . . . + . . . . /// Set the syntax configuration for this builder using + . . . . /// [`syntax::Config`](crate::util::syntax::Config). + . . . . /// + . . . . /// This permits setting things like case insensitivity, Unicode and multi + . . . . /// line mode. +-- line 426 ---------------------------------------- +-- line 517 ---------------------------------------- + . . . . /// + . . . . /// This is duplicated in dfa.classes. + . . . . classes: ByteClasses, + . . . . } + . . . . + . . . . impl<'a> InternalBuilder<'a> { + . . . . /// Create a new builder with an initial empty DFA. + . . . . fn new(config: Config, nfa: &'a NFA) -> InternalBuilder { + 81 ( 0.00%) . . . let classes = if !config.get_byte_classes() { + . . . . // A one-pass DFA will always use the equivalence class map, but + . . . . // enabling this option is useful for debugging. Namely, this will + . . . . // cause all transitions to be defined over their actual bytes + . . . . // instead of an opaque equivalence class identifier. The former is + . . . . // much easier to grok as a human. + . . . . ByteClasses::singletons() + . . . . } else { + . . . . nfa.byte_classes().clone() +-- line 533 ---------------------------------------- +-- line 555 ---------------------------------------- + . . . . min_match_id: StateID::MAX, + . . . . classes: classes.clone(), + . . . . alphabet_len, + . . . . stride2, + . . . . pateps_offset: alphabet_len, + . . . . // OK because PatternID::MAX*2 is guaranteed not to overflow. + . . . . explicit_slot_start: nfa.pattern_len().checked_mul(2).unwrap(), + . . . . }; + 5,022 ( 0.00%) . . . InternalBuilder { + . . . . dfa, + . . . . uncompiled_nfa_ids: vec![], + . . . . nfa_to_dfa_id: vec![DEAD; nfa.states().len()], + . . . . stack: vec![], + . . . . seen: SparseSet::new(nfa.states().len()), + . . . . matched: false, + . . . . config, + . . . . nfa, + 1,296 ( 0.00%) . . . classes, + . . . . } + . . . . } + . . . . + . . . . /// Build the DFA from the NFA given to this builder. If the NFA is not + . . . . /// one-pass, then return an error. An error may also be returned if a + . . . . /// particular limit is exceeded. (Some limits, like the total heap memory + . . . . /// used, are configurable. Others, like the total patterns or slots, are + . . . . /// hard-coded based on representational limitations.) +-- line 580 ---------------------------------------- +-- line 581 ---------------------------------------- + . . . . fn build(mut self) -> Result { + . . . . self.nfa.look_set_any().available().map_err(BuildError::word)?; + . . . . for look in self.nfa.look_set_any().iter() { + . . . . // This is a future incompatibility check where if we add any + . . . . // more look-around assertions, then the one-pass DFA either + . . . . // needs to reject them (what we do here) or it needs to have its + . . . . // Transition representation modified to be capable of storing the + . . . . // new assertions. + 244 ( 0.00%) . . . if look.as_repr() > Look::WordUnicodeNegate.as_repr() { + . . . . return Err(BuildError::unsupported_look(look)); + . . . . } + . . . . } + 162 ( 0.00%) . . . if self.nfa.pattern_len().as_u64() > PatternEpsilons::PATTERN_ID_LIMIT + . . . . { + . . . . return Err(BuildError::too_many_patterns( + . . . . PatternEpsilons::PATTERN_ID_LIMIT, + . . . . )); + . . . . } + 243 ( 0.00%) . . . if self.nfa.group_info().explicit_slot_len() > Slots::LIMIT { + . . . . return Err(BuildError::not_one_pass( + . . . . "too many explicit capturing groups (max is 16)", + . . . . )); + . . . . } + . . . . assert_eq!(DEAD, self.add_empty_state()?); + . . . . + . . . . // This is where the explicit slots start. We care about this because + . . . . // we only need to track explicit slots. The implicit slots---two for + . . . . // each pattern---are tracked as part of the search routine itself. + . . . . let explicit_slot_start = self.nfa.pattern_len() * 2; + 81 ( 0.00%) . . . self.add_start_state(None, self.nfa.start_anchored())?; + 81 ( 0.00%) . . . if self.config.get_starts_for_each_pattern() { + 162 ( 0.00%) . . . for pid in self.nfa.patterns() { + 648 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/nfa.rs:regex_automata::nfa::thompson::nfa::NFA::patterns (81x) + . . . . self.add_start_state( + . . . . Some(pid), + 324 ( 0.00%) . . . self.nfa.start_pattern(pid).unwrap(), + . . . . )?; + . . . . } + . . . . } + . . . . // NOTE: One wonders what the effects of treating 'uncompiled_nfa_ids' + . . . . // as a stack are. It is really an unordered *set* of NFA state IDs. + . . . . // If it, for example, in practice led to discovering whether a regex + . . . . // was or wasn't one-pass later than if we processed NFA state IDs in + . . . . // ascending order, then that would make this routine more costly in + . . . . // the somewhat common case of a regex that isn't one-pass. + . . . . while let Some(nfa_id) = self.uncompiled_nfa_ids.pop() { + 392 ( 0.00%) . . . let dfa_id = self.nfa_to_dfa_id[nfa_id]; + . . . . // Once we see a match, we keep going, but don't add any new + . . . . // transitions. Normally we'd just stop, but we have to keep + . . . . // going in order to verify that our regex is actually one-pass. + 392 ( 0.00%) . . . self.matched = false; + . . . . // The NFA states we've already explored for this DFA state. + . . . . self.seen.clear(); + . . . . // The NFA states to explore via epsilon transitions. If we ever + . . . . // try to push an NFA state that we've already seen, then the NFA + . . . . // is not one-pass because it implies there are multiple epsilon + . . . . // transition paths that lead to the same NFA state. In other + . . . . // words, there is ambiguity. + 784 ( 0.00%) . . . self.stack_push(nfa_id, Epsilons::empty())?; + . . . . while let Some((id, epsilons)) = self.stack.pop() { + 5,995 ( 0.00%) . . . match *self.nfa.state(id) { + . . . . thompson::State::ByteRange { ref trans } => { + 2,340 ( 0.00%) . . . self.compile_transition(dfa_id, trans, epsilons)?; +283,175 ( 0.08%) 254 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::compile_transition (390x) + . . . . } + . . . . thompson::State::Sparse(ref sparse) => { + 416 ( 0.00%) . . . for trans in sparse.transitions.iter() { + 7,427 ( 0.00%) . . . self.compile_transition(dfa_id, trans, epsilons)?; +772,342 ( 0.22%) 517 ( 0.06%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::compile_transition (1,061x) + . . . . } + . . . . } + . . . . thompson::State::Dense(ref dense) => { + . . . . for trans in dense.iter() { + . . . . self.compile_transition(dfa_id, &trans, epsilons)?; + . . . . } + . . . . } + 66 ( 0.00%) . . . thompson::State::Look { look, next } => { + . . . . let looks = epsilons.looks().insert(look); + 198 ( 0.00%) . . . self.stack_push(next, epsilons.set_looks(looks))?; + . . . . } + . . . . thompson::State::Union { ref alternates } => { + 1,720 ( 0.00%) . . . for &sid in alternates.iter().rev() { + 6,576 ( 0.00%) . . . self.stack_push(sid, epsilons)?; +165,717 ( 0.05%) 258 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push (1,644x) + . . . . } + . . . . } + 224 ( 0.00%) . . . thompson::State::BinaryUnion { alt1, alt2 } => { + 560 ( 0.00%) . . . self.stack_push(alt2, epsilons)?; + 6,023 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::stack_push (112x) + 560 ( 0.00%) . . . self.stack_push(alt1, epsilons)?; + . . . . } + 346 ( 0.00%) . . . thompson::State::Capture { next, slot, .. } => { + . . . . let slot = slot.as_usize(); + 692 ( 0.00%) . . . let epsilons = if slot < explicit_slot_start { + . . . . // If this is an implicit slot, we don't care + . . . . // about it, since we handle implicit slots in + . . . . // the search routine. We can get away with that + . . . . // because there are 2 implicit slots for every + . . . . // pattern. + . . . . epsilons + . . . . } else { + . . . . // Offset our explicit slots so that they start +-- line 677 ---------------------------------------- +-- line 679 ---------------------------------------- + . . . . let offset = slot - explicit_slot_start; + . . . . epsilons.set_slots(epsilons.slots().insert(offset)) + . . . . }; + . . . . self.stack_push(next, epsilons)?; + . . . . } + . . . . thompson::State::Fail => { + . . . . continue; + . . . . } + 1 ( 0.00%) . . . thompson::State::Match { pattern_id } => { + . . . . // If we found two different paths to a match state + . . . . // for the same DFA state, then we have ambiguity. + . . . . // Thus, it's not one-pass. + 2 ( 0.00%) . . . if self.matched { + . . . . return Err(BuildError::not_one_pass( + . . . . "multiple epsilon transitions to match state", + . . . . )); + . . . . } + 1 ( 0.00%) . . . self.matched = true; + . . . . // Shove the matching pattern ID and the 'epsilons' + . . . . // into the current DFA state's pattern epsilons. The + . . . . // 'epsilons' includes the slots we need to capture + . . . . // before reporting the match and also the conditional + . . . . // epsilon transitions we need to check before we can + . . . . // report a match. + . . . . self.dfa.set_pattern_epsilons( + . . . . dfa_id, +-- line 704 ---------------------------------------- +-- line 717 ---------------------------------------- + . . . . // continue on. When we go to compile a new DFA state, + . . . . // we just skip that part. But otherwise check that the + . . . . // one-pass property is upheld. + . . . . } + . . . . } + . . . . } + . . . . } + . . . . self.shuffle_states(); + 5 ( 0.00%) . . . Ok(self.dfa) + 65 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (1x) + . . . . } + . . . . + . . . . /// Shuffle all match states to the end of the transition table and set + . . . . /// 'min_match_id' to the ID of the first such match state. + . . . . /// + . . . . /// The point of this is to make it extremely cheap to determine whether + . . . . /// a state is a match state or not. We need to check on this on every + . . . . /// transition during a search, so it being cheap is important. This + . . . . /// permits us to check it by simply comparing two state identifiers, as + . . . . /// opposed to looking for the pattern ID in the state's `PatternEpsilons`. + . . . . /// (Which requires a memory load and some light arithmetic.) + . . . . fn shuffle_states(&mut self) { + 2 ( 0.00%) . . . let mut remapper = Remapper::new(&self.dfa); + 184 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::new (1x) + 2 ( 0.00%) . . . let mut next_dest = self.dfa.last_state_id(); + . . . . for i in (0..self.dfa.state_len()).rev() { + . . . . let id = StateID::must(i); + . . . . let is_match = + . . . . self.dfa.pattern_epsilons(id).pattern_id().is_some(); + . . . . if !is_match { + . . . . continue; + . . . . } + 6 ( 0.00%) . . . remapper.swap(&mut self.dfa, next_dest, id); + 1,956 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::swap (1x) + 1 ( 0.00%) . . . self.dfa.min_match_id = next_dest; + . . . . next_dest = self.dfa.prev_state_id(next_dest).expect( + . . . . "match states should be a proper subset of all states", + . . . . ); + . . . . } + 7 ( 0.00%) . . . remapper.remap(&mut self.dfa); +103,863 ( 0.03%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/remapper.rs:regex_automata::dfa::remapper::Remapper::remap (1x) + . . . . } + . . . . + . . . . /// Compile the given NFA transition into the DFA state given. + . . . . /// + . . . . /// 'Epsilons' corresponds to any conditional epsilon transitions that need + . . . . /// to be satisfied to follow this transition, and any slots that need to + . . . . /// be saved if the transition is followed. + . . . . /// + . . . . /// If this transition indicates that the NFA is not one-pass, then + . . . . /// this returns an error. (This occurs, for example, if the DFA state + . . . . /// already has a transition defined for the same input symbols as the + . . . . /// given transition, *and* the result of the old and new transitions is + . . . . /// different.) +17,412 ( 0.01%) . . . fn compile_transition( + . . . . &mut self, + . . . . dfa_id: StateID, + . . . . trans: &thompson::Transition, + . . . . epsilons: Epsilons, + . . . . ) -> Result<(), BuildError> { + 2,902 ( 0.00%) . . . let next_dfa_id = self.add_dfa_state_for_nfa_state(trans.next)?; +941,687 ( 0.27%) 771 ( 0.10%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (1,451x) + . . . . for byte in self + . . . . .classes + 1,451 ( 0.00%) . . . .representatives(trans.start..=trans.end) + . . . . .filter_map(|r| r.as_u8()) + . . . . { + . . . . let oldtrans = self.dfa.transition(dfa_id, byte); + . . . . let newtrans = + 1,851 ( 0.00%) . . . Transition::new(self.matched, next_dfa_id, epsilons); + . . . . // If the old transition points to the DEAD state, then we know + . . . . // 'byte' has not been mapped to any transition for this DFA state + . . . . // yet. So set it unconditionally. Otherwise, we require that the + . . . . // old and new transitions are equivalent. Otherwise, there is + . . . . // ambiguity and thus the regex is not one-pass. + 1,851 ( 0.00%) . . . if oldtrans.state_id() == DEAD { + . . . . self.dfa.set_transition(dfa_id, byte, newtrans); + 80 ( 0.00%) . . . } else if oldtrans != newtrans { + 400 ( 0.00%) . . . return Err(BuildError::not_one_pass( + . . . . "conflicting transition", + . . . . )); + . . . . } + . . . . } + 1,371 ( 0.00%) . . . Ok(()) +10,157 ( 0.00%) . . . } + . . . . + . . . . /// Add a start state to the DFA corresponding to the given NFA starting + . . . . /// state ID. + . . . . /// + . . . . /// If adding a state would blow any limits (configured or hard-coded), + . . . . /// then an error is returned. + . . . . /// + . . . . /// If the starting state is an anchored state for a particular pattern, +-- line 804 ---------------------------------------- +-- line 809 ---------------------------------------- + . . . . fn add_start_state( + . . . . &mut self, + . . . . pid: Option, + . . . . nfa_id: StateID, + . . . . ) -> Result { + . . . . match pid { + . . . . // With no pid, this should be the start state for all patterns + . . . . // and thus be the first one. + 81 ( 0.00%) . . . None => assert!(self.dfa.starts.is_empty()), + . . . . // With a pid, we want it to be at self.dfa.starts[pid+1]. + 162 ( 0.00%) . . . Some(pid) => assert!(self.dfa.starts.len() == pid.one_more()), + . . . . } + 324 ( 0.00%) . . . let dfa_id = self.add_dfa_state_for_nfa_state(nfa_id)?; +249,472 ( 0.07%) 240 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/dfa/onepass.rs:regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (162x) + . . . . self.dfa.starts.push(dfa_id); + . . . . Ok(dfa_id) + . . . . } + . . . . + . . . . /// Add a new DFA state corresponding to the given NFA state. If adding a + . . . . /// state would blow any limits (configured or hard-coded), then an error + . . . . /// is returned. If a DFA state already exists for the given NFA state, + . . . . /// then that DFA state's ID is returned and no new states are added. + . . . . /// + . . . . /// It is not expected that this routine is called for every NFA state. + . . . . /// Instead, an NFA state ID will usually correspond to the "start" state + . . . . /// for a sub-graph of the NFA, where all states in the sub-graph are + . . . . /// reachable via epsilon transitions (conditional or unconditional). That + . . . . /// sub-graph of NFA states is ultimately what produces a single DFA state. +12,904 ( 0.00%) . . . fn add_dfa_state_for_nfa_state( + . . . . &mut self, + . . . . nfa_id: StateID, + . . . . ) -> Result { + . . . . // If we've already built a DFA state for the given NFA state, then + . . . . // just return that. We definitely do not want to have more than one + . . . . // DFA state in existence for the same NFA state, since all but one of + . . . . // them will likely become unreachable. And at least some of them are + . . . . // likely to wind up being incomplete. + 1,613 ( 0.00%) . . . let existing_dfa_id = self.nfa_to_dfa_id[nfa_id]; + 1,613 ( 0.00%) . . . if existing_dfa_id != DEAD { + 547 ( 0.00%) . . . return Ok(existing_dfa_id); + . . . . } + . . . . // If we don't have any DFA state yet, add it and then add the given + . . . . // NFA state to the list of states to explore. + . . . . let dfa_id = self.add_empty_state()?; + 1,066 ( 0.00%) . . . self.nfa_to_dfa_id[nfa_id] = dfa_id; + 154 ( 0.00%) . . . self.uncompiled_nfa_ids.push(nfa_id); + 2,132 ( 0.00%) . . . Ok(dfa_id) +12,904 ( 0.00%) . . . } + . . . . + . . . . /// Unconditionally add a new empty DFA state. If adding it would exceed + . . . . /// any limits (configured or hard-coded), then an error is returned. The + . . . . /// ID of the new state is returned on success. + . . . . /// + . . . . /// The added state is *not* a match state. + . . . . fn add_empty_state(&mut self) -> Result { + . . . . let state_limit = Transition::STATE_ID_LIMIT; +-- line 863 ---------------------------------------- +-- line 864 ---------------------------------------- + . . . . // Note that unlike dense and lazy DFAs, we specifically do NOT + . . . . // premultiply our state IDs here. The reason is that we want to pack + . . . . // our state IDs into 64-bit transitions with other info, so the fewer + . . . . // the bits we use for state IDs the better. If we premultiply, then + . . . . // our state ID space shrinks. We justify this by the assumption that + . . . . // a one-pass DFA is just already doing a fair bit more work than a + . . . . // normal DFA anyway, so an extra multiplication to compute a state + . . . . // transition doesn't seem like a huge deal. + 4,264 ( 0.00%) . . . let next_id = self.dfa.table.len() >> self.dfa.stride2(); + . . . . let id = StateID::new(next_id) + . . . . .map_err(|_| BuildError::too_many_states(state_limit))?; + 2,132 ( 0.00%) . . . if id.as_u64() > Transition::STATE_ID_LIMIT { + . . . . return Err(BuildError::too_many_states(state_limit)); + . . . . } + . . . . self.dfa + . . . . .table + . . . . .extend(core::iter::repeat(Transition(0)).take(self.dfa.stride())); + . . . . // The default empty value for 'PatternEpsilons' is sadly not all + . . . . // zeroes. Instead, a special sentinel is used to indicate that there + . . . . // is no pattern. So we need to explicitly set the pattern epsilons to + . . . . // the correct "empty" PatternEpsilons. + . . . . self.dfa.set_pattern_epsilons(id, PatternEpsilons::empty()); + 2,294 ( 0.00%) . . . if let Some(size_limit) = self.config.get_size_limit() { + 2,294 ( 0.00%) . . . if self.dfa.memory_usage() > size_limit { + . . . . return Err(BuildError::exceeded_size_limit(size_limit)); + . . . . } + . . . . } + . . . . Ok(id) + . . . . } + . . . . + . . . . /// Push the given NFA state ID and its corresponding epsilons (slots and + . . . . /// conditional epsilon transitions) on to a stack for use in a depth first + . . . . /// traversal of a sub-graph of the NFA. + . . . . /// + . . . . /// If the given NFA state ID has already been pushed on to the stack, then + . . . . /// it indicates the regex is not one-pass and this correspondingly returns + . . . . /// an error. +18,704 ( 0.01%) . . . fn stack_push( + . . . . &mut self, + . . . . nfa_id: StateID, + . . . . epsilons: Epsilons, + . . . . ) -> Result<(), BuildError> { + . . . . // If we already have seen a match and we are compiling a leftmost + . . . . // first DFA, then we shouldn't add any more states to look at. This is + . . . . // effectively how preference order and non-greediness is implemented. + . . . . // if !self.config.get_match_kind().continue_past_first_match() + . . . . // && self.matched + . . . . // { + . . . . // return Ok(()); + . . . . // } + 2,672 ( 0.00%) . . . if !self.seen.insert(nfa_id) { + . . . . return Err(BuildError::not_one_pass( + . . . . "multiple epsilon transitions to same state", + . . . . )); + . . . . } + 211 ( 0.00%) . . . self.stack.push((nfa_id, epsilons)); + 2,672 ( 0.00%) . . . Ok(()) +16,032 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A one-pass DFA for executing a subset of anchored regex searches while + . . . . /// resolving capturing groups. + . . . . /// + . . . . /// A one-pass DFA can be built from an NFA that is one-pass. An NFA is + . . . . /// one-pass when there is never any ambiguity about how to continue a search. + . . . . /// For example, `a*a` is not one-pass becuase during a search, it's not +-- line 929 ---------------------------------------- +-- line 1438 ---------------------------------------- + . . . . + . . . . /// Returns the total number of states in this one-pass DFA. + . . . . /// + . . . . /// Note that unlike dense or sparse DFAs, a one-pass DFA does not expose + . . . . /// a low level DFA API. Therefore, this routine has little use other than + . . . . /// being informational. + . . . . #[inline] + . . . . pub fn state_len(&self) -> usize { + 6 ( 0.00%) . . . self.table.len() >> self.stride2() + . . . . } + . . . . + . . . . /// Returns the total number of elements in the alphabet for this DFA. + . . . . /// + . . . . /// That is, this returns the total number of transitions that each + . . . . /// state in this DFA must have. The maximum alphabet size is 256, which + . . . . /// corresponds to each possible byte value. + . . . . /// +-- line 1454 ---------------------------------------- +-- line 1499 ---------------------------------------- + . . . . /// than `8`. (Do note that a maximal stride is incredibly rare, as it + . . . . /// would imply that there is almost no redundant in the regex pattern.) + . . . . /// + . . . . /// Note that unlike dense or sparse DFAs, a one-pass DFA does not expose + . . . . /// a low level DFA API. Therefore, this routine has little use other than + . . . . /// being informational. + . . . . #[inline] + . . . . pub fn stride2(&self) -> usize { + 3,214 ( 0.00%) . . . self.stride2 + . . . . } + . . . . + . . . . /// Returns the total stride for every state in this DFA. This corresponds + . . . . /// to the total number of transitions used by each state in this DFA's + . . . . /// transition table. + . . . . /// + . . . . /// Please see [`DFA::stride2`] for more information. In particular, this + . . . . /// returns the stride as the number of transitions, where as `stride2` + . . . . /// returns it as the exponent of a power of 2. + . . . . /// + . . . . /// Note that unlike dense or sparse DFAs, a one-pass DFA does not expose + . . . . /// a low level DFA API. Therefore, this routine has little use other than + . . . . /// being informational. + . . . . #[inline] + . . . . pub fn stride(&self) -> usize { + 2,294 ( 0.00%) . . . 1 << self.stride2() + . . . . } + . . . . + . . . . /// Returns the memory usage, in bytes, of this DFA. + . . . . /// + . . . . /// The memory usage is computed based on the number of bytes used to + . . . . /// represent this DFA. + . . . . /// + . . . . /// This does **not** include the stack size used up by this DFA. To + . . . . /// compute that, use `std::mem::size_of::()`. + . . . . #[inline] + . . . . pub fn memory_usage(&self) -> usize { + . . . . use core::mem::size_of; + . . . . + 2,294 ( 0.00%) . . . self.table.len() * size_of::() + . . . . + self.starts.len() * size_of::() + . . . . } + . . . . } + . . . . + . . . . impl DFA { + . . . . /// Executes an anchored leftmost forward search, and returns true if and + . . . . /// only if this one-pass DFA matches the given haystack. + . . . . /// +-- line 1545 ---------------------------------------- +-- line 1963 ---------------------------------------- + . . . . /// let slot_start = pid.unwrap().as_usize() * 2; + . . . . /// let slot_end = slot_start + 1; + . . . . /// assert_eq!(Some(0), slots[slot_start].map(|s| s.get())); + . . . . /// assert_eq!(Some(3), slots[slot_end].map(|s| s.get())); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + 13 ( 0.00%) . . . pub fn try_search_slots( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . slots: &mut [Option], + . . . . ) -> Result, MatchError> { + 1 ( 0.00%) . . . let utf8empty = self.get_nfa().has_empty() && self.get_nfa().is_utf8(); + . . . . if !utf8empty { + . . . . return self.try_search_slots_imp(cache, input, slots); + . . . . } + . . . . // See PikeVM::try_search_slots for why we do this. + . . . . let min = self.get_nfa().group_info().implicit_slot_len(); + . . . . if slots.len() >= min { + . . . . return self.try_search_slots_imp(cache, input, slots); + . . . . } +-- line 1985 ---------------------------------------- +-- line 1995 ---------------------------------------- + . . . . let got = self.try_search_slots_imp(cache, input, &mut enough)?; + . . . . // This is OK because we know `enough_slots` is strictly bigger than + . . . . // `slots`, otherwise this special case isn't reached. + . . . . slots.copy_from_slice(&enough[..slots.len()]); + . . . . Ok(got) + . . . . } + . . . . + . . . . #[inline(never)] + 11 ( 0.00%) . . . fn try_search_slots_imp( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . slots: &mut [Option], + . . . . ) -> Result, MatchError> { + 1 ( 0.00%) . . . let utf8empty = self.get_nfa().has_empty() && self.get_nfa().is_utf8(); + 1 ( 0.00%) . . . match self.search_imp(cache, input, slots)? { + . . . . None => return Ok(None), + . . . . Some(pid) if !utf8empty => return Ok(Some(pid)), + . . . . Some(pid) => { + . . . . // These slot indices are always correct because we know our + . . . . // 'pid' is valid and thus we know that the slot indices for it + . . . . // are valid. + . . . . let slot_start = pid.as_usize().wrapping_mul(2); + . . . . let slot_end = slot_start.wrapping_add(1); +-- line 2018 ---------------------------------------- +-- line 2028 ---------------------------------------- + . . . . // searches, we don't try to skip ahead to find the next match. + . . . . // We can just quit with nothing. + . . . . if start == end && !input.is_char_boundary(start) { + . . . . return Ok(None); + . . . . } + . . . . Ok(Some(pid)) + . . . . } + . . . . } + 9 ( 0.00%) . . . } + . . . . } + . . . . + . . . . impl DFA { + . . . . fn search_imp( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . slots: &mut [Option], +-- line 2044 ---------------------------------------- +-- line 2075 ---------------------------------------- + . . . . // case, maybe an extra function call is OK, but even then, it might be + . . . . // too much of a latency hit. Another idea is to just try and figure + . . . . // out how to reduce the code size of 'find_match'. RE2 has a trick + . . . . // here where the match handling isn't done if we know the next byte of + . . . . // input yields a match too. Maybe we adopt that? + . . . . // + . . . . // This just might be a tricky DFA to optimize. + . . . . + 1 ( 0.00%) . . . if input.is_done() { + . . . . return Ok(None); + . . . . } + . . . . // We unfortunately have a bit of book-keeping to do to set things + . . . . // up. We do have to setup our cache and clear all of our slots. In + . . . . // particular, clearing the slots is necessary for the case where we + . . . . // report a match, but one of the capturing groups didn't participate + . . . . // in the match but had a span set from a previous search. That would + . . . . // be bad. In theory, we could avoid all this slot clearing if we knew + . . . . // that every slot was always activated for every match. Then we would + . . . . // know they would always be overwritten when a match is found. + . . . . let explicit_slots_len = core::cmp::min( + . . . . Slots::LIMIT, + 1 ( 0.00%) . . . slots.len().saturating_sub(self.explicit_slot_start), + . . . . ); + . . . . cache.setup_search(explicit_slots_len); + . . . . for slot in cache.explicit_slots() { + 5 ( 0.00%) . . . *slot = None; + 19 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms (1x) + . . . . } + . . . . for slot in slots.iter_mut() { + 5 ( 0.00%) . . . *slot = None; + 19 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms (1x) + . . . . } + . . . . // We set the starting slots for every pattern up front. This does + . . . . // increase our latency somewhat, but it avoids having to do it every + . . . . // time we see a match state (which could be many times in a single + . . . . // search if the match state consumes input). + . . . . for pid in self.nfa.patterns() { + 2 ( 0.00%) . . . let i = pid.as_usize() * 2; + 2 ( 0.00%) . . . if i >= slots.len() { + . . . . break; + . . . . } + 1 ( 0.00%) . . . slots[i] = NonMaxUsize::new(input.start()); + . . . . } + . . . . let mut pid = None; + 1 ( 0.00%) . . . let mut next_sid = match input.get_anchored() { + . . . . Anchored::Yes => self.start(), + . . . . Anchored::Pattern(pid) => self.start_pattern(pid)?, + . . . . Anchored::No => { + . . . . // If the regex is itself always anchored, then we're fine, + . . . . // even if the search is configured to be unanchored. + 1 ( 0.00%) . . . if !self.nfa.is_always_start_anchored() { + . . . . return Err(MatchError::unsupported_anchored( + . . . . Anchored::No, + . . . . )); + . . . . } + . . . . self.start() + . . . . } + . . . . }; + . . . . let leftmost_first = + . . . . matches!(self.config.get_match_kind(), MatchKind::LeftmostFirst); + . . . . for at in input.start()..input.end() { + . . . . let sid = next_sid; + 6 ( 0.00%) . . . let trans = self.transition(sid, input.haystack()[at]); + . . . . next_sid = trans.state_id(); + . . . . let epsilons = trans.epsilons(); + . . . . if sid >= self.min_match_id { + . . . . if self.find_match(cache, input, at, sid, slots, &mut pid) { + . . . . if input.get_earliest() + . . . . || (leftmost_first && trans.match_wins()) + . . . . { + . . . . return Ok(pid); + . . . . } + . . . . } + . . . . } + 2 ( 0.00%) . . . if sid == DEAD + 1 ( 0.00%) . . . || (!epsilons.looks().is_empty() + . . . . && !self.nfa.look_matcher().matches_set_inline( + . . . . epsilons.looks(), + . . . . input.haystack(), + . . . . at, + . . . . )) + . . . . { + . . . . return Ok(pid); + . . . . } +-- line 2156 ---------------------------------------- +-- line 2250 ---------------------------------------- + . . . . Ok(self.starts.get(pid.one_more()).copied().unwrap_or(DEAD)) + . . . . } + . . . . + . . . . /// Returns the transition from the given state ID and byte of input. The + . . . . /// transition includes the next state ID, the slots that should be saved + . . . . /// and any conditional epsilon transitions that must be satisfied in order + . . . . /// to take this transition. + . . . . fn transition(&self, sid: StateID, byte: u8) -> Transition { + 3,704 ( 0.00%) . . . let offset = sid.as_usize() << self.stride2(); + . . . . let class = self.classes.get(byte).as_usize(); + 7,408 ( 0.00%) . . . self.table[offset + class] + . . . . } + . . . . + . . . . /// Set the transition from the given state ID and byte of input to the + . . . . /// transition given. + . . . . fn set_transition(&mut self, sid: StateID, byte: u8, to: Transition) { + . . . . let offset = sid.as_usize() << self.stride2(); + . . . . let class = self.classes.get(byte).as_usize(); + 3,542 ( 0.00%) . . . self.table[offset + class] = to; + . . . . } + . . . . + . . . . /// Return an iterator of "sparse" transitions for the given state ID. + . . . . /// "sparse" in this context means that consecutive transitions that are + . . . . /// equivalent are returned as one group, and transitions to the DEAD state + . . . . /// are ignored. + . . . . /// + . . . . /// This winds up being useful for debug printing, since it's much terser +-- line 2276 ---------------------------------------- +-- line 2286 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . /// Return the pattern epsilons for the given state ID. + . . . . /// + . . . . /// If the given state ID does not correspond to a match state ID, then the + . . . . /// pattern epsilons returned is empty. + . . . . fn pattern_epsilons(&self, sid: StateID) -> PatternEpsilons { + 74 ( 0.00%) . . . let offset = sid.as_usize() << self.stride2(); + 74 ( 0.00%) . . . PatternEpsilons(self.table[offset + self.pateps_offset].0) + . . . . } + . . . . + . . . . /// Set the pattern epsilons for the given state ID. + . . . . fn set_pattern_epsilons(&mut self, sid: StateID, pateps: PatternEpsilons) { + 4,069 ( 0.00%) . . . let offset = sid.as_usize() << self.stride2(); + 2,380 ( 0.00%) . . . self.table[offset + self.pateps_offset] = Transition(pateps.0); + . . . . } + . . . . + . . . . /// Returns the state ID prior to the one given. This returns None if the + . . . . /// given ID is the first DFA state. + . . . . fn prev_state_id(&self, id: StateID) -> Option { + . . . . if id == DEAD { + . . . . None + . . . . } else { +-- line 2309 ---------------------------------------- +-- line 2317 ---------------------------------------- + . . . . /// "last" in this context means the last state to appear in memory, i.e., + . . . . /// the one with the greatest ID. + . . . . fn last_state_id(&self) -> StateID { + . . . . // CORRECTNESS: A DFA table is always non-empty since it always at + . . . . // least contains a DEAD state. Since every state has the same stride, + . . . . // we can just compute what the "next" state ID would have been and + . . . . // then subtract 1 from it. + . . . . StateID::new_unchecked( + 1 ( 0.00%) . . . (self.table.len() >> self.stride2()).checked_sub(1).unwrap(), + . . . . ) + . . . . } + . . . . + . . . . /// Move the transitions from 'id1' to 'id2' and vice versa. + . . . . /// + . . . . /// WARNING: This does not update the rest of the transition table to have + . . . . /// transitions to 'id1' changed to 'id2' and vice versa. This merely moves + . . . . /// the states in memory. + . . . . pub(super) fn swap_states(&mut self, id1: StateID, id2: StateID) { + 3 ( 0.00%) . . . let o1 = id1.as_usize() << self.stride2(); + 3 ( 0.00%) . . . let o2 = id2.as_usize() << self.stride2(); + . . . . for b in 0..self.stride() { + . . . . self.table.swap(o1 + b, o2 + b); + . . . . } + . . . . } + . . . . + . . . . /// Map all state IDs in this DFA (transition table + start states) + . . . . /// according to the closure given. + . . . . pub(super) fn remap(&mut self, map: impl Fn(StateID) -> StateID) { + . . . . for i in 0..self.state_len() { + 148 ( 0.00%) . . . let offset = i << self.stride2(); + . . . . for b in 0..self.alphabet_len() { + . . . . let next = self.table[offset + b].state_id(); + . . . . self.table[offset + b].set_state_id(map(next)); + . . . . } + . . . . } + . . . . for i in 0..self.starts.len() { + 4 ( 0.00%) . . . self.starts[i] = map(self.starts[i]); + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for DFA { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . fn debug_state_transitions( + . . . . f: &mut core::fmt::Formatter, +-- line 2361 ---------------------------------------- +-- line 2506 ---------------------------------------- + . . . . /// + . . . . /// A potentially more convenient routine to create a cache is + . . . . /// [`DFA::create_cache`], as it does not require also importing the + . . . . /// `Cache` type. + . . . . /// + . . . . /// If you want to reuse the returned `Cache` with some other one-pass DFA, + . . . . /// then you must call [`Cache::reset`] with the desired one-pass DFA. + . . . . pub fn new(re: &DFA) -> Cache { + 3 ( 0.00%) . . . let mut cache = Cache { explicit_slots: vec![], explicit_slot_len: 0 }; + . . . . cache.reset(re); + . . . . cache + . . . . } + . . . . + . . . . /// Reset this cache such that it can be used for searching with a + . . . . /// different [`onepass::DFA`](DFA). + . . . . /// + . . . . /// A cache reset permits reusing memory already allocated in this cache +-- line 2522 ---------------------------------------- +-- line 2552 ---------------------------------------- + . . . . /// assert_eq!( + . . . . /// Some(Match::must(0, 0..3)), + . . . . /// { re2.captures(&mut cache, "☃", &mut caps2); caps2.get_match() }, + . . . . /// ); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn reset(&mut self, re: &DFA) { + 1 ( 0.00%) . . . let explicit_slot_len = re.get_nfa().group_info().explicit_slot_len(); + . . . . self.explicit_slots.resize(explicit_slot_len, None); + 1 ( 0.00%) . . . self.explicit_slot_len = explicit_slot_len; + . . . . } + . . . . + . . . . /// Returns the heap memory usage, in bytes, of this cache. + . . . . /// + . . . . /// This does **not** include the stack size used up by this cache. To + . . . . /// compute that, use `std::mem::size_of::()`. + . . . . pub fn memory_usage(&self) -> usize { + . . . . self.explicit_slots.len() * core::mem::size_of::>() + . . . . } + . . . . + . . . . fn explicit_slots(&mut self) -> &mut [Option] { + 2 ( 0.00%) . . . &mut self.explicit_slots[..self.explicit_slot_len] + . . . . } + . . . . + . . . . fn setup_search(&mut self, explicit_slot_len: usize) { + 1 ( 0.00%) . . . self.explicit_slot_len = explicit_slot_len; + . . . . } + . . . . } + . . . . + . . . . /// Represents a single transition in a one-pass DFA. + . . . . /// + . . . . /// The high 21 bits corresponds to the state ID. The bit following corresponds + . . . . /// to the special "match wins" flag. The remaining low 42 bits corresponds to + . . . . /// the transition epsilons, which contains the slots that should be saved when + . . . . /// this transition is followed and the conditional epsilon transitions that + . . . . /// must be satisfied in order to follow this transition. + . . . . #[derive(Clone, Copy, Eq, PartialEq)] + 80 ( 0.00%) . . . struct Transition(u64); + . . . . + . . . . impl Transition { + . . . . const STATE_ID_BITS: u64 = 21; + . . . . const STATE_ID_SHIFT: u64 = 64 - Transition::STATE_ID_BITS; + . . . . const STATE_ID_LIMIT: u64 = 1 << Transition::STATE_ID_BITS; + . . . . const MATCH_WINS_SHIFT: u64 = 64 - (Transition::STATE_ID_BITS + 1); + . . . . const INFO_MASK: u64 = 0x000003FF_FFFFFFFF; + . . . . + . . . . /// Return a new transition to the given state ID with the given epsilons. + . . . . fn new(match_wins: bool, sid: StateID, epsilons: Epsilons) -> Transition { + . . . . let match_wins = + 1,851 ( 0.00%) . . . if match_wins { 1 << Transition::MATCH_WINS_SHIFT } else { 0 }; + 5,994 ( 0.00%) . . . let sid = sid.as_u64() << Transition::STATE_ID_SHIFT; +13,839 ( 0.00%) . . . Transition(sid | match_wins | epsilons.0) + . . . . } + . . . . + . . . . /// Returns true if and only if this transition points to the DEAD state. + . . . . fn is_dead(self) -> bool { + . . . . self.state_id() == DEAD + . . . . } + . . . . + . . . . /// Return whether this transition has a "match wins" property. +-- line 2612 ---------------------------------------- +-- line 2623 ---------------------------------------- + . . . . + . . . . /// Return the "next" state ID that this transition points to. + . . . . fn state_id(&self) -> StateID { + . . . . // OK because a Transition has a valid StateID in its upper bits by + . . . . // construction. The cast to usize is also correct, even on 16-bit + . . . . // targets because, again, we know the upper bits is a valid StateID, + . . . . // which can never overflow usize on any supported target. + . . . . StateID::new_unchecked( +17,982 ( 0.01%) . . . (self.0 >> Transition::STATE_ID_SHIFT).as_usize(), + . . . . ) + . . . . } + . . . . + . . . . /// Set the "next" state ID in this transition. + . . . . fn set_state_id(&mut self, sid: StateID) { + 5,994 ( 0.00%) . . . *self = Transition::new(self.match_wins(), sid, self.epsilons()); + . . . . } + . . . . + . . . . /// Return the epsilons embedded in this transition. + . . . . fn epsilons(&self) -> Epsilons { + . . . . Epsilons(self.0 & Transition::INFO_MASK) + . . . . } + . . . . } + . . . . +-- line 2645 ---------------------------------------- +-- line 2699 ---------------------------------------- + . . . . /// no pattern ID and an empty epsilons. + . . . . fn is_empty(self) -> bool { + . . . . self.pattern_id().is_none() && self.epsilons().is_empty() + . . . . } + . . . . + . . . . /// Return the pattern ID in this pattern epsilons if one exists. + . . . . fn pattern_id(self) -> Option { + . . . . let pid = self.0 >> PatternEpsilons::PATTERN_ID_SHIFT; + 148 ( 0.00%) . . . if pid == PatternEpsilons::PATTERN_ID_LIMIT { + . . . . None + . . . . } else { + . . . . Some(PatternID::new_unchecked(pid.as_usize())) + . . . . } + . . . . } + . . . . + . . . . /// Returns the pattern ID without checking whether it's valid. If this is + . . . . /// called and there is no pattern ID in this `PatternEpsilons`, then this +-- line 2715 ---------------------------------------- +-- line 2722 ---------------------------------------- + . . . . let pid = self.0 >> PatternEpsilons::PATTERN_ID_SHIFT; + . . . . PatternID::new_unchecked(pid.as_usize()) + . . . . } + . . . . + . . . . /// Return a new pattern epsilons with the given pattern ID, but the same + . . . . /// epsilons. + . . . . fn set_pattern_id(self, pid: PatternID) -> PatternEpsilons { + . . . . PatternEpsilons( + 1 ( 0.00%) . . . (pid.as_u64() << PatternEpsilons::PATTERN_ID_SHIFT) + . . . . | (self.0 & PatternEpsilons::EPSILONS_MASK), + . . . . ) + . . . . } + . . . . + . . . . /// Return the epsilons part of this pattern epsilons. + . . . . fn epsilons(self) -> Epsilons { + . . . . Epsilons(self.0 & PatternEpsilons::EPSILONS_MASK) + . . . . } + . . . . + . . . . /// Return a new pattern epsilons with the given epsilons, but the same + . . . . /// pattern ID. + . . . . fn set_epsilons(self, epsilons: Epsilons) -> PatternEpsilons { + . . . . PatternEpsilons( + 1 ( 0.00%) . . . (self.0 & PatternEpsilons::PATTERN_ID_MASK) + 3 ( 0.00%) . . . | (u64::from(epsilons.0) & PatternEpsilons::EPSILONS_MASK), + . . . . ) + . . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for PatternEpsilons { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . if self.is_empty() { + . . . . return write!(f, "N/A"); +-- line 2753 ---------------------------------------- +-- line 2797 ---------------------------------------- + . . . . + . . . . /// Returns true if this epsilons contains no slots and no assertions. + . . . . fn is_empty(self) -> bool { + . . . . self.0 == 0 + . . . . } + . . . . + . . . . /// Returns the slot epsilon transitions. + . . . . fn slots(self) -> Slots { + 529 ( 0.00%) . . . Slots((self.0 >> Epsilons::SLOT_SHIFT).low_u32()) + . . . . } + . . . . + . . . . /// Set the slot epsilon transitions. + . . . . fn set_slots(self, slots: Slots) -> Epsilons { + . . . . Epsilons( + 528 ( 0.00%) . . . (u64::from(slots.0) << Epsilons::SLOT_SHIFT) + 264 ( 0.00%) . . . | (self.0 & Epsilons::LOOK_MASK), + . . . . ) + . . . . } + . . . . + . . . . /// Return the set of look-around assertions in these epsilon transitions. + . . . . fn looks(self) -> LookSet { + . . . . LookSet { bits: (self.0 & Epsilons::LOOK_MASK).low_u32() } + . . . . } + . . . . + . . . . /// Set the look-around assertions on these epsilon transitions. + . . . . fn set_looks(self, look_set: LookSet) -> Epsilons { + . . . . Epsilons( + 198 ( 0.00%) . . . (self.0 & Epsilons::SLOT_MASK) + 66 ( 0.00%) . . . | (u64::from(look_set.bits) & Epsilons::LOOK_MASK), + . . . . ) + . . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for Epsilons { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . let mut wrote = false; + . . . . if !self.slots().is_empty() { +-- line 2833 ---------------------------------------- +-- line 2884 ---------------------------------------- + . . . . struct Slots(u32); + . . . . + . . . . impl Slots { + . . . . const LIMIT: usize = 32; + . . . . + . . . . /// Insert the slot at the given bit index. + . . . . fn insert(self, slot: usize) -> Slots { + . . . . debug_assert!(slot < Slots::LIMIT); + 264 ( 0.00%) . . . Slots(self.0 | (1 << slot.as_u32())) + . . . . } + . . . . + . . . . /// Remove the slot at the given bit index. + . . . . fn remove(self, slot: usize) -> Slots { + . . . . debug_assert!(slot < Slots::LIMIT); + . . . . Slots(self.0 & !(1 << slot.as_u32())) + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains no slots. + . . . . fn is_empty(self) -> bool { + 1 ( 0.00%) . . . self.0 == 0 + . . . . } + . . . . + . . . . /// Returns an iterator over all of the set bits in this set. + . . . . fn iter(self) -> SlotsIter { + . . . . SlotsIter { slots: self } + . . . . } + . . . . + . . . . /// For the position `at` in the current haystack, copy it to +-- line 2911 ---------------------------------------- +-- line 2917 ---------------------------------------- + . . . . /// The slice *must* correspond only to the explicit slots and the first + . . . . /// element of the slice must always correspond to the first explicit slot + . . . . /// in the corresponding NFA. + . . . . fn apply( + . . . . self, + . . . . at: usize, + . . . . caller_explicit_slots: &mut [Option], + . . . . ) { + 1 ( 0.00%) . . . if self.is_empty() { + . . . . return; + . . . . } + . . . . let at = NonMaxUsize::new(at); + . . . . for slot in self.iter() { + . . . . if slot >= caller_explicit_slots.len() { + . . . . break; + . . . . } + . . . . caller_explicit_slots[slot] = at; +-- line 2933 ---------------------------------------- + +38,815 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/sparse_set.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 37 ---------------------------------------- + . . . . pub(crate) set1: SparseSet, + . . . . pub(crate) set2: SparseSet, + . . . . } + . . . . + . . . . impl SparseSets { + . . . . /// Create a new pair of sparse sets where each set has the given capacity. + . . . . /// + . . . . /// This panics if the capacity given is bigger than `StateID::LIMIT`. + 819 ( 0.00%) . . . pub(crate) fn new(capacity: usize) -> SparseSets { + 2,106 ( 0.00%) . . . SparseSets { + . . . . set1: SparseSet::new(capacity), + . . . . set2: SparseSet::new(capacity), + . . . . } + 1,053 ( 0.00%) . . . } + . . . . + . . . . /// Resizes these sparse sets to have the new capacity given. + . . . . /// + . . . . /// The sets are automatically cleared. + . . . . /// + . . . . /// This panics if the capacity given is bigger than `StateID::LIMIT`. + . . . . #[inline] + . . . . pub(crate) fn resize(&mut self, new_capacity: usize) { +-- line 58 ---------------------------------------- +-- line 68 ---------------------------------------- + . . . . + . . . . /// Swap set1 with set2. + . . . . pub(crate) fn swap(&mut self) { + . . . . core::mem::swap(&mut self.set1, &mut self.set2); + . . . . } + . . . . + . . . . /// Returns the memory usage, in bytes, used by this pair of sparse sets. + . . . . pub(crate) fn memory_usage(&self) -> usize { + 1,467 ( 0.00%) . . . self.set1.memory_usage() + self.set2.memory_usage() + . . . . } + . . . . } + . . . . + . . . . /// A sparse set used for representing ordered NFA states. + . . . . /// + . . . . /// This supports constant time addition and membership testing. Clearing an + . . . . /// entire set can also be done in constant time. Iteration yields elements + . . . . /// in the order in which they were inserted. +-- line 84 ---------------------------------------- +-- line 110 ---------------------------------------- + . . . . /// + . . . . /// Sparse sets have a fixed size and they cannot grow. Attempting to + . . . . /// insert more distinct elements than the total capacity of the set will + . . . . /// result in a panic. + . . . . /// + . . . . /// This panics if the capacity given is bigger than `StateID::LIMIT`. + . . . . #[inline] + . . . . pub(crate) fn new(capacity: usize) -> SparseSet { + 2,823 ( 0.00%) . . . let mut set = SparseSet { len: 0, dense: vec![], sparse: vec![] }; + . . . . set.resize(capacity); + . . . . set + . . . . } + . . . . + . . . . /// Resizes this sparse set to have the new capacity given. + . . . . /// + . . . . /// This set is automatically cleared. + . . . . /// + . . . . /// This panics if the capacity given is bigger than `StateID::LIMIT`. + . . . . #[inline] + . . . . pub(crate) fn resize(&mut self, new_capacity: usize) { + 479 ( 0.00%) . . . assert!( + 677 ( 0.00%) . . . new_capacity <= StateID::LIMIT, + . . . . "sparse set capacity cannot excced {:?}", + . . . . StateID::LIMIT + . . . . ); + . . . . self.clear(); + . . . . self.dense.resize(new_capacity, StateID::ZERO); + . . . . self.sparse.resize(new_capacity, StateID::ZERO); + . . . . } + . . . . +-- line 139 ---------------------------------------- +-- line 144 ---------------------------------------- + . . . . #[inline] + . . . . pub(crate) fn capacity(&self) -> usize { + . . . . self.dense.len() + . . . . } + . . . . + . . . . /// Returns the number of elements in this set. + . . . . #[inline] + . . . . pub(crate) fn len(&self) -> usize { +10,258 ( 0.00%) . . . self.len + . . . . } + . . . . + . . . . /// Returns true if and only if this set is empty. + . . . . #[inline] + . . . . pub(crate) fn is_empty(&self) -> bool { + 436 ( 0.00%) . . . self.len() == 0 + . . . . } + . . . . + . . . . /// Insert the state ID value into this set and return true if the given + . . . . /// state ID was not previously in this set. + . . . . /// + . . . . /// This operation is idempotent. If the given value is already in this + . . . . /// set, then this is a no-op. + . . . . /// + . . . . /// If more than `capacity` ids are inserted, then this panics. + . . . . /// + . . . . /// This is marked as inline(always) since the compiler won't inline it + . . . . /// otherwise, and it's a fairly hot piece of code in DFA determinization. + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . pub(crate) fn insert(&mut self, id: StateID) -> bool { + 5,308 ( 0.00%) . . . if self.contains(id) { + . . . . return false; + . . . . } + . . . . + . . . . let i = self.len(); + 7,016 ( 0.00%) . . . assert!( + 7,016 ( 0.00%) . . . i < self.capacity(), + . . . . "{:?} exceeds capacity of {:?} when inserting {:?}", + . . . . i, + . . . . self.capacity(), + . . . . id, + . . . . ); + . . . . // OK since i < self.capacity() and self.capacity() is guaranteed to + . . . . // be <= StateID::LIMIT. + . . . . let index = StateID::new_unchecked(i); + 7,016 ( 0.00%) . . . self.dense[index] = id; + 8,166 ( 0.00%) . . . self.sparse[id] = index; + 8,215 ( 0.00%) . . . self.len += 1; + . . . . true + . . . . } + . . . . + . . . . /// Returns true if and only if this set contains the given value. + . . . . #[inline] + . . . . pub(crate) fn contains(&self, id: StateID) -> bool { + 7,016 ( 0.00%) . . . let index = self.sparse[id]; +14,032 ( 0.00%) . . . index.as_usize() < self.len() && self.dense[index] == id + . . . . } + . . . . + . . . . /// Clear this set such that it has no members. + . . . . #[inline] + . . . . pub(crate) fn clear(&mut self) { + 1,683 ( 0.00%) . . . self.len = 0; + . . . . } + . . . . + . . . . #[inline] + . . . . pub(crate) fn iter(&self) -> SparseSetIter<'_> { + 477 ( 0.00%) . . . SparseSetIter(self.dense[..self.len()].iter()) + . . . . } + . . . . + . . . . /// Returns the heap memory usage, in bytes, used by this sparse set. + . . . . #[inline] + . . . . pub(crate) fn memory_usage(&self) -> usize { + 1,568 ( 0.00%) . . . self.dense.len() * StateID::SIZE + self.sparse.len() * StateID::SIZE + . . . . } + . . . . } + . . . . + . . . . impl core::fmt::Debug for SparseSet { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . let elements: Vec = self.iter().collect(); + . . . . f.debug_tuple("SparseSet").field(&elements).finish() + . . . . } +-- line 223 ---------------------------------------- + + 3,566 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 291 ---------------------------------------- + . . . . + . . . . /// Create a new cache for this lazy DFA. + . . . . /// + . . . . /// The cache returned should only be used for searches for this + . . . . /// lazy DFA. If you want to reuse the cache for another DFA, then + . . . . /// you must call [`Cache::reset`] with that DFA (or, equivalently, + . . . . /// [`DFA::reset_cache`]). + . . . . pub fn create_cache(&self) -> Cache { + 22 ( 0.00%) . . . Cache::new(self) +146,780 ( 0.04%) 139 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Cache::new (11x) + . . . . } + . . . . + . . . . /// Reset the given cache such that it can be used for searching with the + . . . . /// this lazy DFA (and only this DFA). + . . . . /// + . . . . /// A cache reset permits reusing memory already allocated in this cache + . . . . /// with a different lazy DFA. + . . . . /// +-- line 307 ---------------------------------------- +-- line 400 ---------------------------------------- + . . . . /// byte to its corresponding equivalence class. In practice this has a + . . . . /// negligible impact on performance. + . . . . pub fn byte_classes(&self) -> &ByteClasses { + . . . . &self.classes + . . . . } + . . . . + . . . . /// Returns this lazy DFA's configuration. + . . . . pub fn get_config(&self) -> &Config { + 45 ( 0.00%) . . . &self.config + . . . . } + . . . . + . . . . /// Returns a reference to the underlying NFA. + . . . . pub fn get_nfa(&self) -> &thompson::NFA { + 259 ( 0.00%) . . . &self.nfa + . . . . } + . . . . + . . . . /// Returns the stride, as a base-2 exponent, required for these + . . . . /// equivalence classes. + . . . . /// + . . . . /// The stride is always the smallest power of 2 that is greater than or + . . . . /// equal to the alphabet length. This is done so that converting between + . . . . /// state IDs and indices can be done with shifts alone, which is much +-- line 421 ---------------------------------------- +-- line 423 ---------------------------------------- + . . . . fn stride2(&self) -> usize { + . . . . self.stride2 + . . . . } + . . . . + . . . . /// Returns the total stride for every state in this lazy DFA. This + . . . . /// corresponds to the total number of transitions used by each state in + . . . . /// this DFA's transition table. + . . . . fn stride(&self) -> usize { + 2,700 ( 0.00%) . . . 1 << self.stride2() + . . . . } + . . . . + . . . . /// Returns the memory usage, in bytes, of this lazy DFA. + . . . . /// + . . . . /// This does **not** include the stack size used up by this lazy DFA. To + . . . . /// compute that, use `std::mem::size_of::()`. This also does not + . . . . /// include the size of the `Cache` used. + . . . . /// +-- line 439 ---------------------------------------- +-- line 586 ---------------------------------------- + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . #[inline] + . . . . pub fn try_search_fwd( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . ) -> Result, MatchError> { + 45 ( 0.00%) . . . let utf8empty = self.get_nfa().has_empty() && self.get_nfa().is_utf8(); + 315 ( 0.00%) . . . let hm = match search::find_fwd(self, cache, input)? { +658,877 ( 0.19%) 694 ( 0.09%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/search.rs:regex_automata::hybrid::search::find_fwd (45x) + . . . . None => return Ok(None), + 20 ( 0.00%) . . . Some(hm) if !utf8empty => return Ok(Some(hm)), + . . . . Some(hm) => hm, + . . . . }; + . . . . // We get to this point when we know our DFA can match the empty string + . . . . // AND when UTF-8 mode is enabled. In this case, we skip any matches + . . . . // whose offset splits a codepoint. Such a match is necessarily a + . . . . // zero-width match, because UTF-8 mode requires the underlying NFA + . . . . // to be built such that all non-empty matches span valid UTF-8. + . . . . // Therefore, any match that ends in the middle of a codepoint cannot +-- line 605 ---------------------------------------- +-- line 1214 ---------------------------------------- + . . . . #[inline] + . . . . pub fn next_state( + . . . . &self, + . . . . cache: &mut Cache, + . . . . current: LazyStateID, + . . . . input: u8, + . . . . ) -> Result { + . . . . let class = usize::from(self.classes.get(input)); + 221 ( 0.00%) . . . let offset = current.as_usize_untagged() + class; + 448 ( 0.00%) . . . let sid = cache.trans[offset]; + 206 ( 0.00%) . . . if !sid.is_unknown() { + . . . . return Ok(sid); + . . . . } + . . . . let unit = alphabet::Unit::u8(input); + 875 ( 0.00%) . . . Lazy::new(self, cache).cache_next_state(current, unit) +511,566 ( 0.15%) 506 ( 0.06%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_next_state (218x) + . . . . } + . . . . + . . . . /// Transitions from the current state to the next state, given the next + . . . . /// byte of input and a state ID that is not tagged. + . . . . /// + . . . . /// The only reason to use this routine is performance. In particular, the + . . . . /// `next_state` method needs to do some additional checks, among them is + . . . . /// to account for identifiers to states that are not yet computed. In +-- line 1236 ---------------------------------------- +-- line 1415 ---------------------------------------- + . . . . pub unsafe fn next_state_untagged_unchecked( + . . . . &self, + . . . . cache: &Cache, + . . . . current: LazyStateID, + . . . . input: u8, + . . . . ) -> LazyStateID { + . . . . debug_assert!(!current.is_tagged()); + . . . . let class = usize::from(self.classes.get(input)); + 280 ( 0.00%) . . . let offset = current.as_usize_unchecked() + class; + 545 ( 0.00%) . . . *cache.trans.get_unchecked(offset) + . . . . } + . . . . + . . . . /// Transitions from the current state to the next state for the special + . . . . /// EOI symbol. + . . . . /// + . . . . /// The given cache is used to either reuse pre-computed state + . . . . /// transitions, or to store this newly computed transition for future + . . . . /// reuse. Thus, this routine guarantees that it will never return a state +-- line 1432 ---------------------------------------- +-- line 1551 ---------------------------------------- + . . . . /// error if the given configuration contains an unsupported [`Anchored`] + . . . . /// configuration. + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . pub fn start_state( + . . . . &self, + . . . . cache: &mut Cache, + . . . . config: &start::Config, + . . . . ) -> Result { + 135 ( 0.00%) . . . let lazy = LazyRef::new(self, cache); + . . . . let anchored = config.get_anchored(); + . . . . let start = match config.get_look_behind() { + . . . . None => Start::Text, + . . . . Some(byte) => { + . . . . if !self.quitset.is_empty() && self.quitset.contains(byte) { + . . . . return Err(StartError::quit(byte)); + . . . . } + . . . . self.start_map.get(byte) + . . . . } + . . . . }; + . . . . let start_id = lazy.get_cached_start_id(anchored, start)?; + 45 ( 0.00%) . . . if !start_id.is_unknown() { + . . . . return Ok(start_id); + . . . . } + 498 ( 0.00%) . . . Lazy::new(self, cache).cache_start_group(anchored, start) +126,821 ( 0.04%) 188 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::cache_start_group (41x) + . . . . } + . . . . + . . . . /// Return the ID of the start state for this lazy DFA when executing a + . . . . /// forward search. + . . . . /// + . . . . /// This is a convenience routine for calling [`DFA::start_state`] that + . . . . /// converts the given [`Input`] to a [start configuration](start::Config). + . . . . /// Additionally, if an error occurs, it is converted from a [`StartError`] +-- line 1582 ---------------------------------------- +-- line 1744 ---------------------------------------- + . . . . id: LazyStateID, + . . . . match_index: usize, + . . . . ) -> PatternID { + . . . . // This is an optimization for the very common case of a DFA with a + . . . . // single pattern. This conditional avoids a somewhat more costly path + . . . . // that finds the pattern ID from the corresponding `State`, which + . . . . // requires a bit of slicing/pointer-chasing. This optimization tends + . . . . // to only matter when matches are frequent. + 10 ( 0.00%) . . . if self.pattern_len() == 1 { + . . . . return PatternID::ZERO; + . . . . } + . . . . LazyRef::new(self, cache) + . . . . .get_cached_state(id) + . . . . .match_pattern(match_index) + . . . . } + . . . . } + . . . . +-- line 1760 ---------------------------------------- +-- line 1867 ---------------------------------------- + . . . . } + . . . . + . . . . impl Cache { + . . . . /// Create a new cache for the given lazy DFA. + . . . . /// + . . . . /// The cache returned should only be used for searches for the given DFA. + . . . . /// If you want to reuse the cache for another DFA, then you must call + . . . . /// [`Cache::reset`] with that DFA. + 585 ( 0.00%) . . . pub fn new(dfa: &DFA) -> Cache { + 2,340 ( 0.00%) . . . let mut cache = Cache { + . . . . trans: alloc::vec![], + . . . . starts: alloc::vec![], + . . . . states: alloc::vec![], + . . . . states_to_id: StateMap::new(), + 234 ( 0.00%) . . . sparses: SparseSets::new(dfa.get_nfa().states().len()), +396,782 ( 0.11%) 490 ( 0.06%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/sparse_set.rs:regex_automata::util::sparse_set::SparseSets::new (117x) + . . . . stack: alloc::vec![], + . . . . scratch_state_builder: StateBuilderEmpty::new(), + . . . . state_saver: StateSaver::none(), + . . . . memory_usage_state: 0, + . . . . clear_count: 0, + . . . . bytes_searched: 0, + . . . . progress: None, + . . . . }; + . . . . debug!("pre-init lazy DFA cache size: {}", cache.memory_usage()); + 468 ( 0.00%) . . . Lazy { dfa, cache: &mut cache }.init_cache(); +2,295,976 ( 0.66%) 1,555 ( 0.19%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::init_cache (117x) + . . . . debug!("post-init lazy DFA cache size: {}", cache.memory_usage()); + . . . . cache + 585 ( 0.00%) . . . } + . . . . + . . . . /// Reset this cache such that it can be used for searching with the given + . . . . /// lazy DFA (and only that DFA). + . . . . /// + . . . . /// A cache reset permits reusing memory already allocated in this cache + . . . . /// with a different lazy DFA. + . . . . /// + . . . . /// Resetting a cache sets its "clear count" to 0. This is relevant if the +-- line 1902 ---------------------------------------- +-- line 1949 ---------------------------------------- + . . . . /// Note that keeping track of search progress is _not necessary_ + . . . . /// for correct implementations of search using a lazy DFA. Keeping + . . . . /// track of search progress is only necessary if you want the + . . . . /// [`Config::minimum_bytes_per_state`] configuration knob to work. + . . . . #[inline] + . . . . pub fn search_start(&mut self, at: usize) { + . . . . // If a previous search wasn't marked as finished, then finish it + . . . . // now automatically. + 89 ( 0.00%) . . . if let Some(p) = self.progress.take() { + . . . . self.bytes_searched += p.len(); + . . . . } + 132 ( 0.00%) . . . self.progress = Some(SearchProgress { start: at, at }); + . . . . } + . . . . + . . . . /// Updates the current search to indicate that it has search to the + . . . . /// current position. + . . . . /// + . . . . /// No special care needs to be taken for reverse searches. Namely, the + . . . . /// position given may be _less than_ the starting position of the search. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics if no search has been started by [`Cache::search_start`]. + . . . . #[inline] + . . . . pub fn search_update(&mut self, at: usize) { + . . . . let p = + . . . . self.progress.as_mut().expect("no in-progress search to update"); + 221 ( 0.00%) . . . p.at = at; + . . . . } + . . . . + . . . . /// Indicates that a search has finished at the given position. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics if no search has been started by [`Cache::search_start`]. + . . . . #[inline] + 44 ( 0.00%) . . . pub fn search_finish(&mut self, at: usize) { + . . . . let mut p = + . . . . self.progress.take().expect("no in-progress search to finish"); + . . . . p.at = at; + 44 ( 0.00%) . . . self.bytes_searched += p.len(); + 88 ( 0.00%) . . . } + . . . . + . . . . /// Returns the total number of bytes that have been searched since this + . . . . /// cache was last cleared. + . . . . /// + . . . . /// This is useful for determining the efficiency of the cache. For + . . . . /// example, the lazy DFA uses this value in conjunction with the + . . . . /// [`Config::minimum_bytes_per_state`] knob to help determine whether it + . . . . /// should quit searching. +-- line 1998 ---------------------------------------- +-- line 2020 ---------------------------------------- + . . . . /// compute that, use `std::mem::size_of::()`. + . . . . pub fn memory_usage(&self) -> usize { + . . . . const ID_SIZE: usize = size_of::(); + . . . . const STATE_SIZE: usize = size_of::(); + . . . . + . . . . // NOTE: If you make changes to the below, then + . . . . // 'minimum_cache_capacity' should be updated correspondingly. + . . . . + 4,388 ( 0.00%) . . . self.trans.len() * ID_SIZE + . . . . + self.starts.len() * ID_SIZE + 1,568 ( 0.00%) . . . + self.states.len() * STATE_SIZE + . . . . // Maps likely use more memory than this, but it's probably close. + 784 ( 0.00%) . . . + self.states_to_id.len() * (STATE_SIZE + ID_SIZE) + . . . . + self.sparses.memory_usage() + . . . . + self.stack.capacity() * ID_SIZE + . . . . + self.scratch_state_builder.capacity() + . . . . // Heap memory used by 'State' in both 'states' and 'states_to_id'. + . . . . + self.memory_usage_state + . . . . } + . . . . } + . . . . +-- line 2040 ---------------------------------------- +-- line 2051 ---------------------------------------- + . . . . } + . . . . + . . . . impl SearchProgress { + . . . . /// Returns the length, in bytes, of this search so far. + . . . . /// + . . . . /// This automatically handles the case of a reverse search, where `at` + . . . . /// is likely to be less than `start`. + . . . . fn len(&self) -> usize { + 220 ( 0.00%) . . . if self.start <= self.at { + . . . . self.at - self.start + . . . . } else { + . . . . self.start - self.at + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// A map from states to state identifiers. When using std, we use a standard +-- line 2067 ---------------------------------------- +-- line 2111 ---------------------------------------- + . . . . /// + . . . . /// Where 'all-codepoints-utf8-100x' is the UTF-8 encoding of every + . . . . /// codepoint, in sequence, repeated 100 times. + . . . . /// + . . . . /// With 'inline(never)' hyperfine reports 1.1s per run. With + . . . . /// 'inline(always)', hyperfine reports 1.23s. So that's a 10% improvement. + . . . . #[cold] + . . . . #[inline(never)] + 1,744 ( 0.00%) . . . fn cache_next_state( + . . . . &mut self, + . . . . mut current: LazyStateID, + . . . . unit: alphabet::Unit, + . . . . ) -> Result { + 436 ( 0.00%) . . . let stride2 = self.dfa.stride2(); + 218 ( 0.00%) . . . let empty_builder = self.get_state_builder(); + 872 ( 0.00%) . . . let builder = determinize::next( +151,074 ( 0.04%) 2 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::next (218x) + . . . . self.dfa.get_nfa(), + . . . . self.dfa.get_config().get_match_kind(), + 218 ( 0.00%) . . . &mut self.cache.sparses, + . . . . &mut self.cache.stack, + 654 ( 0.00%) . . . &self.cache.states[current.as_usize_untagged() >> stride2], + . . . . unit, + 1,308 ( 0.00%) . . . empty_builder, + . . . . ); + . . . . let save_state = !self.as_ref().state_builder_fits_in_cache(&builder); + 218 ( 0.00%) . . . if save_state { + . . . . self.save_state(current); + . . . . } + 1,002 ( 0.00%) . . . let next = self.add_builder_state(builder, |sid| sid)?; + 218 ( 0.00%) . . . if save_state { + . . . . current = self.saved_state_id(); + . . . . } + . . . . // This is the payoff. The next time 'next_state' is called with this + . . . . // state and alphabet unit, it will find this transition and avoid + . . . . // having to re-determinize this transition. + 1,090 ( 0.00%) . . . self.set_transition(current, unit, next); + 7,194 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::set_transition (218x) + . . . . Ok(next) + 2,180 ( 0.00%) . . . } + . . . . + . . . . /// Compute and cache the starting state for the given pattern ID (if + . . . . /// present) and the starting configuration. + . . . . /// + . . . . /// This panics if a pattern ID is given and the DFA isn't configured to + . . . . /// build anchored start states for each pattern. + . . . . /// + . . . . /// This will never return an unknown lazy state ID. + . . . . /// + . . . . /// If caching this state would otherwise result in a cache that has been + . . . . /// cleared too many times, then an error is returned. + . . . . #[cold] + . . . . #[inline(never)] + 369 ( 0.00%) . . . fn cache_start_group( + . . . . &mut self, + . . . . anchored: Anchored, + . . . . start: Start, + . . . . ) -> Result { + 82 ( 0.00%) . . . let nfa_start_id = match anchored { + 82 ( 0.00%) . . . Anchored::No => self.dfa.get_nfa().start_unanchored(), + . . . . Anchored::Yes => self.dfa.get_nfa().start_anchored(), + . . . . Anchored::Pattern(pid) => { + . . . . if !self.dfa.get_config().get_starts_for_each_pattern() { + . . . . return Err(StartError::unsupported_anchored(anchored)); + . . . . } + . . . . match self.dfa.get_nfa().start_pattern(pid) { + . . . . None => return Ok(self.as_ref().dead_id()), + . . . . Some(sid) => sid, +-- line 2176 ---------------------------------------- +-- line 2178 ---------------------------------------- + . . . . } + . . . . }; + . . . . + . . . . let id = self + . . . . .cache_start_one(nfa_start_id, start) + . . . . .map_err(StartError::cache)?; + . . . . self.set_start_state(anchored, start, id); + . . . . Ok(id) + 451 ( 0.00%) . . . } + . . . . + . . . . /// Compute and cache the starting state for the given NFA state ID and the + . . . . /// starting configuration. The NFA state ID might be one of the following: + . . . . /// + . . . . /// 1) An unanchored start state to match any pattern. + . . . . /// 2) An anchored start state to match any pattern. + . . . . /// 3) An anchored start state for a particular pattern. + . . . . /// +-- line 2194 ---------------------------------------- +-- line 2196 ---------------------------------------- + . . . . /// + . . . . /// If caching this state would otherwise result in a cache that has been + . . . . /// cleared too many times, then an error is returned. + . . . . fn cache_start_one( + . . . . &mut self, + . . . . nfa_start_id: NFAStateID, + . . . . start: Start, + . . . . ) -> Result { + 41 ( 0.00%) . . . let mut builder_matches = self.get_state_builder().into_matches(); + 82 ( 0.00%) . . . determinize::set_lookbehind_from_start( + 1,378 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::set_lookbehind_from_start (41x) + . . . . self.dfa.get_nfa(), + . . . . &start, + . . . . &mut builder_matches, + . . . . ); + . . . . self.cache.sparses.set1.clear(); + 164 ( 0.00%) . . . determinize::epsilon_closure( + 36,826 ( 0.01%) 14 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::epsilon_closure (41x) + . . . . self.dfa.get_nfa(), + . . . . nfa_start_id, + . . . . builder_matches.look_have(), + 41 ( 0.00%) . . . &mut self.cache.stack, + . . . . &mut self.cache.sparses.set1, + . . . . ); + 123 ( 0.00%) . . . let mut builder = builder_matches.into_nfa(); + 123 ( 0.00%) . . . determinize::add_nfa_states( + 39,758 ( 0.01%) 133 ( 0.02%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/mod.rs:regex_automata::util::determinize::add_nfa_states (41x) + . . . . &self.dfa.get_nfa(), + . . . . &self.cache.sparses.set1, + . . . . &mut builder, + . . . . ); + . . . . let tag_starts = self.dfa.get_config().get_specialize_start_states(); + 205 ( 0.00%) . . . self.add_builder_state(builder, |id| { + 82 ( 0.00%) . . . if tag_starts { + . . . . id.to_start() + . . . . } else { + . . . . id + . . . . } + . . . . }) + . . . . } + . . . . + . . . . /// Either add the given builder state to this cache, or return an ID to an +-- line 2234 ---------------------------------------- +-- line 2242 ---------------------------------------- + . . . . /// + . . . . /// If caching this state would otherwise result in a cache that has been + . . . . /// cleared too many times, then an error is returned. + . . . . fn add_builder_state( + . . . . &mut self, + . . . . builder: StateBuilderNFA, + . . . . idmap: impl Fn(LazyStateID) -> LazyStateID, + . . . . ) -> Result { + 44 ( 0.00%) . . . if let Some(&cached_id) = + . . . . self.cache.states_to_id.get(builder.as_bytes()) + . . . . { + . . . . // Since we have a cached state, put the constructed state's + . . . . // memory back into our scratch space, so that it can be reused. + . . . . self.put_state_builder(builder); + . . . . return Ok(cached_id); + . . . . } + . . . . let result = self.add_state(builder.to_state(), idmap); +-- line 2258 ---------------------------------------- +-- line 2270 ---------------------------------------- + . . . . /// + . . . . /// If caching this state would otherwise result in a cache that has been + . . . . /// cleared too many times, then an error is returned. + . . . . fn add_state( + . . . . &mut self, + . . . . state: State, + . . . . idmap: impl Fn(LazyStateID) -> LazyStateID, + . . . . ) -> Result { + 566 ( 0.00%) . . . if !self.as_ref().state_fits_in_cache(&state) { + . . . . self.try_clear_cache()?; + . . . . } + . . . . // It's important for this to come second, since the above may clear + . . . . // the cache. If we clear the cache after ID generation, then the ID + . . . . // is likely bunk since it would have been generated based on a larger + . . . . // transition table. + 860 ( 0.00%) . . . let mut id = idmap(self.next_state_id()?); + 1,914 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::next_state_id (174x) + 1,268 ( 0.00%) . . . if state.is_match() { + . . . . id = id.to_match(); + . . . . } + . . . . // Add room in the transition table. Since this is a fresh state, all + . . . . // of its transitions are unknown. + . . . . self.cache.trans.extend( + 566 ( 0.00%) . . . iter::repeat(self.as_ref().unknown_id()).take(self.dfa.stride()), + . . . . ); + . . . . // When we add a sentinel state, we never want to set any quit + . . . . // transitions. Technically, this is harmless, since sentinel states + . . . . // have all of their transitions set to loop back to themselves. But + . . . . // when creating sentinel states before the quit sentinel state, + . . . . // this will try to call 'set_transition' on a state ID that doesn't + . . . . // actually exist yet, which isn't allowed. So we just skip doing so + . . . . // entirely. + 683 ( 0.00%) . . . if !self.dfa.quitset.is_empty() && !self.as_ref().is_sentinel(id) { + . . . . let quit_id = self.as_ref().quit_id(); + . . . . for b in self.dfa.quitset.iter() { + . . . . self.set_transition(id, alphabet::Unit::u8(b), quit_id); + . . . . } + . . . . } + 566 ( 0.00%) . . . self.cache.memory_usage_state += state.memory_usage(); + 117 ( 0.00%) . . . self.cache.states.push(state.clone()); + 1,132 ( 0.00%) . . . self.cache.states_to_id.insert(state, id); + . . . . Ok(id) + . . . . } + . . . . + . . . . /// Allocate a new state ID. + . . . . /// + . . . . /// This will never return an unknown lazy state ID. + . . . . /// + . . . . /// If caching this state would otherwise result in a cache that has been + . . . . /// cleared too many times, then an error is returned. + 430 ( 0.00%) . . . fn next_state_id(&mut self) -> Result { + 215 ( 0.00%) . . . let sid = match LazyStateID::new(self.cache.trans.len()) { + . . . . Ok(sid) => sid, + . . . . Err(_) => { + . . . . self.try_clear_cache()?; + . . . . // This has to pass since we check that ID capacity at + . . . . // construction time can fit at least MIN_STATES states. + . . . . LazyStateID::new(self.cache.trans.len()).unwrap() + . . . . } + . . . . }; + . . . . Ok(sid) + 860 ( 0.00%) . . . } + . . . . + . . . . /// Attempt to clear the cache used by this lazy DFA. + . . . . /// + . . . . /// If clearing the cache exceeds the minimum number of required cache + . . . . /// clearings, then this will return a cache error. In this case, + . . . . /// callers should bubble this up as the cache can't be used until it is + . . . . /// reset. Implementations of search should convert this error into a + . . . . /// [`MatchError::gave_up`]. +-- line 2338 ---------------------------------------- +-- line 2497 ---------------------------------------- + . . . . /// Initialize this cache from emptiness to a place where it can be used + . . . . /// for search. + . . . . /// + . . . . /// This is called both at cache creation time and after the cache has been + . . . . /// cleared. + . . . . /// + . . . . /// Primarily, this adds the three sentinel states and allocates some + . . . . /// initial memory. + 936 ( 0.00%) . . . fn init_cache(&mut self) { + . . . . // Why multiply by 2 here? Because we make room for both the unanchored + . . . . // and anchored start states. Unanchored is first and then anchored. + . . . . let mut starts_len = Start::len().checked_mul(2).unwrap(); + . . . . // ... but if we also want start states for every pattern, we make room + . . . . // for that too. + 234 ( 0.00%) . . . if self.dfa.get_config().get_starts_for_each_pattern() { + 318 ( 0.00%) . . . starts_len += Start::len() * self.dfa.pattern_len(); + . . . . } + 117 ( 0.00%) . . . self.cache + . . . . .starts + . . . . .extend(iter::repeat(self.as_ref().unknown_id()).take(starts_len)); + . . . . // This is the set of NFA states that corresponds to each of our three + . . . . // sentinel states: the empty set. + 117 ( 0.00%) . . . let dead = State::dead(); + 44,904 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::dead (117x) + . . . . // This sets up some states that we use as sentinels that are present + . . . . // in every DFA. While it would be technically possible to implement + . . . . // this DFA without explicitly putting these states in the transition + . . . . // table, this is convenient to do to make `next_state` correct for all + . . . . // valid state IDs without needing explicit conditionals to special + . . . . // case these sentinel states. + . . . . // + . . . . // All three of these states are "dead" states. That is, all of + . . . . // them transition only to themselves. So once you enter one of + . . . . // these states, it's impossible to leave them. Thus, any correct + . . . . // search routine must explicitly check for these state types. (Sans + . . . . // `unknown`, since that is only used internally to represent missing + . . . . // states.) + . . . . let unk_id = + 117 ( 0.00%) . . . self.add_state(dead.clone(), |id| id.to_unknown()).unwrap(); + 117 ( 0.00%) . . . let dead_id = self.add_state(dead.clone(), |id| id.to_dead()).unwrap(); + 117 ( 0.00%) . . . let quit_id = self.add_state(dead.clone(), |id| id.to_quit()).unwrap(); + 234 ( 0.00%) . . . assert_eq!(unk_id, self.as_ref().unknown_id()); + 234 ( 0.00%) . . . assert_eq!(dead_id, self.as_ref().dead_id()); + 234 ( 0.00%) . . . assert_eq!(quit_id, self.as_ref().quit_id()); + . . . . // The idea here is that if you start in an unknown/dead/quit state and + . . . . // try to transition on them, then you should end up where you started. + . . . . self.set_all_transitions(unk_id, unk_id); + . . . . self.set_all_transitions(dead_id, dead_id); + . . . . self.set_all_transitions(quit_id, quit_id); + . . . . // All of these states are technically equivalent from the FSM + . . . . // perspective, so putting all three of them in the cache isn't + . . . . // possible. (They are distinct merely because we use their +-- line 2547 ---------------------------------------- +-- line 2577 ---------------------------------------- + . . . . self.cache + . . . . .state_saver + . . . . .take_saved() + . . . . .expect("state saver does not have saved state ID") + . . . . } + . . . . + . . . . /// Set all transitions on the state 'from' to 'to'. + . . . . fn set_all_transitions(&mut self, from: LazyStateID, to: LazyStateID) { + 89,505 ( 0.03%) . . . for unit in self.dfa.classes.representatives(..) { +134,478 ( 0.04%) . . . self.set_transition(from, unit, to); +738,576 ( 0.21%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/hybrid/dfa.rs:regex_automata::hybrid::dfa::Lazy::set_transition (22,413x) + . . . . } + . . . . } + . . . . + . . . . /// Set the transition on 'from' for 'unit' to 'to'. + . . . . /// + . . . . /// This panics if either 'from' or 'to' is invalid. + . . . . /// + . . . . /// All unit values are OK. + 67,893 ( 0.02%) . . . fn set_transition( + . . . . &mut self, + . . . . from: LazyStateID, + . . . . unit: alphabet::Unit, + . . . . to: LazyStateID, + . . . . ) { + 22,631 ( 0.01%) . . . assert!(self.as_ref().is_valid(from), "invalid 'from' id: {:?}", from); + . . . . assert!(self.as_ref().is_valid(to), "invalid 'to' id: {:?}", to); + . . . . let offset = + 22,631 ( 0.01%) . . . from.as_usize_untagged() + self.dfa.classes.get_by_unit(unit); + 45,262 ( 0.01%) . . . self.cache.trans[offset] = to; + 45,262 ( 0.01%) . . . } + . . . . + . . . . /// Set the start ID for the given pattern ID (if given) and starting + . . . . /// configuration to the ID given. + . . . . /// + . . . . /// This panics if 'id' is not valid or if a pattern ID is given and + . . . . /// 'starts_for_each_pattern' is not enabled. + . . . . fn set_start_state( + . . . . &mut self, + . . . . anchored: Anchored, + . . . . start: Start, + . . . . id: LazyStateID, + . . . . ) { + 41 ( 0.00%) . . . assert!(self.as_ref().is_valid(id)); + . . . . let start_index = start.as_usize(); + 82 ( 0.00%) . . . let index = match anchored { + . . . . Anchored::No => start_index, + . . . . Anchored::Yes => Start::len() + start_index, + . . . . Anchored::Pattern(pid) => { + . . . . assert!( + . . . . self.dfa.get_config().get_starts_for_each_pattern(), + . . . . "attempted to search for a specific pattern \ + . . . . without enabling starts_for_each_pattern", + . . . . ); + . . . . let pid = pid.as_usize(); + . . . . (2 * Start::len()) + (Start::len() * pid) + start_index + . . . . } + . . . . }; + 123 ( 0.00%) . . . self.cache.starts[index] = id; + . . . . } + . . . . + . . . . /// Returns a state builder from this DFA that might have existing + . . . . /// capacity. This helps avoid allocs in cases where a state is built that + . . . . /// turns out to already be cached. + . . . . /// + . . . . /// Callers must put the state builder back with 'put_state_builder', + . . . . /// otherwise the allocation reuse won't work. +-- line 2642 ---------------------------------------- +-- line 2679 ---------------------------------------- + . . . . /// unknown lazy state ID. + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn get_cached_start_id( + . . . . &self, + . . . . anchored: Anchored, + . . . . start: Start, + . . . . ) -> Result { + . . . . let start_index = start.as_usize(); + 135 ( 0.00%) . . . let index = match anchored { + . . . . Anchored::No => start_index, + . . . . Anchored::Yes => Start::len() + start_index, + . . . . Anchored::Pattern(pid) => { + . . . . if !self.dfa.get_config().get_starts_for_each_pattern() { + . . . . return Err(StartError::unsupported_anchored(anchored)); + . . . . } + . . . . if pid.as_usize() >= self.dfa.pattern_len() { + . . . . return Ok(self.dead_id()); + . . . . } + . . . . (2 * Start::len()) + . . . . + (Start::len() * pid.as_usize()) + . . . . + start_index + . . . . } + . . . . }; + 135 ( 0.00%) . . . Ok(self.cache.starts[index]) + . . . . } + . . . . + . . . . /// Return the cached NFA/DFA powerset state for the given ID. + . . . . /// + . . . . /// This panics if the given ID does not address a valid state. + . . . . fn get_cached_state(&self, sid: LazyStateID) -> &State { + . . . . let index = sid.as_usize_untagged() >> self.dfa.stride2(); + . . . . &self.cache.states[index] +-- line 2710 ---------------------------------------- +-- line 2730 ---------------------------------------- + . . . . } + . . . . + . . . . /// Returns the ID of the dead state for this lazy DFA. + . . . . fn dead_id(&self) -> LazyStateID { + . . . . // This unwrap is OK since the maximum value here is 1 * 512 = 512, + . . . . // which is <= 2047 (the maximum state ID on 16-bit systems). Where + . . . . // 512 is the worst case for our equivalence classes (every byte is a + . . . . // distinct class). + 468 ( 0.00%) . . . LazyStateID::new(1 << self.dfa.stride2()).unwrap().to_dead() + . . . . } + . . . . + . . . . /// Returns the ID of the quit state for this lazy DFA. + . . . . fn quit_id(&self) -> LazyStateID { + . . . . // This unwrap is OK since the maximum value here is 2 * 512 = 1024, + . . . . // which is <= 2047 (the maximum state ID on 16-bit systems). Where + . . . . // 512 is the worst case for our equivalence classes (every byte is a + . . . . // distinct class). + 117 ( 0.00%) . . . LazyStateID::new(2 << self.dfa.stride2()).unwrap().to_quit() + . . . . } + . . . . + . . . . /// Returns true if and only if the given ID is valid. + . . . . /// + . . . . /// An ID is valid if it is both a valid index into the transition table + . . . . /// and is a multiple of the DFA's stride. + . . . . fn is_valid(&self, id: LazyStateID) -> bool { + . . . . let id = id.as_usize_untagged(); +203,966 ( 0.06%) . . . id < self.cache.trans.len() && id % self.dfa.stride() == 0 + . . . . } + . . . . + . . . . /// Returns true if adding the state given would fit in this cache. + . . . . fn state_fits_in_cache(&self, state: &State) -> bool { + 781 ( 0.00%) . . . let needed = self.cache.memory_usage() + . . . . + self.memory_usage_for_one_more_state(state.memory_usage()); + . . . . trace!( + . . . . "lazy DFA cache capacity check: {:?} ?<=? {:?}", + . . . . needed, + . . . . self.dfa.cache_capacity + . . . . ); + 566 ( 0.00%) . . . needed <= self.dfa.cache_capacity + . . . . } + . . . . + . . . . /// Returns true if adding the state to be built by the given builder would + . . . . /// fit in this cache. + . . . . fn state_builder_fits_in_cache(&self, state: &StateBuilderNFA) -> bool { + 872 ( 0.00%) . . . let needed = self.cache.memory_usage() + . . . . + self.memory_usage_for_one_more_state(state.as_bytes().len()); + 872 ( 0.00%) . . . needed <= self.dfa.cache_capacity + . . . . } + . . . . + . . . . /// Returns the additional memory usage, in bytes, required to add one more + . . . . /// state to this cache. The given size should be the heap size, in bytes, + . . . . /// that would be used by the new state being added. + . . . . fn memory_usage_for_one_more_state( + . . . . &self, + . . . . state_heap_size: usize, + . . . . ) -> usize { + . . . . const ID_SIZE: usize = size_of::(); + . . . . const STATE_SIZE: usize = size_of::(); + . . . . + 3,351 ( 0.00%) . . . self.dfa.stride() * ID_SIZE // additional space needed in trans table + . . . . + STATE_SIZE // space in cache.states + . . . . + (STATE_SIZE + ID_SIZE) // space in cache.states_to_id + . . . . + state_heap_size // heap memory used by state itself + . . . . } + . . . . } + . . . . + . . . . /// A simple type that encapsulates the saving of a state ID through a cache + . . . . /// clearing. +-- line 2797 ---------------------------------------- +-- line 2854 ---------------------------------------- + . . . . /// + . . . . /// A lazy DFA configuration is a simple data object that is typically used + . . . . /// with [`Builder::configure`]. + . . . . /// + . . . . /// The default configuration guarantees that a search will never return a + . . . . /// "gave up" or "quit" error, although it is possible for a search to fail + . . . . /// if [`Config::starts_for_each_pattern`] wasn't enabled (which it is not by + . . . . /// default) and an [`Anchored::Pattern`] mode is requested via [`Input`]. + 3,062 ( 0.00%) . . . #[derive(Clone, Debug, Default)] + . . . . pub struct Config { + . . . . // As with other configuration types in this crate, we put all our knobs + . . . . // in options so that we can distinguish between "default" and "not set." + . . . . // This makes it possible to easily combine multiple configurations + . . . . // without default values overwriting explicitly specified values. See the + . . . . // 'overwrite' method. + . . . . // + . . . . // For docs on the fields below, see the corresponding method setters. +-- line 2870 ---------------------------------------- +-- line 2992 ---------------------------------------- + . . . . /// let got_rev = dfa_rev.try_search_rev(&mut cache_rev, &input)?.unwrap(); + . . . . /// assert_eq!(expected_fwd, got_fwd); + . . . . /// assert_eq!(expected_rev, got_rev); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn match_kind(mut self, kind: MatchKind) -> Config { + . . . . self.match_kind = Some(kind); + 1,944 ( 0.00%) . . . self + . . . . } + . . . . + . . . . /// Set a prefilter to be used whenever a start state is entered. + . . . . /// + . . . . /// A [`Prefilter`] in this context is meant to accelerate searches by + . . . . /// looking for literal prefixes that every match for the corresponding + . . . . /// pattern (or patterns) must start with. Once a prefilter produces a + . . . . /// match, the underlying search routine continues on to try and confirm +-- line 3008 ---------------------------------------- +-- line 3067 ---------------------------------------- + . . . . /// // No match reported even though there clearly is one! + . . . . /// None, + . . . . /// re.try_search_fwd(&mut cache, &input)?, + . . . . /// ); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn prefilter(mut self, pre: Option) -> Config { + 1,377 ( 0.00%) . . . self.pre = Some(pre); + 162 ( 0.00%) . . . if self.specialize_start_states.is_none() { + 81 ( 0.00%) . . . self.specialize_start_states = + . . . . Some(self.get_prefilter().is_some()); + . . . . } + 4,164 ( 0.00%) . . . self + . . . . } + . . . . + . . . . /// Whether to compile a separate start state for each pattern in the + . . . . /// lazy DFA. + . . . . /// + . . . . /// When enabled, a separate **anchored** start state is added for each + . . . . /// pattern in the lazy DFA. When this start state is used, then the DFA + . . . . /// will only search for matches for the pattern specified, even if there +-- line 3088 ---------------------------------------- +-- line 3442 ---------------------------------------- + . . . . /// // Start states are not tagged in the default configuration! + . . . . /// assert!(!sid.is_tagged()); + . . . . /// assert!(!sid.is_start()); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + . . . . pub fn specialize_start_states(mut self, yes: bool) -> Config { + . . . . self.specialize_start_states = Some(yes); + 567 ( 0.00%) . . . self + . . . . } + . . . . + . . . . /// Sets the maximum amount of heap memory, in bytes, to allocate to the + . . . . /// cache for use during a lazy DFA search. If the lazy DFA would otherwise + . . . . /// use more heap memory, then, depending on other configuration knobs, + . . . . /// either stop the search and return an error or clear the cache and + . . . . /// continue the search. + . . . . /// +-- line 3458 ---------------------------------------- +-- line 3703 ---------------------------------------- + . . . . /// called. + . . . . /// * Call [`Cache::search_finish`] before completing a search. (It is + . . . . /// not strictly necessary to call this when an error is returned, as + . . . . /// `Cache::search_start` will automatically finish the previous search + . . . . /// for you. But calling it where possible before returning helps improve + . . . . /// the accuracy of how many bytes have actually been searched.) + . . . . pub fn minimum_bytes_per_state(mut self, min: Option) -> Config { + . . . . self.minimum_bytes_per_state = Some(min); + 1,588 ( 0.00%) . . . self + . . . . } + . . . . + . . . . /// Returns the match semantics set in this configuration. + . . . . pub fn get_match_kind(&self) -> MatchKind { + . . . . self.match_kind.unwrap_or(MatchKind::LeftmostFirst) + . . . . } + . . . . + . . . . /// Returns the prefilter set in this configuration, if one at all. +-- line 3719 ---------------------------------------- +-- line 3755 ---------------------------------------- + . . . . /// it's in a start state and do some kind of optimization (like run a + . . . . /// prefilter). + . . . . pub fn get_specialize_start_states(&self) -> bool { + . . . . self.specialize_start_states.unwrap_or(false) + . . . . } + . . . . + . . . . /// Returns the cache capacity set on this configuration. + . . . . pub fn get_cache_capacity(&self) -> usize { + 175 ( 0.00%) . . . self.cache_capacity.unwrap_or(2 * (1 << 20)) + . . . . } + . . . . + . . . . /// Returns whether the cache capacity check should be skipped. + . . . . pub fn get_skip_cache_capacity_check(&self) -> bool { + . . . . self.skip_cache_capacity_check.unwrap_or(false) + . . . . } + . . . . + . . . . /// Returns, if set, the minimum number of times the cache must be cleared +-- line 3771 ---------------------------------------- +-- line 3812 ---------------------------------------- + . . . . /// + . . . . /// If byte classes are disabled on this configuration, then a map is + . . . . /// returned that puts each byte in its own equivalent class. + . . . . fn byte_classes_from_nfa( + . . . . &self, + . . . . nfa: &thompson::NFA, + . . . . quit: &ByteSet, + . . . . ) -> ByteClasses { + 175 ( 0.00%) . . . if !self.get_byte_classes() { + . . . . // The lazy DFA will always use the equivalence class map, but + . . . . // enabling this option is useful for debugging. Namely, this will + . . . . // cause all transitions to be defined over their actual bytes + . . . . // instead of an opaque equivalence class identifier. The former is + . . . . // much easier to grok as a human. + . . . . ByteClasses::singletons() + . . . . } else { + . . . . let mut set = nfa.byte_class_set().clone(); +-- line 3828 ---------------------------------------- +-- line 3829 ---------------------------------------- + . . . . // It is important to distinguish any "quit" bytes from all other + . . . . // bytes. Otherwise, a non-quit byte may end up in the same class + . . . . // as a quit byte, and thus cause the DFA stop when it shouldn't. + . . . . // + . . . . // Test case: + . . . . // + . . . . // regex-cli find match hybrid --unicode-word-boundary \ + . . . . // -p '^#' -p '\b10\.55\.182\.100\b' -y @conn.json.1000x.log + 175 ( 0.00%) . . . if !quit.is_empty() { + . . . . set.add_set(&quit); + . . . . } + . . . . set.byte_classes() + . . . . } + . . . . } + . . . . + . . . . /// Return the quit set for this configuration and the given NFA. + . . . . /// +-- line 3845 ---------------------------------------- +-- line 3846 ---------------------------------------- + . . . . /// This may return an error if the NFA is incompatible with this + . . . . /// configuration's quit set. For example, if the NFA has a Unicode word + . . . . /// boundary and the quit set doesn't include non-ASCII bytes. + . . . . fn quit_set_from_nfa( + . . . . &self, + . . . . nfa: &thompson::NFA, + . . . . ) -> Result { + . . . . let mut quit = self.quitset.unwrap_or(ByteSet::empty()); + 175 ( 0.00%) . . . if nfa.look_set_any().contains_word_unicode() { + . . . . if self.get_unicode_word_boundary() { + . . . . for b in 0x80..=0xFF { + . . . . quit.add(b); + . . . . } + . . . . } else { + . . . . // If heuristic support for Unicode word boundaries wasn't + . . . . // enabled, then we can still check if our quit set is correct. + . . . . // If the caller set their quit bytes in a way that causes the +-- line 3862 ---------------------------------------- +-- line 3864 ---------------------------------------- + . . . . // we need for heuristic support to work. + . . . . if !quit.contains_range(0x80, 0xFF) { + . . . . return Err( + . . . . BuildError::unsupported_dfa_word_boundary_unicode(), + . . . . ); + . . . . } + . . . . } + . . . . } + 700 ( 0.00%) . . . Ok(quit) + . . . . } + . . . . + . . . . /// Overwrite the default configuration such that the options in `o` are + . . . . /// always used. If an option in `o` is not set, then the corresponding + . . . . /// option in `self` is used. If it's not set in `self` either, then it + . . . . /// remains not set. + . . . . fn overwrite(&self, o: Config) -> Config { + 700 ( 0.00%) . . . Config { + 175 ( 0.00%) . . . match_kind: o.match_kind.or(self.match_kind), + 525 ( 0.00%) . . . pre: o.pre.or_else(|| self.pre.clone()), + 175 ( 0.00%) . . . starts_for_each_pattern: o + . . . . .starts_for_each_pattern + . . . . .or(self.starts_for_each_pattern), + . . . . byte_classes: o.byte_classes.or(self.byte_classes), + . . . . unicode_word_boundary: o + . . . . .unicode_word_boundary + . . . . .or(self.unicode_word_boundary), + 875 ( 0.00%) . . . quitset: o.quitset.or(self.quitset), + . . . . specialize_start_states: o + . . . . .specialize_start_states + . . . . .or(self.specialize_start_states), + 175 ( 0.00%) . . . cache_capacity: o.cache_capacity.or(self.cache_capacity), + 175 ( 0.00%) . . . skip_cache_capacity_check: o + . . . . .skip_cache_capacity_check + . . . . .or(self.skip_cache_capacity_check), + 175 ( 0.00%) . . . minimum_cache_clear_count: o + . . . . .minimum_cache_clear_count + . . . . .or(self.minimum_cache_clear_count), + 175 ( 0.00%) . . . minimum_bytes_per_state: o + . . . . .minimum_bytes_per_state + . . . . .or(self.minimum_bytes_per_state), + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// A builder for constructing a lazy deterministic finite automaton from + . . . . /// regular expressions. +-- line 3909 ---------------------------------------- +-- line 3975 ---------------------------------------- + . . . . config: Config, + . . . . #[cfg(feature = "syntax")] + . . . . thompson: thompson::Compiler, + . . . . } + . . . . + . . . . impl Builder { + . . . . /// Create a new lazy DFA builder with the default configuration. + . . . . pub fn new() -> Builder { + 2,236 ( 0.00%) . . . Builder { + . . . . config: Config::default(), + . . . . #[cfg(feature = "syntax")] + 512 ( 0.00%) . . . thompson: thompson::Compiler::new(), + 3,523 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (13x) + . . . . } + . . . . } + . . . . + . . . . /// Build a lazy DFA from the given pattern. + . . . . /// + . . . . /// If there was a problem parsing or compiling the pattern, then an error + . . . . /// is returned. + . . . . #[cfg(feature = "syntax")] +-- line 3994 ---------------------------------------- +-- line 4047 ---------------------------------------- + . . . . /// let dfa = DFA::builder().build_from_nfa(nfa)?; + . . . . /// let mut cache = dfa.create_cache(); + . . . . /// let expected = Some(HalfMatch::must(0, 6)); + . . . . /// let got = dfa.try_search_fwd(&mut cache, &Input::new(haystack))?; + . . . . /// assert_eq!(expected, got); + . . . . /// + . . . . /// # Ok::<(), Box>(()) + . . . . /// ``` + 1,575 ( 0.00%) . . . pub fn build_from_nfa( + . . . . &self, + . . . . nfa: thompson::NFA, + . . . . ) -> Result { + 1,225 ( 0.00%) . . . let quitset = self.config.quit_set_from_nfa(&nfa)?; + . . . . let classes = self.config.byte_classes_from_nfa(&nfa, &quitset); + . . . . // Check that we can fit at least a few states into our cache, + . . . . // otherwise it's pretty senseless to use the lazy DFA. This does have + . . . . // a possible failure mode though. This assumes the maximum size of a + . . . . // state in powerset space (so, the total number of NFA states), which + . . . . // may never actually materialize, and could be quite a bit larger + . . . . // than the actual biggest state. If this turns out to be a problem, + . . . . // we could expose a knob that disables this check. But if so, we have + . . . . // to be careful not to panic in other areas of the code (the cache + . . . . // clearing and init code) that tend to assume some minimum useful + . . . . // cache capacity. + 175 ( 0.00%) . . . let min_cache = minimum_cache_capacity( + . . . . &nfa, + . . . . &classes, + . . . . self.config.get_starts_for_each_pattern(), + . . . . ); + . . . . let mut cache_capacity = self.config.get_cache_capacity(); + 350 ( 0.00%) . . . if cache_capacity < min_cache { + . . . . // When the caller has asked us to skip the cache capacity check, + . . . . // then we simply force the cache capacity to its minimum amount + . . . . // and mush on. + . . . . if self.config.get_skip_cache_capacity_check() { + . . . . debug!( + . . . . "given capacity ({}) is too small, \ + . . . . since skip_cache_capacity_check is enabled, \ + . . . . setting cache capacity to minimum ({})", +-- line 4085 ---------------------------------------- +-- line 4097 ---------------------------------------- + . . . . // of states in our state ID space. This is unlikely to trigger in + . . . . // >=32-bit systems, but 16-bit systems have a pretty small state ID + . . . . // space since a number of bits are used up as sentinels. + . . . . if let Err(err) = minimum_lazy_state_id(&classes) { + . . . . return Err(BuildError::insufficient_state_id_capacity(err)); + . . . . } + . . . . let stride2 = classes.stride2(); + . . . . let start_map = StartByteMap::new(nfa.look_matcher()); + 8,925 ( 0.00%) . . . Ok(DFA { + 13,475 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) + . . . . config: self.config.clone(), + 175 ( 0.00%) . . . nfa, + . . . . stride2, + 700 ( 0.00%) . . . start_map, + 5,250 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) + 525 ( 0.00%) . . . classes, + 5,250 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (175x) + . . . . quitset, + . . . . cache_capacity, + . . . . }) + 1,575 ( 0.00%) . . . } + . . . . + . . . . /// Apply the given lazy DFA configuration options to this builder. + 1,400 ( 0.00%) . . . pub fn configure(&mut self, config: Config) -> &mut Builder { + 4,375 ( 0.00%) . . . self.config = self.config.overwrite(config); + . . . . self + 1,575 ( 0.00%) . . . } + . . . . + . . . . /// Set the syntax configuration for this builder using + . . . . /// [`syntax::Config`](crate::util::syntax::Config). + . . . . /// + . . . . /// This permits setting things like case insensitivity, Unicode and multi + . . . . /// line mode. + . . . . /// + . . . . /// These settings only apply when constructing a lazy DFA directly from a +-- line 4128 ---------------------------------------- +-- line 4282 ---------------------------------------- + . . . . /// It's not likely for this to have any impact 32-bit systems (or higher), but + . . . . /// on 16-bit systems, the lazy state ID space is quite constrained and thus + . . . . /// may be insufficient if our MIN_STATES value is (for some reason) too high. + . . . . fn minimum_lazy_state_id( + . . . . classes: &ByteClasses, + . . . . ) -> Result { + . . . . let stride = 1 << classes.stride2(); + . . . . let min_state_index = MIN_STATES.checked_sub(1).unwrap(); + 350 ( 0.00%) . . . LazyStateID::new(min_state_index * stride) + . . . . } + . . . . + . . . . /// Based on the minimum number of states required for a useful lazy DFA cache, + . . . . /// this returns a heuristic minimum number of bytes of heap space required. + . . . . /// + . . . . /// This is a "heuristic" because the minimum it returns is likely bigger than + . . . . /// the true minimum. Namely, it assumes that each powerset NFA/DFA state uses + . . . . /// the maximum number of NFA states (all of them). This is likely bigger +-- line 4298 ---------------------------------------- +-- line 4322 ---------------------------------------- + . . . . starts_for_each_pattern: bool, + . . . . ) -> usize { + . . . . const ID_SIZE: usize = size_of::(); + . . . . const STATE_SIZE: usize = size_of::(); + . . . . + . . . . let stride = 1 << classes.stride2(); + . . . . let states_len = nfa.states().len(); + . . . . let sparses = 2 * states_len * NFAStateID::SIZE; + 350 ( 0.00%) . . . let trans = MIN_STATES * stride * ID_SIZE; + . . . . + . . . . let mut starts = Start::len() * ID_SIZE; + 175 ( 0.00%) . . . if starts_for_each_pattern { + 486 ( 0.00%) . . . starts += (Start::len() * nfa.pattern_len()) * ID_SIZE; + . . . . } + . . . . + . . . . // The min number of states HAS to be at least 4: we have 3 sentinel states + . . . . // and then we need space for one more when we save a state after clearing + . . . . // the cache. We also need space for one more, otherwise we get stuck in a + . . . . // loop where we try to add a 5th state, which gets rejected, which clears + . . . . // the cache, which adds back a saved state (4th total state) which then + . . . . // tries to add the 5th state again. +-- line 4342 ---------------------------------------- +-- line 4350 ---------------------------------------- + . . . . // Every `State` has 5 bytes for flags, 4 bytes (max) for the number of + . . . . // patterns, followed by 32-bit encodings of patterns and then delta + . . . . // varint encodings of NFA state IDs. We use the worst case (which isn't + . . . . // technically possible) of 5 bytes for each NFA state ID. + . . . . // + . . . . // HOWEVER, three of the states needed by a lazy DFA are just the sentinel + . . . . // unknown, dead and quit states. Those states have a known size and it is + . . . . // small. + 700 ( 0.00%) . . . let dead_state_size = State::dead().memory_usage(); + 67,176 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs:regex_automata::util::determinize::state::State::dead (175x) + 700 ( 0.00%) . . . let max_state_size = 5 + 4 + (nfa.pattern_len() * 4) + (states_len * 5); + 350 ( 0.00%) . . . let states = (SENTINEL_STATES * (STATE_SIZE + dead_state_size)) + . . . . + (non_sentinel * (STATE_SIZE + max_state_size)); + . . . . // NOTE: We don't double count heap memory used by State for this map since + . . . . // we use reference counting to avoid doubling memory usage. (This tends to + . . . . // be where most memory is allocated in the cache.) + . . . . let states_to_sid = (MIN_STATES * STATE_SIZE) + (MIN_STATES * ID_SIZE); + . . . . let stack = states_len * NFAStateID::SIZE; + . . . . let scratch_state_builder = max_state_size; + . . . . + 1,225 ( 0.00%) . . . trans + . . . . + starts + . . . . + states + . . . . + states_to_sid + . . . . + sparses + . . . . + stack + . . . . + scratch_state_builder + . . . . } + . . . . +-- line 4377 ---------------------------------------- + +118,629 ( 0.03%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 110 ---------------------------------------- + . . . . /// analysis over an `Ast` without using a stack size proportional to the depth + . . . . /// of the `Ast`. Namely, this method will instead use constant stack size, but + . . . . /// will use heap space proportional to the size of the `Ast`. This may be + . . . . /// desirable in cases where the size of `Ast` is proportional to end user + . . . . /// input. + . . . . /// + . . . . /// If the visitor returns an error at any point, then visiting is stopped and + . . . . /// the error is returned. + 1,539 ( 0.00%) . . . pub fn visit(ast: &Ast, visitor: V) -> Result { + . . . . HeapVisitor::new().visit(ast, visitor) + 1,458 ( 0.00%) . . . } + . . . . + . . . . /// HeapVisitor visits every item in an `Ast` recursively using constant stack + . . . . /// size and a heap size proportional to the size of the `Ast`. + . . . . struct HeapVisitor<'a> { + . . . . /// A stack of `Ast` nodes. This is roughly analogous to the call stack + . . . . /// used in a typical recursive visitor. + . . . . stack: Vec<(&'a Ast, Frame<'a>)>, + . . . . /// Similar to the `Ast` stack above, but is used only for character +-- line 128 ---------------------------------------- +-- line 194 ---------------------------------------- + . . . . /// syntax, which is not possible.) + . . . . enum ClassInduct<'a> { + . . . . Item(&'a ast::ClassSetItem), + . . . . BinaryOp(&'a ast::ClassSetBinaryOp), + . . . . } + . . . . + . . . . impl<'a> HeapVisitor<'a> { + . . . . fn new() -> HeapVisitor<'a> { + 486 ( 0.00%) . . . HeapVisitor { stack: vec![], stack_class: vec![] } + . . . . } + . . . . + . . . . fn visit( + . . . . &mut self, + . . . . mut ast: &'a Ast, + . . . . mut visitor: V, + . . . . ) -> Result { + . . . . self.stack.clear(); + . . . . self.stack_class.clear(); + . . . . + . . . . visitor.start(); + . . . . loop { + 569,805 ( 0.16%) . . . visitor.visit_pre(ast)?; +2,503,709 ( 0.72%) 1,256 ( 0.16%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_pre (71,256x) +1,928,319 ( 0.56%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs: as regex_syntax::ast::visitor::Visitor>::visit_pre (71,256x) + 142,512 ( 0.04%) . . . if let Some(x) = self.induct(ast, &mut visitor)? { + . . . . let child = x.child(); + . . . . self.stack.push((ast, x)); + . . . . ast = child; + . . . . continue; + . . . . } + . . . . // No induction means we have a base case, so we can post visit + . . . . // it now. + 209,520 ( 0.06%) . . . visitor.visit_post(ast)?; + . . . . + . . . . // At this point, we now try to pop our call stack until it is + . . . . // either empty or we hit another inductive case. + . . . . loop { + 546,600 ( 0.16%) . . . let (post_ast, frame) = match self.stack.pop() { + 648 ( 0.00%) . . . None => return visitor.finish(), + 6,075 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::finish (81x) + . . . . Some((post_ast, frame)) => (post_ast, frame), + . . . . }; + . . . . // If this is a concat/alternate, then we might have additional + . . . . // inductive steps to process. + . . . . if let Some(x) = self.pop(frame) { + . . . . match x { + . . . . Frame::Alternation { .. } => { + . . . . visitor.visit_alternation_in()?; +-- line 238 ---------------------------------------- +-- line 243 ---------------------------------------- + . . . . _ => {} + . . . . } + . . . . ast = x.child(); + . . . . self.stack.push((post_ast, x)); + . . . . break; + . . . . } + . . . . // Otherwise, we've finished visiting all the child nodes for + . . . . // this AST, so we can post visit it now. + 56,628 ( 0.02%) . . . visitor.visit_post(post_ast)?; + . . . . } + . . . . } + . . . . } + . . . . + . . . . /// Build a stack frame for the given AST if one is needed (which occurs if + . . . . /// and only if there are child nodes in the AST). Otherwise, return None. + . . . . /// + . . . . /// If this visits a class, then the underlying visitor implementation may + . . . . /// return an error which will be passed on here. + . . . . fn induct( + . . . . &mut self, + . . . . ast: &'a Ast, + . . . . visitor: &mut V, + . . . . ) -> Result>, V::Err> { + 427,536 ( 0.12%) . . . Ok(match *ast { + . . . . Ast::ClassBracketed(ref x) => { + . . . . self.visit_class(x, visitor)?; + . . . . None + . . . . } + . . . . Ast::Repetition(ref x) => Some(Frame::Repetition(x)), + . . . . Ast::Group(ref x) => Some(Frame::Group(x)), + 31,572 ( 0.01%) . . . Ast::Concat(ref x) if x.asts.is_empty() => None, + . . . . Ast::Concat(ref x) => { + 31,572 ( 0.01%) . . . Some(Frame::Concat { head: &x.asts[0], tail: &x.asts[1..] }) + . . . . } + 1,024 ( 0.00%) . . . Ast::Alternation(ref x) if x.asts.is_empty() => None, + . . . . Ast::Alternation(ref x) => Some(Frame::Alternation { + 1,024 ( 0.00%) . . . head: &x.asts[0], + . . . . tail: &x.asts[1..], + . . . . }), + . . . . _ => None, + . . . . }) + . . . . } + . . . . + . . . . /// Pops the given frame. If the frame has an additional inductive step, + . . . . /// then return it, otherwise return `None`. + . . . . fn pop(&self, induct: Frame<'a>) -> Option> { + 353,297 ( 0.10%) . . . match induct { + . . . . Frame::Repetition(_) => None, + . . . . Frame::Group(_) => None, + . . . . Frame::Concat { tail, .. } => { + 140,682 ( 0.04%) . . . if tail.is_empty() { + . . . . None + . . . . } else { + . . . . Some(Frame::Concat { head: &tail[0], tail: &tail[1..] }) + . . . . } + . . . . } + . . . . Frame::Alternation { tail, .. } => { + 32,882 ( 0.01%) . . . if tail.is_empty() { + . . . . None + . . . . } else { + . . . . Some(Frame::Alternation { + . . . . head: &tail[0], + . . . . tail: &tail[1..], + . . . . }) + . . . . } + . . . . } +-- line 308 ---------------------------------------- +-- line 323 ---------------------------------------- + . . . . ast = child; + . . . . continue; + . . . . } + . . . . self.visit_class_post(&ast, visitor)?; + . . . . + . . . . // At this point, we now try to pop our call stack until it is + . . . . // either empty or we hit another inductive case. + . . . . loop { + 23,786 ( 0.01%) . . . let (post_ast, frame) = match self.stack_class.pop() { + . . . . None => return Ok(()), + . . . . Some((post_ast, frame)) => (post_ast, frame), + . . . . }; + . . . . // If this is a union or a binary op, then we might have + . . . . // additional inductive steps to process. + . . . . if let Some(x) = self.pop_class(frame) { + . . . . if let ClassFrame::BinaryRHS { ref op, .. } = x { + . . . . visitor.visit_class_set_binary_op_in(op)?; +-- line 339 ---------------------------------------- +-- line 350 ---------------------------------------- + . . . . } + . . . . + . . . . /// Call the appropriate `Visitor` methods given an inductive step. + . . . . fn visit_class_pre( + . . . . &self, + . . . . ast: &ClassInduct<'a>, + . . . . visitor: &mut V, + . . . . ) -> Result<(), V::Err> { + 25,170 ( 0.01%) . . . match *ast { + . . . . ClassInduct::Item(item) => { + 34,412 ( 0.01%) . . . visitor.visit_class_set_item_pre(item)?; + 111,580 ( 0.03%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/parse.rs: as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre (4,916x) + 64,743 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_pre (4,916x) + . . . . } + . . . . ClassInduct::BinaryOp(op) => { + 4,916 ( 0.00%) . . . visitor.visit_class_set_binary_op_pre(op)?; + . . . . } + . . . . } + . . . . Ok(()) + . . . . } + . . . . + . . . . /// Call the appropriate `Visitor` methods given an inductive step. + . . . . fn visit_class_post( + . . . . &self, + . . . . ast: &ClassInduct<'a>, + . . . . visitor: &mut V, + . . . . ) -> Result<(), V::Err> { + 2,384 ( 0.00%) . . . match *ast { + . . . . ClassInduct::Item(item) => { + 22,196 ( 0.01%) . . . visitor.visit_class_set_item_post(item)?; +1,599,466 ( 0.46%) 1,609 ( 0.20%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:::visit_class_set_item_post (4,916x) + . . . . } + . . . . ClassInduct::BinaryOp(op) => { + 1,192 ( 0.00%) . . . visitor.visit_class_set_binary_op_post(op)?; + . . . . } + . . . . } + . . . . Ok(()) + . . . . } + . . . . + . . . . /// Build a stack frame for the given class node if one is needed (which + . . . . /// occurs if and only if there are child nodes). Otherwise, return None. + . . . . fn induct_class(&self, ast: &ClassInduct<'a>) -> Option> { + 47,060 ( 0.01%) . . . match *ast { + . . . . ClassInduct::Item(&ast::ClassSetItem::Bracketed(ref x)) => { + 426 ( 0.00%) . . . match x.kind { + . . . . ast::ClassSet::Item(ref item) => { + . . . . Some(ClassFrame::Union { head: item, tail: &[] }) + . . . . } + . . . . ast::ClassSet::BinaryOp(ref op) => { + . . . . Some(ClassFrame::Binary { op }) + . . . . } + . . . . } + . . . . } + . . . . ClassInduct::Item(&ast::ClassSetItem::Union(ref x)) => { + 1,050 ( 0.00%) . . . if x.items.is_empty() { + . . . . None + . . . . } else { + . . . . Some(ClassFrame::Union { + 1,050 ( 0.00%) . . . head: &x.items[0], + . . . . tail: &x.items[1..], + . . . . }) + . . . . } + . . . . } + . . . . ClassInduct::BinaryOp(op) => { + . . . . Some(ClassFrame::BinaryLHS { op, lhs: &op.lhs, rhs: &op.rhs }) + . . . . } + . . . . _ => None, +-- line 413 ---------------------------------------- +-- line 414 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . /// Pops the given frame. If the frame has an additional inductive step, + . . . . /// then return it, otherwise return `None`. + . . . . fn pop_class(&self, induct: ClassFrame<'a>) -> Option> { + . . . . match induct { + . . . . ClassFrame::Union { tail, .. } => { + 8,652 ( 0.00%) . . . if tail.is_empty() { + . . . . None + . . . . } else { + . . . . Some(ClassFrame::Union { + . . . . head: &tail[0], + . . . . tail: &tail[1..], + . . . . }) + . . . . } + . . . . } +-- line 430 ---------------------------------------- +-- line 437 ---------------------------------------- + . . . . } + . . . . } + . . . . + . . . . impl<'a> Frame<'a> { + . . . . /// Perform the next inductive step on this frame and return the next + . . . . /// child AST node to visit. + . . . . fn child(&self) -> &'a Ast { + . . . . match *self { + 7,540 ( 0.00%) . . . Frame::Repetition(rep) => &rep.ast, + 2,772 ( 0.00%) . . . Frame::Group(group) => &group.ast, + . . . . Frame::Concat { head, .. } => head, + . . . . Frame::Alternation { head, .. } => head, + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl<'a> ClassFrame<'a> { + . . . . /// Perform the next inductive step on this frame and return the next +-- line 454 ---------------------------------------- +-- line 464 ---------------------------------------- + . . . . ClassInduct::from_set(rhs) + . . . . } + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl<'a> ClassInduct<'a> { + . . . . fn from_bracketed(ast: &'a ast::ClassBracketed) -> ClassInduct<'a> { + 5,506 ( 0.00%) . . . ClassInduct::from_set(&ast.kind) + . . . . } + . . . . + . . . . fn from_set(ast: &'a ast::ClassSet) -> ClassInduct<'a> { + 33,036 ( 0.01%) . . . match *ast { + . . . . ast::ClassSet::Item(ref item) => ClassInduct::Item(item), + . . . . ast::ClassSet::BinaryOp(ref op) => ClassInduct::BinaryOp(op), + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl<'a> core::fmt::Debug for ClassFrame<'a> { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +-- line 484 ---------------------------------------- + +1,392,590 ( 0.40%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 116 ---------------------------------------- + . . . . /// no entry in the underlying case folding table), then this returns an + . . . . /// empty slice. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics when called with a `c` that is less than or equal to the + . . . . /// previous call. In other words, callers need to use this method with + . . . . /// strictly increasing values of `c`. + 3,360 ( 0.00%) . . . pub fn mapping(&mut self, c: char) -> &'static [char] { + 3,360 ( 0.00%) . . . if let Some(last) = self.last { + . . . . assert!( + . . . . last < c, + . . . . "got codepoint U+{:X} which occurs before \ + . . . . last codepoint U+{:X}", + . . . . u32::from(c), + . . . . u32::from(last), + . . . . ); + . . . . } + 1,120 ( 0.00%) . . . self.last = Some(c); + 5,600 ( 0.00%) . . . if self.next >= self.table.len() { + . . . . return &[]; + . . . . } + 2,400 ( 0.00%) . . . let (k, v) = self.table[self.next]; + 2,240 ( 0.00%) . . . if k == c { + 160 ( 0.00%) . . . self.next += 1; + . . . . return v; + . . . . } + . . . . match self.get(c) { + . . . . Err(i) => { + . . . . self.next = i; + . . . . &[] + . . . . } + . . . . Ok(i) => { + . . . . // Since we require lookups to proceed + . . . . // in order, anything we find should be + . . . . // after whatever we thought might be + . . . . // next. Otherwise, the caller is either + . . . . // going out of order or we would have + . . . . // found our next key at 'self.next'. + 2,080 ( 0.00%) . . . assert!(i > self.next); + 2,080 ( 0.00%) . . . self.next = i + 1; + 2,080 ( 0.00%) . . . self.table[i].1 + . . . . } + . . . . } + 4,480 ( 0.00%) . . . } + . . . . + . . . . /// Returns true if and only if the given range overlaps with any region + . . . . /// of the underlying case folding table. That is, when true, there exists + . . . . /// at least one codepoint in the inclusive range `[start, end]` that has + . . . . /// a non-trivial equivalence class of case folded codepoints. Conversely, + . . . . /// when this returns false, all codepoints in the range `[start, end]` + . . . . /// correspond to the trivial equivalence class of case folded codepoints, + . . . . /// i.e., itself. +-- line 168 ---------------------------------------- +-- line 170 ---------------------------------------- + . . . . /// This is useful to call before iterating over the codepoints in the + . . . . /// range and looking up the mapping for each. If you know none of the + . . . . /// mappings will return anything, then you might be able to skip doing it + . . . . /// altogether. + . . . . /// + . . . . /// # Panics + . . . . /// + . . . . /// This panics when `end < start`. + 1,120 ( 0.00%) . . . pub fn overlaps(&self, start: char, end: char) -> bool { + . . . . use core::cmp::Ordering; + . . . . + 4,620 ( 0.00%) . . . assert!(start <= end); + 1,120 ( 0.00%) . . . self.table + . . . . .binary_search_by(|&(c, _)| { +92,240 ( 0.03%) . . . if start <= c && c <= end { + . . . . Ordering::Equal +43,640 ( 0.01%) . . . } else if c > end { + . . . . Ordering::Greater + . . . . } else { + . . . . Ordering::Less + . . . . } + . . . . }) + . . . . .is_ok() + 2,240 ( 0.00%) . . . } + . . . . + . . . . /// Returns the index at which `c` occurs in the simple case fold table. If + . . . . /// `c` does not occur, then this returns an `i` such that `table[i-1].0 < + . . . . /// c` and `table[i].0 > c`. + . . . . fn get(&self, c: char) -> Result { + . . . . self.table.binary_search_by_key(&c, |&(c1, _)| c1) + . . . . } + . . . . } +-- line 201 ---------------------------------------- + +52,990 ( 0.02%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 26 ---------------------------------------- + . . . . impl Default for TranslatorBuilder { + . . . . fn default() -> TranslatorBuilder { + . . . . TranslatorBuilder::new() + . . . . } + . . . . } + . . . . + . . . . impl TranslatorBuilder { + . . . . /// Create a new translator builder with a default c onfiguration. + 81 ( 0.00%) . . . pub fn new() -> TranslatorBuilder { + . . . . TranslatorBuilder { + . . . . utf8: true, + . . . . line_terminator: b'\n', + . . . . flags: Flags::default(), + . . . . } + 81 ( 0.00%) . . . } + . . . . + . . . . /// Build a translator using the current configuration. + 81 ( 0.00%) . . . pub fn build(&self) -> Translator { + 405 ( 0.00%) . . . Translator { + . . . . stack: RefCell::new(vec![]), + . . . . flags: Cell::new(self.flags), + . . . . utf8: self.utf8, + 81 ( 0.00%) . . . line_terminator: self.line_terminator, + . . . . } + 81 ( 0.00%) . . . } + . . . . + . . . . /// When disabled, translation will permit the construction of a regular + . . . . /// expression that may match invalid UTF-8. + . . . . /// + . . . . /// When enabled (the default), the translator is guaranteed to produce an + . . . . /// expression that, for non-empty matches, will only ever produce spans + . . . . /// that are entirely valid UTF-8 (otherwise, the translator will return an + . . . . /// error). +-- line 58 ---------------------------------------- +-- line 59 ---------------------------------------- + . . . . /// + . . . . /// Perhaps surprisingly, when UTF-8 is enabled, an empty regex or even + . . . . /// a negated ASCII word boundary (uttered as `(?-u:\B)` in the concrete + . . . . /// syntax) will be allowed even though they can produce matches that split + . . . . /// a UTF-8 encoded codepoint. This only applies to zero-width or "empty" + . . . . /// matches, and it is expected that the regex engine itself must handle + . . . . /// these cases if necessary (perhaps by suppressing any zero-width matches + . . . . /// that split a codepoint). + 81 ( 0.00%) . . . pub fn utf8(&mut self, yes: bool) -> &mut TranslatorBuilder { + 81 ( 0.00%) . . . self.utf8 = yes; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Sets the line terminator for use with `(?u-s:.)` and `(?-us:.)`. + . . . . /// + . . . . /// Namely, instead of `.` (by default) matching everything except for `\n`, + . . . . /// this will cause `.` to match everything except for the byte given. + . . . . /// + . . . . /// If `.` is used in a context where Unicode mode is enabled and this byte + . . . . /// isn't ASCII, then an error will be returned. When Unicode mode is +-- line 78 ---------------------------------------- +-- line 84 ---------------------------------------- + . . . . /// mode or UTF-8 mode are enabled. + . . . . /// + . . . . /// Note that if `R` mode is enabled then it always takes precedence and + . . . . /// the line terminator will be treated as `\r` and `\n` simultaneously. + . . . . /// + . . . . /// Note also that this *doesn't* impact the look-around assertions + . . . . /// `(?m:^)` and `(?m:$)`. That's usually controlled by additional + . . . . /// configuration in the regex engine itself. + 81 ( 0.00%) . . . pub fn line_terminator(&mut self, byte: u8) -> &mut TranslatorBuilder { + 81 ( 0.00%) . . . self.line_terminator = byte; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable or disable the case insensitive flag (`i`) by default. + 162 ( 0.00%) . . . pub fn case_insensitive(&mut self, yes: bool) -> &mut TranslatorBuilder { + 162 ( 0.00%) . . . self.flags.case_insensitive = if yes { Some(true) } else { None }; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable or disable the multi-line matching flag (`m`) by default. + 162 ( 0.00%) . . . pub fn multi_line(&mut self, yes: bool) -> &mut TranslatorBuilder { + 162 ( 0.00%) . . . self.flags.multi_line = if yes { Some(true) } else { None }; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable or disable the "dot matches any character" flag (`s`) by + . . . . /// default. + 162 ( 0.00%) . . . pub fn dot_matches_new_line( + . . . . &mut self, + . . . . yes: bool, + . . . . ) -> &mut TranslatorBuilder { + 162 ( 0.00%) . . . self.flags.dot_matches_new_line = if yes { Some(true) } else { None }; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable or disable the CRLF mode flag (`R`) by default. + 162 ( 0.00%) . . . pub fn crlf(&mut self, yes: bool) -> &mut TranslatorBuilder { + 162 ( 0.00%) . . . self.flags.crlf = if yes { Some(true) } else { None }; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable or disable the "swap greed" flag (`U`) by default. + 162 ( 0.00%) . . . pub fn swap_greed(&mut self, yes: bool) -> &mut TranslatorBuilder { + 162 ( 0.00%) . . . self.flags.swap_greed = if yes { Some(true) } else { None }; + . . . . self + 81 ( 0.00%) . . . } + . . . . + . . . . /// Enable or disable the Unicode flag (`u`) by default. + 81 ( 0.00%) . . . pub fn unicode(&mut self, yes: bool) -> &mut TranslatorBuilder { + 162 ( 0.00%) . . . self.flags.unicode = if yes { None } else { Some(false) }; + . . . . self + 81 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// A translator maps abstract syntax to a high level intermediate + . . . . /// representation. + . . . . /// + . . . . /// A translator may be benefit from reuse. That is, a translator can translate + . . . . /// many abstract syntax trees. + . . . . /// +-- line 143 ---------------------------------------- +-- line 165 ---------------------------------------- + . . . . /// intermediate representation (HIR). + . . . . /// + . . . . /// If there was a problem doing the translation, then an HIR-specific + . . . . /// error is returned. + . . . . /// + . . . . /// The original pattern string used to produce the `Ast` *must* also be + . . . . /// provided. The translator does not use the pattern string during any + . . . . /// correct translation, but is used for error reporting. + 243 ( 0.00%) . . . pub fn translate(&mut self, pattern: &str, ast: &Ast) -> Result { + 162 ( 0.00%) . . . ast::visit(ast, TranslatorI::new(self, pattern)) +68,722,234 (19.85%) 151,909 (18.76%) 27 ( 8.71%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/ast/visitor.rs:regex_syntax::ast::visitor::visit (81x) + 324 ( 0.00%) . . . } + . . . . } + . . . . + . . . . /// An HirFrame is a single stack frame, represented explicitly, which is + . . . . /// created for each item in the Ast that we traverse. + . . . . /// + . . . . /// Note that technically, this type doesn't represent our entire stack + . . . . /// frame. In particular, the Ast visitor represents any state associated with + . . . . /// traversing the Ast itself. +-- line 183 ---------------------------------------- +-- line 245 ---------------------------------------- + . . . . /// + . . . . /// It is popped after each expression in a branch until an 'Alternation' + . . . . /// frame is observed when doing a post visit on an alternation. + . . . . AlternationBranch, + . . . . } + . . . . + . . . . impl HirFrame { + . . . . /// Assert that the current stack frame is an Hir expression and return it. + 23,931 ( 0.01%) . . . fn unwrap_expr(self) -> Hir { + 21,272 ( 0.01%) . . . match self { + 15,954 ( 0.00%) . . . HirFrame::Expr(expr) => expr, + . . . . HirFrame::Literal(lit) => Hir::literal(lit), + . . . . _ => panic!("tried to unwrap expr from HirFrame, got: {:?}", self), + . . . . } + 26,590 ( 0.01%) . . . } + . . . . + . . . . /// Assert that the current stack frame is a Unicode class expression and + . . . . /// return it. + . . . . fn unwrap_class_unicode(self) -> hir::ClassUnicode { + 14,430 ( 0.00%) . . . match self { + 28,860 ( 0.01%) . . . HirFrame::ClassUnicode(cls) => cls, + . . . . _ => panic!( + . . . . "tried to unwrap Unicode class \ + . . . . from HirFrame, got: {:?}", + . . . . self + . . . . ), + . . . . } + . . . . } + . . . . +-- line 273 ---------------------------------------- +-- line 282 ---------------------------------------- + . . . . self + . . . . ), + . . . . } + . . . . } + . . . . + . . . . /// Assert that the current stack frame is a repetition sentinel. If it + . . . . /// isn't, then panic. + . . . . fn unwrap_repetition(self) { + 3,770 ( 0.00%) . . . match self { + . . . . HirFrame::Repetition => {} + . . . . _ => { + . . . . panic!( + . . . . "tried to unwrap repetition from HirFrame, got: {:?}", + . . . . self + . . . . ) + . . . . } + . . . . } + 1,885 ( 0.00%) . . . } + 16,965 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (1,885x) + . . . . + . . . . /// Assert that the current stack frame is a group indicator and return + . . . . /// its corresponding flags (the flags that were active at the time the + . . . . /// group was entered). + . . . . fn unwrap_group(self) -> Flags { + 1,386 ( 0.00%) . . . match self { + . . . . HirFrame::Group { old_flags } => old_flags, + . . . . _ => { + . . . . panic!("tried to unwrap group from HirFrame, got: {:?}", self) + . . . . } + . . . . } + 693 ( 0.00%) . . . } + 6,237 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (693x) + . . . . + . . . . /// Assert that the current stack frame is an alternation pipe sentinel. If + . . . . /// it isn't, then panic. + . . . . fn unwrap_alternation_pipe(self) { + 32,882 ( 0.01%) . . . match self { + . . . . HirFrame::AlternationBranch => {} + . . . . _ => { + . . . . panic!( + . . . . "tried to unwrap alt pipe from HirFrame, got: {:?}", + . . . . self + . . . . ) + . . . . } + . . . . } + 32,882 ( 0.01%) . . . } +147,969 ( 0.04%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (16,441x) + . . . . } + . . . . + . . . . impl<'t, 'p> Visitor for TranslatorI<'t, 'p> { + . . . . type Output = Hir; + . . . . type Err = Error; + . . . . + 162 ( 0.00%) . . . fn finish(self) -> Result { + . . . . // ... otherwise, we should have exactly one HIR on the stack. + 243 ( 0.00%) . . . assert_eq!(self.trans().stack.borrow().len(), 1); + 162 ( 0.00%) . . . Ok(self.pop().unwrap().unwrap_expr()) + 2,673 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::HirFrame::unwrap_expr (81x) + 324 ( 0.00%) . . . } + . . . . +570,048 ( 0.16%) . . . fn visit_pre(&mut self, ast: &Ast) -> Result<()> { +285,024 ( 0.08%) . . . match *ast { + . . . . Ast::ClassBracketed(_) => { + 5,506 ( 0.00%) . . . if self.flags().unicode() { + . . . . let cls = hir::ClassUnicode::empty(); + . . . . self.push(HirFrame::ClassUnicode(cls)); + . . . . } else { + . . . . let cls = hir::ClassBytes::empty(); + . . . . self.push(HirFrame::ClassBytes(cls)); + . . . . } + . . . . } + 1,885 ( 0.00%) . . . Ast::Repetition(_) => self.push(HirFrame::Repetition), + . . . . Ast::Group(ref x) => { + 1,386 ( 0.00%) . . . let old_flags = x + . . . . .flags() + . . . . .map(|ast| self.set_flags(ast)) + . . . . .unwrap_or_else(|| self.flags()); + . . . . self.push(HirFrame::Group { old_flags }); + . . . . } + . . . . Ast::Concat(_) => { + 15,786 ( 0.00%) . . . self.push(HirFrame::Concat); + . . . . } + . . . . Ast::Alternation(ref x) => { + 512 ( 0.00%) . . . self.push(HirFrame::Alternation); + 1,024 ( 0.00%) . . . if !x.asts.is_empty() { + . . . . self.push(HirFrame::AlternationBranch); + . . . . } + . . . . } + . . . . _ => {} + . . . . } + 71,256 ( 0.02%) . . . Ok(()) +641,304 ( 0.19%) . . . } + . . . . +712,560 ( 0.21%) . . . fn visit_post(&mut self, ast: &Ast) -> Result<()> { +356,280 ( 0.10%) . . . match *ast { + . . . . Ast::Empty(_) => { + . . . . self.push(HirFrame::Expr(Hir::empty())); + . . . . } + . . . . Ast::Flags(ref x) => { + 80 ( 0.00%) . . . self.set_flags(&x.flags); + . . . . // Flags in the AST are generally considered directives and + . . . . // not actual sub-expressions. However, they can be used in + . . . . // the concrete syntax like `((?i))`, and we need some kind of + . . . . // indication of an expression there, and Empty is the correct + . . . . // choice. + . . . . // + . . . . // There can also be things like `(?i)+`, but we rule those out + . . . . // in the parser. In the future, we might allow them for + . . . . // consistency sake. + . . . . self.push(HirFrame::Expr(Hir::empty())); + . . . . } + 49,480 ( 0.01%) . . . Ast::Literal(ref x) => match self.ast_literal_to_scalar(x)? { + . . . . Either::Right(byte) => self.push_byte(byte), +395,840 ( 0.11%) . . . Either::Left(ch) => match self.case_fold_char(x.span, ch)? { + . . . . None => self.push_char(ch), + . . . . Some(expr) => self.push(HirFrame::Expr(expr)), + . . . . }, + . . . . }, + . . . . Ast::Dot(ref span) => { + 35 ( 0.00%) . . . self.push(HirFrame::Expr(self.hir_dot(**span)?)); + . . . . } + . . . . Ast::Assertion(ref x) => { + 366 ( 0.00%) . . . self.push(HirFrame::Expr(self.hir_assertion(x)?)); + . . . . } + . . . . Ast::ClassPerl(ref x) => { + . . . . if self.flags().unicode() { + . . . . let cls = self.hir_perl_unicode_class(x)?; + . . . . let hcls = hir::Class::Unicode(cls); + . . . . self.push(HirFrame::Expr(Hir::class(hcls))); + . . . . } else { + . . . . let cls = self.hir_perl_byte_class(x)?; +-- line 408 ---------------------------------------- +-- line 410 ---------------------------------------- + . . . . self.push(HirFrame::Expr(Hir::class(hcls))); + . . . . } + . . . . } + . . . . Ast::ClassUnicode(ref x) => { + . . . . let cls = hir::Class::Unicode(self.hir_unicode_class(x)?); + . . . . self.push(HirFrame::Expr(Hir::class(cls))); + . . . . } + . . . . Ast::ClassBracketed(ref ast) => { + 5,506 ( 0.00%) . . . if self.flags().unicode() { + 2,753 ( 0.00%) . . . let mut cls = self.pop().unwrap().unwrap_class_unicode(); + . . . . self.unicode_fold_and_negate( + 2,753 ( 0.00%) . . . &ast.span, + 5,506 ( 0.00%) . . . ast.negated, + . . . . &mut cls, + . . . . )?; + 13,765 ( 0.00%) . . . let expr = Hir::class(hir::Class::Unicode(cls)); + . . . . self.push(HirFrame::Expr(expr)); + . . . . } else { + . . . . let mut cls = self.pop().unwrap().unwrap_class_bytes(); + . . . . self.bytes_fold_and_negate( + . . . . &ast.span, + . . . . ast.negated, + . . . . &mut cls, + . . . . )?; + . . . . let expr = Hir::class(hir::Class::Bytes(cls)); + . . . . self.push(HirFrame::Expr(expr)); + . . . . } + . . . . } + . . . . Ast::Repetition(ref x) => { + 3,770 ( 0.00%) . . . let expr = self.pop().unwrap().unwrap_expr(); + 62,205 ( 0.02%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::HirFrame::unwrap_expr (1,885x) + . . . . self.pop().unwrap().unwrap_repetition(); + 9,425 ( 0.00%) . . . self.push(HirFrame::Expr(self.hir_repetition(x, expr))); + . . . . } + . . . . Ast::Group(ref x) => { + 1,386 ( 0.00%) . . . let expr = self.pop().unwrap().unwrap_expr(); + 22,869 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::HirFrame::unwrap_expr (693x) + . . . . let old_flags = self.pop().unwrap().unwrap_group(); + . . . . self.trans().flags.set(old_flags); + 5,544 ( 0.00%) . . . self.push(HirFrame::Expr(self.hir_capture(x, expr))); + . . . . } + . . . . Ast::Concat(_) => { + . . . . let mut exprs = vec![]; +210,600 ( 0.06%) . . . while let Some(expr) = self.pop_concat_expr() { + 39,784 ( 0.01%) . . . if !matches!(*expr.kind(), HirKind::Empty) { +198,720 ( 0.06%) . . . exprs.push(expr); + . . . . } + 40 ( 0.00%) . . . } + 3,020 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (20x) + 1,925 ( 0.00%) . . . exprs.reverse(); +110,502 ( 0.03%) . . . self.push(HirFrame::Expr(Hir::concat(exprs))); +24,202,143 ( 6.99%) 51,330 ( 6.34%) 3 ( 0.97%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (15,786x) + . . . . } + . . . . Ast::Alternation(_) => { + . . . . let mut exprs = vec![]; + 33,906 ( 0.01%) . . . while let Some(expr) = self.pop_alt_expr() { + . . . . self.pop().unwrap().unwrap_alternation_pipe(); + . . . . exprs.push(expr); + . . . . } + 512 ( 0.00%) . . . exprs.reverse(); + 3,584 ( 0.00%) . . . self.push(HirFrame::Expr(Hir::alternation(exprs))); +6,081,394 ( 1.76%) 2,345 ( 0.29%) 4 ( 1.29%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (512x) + . . . . } + . . . . } + 71,378 ( 0.02%) . . . Ok(()) +641,304 ( 0.19%) . . . } + . . . . + . . . . fn visit_alternation_in(&mut self) -> Result<()> { + 15,929 ( 0.00%) . . . self.push(HirFrame::AlternationBranch); + . . . . Ok(()) + . . . . } + . . . . + 19,664 ( 0.01%) . . . fn visit_class_set_item_pre( + . . . . &mut self, + . . . . ast: &ast::ClassSetItem, + . . . . ) -> Result<()> { + 9,832 ( 0.00%) . . . match *ast { + . . . . ast::ClassSetItem::Bracketed(_) => { + 142 ( 0.00%) . . . if self.flags().unicode() { + . . . . let cls = hir::ClassUnicode::empty(); + . . . . self.push(HirFrame::ClassUnicode(cls)); + . . . . } else { + . . . . let cls = hir::ClassBytes::empty(); + . . . . self.push(HirFrame::ClassBytes(cls)); + . . . . } + . . . . } + . . . . // We needn't handle the Union case here since the visitor will + . . . . // do it for us. + . . . . _ => {} + . . . . } + 4,916 ( 0.00%) . . . Ok(()) + 24,580 ( 0.01%) . . . } + . . . . + 49,160 ( 0.01%) . . . fn visit_class_set_item_post( + . . . . &mut self, + . . . . ast: &ast::ClassSetItem, + . . . . ) -> Result<()> { + 24,580 ( 0.01%) . . . match *ast { + . . . . ast::ClassSetItem::Empty(_) => {} + . . . . ast::ClassSetItem::Literal(ref x) => { + 7,090 ( 0.00%) . . . if self.flags().unicode() { + 3,545 ( 0.00%) . . . let mut cls = self.pop().unwrap().unwrap_class_unicode(); + 3,545 ( 0.00%) . . . cls.push(hir::ClassUnicodeRange::new(x.c, x.c)); + . . . . self.push(HirFrame::ClassUnicode(cls)); + . . . . } else { + . . . . let mut cls = self.pop().unwrap().unwrap_class_bytes(); + . . . . let byte = self.class_literal_byte(x)?; + . . . . cls.push(hir::ClassBytesRange::new(byte, byte)); + . . . . self.push(HirFrame::ClassBytes(cls)); + . . . . } + . . . . } +-- line 515 ---------------------------------------- +-- line 521 ---------------------------------------- + . . . . } else { + . . . . let mut cls = self.pop().unwrap().unwrap_class_bytes(); + . . . . let start = self.class_literal_byte(&x.start)?; + . . . . let end = self.class_literal_byte(&x.end)?; + . . . . cls.push(hir::ClassBytesRange::new(start, end)); + . . . . self.push(HirFrame::ClassBytes(cls)); + . . . . } + . . . . } + 770 ( 0.00%) . . . ast::ClassSetItem::Ascii(ref x) => { + 1,540 ( 0.00%) . . . if self.flags().unicode() { + . . . . let xcls = self.hir_ascii_unicode_class(x)?; + 770 ( 0.00%) . . . let mut cls = self.pop().unwrap().unwrap_class_unicode(); + . . . . cls.union(&xcls); + 9,240 ( 0.00%) . . . self.push(HirFrame::ClassUnicode(cls)); + . . . . } else { + . . . . let xcls = self.hir_ascii_byte_class(x)?; + . . . . let mut cls = self.pop().unwrap().unwrap_class_bytes(); + . . . . cls.union(&xcls); + . . . . self.push(HirFrame::ClassBytes(cls)); + . . . . } + . . . . } + . . . . ast::ClassSetItem::Unicode(ref x) => { + . . . . let xcls = self.hir_unicode_class(x)?; + . . . . let mut cls = self.pop().unwrap().unwrap_class_unicode(); + . . . . cls.union(&xcls); + . . . . self.push(HirFrame::ClassUnicode(cls)); + . . . . } + 5 ( 0.00%) . . . ast::ClassSetItem::Perl(ref x) => { + 10 ( 0.00%) . . . if self.flags().unicode() { + 15 ( 0.00%) . . . let xcls = self.hir_perl_unicode_class(x)?; + 9,820 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/translate.rs:regex_syntax::hir::translate::TranslatorI::hir_perl_unicode_class (5x) + 5 ( 0.00%) . . . let mut cls = self.pop().unwrap().unwrap_class_unicode(); + . . . . cls.union(&xcls); + 60 ( 0.00%) . . . self.push(HirFrame::ClassUnicode(cls)); + . . . . } else { + . . . . let xcls = self.hir_perl_byte_class(x)?; + . . . . let mut cls = self.pop().unwrap().unwrap_class_bytes(); + . . . . cls.union(&xcls); + . . . . self.push(HirFrame::ClassBytes(cls)); + . . . . } + . . . . } + . . . . ast::ClassSetItem::Bracketed(ref ast) => { + 142 ( 0.00%) . . . if self.flags().unicode() { + 71 ( 0.00%) . . . let mut cls1 = self.pop().unwrap().unwrap_class_unicode(); + . . . . self.unicode_fold_and_negate( + 71 ( 0.00%) . . . &ast.span, + 142 ( 0.00%) . . . ast.negated, + . . . . &mut cls1, + . . . . )?; + . . . . + . . . . let mut cls2 = self.pop().unwrap().unwrap_class_unicode(); + . . . . cls2.union(&cls1); + 852 ( 0.00%) . . . self.push(HirFrame::ClassUnicode(cls2)); + . . . . } else { + . . . . let mut cls1 = self.pop().unwrap().unwrap_class_bytes(); + . . . . self.bytes_fold_and_negate( + . . . . &ast.span, + . . . . ast.negated, + . . . . &mut cls1, + . . . . )?; + . . . . +-- line 580 ---------------------------------------- +-- line 581 ---------------------------------------- + . . . . let mut cls2 = self.pop().unwrap().unwrap_class_bytes(); + . . . . cls2.union(&cls1); + . . . . self.push(HirFrame::ClassBytes(cls2)); + . . . . } + . . . . } + . . . . // This is handled automatically by the visitor. + . . . . ast::ClassSetItem::Union(_) => {} + . . . . } + 4,916 ( 0.00%) . . . Ok(()) + 44,244 ( 0.01%) . . . } + . . . . + . . . . fn visit_class_set_binary_op_pre( + . . . . &mut self, + . . . . _op: &ast::ClassSetBinaryOp, + . . . . ) -> Result<()> { + . . . . if self.flags().unicode() { + . . . . let cls = hir::ClassUnicode::empty(); + . . . . self.push(HirFrame::ClassUnicode(cls)); +-- line 598 ---------------------------------------- +-- line 678 ---------------------------------------- + . . . . struct TranslatorI<'t, 'p> { + . . . . trans: &'t Translator, + . . . . pattern: &'p str, + . . . . } + . . . . + . . . . impl<'t, 'p> TranslatorI<'t, 'p> { + . . . . /// Build a new internal translator. + . . . . fn new(trans: &'t Translator, pattern: &'p str) -> TranslatorI<'t, 'p> { + 324 ( 0.00%) . . . TranslatorI { trans, pattern } + . . . . } + . . . . + . . . . /// Return a reference to the underlying translator. + . . . . fn trans(&self) -> &Translator { + . . . . &self.trans + . . . . } + . . . . + . . . . /// Push the given frame on to the call stack. + . . . . fn push(&self, frame: HirFrame) { + 255 ( 0.00%) . . . self.trans().stack.borrow_mut().push(frame); + . . . . } + . . . . + . . . . /// Push the given literal char on to the call stack. + . . . . /// + . . . . /// If the top-most element of the stack is a literal, then the char + . . . . /// is appended to the end of that literal. Otherwise, a new literal + . . . . /// containing just the given char is pushed to the top of the stack. + . . . . fn push_char(&self, ch: char) { + 48,360 ( 0.01%) . . . let mut buf = [0; 4]; + . . . . let bytes = ch.encode_utf8(&mut buf).as_bytes(); + . . . . let mut stack = self.trans().stack.borrow_mut(); +257,968 ( 0.07%) . . . if let Some(HirFrame::Literal(ref mut literal)) = stack.last_mut() { + . . . . literal.extend_from_slice(bytes); + . . . . } else { + . . . . stack.push(HirFrame::Literal(bytes.to_vec())); + . . . . } + . . . . } + . . . . + . . . . /// Push the given literal byte on to the call stack. + . . . . /// +-- line 716 ---------------------------------------- +-- line 731 ---------------------------------------- + . . . . self.trans().stack.borrow_mut().pop() + . . . . } + . . . . + . . . . /// Pop an HIR expression from the top of the stack for a concatenation. + . . . . /// + . . . . /// This returns None if the stack is empty or when a concat frame is seen. + . . . . /// Otherwise, it panics if it could not find an HIR expression. + . . . . fn pop_concat_expr(&self) -> Option { +249,746 ( 0.07%) . . . let frame = self.pop()?; +178,390 ( 0.05%) . . . match frame { + . . . . HirFrame::Concat => None, + 31,962 ( 0.01%) . . . HirFrame::Expr(expr) => Some(expr), + 45,978 ( 0.01%) . . . HirFrame::Literal(lit) => Some(Hir::literal(lit)), + . . . . HirFrame::ClassUnicode(_) => { + . . . . unreachable!("expected expr or concat, got Unicode class") + . . . . } + . . . . HirFrame::ClassBytes(_) => { + . . . . unreachable!("expected expr or concat, got byte class") + . . . . } + . . . . HirFrame::Repetition => { + . . . . unreachable!("expected expr or concat, got repetition") +-- line 751 ---------------------------------------- +-- line 755 ---------------------------------------- + . . . . } + . . . . HirFrame::Alternation => { + . . . . unreachable!("expected expr or concat, got alt marker") + . . . . } + . . . . HirFrame::AlternationBranch => { + . . . . unreachable!("expected expr or concat, got alt branch marker") + . . . . } + . . . . } +107,494 ( 0.03%) . . . } +142,074 ( 0.04%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (15,786x) + . . . . + . . . . /// Pop an HIR expression from the top of the stack for an alternation. + . . . . /// + . . . . /// This returns None if the stack is empty or when an alternation frame is + . . . . /// seen. Otherwise, it panics if it could not find an HIR expression. + . . . . fn pop_alt_expr(&self) -> Option { +118,671 ( 0.03%) . . . let frame = self.pop()?; + 84,765 ( 0.02%) . . . match frame { + . . . . HirFrame::Alternation => None, +109,697 ( 0.03%) . . . HirFrame::Expr(expr) => Some(expr), + 2,310 ( 0.00%) . . . HirFrame::Literal(lit) => Some(Hir::literal(lit)), + . . . . HirFrame::ClassUnicode(_) => { + . . . . unreachable!("expected expr or alt, got Unicode class") + . . . . } + . . . . HirFrame::ClassBytes(_) => { + . . . . unreachable!("expected expr or alt, got byte class") + . . . . } + . . . . HirFrame::Repetition => { + . . . . unreachable!("expected expr or alt, got repetition") +-- line 782 ---------------------------------------- +-- line 786 ---------------------------------------- + . . . . } + . . . . HirFrame::Concat => { + . . . . unreachable!("expected expr or alt, got concat marker") + . . . . } + . . . . HirFrame::AlternationBranch => { + . . . . unreachable!("expected expr or alt, got alt branch marker") + . . . . } + . . . . } + 50,601 ( 0.01%) . . . } + 4,608 ( 0.00%) . . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (512x) + . . . . + . . . . /// Create a new error with the given span and error type. + . . . . fn error(&self, span: Span, kind: ErrorKind) -> Error { + . . . . Error { kind, pattern: self.pattern.to_string(), span } + . . . . } + . . . . + . . . . /// Return a copy of the active flags. + . . . . fn flags(&self) -> Flags { + . . . . self.trans().flags.get() + . . . . } + . . . . + . . . . /// Set the flags of this translator from the flags set in the given AST. + . . . . /// Then, return the old flags. + . . . . fn set_flags(&self, ast_flags: &ast::Flags) -> Flags { + 200 ( 0.00%) . . . let old_flags = self.flags(); + . . . . let mut new_flags = Flags::from_ast(ast_flags); + . . . . new_flags.merge(&old_flags); + . . . . self.trans().flags.set(new_flags); + . . . . old_flags + . . . . } + . . . . + . . . . /// Convert an Ast literal to its scalar representation. + . . . . /// +-- line 817 ---------------------------------------- +-- line 821 ---------------------------------------- + . . . . /// When Unicode mode is disabled, then a `char` will still be returned + . . . . /// whenever possible. A byte is returned only when invalid UTF-8 is + . . . . /// allowed and when the byte is not ASCII. Otherwise, a non-ASCII byte + . . . . /// will result in an error when invalid UTF-8 is not allowed. + . . . . fn ast_literal_to_scalar( + . . . . &self, + . . . . lit: &ast::Literal, + . . . . ) -> Result> { + 98,960 ( 0.03%) . . . if self.flags().unicode() { + 49,480 ( 0.01%) . . . return Ok(Either::Left(lit.c)); + . . . . } + . . . . let byte = match lit.byte() { + . . . . None => return Ok(Either::Left(lit.c)), + . . . . Some(byte) => byte, + . . . . }; + . . . . if byte <= 0x7F { + . . . . return Ok(Either::Left(char::try_from(byte).unwrap())); + . . . . } + . . . . if self.trans().utf8 { + . . . . return Err(self.error(lit.span, ErrorKind::InvalidUtf8)); + . . . . } + . . . . Ok(Either::Right(byte)) + . . . . } + . . . . + . . . . fn case_fold_char(&self, span: Span, c: char) -> Result> { + 51,820 ( 0.01%) . . . if !self.flags().case_insensitive() { + . . . . return Ok(None); + . . . . } + . . . . if self.flags().unicode() { + . . . . // If case folding won't do anything, then don't bother trying. + . . . . let map = unicode::SimpleCaseFolder::new() + 3,360 ( 0.00%) . . . .map(|f| f.overlaps(c, c)) +178,870 ( 0.05%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/unicode.rs:regex_syntax::unicode::SimpleCaseFolder::overlaps (1,120x) + . . . . .map_err(|_| { + . . . . self.error(span, ErrorKind::UnicodeCaseUnavailable) + . . . . })?; + 2,240 ( 0.00%) . . . if !map { + . . . . return Ok(None); + . . . . } + . . . . let mut cls = + 4,480 ( 0.00%) . . . hir::ClassUnicode::new(vec![hir::ClassUnicodeRange::new( + 32,480 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::new (1,120x) + . . . . c, c, + . . . . )]); + 2,240 ( 0.00%) . . . cls.try_case_fold_simple().map_err(|_| { +1,012,881 ( 0.29%) 2,240 ( 0.28%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::ClassUnicode::try_case_fold_simple (1,120x) + . . . . self.error(span, ErrorKind::UnicodeCaseUnavailable) + . . . . })?; + 5,600 ( 0.00%) . . . Ok(Some(Hir::class(hir::Class::Unicode(cls)))) + . . . . } else { + . . . . if !c.is_ascii() { + . . . . return Ok(None); + . . . . } + . . . . // If case folding won't do anything, then don't bother trying. + . . . . match c { + . . . . 'A'..='Z' | 'a'..='z' => {} + . . . . _ => return Ok(None), +-- line 874 ---------------------------------------- +-- line 882 ---------------------------------------- + . . . . )]); + . . . . cls.case_fold_simple(); + . . . . Ok(Some(Hir::class(hir::Class::Bytes(cls)))) + . . . . } + . . . . } + . . . . + . . . . fn hir_dot(&self, span: Span) -> Result { + . . . . let (utf8, lineterm, flags) = + 15 ( 0.00%) . . . (self.trans().utf8, self.trans().line_terminator, self.flags()); + 5 ( 0.00%) . . . if utf8 && (!flags.unicode() || !lineterm.is_ascii()) { + . . . . return Err(self.error(span, ErrorKind::InvalidUtf8)); + . . . . } + 5 ( 0.00%) . . . let dot = if flags.dot_matches_new_line() { + . . . . if flags.unicode() { + . . . . hir::Dot::AnyChar + . . . . } else { + . . . . hir::Dot::AnyByte + . . . . } + . . . . } else { + 5 ( 0.00%) . . . if flags.unicode() { + 10 ( 0.00%) . . . if flags.crlf() { + . . . . hir::Dot::AnyCharExceptCRLF + . . . . } else { + 5 ( 0.00%) . . . if !lineterm.is_ascii() { + . . . . return Err( + . . . . self.error(span, ErrorKind::InvalidLineTerminator) + . . . . ); + . . . . } + . . . . hir::Dot::AnyCharExcept(char::from(lineterm)) + . . . . } + . . . . } else { + . . . . if flags.crlf() { + . . . . hir::Dot::AnyByteExceptCRLF + . . . . } else { + . . . . hir::Dot::AnyByteExcept(lineterm) + . . . . } + . . . . } + . . . . }; + 15 ( 0.00%) . . . Ok(Hir::dot(dot)) + . . . . } + . . . . + . . . . fn hir_assertion(&self, asst: &ast::Assertion) -> Result { + 244 ( 0.00%) . . . let unicode = self.flags().unicode(); + . . . . let multi_line = self.flags().multi_line(); + . . . . let crlf = self.flags().crlf(); + . . . . Ok(match asst.kind { + 330 ( 0.00%) . . . ast::AssertionKind::StartLine => Hir::look(if multi_line { + . . . . if crlf { + . . . . hir::Look::StartCRLF + . . . . } else { + . . . . hir::Look::StartLF + . . . . } + . . . . } else { + . . . . hir::Look::Start + . . . . }), + 280 ( 0.00%) . . . ast::AssertionKind::EndLine => Hir::look(if multi_line { + . . . . if crlf { + . . . . hir::Look::EndCRLF + . . . . } else { + . . . . hir::Look::EndLF + . . . . } + . . . . } else { + . . . . hir::Look::End + . . . . }), +-- line 945 ---------------------------------------- +-- line 982 ---------------------------------------- + . . . . hir::Look::WordEndHalfUnicode + . . . . } else { + . . . . hir::Look::WordEndHalfAscii + . . . . }), + . . . . }) + . . . . } + . . . . + . . . . fn hir_capture(&self, group: &ast::Group, expr: Hir) -> Hir { + 3,251 ( 0.00%) . . . let (index, name) = match group.kind { + 428 ( 0.00%) . . . ast::GroupKind::CaptureIndex(index) => (index, None), + . . . . ast::GroupKind::CaptureName { ref name, .. } => { + 2,344 ( 0.00%) . . . (name.index, Some(name.name.clone().into_boxed_str())) + 65,950 ( 0.02%) 55 ( 0.01%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs:::clone (586x) + . . . . } + . . . . // The HIR doesn't need to use non-capturing groups, since the way + . . . . // in which the data type is defined handles this automatically. + . . . . ast::GroupKind::NonCapturing(_) => return expr, + . . . . }; + 3,465 ( 0.00%) . . . Hir::capture(hir::Capture { index, name, sub: Box::new(expr) }) + . . . . } + . . . . + . . . . fn hir_repetition(&self, rep: &ast::Repetition, expr: Hir) -> Hir { + 25,059 ( 0.01%) . . . let (min, max) = match rep.op.kind { + . . . . ast::RepetitionKind::ZeroOrOne => (0, Some(1)), + . . . . ast::RepetitionKind::ZeroOrMore => (0, None), + . . . . ast::RepetitionKind::OneOrMore => (1, None), + 315 ( 0.00%) . . . ast::RepetitionKind::Range(ast::RepetitionRange::Exactly(m)) => { + . . . . (m, Some(m)) + . . . . } + . . . . ast::RepetitionKind::Range(ast::RepetitionRange::AtLeast(m)) => { + . . . . (m, None) + . . . . } + . . . . ast::RepetitionKind::Range(ast::RepetitionRange::Bounded( + 67 ( 0.00%) . . . m, + 268 ( 0.00%) . . . n, + . . . . )) => (m, Some(n)), + . . . . }; + . . . . let greedy = + 20,735 ( 0.01%) . . . if self.flags().swap_greed() { !rep.greedy } else { rep.greedy }; + 13,195 ( 0.00%) . . . Hir::repetition(hir::Repetition { + . . . . min, + . . . . max, + . . . . greedy, + . . . . sub: Box::new(expr), + . . . . }) + . . . . } + . . . . + . . . . fn hir_unicode_class( +-- line 1028 ---------------------------------------- +-- line 1058 ---------------------------------------- + . . . . result + . . . . } + . . . . + . . . . fn hir_ascii_unicode_class( + . . . . &self, + . . . . ast: &ast::ClassAscii, + . . . . ) -> Result { + . . . . let mut cls = hir::ClassUnicode::new( + 770 ( 0.00%) . . . ascii_class_as_chars(&ast.kind) + . . . . .map(|(s, e)| hir::ClassUnicodeRange::new(s, e)), + . . . . ); + 1,540 ( 0.00%) . . . self.unicode_fold_and_negate(&ast.span, ast.negated, &mut cls)?; + . . . . Ok(cls) + . . . . } + . . . . + . . . . fn hir_ascii_byte_class( + . . . . &self, + . . . . ast: &ast::ClassAscii, + . . . . ) -> Result { + . . . . let mut cls = hir::ClassBytes::new( + . . . . ascii_class(&ast.kind) + . . . . .map(|(s, e)| hir::ClassBytesRange::new(s, e)), + . . . . ); + . . . . self.bytes_fold_and_negate(&ast.span, ast.negated, &mut cls)?; + . . . . Ok(cls) + . . . . } + . . . . + 50 ( 0.00%) . . . fn hir_perl_unicode_class( + . . . . &self, + . . . . ast_class: &ast::ClassPerl, + . . . . ) -> Result { + . . . . use crate::ast::ClassPerlKind::*; + . . . . + 10 ( 0.00%) . . . assert!(self.flags().unicode()); + 15 ( 0.00%) . . . let result = match ast_class.kind { + . . . . Digit => unicode::perl_digit(), + . . . . Space => unicode::perl_space(), + . . . . Word => unicode::perl_word(), + . . . . }; + . . . . let mut class = + 60 ( 0.00%) . . . self.convert_unicode_class_error(&ast_class.span, result)?; + . . . . // We needn't apply case folding here because the Perl Unicode classes + . . . . // are already closed under Unicode simple case folding. + 10 ( 0.00%) . . . if ast_class.negated { + . . . . class.negate(); + . . . . } + 110 ( 0.00%) . . . Ok(class) + 40 ( 0.00%) . . . } + . . . . + . . . . fn hir_perl_byte_class( + . . . . &self, + . . . . ast_class: &ast::ClassPerl, + . . . . ) -> Result { + . . . . use crate::ast::ClassPerlKind::*; + . . . . + . . . . assert!(!self.flags().unicode()); +-- line 1113 ---------------------------------------- +-- line 1160 ---------------------------------------- + . . . . span: &Span, + . . . . negated: bool, + . . . . class: &mut hir::ClassUnicode, + . . . . ) -> Result<()> { + . . . . // Note that we must apply case folding before negation! + . . . . // Consider `(?i)[^x]`. If we applied negation first, then + . . . . // the result would be the character class that matched any + . . . . // Unicode scalar value. + 4,014 ( 0.00%) . . . if self.flags().case_insensitive() { + . . . . class.try_case_fold_simple().map_err(|_| { + . . . . self.error(span.clone(), ErrorKind::UnicodeCaseUnavailable) + . . . . })?; + . . . . } + 3,594 ( 0.00%) . . . if negated { + . . . . class.negate(); + . . . . } + . . . . Ok(()) + . . . . } + . . . . + . . . . fn bytes_fold_and_negate( + . . . . &self, + . . . . span: &Span, +-- line 1181 ---------------------------------------- +-- line 1234 ---------------------------------------- + . . . . // entirely in the parser. + . . . . } + . . . . + . . . . impl Flags { + . . . . fn from_ast(ast: &ast::Flags) -> Flags { + . . . . let mut flags = Flags::default(); + . . . . let mut enable = true; + . . . . for item in &ast.items { + 170 ( 0.00%) . . . match item.kind { + . . . . ast::FlagsItemKind::Negation => { + . . . . enable = false; + . . . . } + . . . . ast::FlagsItemKind::Flag(ast::Flag::CaseInsensitive) => { + 40 ( 0.00%) . . . flags.case_insensitive = Some(enable); + . . . . } + . . . . ast::FlagsItemKind::Flag(ast::Flag::MultiLine) => { + . . . . flags.multi_line = Some(enable); + . . . . } + . . . . ast::FlagsItemKind::Flag(ast::Flag::DotMatchesNewLine) => { + . . . . flags.dot_matches_new_line = Some(enable); + . . . . } + . . . . ast::FlagsItemKind::Flag(ast::Flag::SwapGreed) => { +-- line 1255 ---------------------------------------- +-- line 1263 ---------------------------------------- + . . . . } + . . . . ast::FlagsItemKind::Flag(ast::Flag::IgnoreWhitespace) => {} + . . . . } + . . . . } + . . . . flags + . . . . } + . . . . + . . . . fn merge(&mut self, previous: &Flags) { + 40 ( 0.00%) . . . if self.case_insensitive.is_none() { + . . . . self.case_insensitive = previous.case_insensitive; + . . . . } + 60 ( 0.00%) . . . if self.multi_line.is_none() { + . . . . self.multi_line = previous.multi_line; + . . . . } + 60 ( 0.00%) . . . if self.dot_matches_new_line.is_none() { + . . . . self.dot_matches_new_line = previous.dot_matches_new_line; + . . . . } + 60 ( 0.00%) . . . if self.swap_greed.is_none() { + . . . . self.swap_greed = previous.swap_greed; + . . . . } + 60 ( 0.00%) . . . if self.unicode.is_none() { + . . . . self.unicode = previous.unicode; + . . . . } + 60 ( 0.00%) . . . if self.crlf.is_none() { + . . . . self.crlf = previous.crlf; + . . . . } + . . . . } + . . . . + . . . . fn case_insensitive(&self) -> bool { + . . . . self.case_insensitive.unwrap_or(false) + . . . . } + . . . . +-- line 1294 ---------------------------------------- +-- line 1318 ---------------------------------------- + . . . . .map(|(s, e)| hir::ClassBytesRange::new(s, e)) + . . . . .collect(); + . . . . hir::ClassBytes::new(ranges) + . . . . } + . . . . + . . . . fn ascii_class(kind: &ast::ClassAsciiKind) -> impl Iterator { + . . . . use crate::ast::ClassAsciiKind::*; + . . . . + 3,080 ( 0.00%) . . . let slice: &'static [(u8, u8)] = match *kind { + . . . . Alnum => &[(b'0', b'9'), (b'A', b'Z'), (b'a', b'z')], + . . . . Alpha => &[(b'A', b'Z'), (b'a', b'z')], + . . . . Ascii => &[(b'\x00', b'\x7F')], + . . . . Blank => &[(b'\t', b'\t'), (b' ', b' ')], + . . . . Cntrl => &[(b'\x00', b'\x1F'), (b'\x7F', b'\x7F')], + . . . . Digit => &[(b'0', b'9')], + . . . . Graph => &[(b'!', b'~')], + . . . . Lower => &[(b'a', b'z')], +-- line 1334 ---------------------------------------- + +881,902 ( 0.25%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/determinize/state.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 101 ---------------------------------------- + . . . . /// states. + . . . . /// + . . . . /// This type is intended to be used only in NFA-to-DFA conversion via powerset + . . . . /// construction. + . . . . /// + . . . . /// It may be cheaply cloned and accessed safely from multiple threads + . . . . /// simultaneously. + . . . . #[derive(Clone, Eq, Hash, PartialEq, PartialOrd, Ord)] + 566 ( 0.00%) . . . pub(crate) struct State(Arc<[u8]>); + . . . . + . . . . /// This Borrow impl permits us to lookup any state in a map by its byte + . . . . /// representation. This is particularly convenient when one has a StateBuilder + . . . . /// and we want to see if a correspondingly equivalent state already exists. If + . . . . /// one does exist, then we can reuse the allocation required by StateBuilder + . . . . /// without having to convert it into a State first. + . . . . impl core::borrow::Borrow<[u8]> for State { + . . . . fn borrow(&self) -> &[u8] { +-- line 117 ---------------------------------------- +-- line 122 ---------------------------------------- + . . . . impl core::fmt::Debug for State { + . . . . fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + . . . . f.debug_tuple("State").field(&self.repr()).finish() + . . . . } + . . . . } + . . . . + . . . . /// For docs on these routines, see the internal Repr and ReprVec types below. + . . . . impl State { +2,044 ( 0.00%) . . . pub(crate) fn dead() -> State { + . . . . StateBuilderEmpty::new().into_matches().into_nfa().to_state() +2,920 ( 0.00%) . . . } + . . . . + . . . . pub(crate) fn is_match(&self) -> bool { + . . . . self.repr().is_match() + . . . . } + . . . . + . . . . pub(crate) fn is_from_word(&self) -> bool { + . . . . self.repr().is_from_word() + . . . . } +-- line 140 ---------------------------------------- +-- line 143 ---------------------------------------- + . . . . self.repr().is_half_crlf() + . . . . } + . . . . + . . . . pub(crate) fn look_have(&self) -> LookSet { + . . . . self.repr().look_have() + . . . . } + . . . . + . . . . pub(crate) fn look_need(&self) -> LookSet { + 436 ( 0.00%) . . . self.repr().look_need() + . . . . } + . . . . + . . . . pub(crate) fn match_len(&self) -> usize { + . . . . self.repr().match_len() + . . . . } + . . . . + . . . . pub(crate) fn match_pattern(&self, index: usize) -> PatternID { + . . . . self.repr().match_pattern(index) +-- line 159 ---------------------------------------- +-- line 163 ---------------------------------------- + . . . . self.repr().match_pattern_ids() + . . . . } + . . . . + . . . . #[cfg(all(test, not(miri)))] + . . . . pub(crate) fn iter_match_pattern_ids(&self, f: F) { + . . . . self.repr().iter_match_pattern_ids(f) + . . . . } + . . . . +1,526 ( 0.00%) . . . pub(crate) fn iter_nfa_state_ids(&self, f: F) { + 654 ( 0.00%) . . . self.repr().iter_nfa_state_ids(f) +1,744 ( 0.00%) . . . } + . . . . + . . . . pub(crate) fn memory_usage(&self) -> usize { + . . . . self.0.len() + . . . . } + . . . . + . . . . fn repr(&self) -> Repr<'_> { + . . . . Repr(&*self.0) + . . . . } +-- line 181 ---------------------------------------- +-- line 188 ---------------------------------------- + . . . . /// made when new() is called. Its main use is for being converted into a + . . . . /// builder that can capture assertions and pattern IDs. + . . . . #[derive(Clone, Debug)] + . . . . pub(crate) struct StateBuilderEmpty(Vec); + . . . . + . . . . /// For docs on these routines, see the internal Repr and ReprVec types below. + . . . . impl StateBuilderEmpty { + . . . . pub(crate) fn new() -> StateBuilderEmpty { +1,110 ( 0.00%) . . . StateBuilderEmpty(alloc::vec![]) + . . . . } + . . . . + . . . . pub(crate) fn into_matches(mut self) -> StateBuilderMatches { + . . . . self.0.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0]); +1,069 ( 0.00%) . . . StateBuilderMatches(self.0) + . . . . } + . . . . + . . . . fn clear(&mut self) { + . . . . self.0.clear(); + . . . . } + . . . . + . . . . pub(crate) fn capacity(&self) -> usize { + . . . . self.0.capacity() +-- line 209 ---------------------------------------- +-- line 222 ---------------------------------------- + . . . . f.debug_tuple("StateBuilderMatches").field(&self.repr()).finish() + . . . . } + . . . . } + . . . . + . . . . /// For docs on these routines, see the internal Repr and ReprVec types below. + . . . . impl StateBuilderMatches { + . . . . pub(crate) fn into_nfa(mut self) -> StateBuilderNFA { + . . . . self.repr_vec().close_match_pattern_ids(); +1,077 ( 0.00%) . . . StateBuilderNFA { repr: self.0, prev_nfa_state_id: StateID::ZERO } + . . . . } + . . . . + . . . . pub(crate) fn set_is_from_word(&mut self) { + . . . . self.repr_vec().set_is_from_word() + . . . . } + . . . . + . . . . pub(crate) fn set_is_half_crlf(&mut self) { + . . . . self.repr_vec().set_is_half_crlf() + . . . . } + . . . . + . . . . pub(crate) fn look_have(&self) -> LookSet { + 470 ( 0.00%) . . . LookSet::read_repr(&self.0[1..]) + . . . . } + . . . . + . . . . pub(crate) fn set_look_have( + . . . . &mut self, + . . . . set: impl FnMut(LookSet) -> LookSet, + . . . . ) { + . . . . self.repr_vec().set_look_have(set) + . . . . } + . . . . + 9 ( 0.00%) . . . pub(crate) fn add_match_pattern_id(&mut self, pid: PatternID) { + . . . . self.repr_vec().add_match_pattern_id(pid) + 12 ( 0.00%) . . . } + . . . . + . . . . fn repr(&self) -> Repr<'_> { + . . . . Repr(&self.0) + . . . . } + . . . . + . . . . fn repr_vec(&mut self) -> ReprVec<'_> { + . . . . ReprVec(&mut self.0) + . . . . } +-- line 262 ---------------------------------------- +-- line 290 ---------------------------------------- + . . . . + . . . . pub(crate) fn clear(self) -> StateBuilderEmpty { + . . . . let mut builder = StateBuilderEmpty(self.repr); + . . . . builder.clear(); + . . . . builder + . . . . } + . . . . + . . . . pub(crate) fn look_need(&self) -> LookSet { + 518 ( 0.00%) . . . self.repr().look_need() + . . . . } + . . . . + . . . . pub(crate) fn set_look_have( + . . . . &mut self, + . . . . set: impl FnMut(LookSet) -> LookSet, + . . . . ) { + . . . . self.repr_vec().set_look_have(set) + . . . . } +-- line 306 ---------------------------------------- +-- line 389 ---------------------------------------- + . . . . /// Returns true if and only if this is a match state. + . . . . /// + . . . . /// If callers have added pattern IDs to this state, then callers MUST set + . . . . /// this state as a match state explicitly. However, as a special case, + . . . . /// states that are marked as match states but with no pattern IDs, then + . . . . /// the state is treated as if it had a single pattern ID equivalent to + . . . . /// PatternID::ZERO. + . . . . fn is_match(&self) -> bool { +1,581 ( 0.00%) . . . self.0[0] & (1 << 0) > 0 + . . . . } + . . . . + . . . . /// Returns true if and only if this state has had at least one pattern + . . . . /// ID added to it. + . . . . /// + . . . . /// This is an internal-only flag that permits the representation to save + . . . . /// space in the common case of an NFA with one pattern in it. In that + . . . . /// case, a match state can only ever have exactly one pattern ID: + . . . . /// PatternID::ZERO. So there's no need to represent it. + . . . . fn has_pattern_ids(&self) -> bool { +2,829 ( 0.00%) . . . self.0[0] & (1 << 1) > 0 + . . . . } + . . . . + . . . . /// Returns true if and only if this state is marked as having been created + . . . . /// from a transition over a word byte. This is useful for checking whether + . . . . /// a word boundary assertion is true or not, which requires look-behind + . . . . /// (whether the current state came from a word byte or not) and look-ahead + . . . . /// (whether the transition byte is a word byte or not). + . . . . /// +-- line 416 ---------------------------------------- +-- line 423 ---------------------------------------- + . . . . self.0[0] & (1 << 2) > 0 + . . . . } + . . . . + . . . . /// Returns true if and only if this state is marked as being inside of a + . . . . /// CRLF terminator. In the forward direction, this means the state was + . . . . /// created after seeing a `\r`. In the reverse direction, this means the + . . . . /// state was created after seeing a `\n`. + . . . . fn is_half_crlf(&self) -> bool { + 80 ( 0.00%) . . . self.0[0] & (1 << 3) > 0 + . . . . } + . . . . + . . . . /// The set of look-behind assertions that were true in the transition that + . . . . /// created this state. + . . . . /// + . . . . /// Generally, this should be empty if 'look_need' is empty, since there is + . . . . /// no reason to track which look-behind assertions are true if the state + . . . . /// has no conditional epsilon transitions. +-- line 439 ---------------------------------------- +-- line 518 ---------------------------------------- + . . . . f(PatternID::new_unchecked(usize::try_from(pid).unwrap())); + . . . . } + . . . . } + . . . . + . . . . /// Calls the given function on every NFA state ID in this state. + . . . . fn iter_nfa_state_ids(&self, mut f: F) { + . . . . let mut sids = &self.0[self.pattern_offset_end()..]; + . . . . let mut prev = 0i32; +1,206 ( 0.00%) . . . while !sids.is_empty() { + . . . . let (delta, nr) = read_vari32(sids); + . . . . sids = &sids[nr..]; + 988 ( 0.00%) . . . let sid = prev + delta; + . . . . prev = sid; + . . . . // This is OK since we only ever serialize valid StateIDs to + . . . . // states. And since state IDs can never exceed an isize, they must + . . . . // always be able to fit into a usize, and thus cast is OK. + . . . . f(StateID::new_unchecked(sid.as_usize())) + . . . . } + . . . . } + . . . . +-- line 537 ---------------------------------------- +-- line 548 ---------------------------------------- + . . . . } + . . . . + . . . . /// Returns the total number of *encoded* pattern IDs in this state. + . . . . /// + . . . . /// This may return 0 even when this is a match state, since the pattern + . . . . /// ID `PatternID::ZERO` is not encoded when it's the only pattern ID in + . . . . /// the match state (the overwhelming common case). + . . . . fn encoded_pattern_len(&self) -> usize { + 218 ( 0.00%) . . . if !self.has_pattern_ids() { + . . . . return 0; + . . . . } + . . . . // This unwrap is OK since the total number of patterns is always + . . . . // guaranteed to fit into a usize. + . . . . usize::try_from(wire::read_u32(&self.0[9..13])).unwrap() + . . . . } + . . . . } + . . . . +-- line 564 ---------------------------------------- +-- line 588 ---------------------------------------- + . . . . struct ReprVec<'a>(&'a mut Vec); + . . . . + . . . . impl<'a> ReprVec<'a> { + . . . . /// Set this state as a match state. + . . . . /// + . . . . /// This should not be exposed explicitly outside of this module. It is + . . . . /// set automatically when a pattern ID is added. + . . . . fn set_is_match(&mut self) { + 6 ( 0.00%) . . . self.0[0] |= 1 << 0; + . . . . } + . . . . + . . . . /// Set that this state has pattern IDs explicitly written to it. + . . . . /// + . . . . /// This should not be exposed explicitly outside of this module. This is + . . . . /// used internally as a space saving optimization. Namely, if the state + . . . . /// is a match state but does not have any pattern IDs written to it, + . . . . /// then it is automatically inferred to have a pattern ID of ZERO. +-- line 604 ---------------------------------------- +-- line 621 ---------------------------------------- + . . . . /// In the reverse direction, this should be set when a `\n` has been seen. + . . . . fn set_is_half_crlf(&mut self) { + . . . . self.0[0] |= 1 << 3; + . . . . } + . . . . + . . . . /// The set of look-behind assertions that were true in the transition that + . . . . /// created this state. + . . . . fn look_have(&self) -> LookSet { + 40 ( 0.00%) . . . self.repr().look_have() + . . . . } + . . . . + . . . . /// The set of look-around (both behind and ahead) assertions that appear + . . . . /// at least once in this state's set of NFA states. + . . . . fn look_need(&self) -> LookSet { + . . . . self.repr().look_need() + . . . . } + . . . . +-- line 637 ---------------------------------------- +-- line 660 ---------------------------------------- + . . . . // not write either the pattern ID or the number of patterns encoded. + . . . . // Instead, all we do is set the 'is_match' bit on this state. Overall, + . . . . // this saves 8 bytes per match state for the overwhelming majority of + . . . . // match states. + . . . . // + . . . . // In order to know whether pattern IDs need to be explicitly read or + . . . . // not, we use another internal-only bit, 'has_pattern_ids', to + . . . . // indicate whether they have been explicitly written or not. + 3 ( 0.00%) . . . if !self.repr().has_pattern_ids() { + 3 ( 0.00%) . . . if pid == PatternID::ZERO { + . . . . self.set_is_match(); + . . . . return; + . . . . } + . . . . // Make room for 'close_match_pattern_ids' to write the total + . . . . // number of pattern IDs written. + . . . . self.0.extend(core::iter::repeat(0).take(PatternID::SIZE)); + . . . . self.set_has_pattern_ids(); + . . . . // If this was already a match state, then the only way that's +-- line 677 ---------------------------------------- +-- line 695 ---------------------------------------- + . . . . /// Once this is called, callers must not call it or 'add_match_pattern_id' + . . . . /// again. + . . . . /// + . . . . /// This should not be exposed explicitly outside of this module. It + . . . . /// should be called only when converting a StateBuilderMatches into a + . . . . /// StateBuilderNFA. + . . . . fn close_match_pattern_ids(&mut self) { + . . . . // If we never wrote any pattern IDs, then there's nothing to do here. + 551 ( 0.00%) . . . if !self.repr().has_pattern_ids() { + . . . . return; + . . . . } + . . . . let patsize = PatternID::SIZE; + . . . . let pattern_bytes = self.0.len() - 13; + . . . . // Every pattern ID uses 4 bytes, so number of bytes should be + . . . . // divisible by 4. + . . . . assert_eq!(pattern_bytes % patsize, 0); + . . . . // This unwrap is OK since we are guaranteed that the maximum number +-- line 711 ---------------------------------------- +-- line 713 ---------------------------------------- + . . . . let count32 = u32::try_from(pattern_bytes / patsize).unwrap(); + . . . . wire::NE::write_u32(count32, &mut self.0[9..13]); + . . . . } + . . . . + . . . . /// Add an NFA state ID to this state. The order in which NFA states are + . . . . /// added matters. It is the caller's responsibility to ensure that + . . . . /// duplicate NFA state IDs are not added. + . . . . fn add_nfa_state_id(&mut self, prev: &mut StateID, sid: StateID) { +1,994 ( 0.00%) . . . let delta = sid.as_i32() - prev.as_i32(); + . . . . write_vari32(self.0, delta); + 41 ( 0.00%) . . . *prev = sid; + . . . . } + . . . . + . . . . /// Return a read-only view of this state's representation. + . . . . fn repr(&self) -> Repr<'_> { + . . . . Repr(self.0.as_slice()) + . . . . } + . . . . } + . . . . + . . . . /// Write a signed 32-bit integer using zig-zag encoding. + . . . . /// + . . . . /// https://developers.google.com/protocol-buffers/docs/encoding#varints + . . . . fn write_vari32(data: &mut Vec, n: i32) { + 997 ( 0.00%) . . . let mut un = n.to_bits() << 1; +1,994 ( 0.00%) . . . if n < 0 { + . . . . un = !un; + . . . . } + . . . . write_varu32(data, un) + . . . . } + . . . . + . . . . /// Read a signed 32-bit integer using zig-zag encoding. Also, return the + . . . . /// number of bytes read. + . . . . /// + . . . . /// https://developers.google.com/protocol-buffers/docs/encoding#varints + . . . . fn read_vari32(data: &[u8]) -> (i32, usize) { + . . . . let (un, i) = read_varu32(data); +1,976 ( 0.00%) . . . let mut n = i32::from_bits(un >> 1); +2,964 ( 0.00%) . . . if un & 1 != 0 { + . . . . n = !n; + . . . . } + . . . . (n, i) + . . . . } + . . . . + . . . . /// Write an unsigned 32-bit integer as a varint. In essence, `n` is written + . . . . /// as a sequence of bytes where all bytes except for the last one have the + . . . . /// most significant bit set. The least significant 7 bits correspond to the + . . . . /// actual bits of `n`. So in the worst case, a varint uses 5 bytes, but in + . . . . /// very common cases, it uses fewer than 4. + . . . . /// + . . . . /// https://developers.google.com/protocol-buffers/docs/encoding#varints + . . . . fn write_varu32(data: &mut Vec, mut n: u32) { +2,968 ( 0.00%) . . . while n >= 0b1000_0000 { + 18 ( 0.00%) . . . data.push(n.low_u8() | 0b1000_0000); + 18 ( 0.00%) . . . n >>= 7; + . . . . } + . . . . data.push(n.low_u8()); + . . . . } + . . . . + . . . . /// Read an unsigned 32-bit varint. Also, return the number of bytes read. + . . . . /// + . . . . /// https://developers.google.com/protocol-buffers/docs/encoding#varints + . . . . fn read_varu32(data: &[u8]) -> (u32, usize) { + . . . . // N.B. We can assume correctness here since we know that all varuints are + . . . . // written with write_varu32. Hence, the 'as' uses and unchecked arithmetic + . . . . // is all okay. + . . . . let mut n: u32 = 0; + . . . . let mut shift: u32 = 0; + 998 ( 0.00%) . . . for (i, &b) in data.iter().enumerate() { +5,948 ( 0.00%) . . . if b < 0b1000_0000 { +1,976 ( 0.00%) . . . return (n | (u32::from(b) << shift), i + 1); + . . . . } + 30 ( 0.00%) . . . n |= (u32::from(b) & 0b0111_1111) << shift; + 10 ( 0.00%) . . . shift += 7; + . . . . } + . . . . (0, 0) + . . . . } + . . . . + . . . . /// Push a native-endian encoded `n` on to `dst`. + . . . . fn write_u32(dst: &mut Vec, n: u32) { + . . . . use crate::util::wire::NE; + . . . . +-- line 793 ---------------------------------------- + +5,266 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 45 ---------------------------------------- + . . . . /// The idea here is that the prefilter returned can be used to find candidate + . . . . /// matches. And then the HIR returned can be used to build a reverse regex + . . . . /// matcher, which will find the start of the candidate match. Finally, the + . . . . /// match still has to be confirmed with a normal anchored forward scan to find + . . . . /// the end position of the match. + . . . . /// + . . . . /// Note that this assumes leftmost-first match semantics, so callers must + . . . . /// not call this otherwise. + 104 ( 0.00%) . . . pub(crate) fn extract(hirs: &[&Hir]) -> Option<(Hir, Prefilter)> { + 26 ( 0.00%) . . . if hirs.len() != 1 { + . . . . debug!( + . . . . "skipping reverse inner optimization since it only \ + . . . . supports 1 pattern, {} were given", + . . . . hirs.len(), + . . . . ); + . . . . return None; + . . . . } + 52 ( 0.00%) . . . let mut concat = match top_concat(hirs[0]) { + . . . . Some(concat) => concat, + . . . . None => { + . . . . debug!( + . . . . "skipping reverse inner optimization because a top-level \ + . . . . concatenation could not found", + . . . . ); + . . . . return None; + . . . . } + . . . . }; + . . . . // We skip the first HIR because if it did have a prefix prefilter in it, + . . . . // we probably wouldn't be here looking for an inner prefilter. + . . . . for i in 1..concat.len() { + . . . . let hir = &concat[i]; + 186 ( 0.00%) . . . let pre = match prefilter(hir) { +16,737,867 ( 4.84%) 21,975 ( 2.71%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::prefilter (31x) + . . . . None => continue, + 88 ( 0.00%) . . . Some(pre) => pre, + . . . . }; + . . . . // Even if we got a prefilter, if it isn't consider "fast," then we + . . . . // probably don't want to bother with it. Namely, since the reverse + . . . . // inner optimization requires some overhead, it likely only makes + . . . . // sense if the prefilter scan itself is (believed) to be much faster + . . . . // than the regex engine. + 22 ( 0.00%) . . . if !pre.is_fast() { + . . . . debug!( + . . . . "skipping extracted inner prefilter because \ + . . . . it probably isn't fast" + . . . . ); + . . . . continue; + . . . . } + 78 ( 0.00%) . . . let concat_suffix = Hir::concat(concat.split_off(i)); +104,806 ( 0.03%) 105 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (13x) + 91 ( 0.00%) . . . let concat_prefix = Hir::concat(concat); +16,386 ( 0.00%) 26 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (13x) + . . . . // Look for a prefilter again. Why? Because above we only looked for + . . . . // a prefilter on the individual 'hir', but we might be able to find + . . . . // something better and more discriminatory by looking at the entire + . . . . // suffix. We don't do this above to avoid making this loop worst case + . . . . // quadratic in the length of 'concat'. + 52 ( 0.00%) . . . let pre2 = match prefilter(&concat_suffix) { +12,828,798 ( 3.71%) 21,332 ( 2.63%) 1 ( 0.32%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::prefilter (13x) + . . . . None => pre, + 52 ( 0.00%) . . . Some(pre2) => { + 13 ( 0.00%) . . . if pre2.is_fast() { + 65 ( 0.00%) . . . pre2 + . . . . } else { + . . . . pre + . . . . } + . . . . } + . . . . }; + 195 ( 0.00%) . . . return Some((concat_prefix, pre2)); + 26 ( 0.00%) . . . } + . . . . debug!( + . . . . "skipping reverse inner optimization because a top-level \ + . . . . sub-expression with a fast prefilter could not be found" + . . . . ); + . . . . None + 117 ( 0.00%) . . . } + . . . . + . . . . /// Attempt to extract a prefilter from an HIR expression. + . . . . /// + . . . . /// We do a little massaging here to do our best that the prefilter we get out + . . . . /// of this is *probably* fast. Basically, the false positive rate has a much + . . . . /// higher impact for things like the reverse inner optimization because more + . . . . /// work needs to potentially be done for each candidate match. + . . . . /// + . . . . /// Note that this assumes leftmost-first match semantics, so callers must + . . . . /// not call this otherwise. + 528 ( 0.00%) . . . fn prefilter(hir: &Hir) -> Option { + 88 ( 0.00%) . . . let mut extractor = literal::Extractor::new(); + 308 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::new (44x) + 176 ( 0.00%) . . . extractor.kind(literal::ExtractKind::Prefix); + 132 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::kind (44x) + 132 ( 0.00%) . . . let mut prefixes = extractor.extract(hir); +3,326,197 ( 0.96%) 6,496 ( 0.80%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/literal.rs:regex_syntax::hir::literal::Extractor::extract (44x) + . . . . debug!( + . . . . "inner prefixes (len={:?}) extracted before optimization: {:?}", + . . . . prefixes.len(), + . . . . prefixes + . . . . ); + . . . . // Since these are inner literals, we know they cannot be exact. But the + . . . . // extractor doesn't know this. We mark them as inexact because this might + . . . . // impact literal optimization. Namely, optimization weights "all literals + . . . . // are exact" as very high, because it presumes that any match results in + . . . . // an overall match. But of course, that is not the case here. + . . . . // + . . . . // In practice, this avoids plucking out a ASCII-only \s as an alternation + . . . . // of single-byte whitespace characters. + 88 ( 0.00%) . . . prefixes.make_inexact(); + . . . . prefixes.optimize_for_prefix_by_preference(); + . . . . debug!( + . . . . "inner prefixes (len={:?}) extracted after optimization: {:?}", + . . . . prefixes.len(), + . . . . prefixes + . . . . ); + . . . . prefixes + . . . . .literals() + . . . . .and_then(|lits| Prefilter::new(MatchKind::LeftmostFirst, lits)) + 352 ( 0.00%) . . . } + . . . . + . . . . /// Looks for a "top level" HirKind::Concat item in the given HIR. This will + . . . . /// try to return one even if it's embedded in a capturing group, but is + . . . . /// otherwise pretty conservative in what is returned. + . . . . /// + . . . . /// The HIR returned is a complete copy of the concat with all capturing + . . . . /// groups removed. In effect, the concat returned is "flattened" with respect + . . . . /// to capturing groups. This makes the detection logic above for prefixes + . . . . /// a bit simpler, and it works because 1) capturing groups never influence + . . . . /// whether a match occurs or not and 2) capturing groups are not used when + . . . . /// doing the reverse inner search to find the start of the match. + . . . . fn top_concat(mut hir: &Hir) -> Option> { + . . . . loop { + 130 ( 0.00%) . . . hir = match hir.kind() { + 26 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (13x) + . . . . HirKind::Empty + . . . . | HirKind::Literal(_) + . . . . | HirKind::Class(_) + . . . . | HirKind::Look(_) + . . . . | HirKind::Repetition(_) + . . . . | HirKind::Alternation(_) => return None, + . . . . HirKind::Capture(hir::Capture { ref sub, .. }) => sub, + . . . . HirKind::Concat(ref subs) => { + . . . . // We are careful to only do the flattening/copy when we know + . . . . // we have a "top level" concat we can inspect. This avoids + . . . . // doing extra work in cases where we definitely won't use it. + . . . . // (This might still be wasted work if we can't go on to find + . . . . // some literals to extract.) + . . . . let concat = + 438 ( 0.00%) . . . Hir::concat(subs.iter().map(|h| flatten(h)).collect()); +2,484,151 ( 0.72%) 7,913 ( 0.98%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten (193x) +118,664 ( 0.03%) 116 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (13x) + 52 ( 0.00%) . . . return match concat.into_kind() { + 2,241 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::into_kind (13x) + 13 ( 0.00%) . . . HirKind::Concat(xs) => Some(xs), + . . . . // It is actually possible for this case to occur, because + . . . . // 'Hir::concat' might simplify the expression to the point + . . . . // that concatenations are actually removed. One wonders + . . . . // whether this leads to other cases where we should be + . . . . // extracting literals, but in theory, I believe if we do + . . . . // get here, then it means that a "real" prefilter failed + . . . . // to be extracted and we should probably leave well enough + . . . . // alone. (A "real" prefilter is unbothered by "top-level +-- line 193 ---------------------------------------- +-- line 195 ---------------------------------------- + . . . . _ => return None, + . . . . }; + . . . . } + . . . . }; + . . . . } + . . . . } + . . . . + . . . . /// Returns a copy of the given HIR but with all capturing groups removed. +24,350 ( 0.01%) . . . fn flatten(hir: &Hir) -> Hir { +22,887 ( 0.01%) . . . match hir.kind() { + 568 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::kind (284x) + . . . . HirKind::Empty => Hir::empty(), + . . . . HirKind::Literal(hir::Literal(ref x)) => Hir::literal(x.clone()), + . . . . HirKind::Class(ref x) => Hir::class(x.clone()), + . . . . HirKind::Look(ref x) => Hir::look(x.clone()), + 1,490 ( 0.00%) . . . HirKind::Repetition(ref x) => Hir::repetition(x.with(flatten(&x.sub))), +91,183 ( 0.03%) 242 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (75x) +10,126 ( 0.00%) 32 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Repetition::with (75x) + . . . . // This is the interesting case. We just drop the group information + . . . . // entirely and use the child HIR itself. + 216 ( 0.00%) . . . HirKind::Capture(hir::Capture { ref sub, .. }) => flatten(sub), + . . . . HirKind::Alternation(ref xs) => { + 3,962 ( 0.00%) . . . Hir::alternation(xs.iter().map(|x| flatten(x)).collect()) +1,101,954 ( 0.32%) 5,293 ( 0.65%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (1,446x) +551,421 ( 0.16%) 256 ( 0.03%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::alternation (55x) + . . . . } + . . . . HirKind::Concat(ref xs) => { + 940 ( 0.00%) . . . Hir::concat(xs.iter().map(|x| flatten(x)).collect()) +455,169 ( 0.13%) 1,640 ( 0.20%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::flatten'2 (68x) +43,665 ( 0.01%) 74 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.2/src/hir/mod.rs:regex_syntax::hir::Hir::concat (29x) + . . . . } + . . . . } +21,915 ( 0.01%) . . . } + +10,050 ( 0.00%) . . . + +-------------------------------------------------------------------------------- +-- Auto-annotated source: /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime + +-- line 70 ---------------------------------------- + . . . . fn which_overlapping_matches( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . patset: &mut PatternSet, + . . . . ); + . . . . } + . . . . + 1,134 ( 0.00%) . . . pub(super) fn new( + . . . . info: &RegexInfo, + . . . . hirs: &[&Hir], + . . . . ) -> Result, BuildError> { + . . . . // At this point, we're committed to a regex engine of some kind. So pull + . . . . // out a prefilter if we can, which will feed to each of the constituent + . . . . // regex engines. + 162 ( 0.00%) . . . let pre = if info.is_always_anchored_start() { + . . . . // PERF: I'm not sure we necessarily want to do this... We may want to + . . . . // run a prefilter for quickly rejecting in some cases. The problem + . . . . // is that anchored searches overlap quite a bit with the use case + . . . . // of "run a regex on every line to extract data." In that case, the + . . . . // regex always matches, so running a prefilter doesn't really help us + . . . . // there. The main place where a prefilter helps in an anchored search + . . . . // is if the anchored search is not expected to match frequently. That + . . . . // is, the prefilter gives us a way to possibly reject a haystack very +-- line 93 ---------------------------------------- +-- line 97 ---------------------------------------- + . . . . // Or maybe we should only use a prefilter when we think it's "fast"? + . . . . // + . . . . // Interestingly, I think we currently lack the infrastructure for + . . . . // disabling a prefilter based on haystack length. That would probably + . . . . // need to be a new 'Input' option. (Interestingly, an 'Input' used to + . . . . // carry a 'Prefilter' with it, but I moved away from that.) + . . . . debug!("skipping literal extraction since regex is anchored"); + . . . . None + 16 ( 0.00%) . . . } else if let Some(pre) = info.config().get_prefilter() { + . . . . debug!( + . . . . "skipping literal extraction since the caller provided a prefilter" + . . . . ); + . . . . Some(pre.clone()) + 16 ( 0.00%) . . . } else if info.config().get_auto_prefilter() { + . . . . let kind = info.config().get_match_kind(); + 16 ( 0.00%) . . . let prefixes = crate::util::prefilter::prefixes(kind, hirs); +7,580,638 ( 2.19%) 16,769 ( 2.07%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::prefixes (16x) + . . . . // If we can build a full `Strategy` from just the extracted prefixes, + . . . . // then we can short-circuit and avoid building a regex engine at all. + 32 ( 0.00%) . . . if let Some(pre) = Pre::from_prefixes(info, &prefixes) { + . . . . debug!( + . . . . "found that the regex can be broken down to a literal \ + . . . . search, avoiding the regex engine entirely", + . . . . ); + . . . . return Ok(pre); + . . . . } + . . . . // This now attempts another short-circuit of the regex engine: if we + . . . . // have a huge alternation of just plain literals, then we can just use +-- line 123 ---------------------------------------- +-- line 145 ---------------------------------------- + . . . . strings, + . . . . ); + . . . . Prefilter::new(kind, strings) + . . . . }) + . . . . } else { + . . . . debug!("skipping literal extraction since prefilters were disabled"); + . . . . None + . . . . }; + 9,153 ( 0.00%) . . . let mut core = Core::new(info.clone(), pre.clone(), hirs)?; + . . . . // Now that we have our core regex engines built, there are a few cases + . . . . // where we can do a little bit better than just a normal "search forward + . . . . // and maybe use a prefilter when in a start state." However, these cases + . . . . // may not always work or otherwise build on top of the Core searcher. + . . . . // For example, the reverse anchored optimization seems like it might + . . . . // always work, but only the DFAs support reverse searching and the DFAs + . . . . // might give up or quit for reasons. If we had, e.g., a PikeVM that + . . . . // supported reverse searching, then we could avoid building a full Core +-- line 161 ---------------------------------------- +-- line 169 ---------------------------------------- + . . . . }; + . . . . core = match ReverseSuffix::new(core, hirs) { + . . . . Err(core) => core, + . . . . Ok(rs) => { + . . . . debug!("using reverse suffix strategy"); + . . . . return Ok(Arc::new(rs)); + . . . . } + . . . . }; +43,455 ( 0.01%) . . . core = match ReverseInner::new(core, hirs) { + . . . . Err(core) => core, + . . . . Ok(ri) => { + . . . . debug!("using reverse inner strategy"); + 39 ( 0.00%) . . . return Ok(Arc::new(ri)); + . . . . } + . . . . }; + . . . . debug!("using core strategy"); + 136 ( 0.00%) . . . Ok(Arc::new(core)) + 1,002 ( 0.00%) 15 ( 0.00%) . . } + . . . . + . . . . #[derive(Clone, Debug)] + . . . . struct Pre

{ + . . . . pre: P, + . . . . group_info: GroupInfo, + . . . . } + . . . . + . . . . impl Pre

{ +-- line 194 ---------------------------------------- +-- line 312 ---------------------------------------- + . . . . /// them are alternation of literals, but I haven't had the time to go down + . . . . /// that path yet. + . . . . fn from_alternation_literals( + . . . . info: &RegexInfo, + . . . . hirs: &[&Hir], + . . . . ) -> Option> { + . . . . use crate::util::prefilter::AhoCorasick; + . . . . + 80 ( 0.00%) . . . let lits = crate::meta::literal::alternation_literals(info, hirs)?; + 458 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/literal.rs:regex_automata::meta::literal::alternation_literals (16x) + . . . . let ac = AhoCorasick::new(MatchKind::LeftmostFirst, &lits)?; + . . . . Some(Pre::new(ac)) + . . . . } + . . . . } + . . . . + . . . . // This implements Strategy for anything that implements PrefilterI. + . . . . // + . . . . // Note that this must only be used for regexes of length 1. Multi-regexes +-- line 328 ---------------------------------------- +-- line 461 ---------------------------------------- + . . . . let mut lookm = LookMatcher::new(); + . . . . lookm.set_line_terminator(info.config().get_line_terminator()); + . . . . let thompson_config = thompson::Config::new() + . . . . .utf8(info.config().get_utf8_empty()) + . . . . .nfa_size_limit(info.config().get_nfa_size_limit()) + . . . . .shrink(false) + . . . . .which_captures(info.config().get_which_captures()) + . . . . .look_matcher(lookm); + 567 ( 0.00%) . . . let nfa = thompson::Compiler::new() +62,997,474 (18.20%) 123,973 (15.31%) 97 (31.29%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (81x) +22,506 ( 0.01%) 4 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (81x) + . . . . .configure(thompson_config.clone()) + . . . . .build_many_from_hir(hirs) + 81 ( 0.00%) . . . .map_err(BuildError::nfa)?; +8,462,203 ( 2.44%) 22,273 ( 2.75%) 1 ( 0.32%) . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (81x) + . . . . // It's possible for the PikeVM or the BB to fail to build, even though + . . . . // at this point, we already have a full NFA in hand. They can fail + . . . . // when a Unicode word boundary is used but where Unicode word boundary + . . . . // support is disabled at compile time, thus making it impossible to + . . . . // match. (Construction can also fail if the NFA was compiled without + . . . . // captures, but we always enable that above.) + 648 ( 0.00%) . . . let pikevm = wrappers::PikeVM::new(&info, pre.clone(), &nfa)?; +43,963 ( 0.01%) 111 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::PikeVM::new (81x) + . . . . let backtrack = + 1,782 ( 0.00%) . . . wrappers::BoundedBacktracker::new(&info, pre.clone(), &nfa)?; +44,317 ( 0.01%) 111 ( 0.01%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::BoundedBacktracker::new (81x) + . . . . // The onepass engine can of course fail to build, but we expect it to + . . . . // fail in many cases because it is an optimization that doesn't apply + . . . . // to all regexes. The 'OnePass' wrapper encapsulates this failure (and + . . . . // logs a message if it occurs). + 81 ( 0.00%) . . . let onepass = wrappers::OnePass::new(&info, &nfa); +2,500,469 ( 0.72%) 2,480 ( 0.31%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::OnePass::new (81x) + . . . . // We try to encapsulate whether a particular regex engine should be + . . . . // used within each respective wrapper, but the DFAs need a reverse NFA + . . . . // to build itself, and we really do not want to build a reverse NFA if + . . . . // we know we aren't going to use the lazy DFA. So we do a config check + . . . . // up front, which is in practice the only way we won't try to use the + . . . . // DFA. + . . . . let (nfarev, hybrid, dfa) = + 81 ( 0.00%) . . . if !info.config().get_hybrid() && !info.config().get_dfa() { + . . . . (None, wrappers::Hybrid::none(), wrappers::DFA::none()) + . . . . } else { + . . . . // FIXME: Technically, we don't quite yet KNOW that we need + . . . . // a reverse NFA. It's possible for the DFAs below to both + . . . . // fail to build just based on the forward NFA. In which case, + . . . . // building the reverse NFA was totally wasted work. But... + . . . . // fixing this requires breaking DFA construction apart into + . . . . // two pieces: one for the forward part and another for the + . . . . // reverse part. Quite annoying. Making it worse, when building + . . . . // both DFAs fails, it's quite likely that the NFA is large and + . . . . // that it will take quite some time to build the reverse NFA + . . . . // too. So... it's really probably worth it to do this! + 648 ( 0.00%) . . . let nfarev = thompson::Compiler::new() +38,783,936 (11.20%) 98,220 (12.13%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (81x) +21,951 ( 0.01%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (81x) + . . . . // Currently, reverse NFAs don't support capturing groups, + . . . . // so we MUST disable them. But even if we didn't have to, + . . . . // we would, because nothing in this crate does anything + . . . . // useful with capturing groups in reverse. And of course, + . . . . // the lazy DFA ignores capturing groups in all cases. + . . . . .configure( + . . . . thompson_config + . . . . .clone() + . . . . .which_captures(WhichCaptures::None) + . . . . .reverse(true), + . . . . ) + . . . . .build_many_from_hir(hirs) + 81 ( 0.00%) . . . .map_err(BuildError::nfa)?; +2,993,526 ( 0.86%) 15,439 ( 1.91%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (81x) + . . . . let dfa = if !info.config().get_dfa() { + . . . . wrappers::DFA::none() + . . . . } else { + . . . . wrappers::DFA::new(&info, pre.clone(), &nfa, &nfarev) + . . . . }; + 81 ( 0.00%) . . . let hybrid = if !info.config().get_hybrid() { + . . . . wrappers::Hybrid::none() + . . . . } else if dfa.is_some() { + . . . . debug!("skipping lazy DFA because we have a full DFA"); + . . . . wrappers::Hybrid::none() + . . . . } else { + 81 ( 0.00%) . . . wrappers::Hybrid::new(&info, pre.clone(), &nfa, &nfarev) +1,130,520 ( 0.33%) 606 ( 0.07%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::Hybrid::new (81x) + . . . . }; +27,297 ( 0.01%) . . . (Some(nfarev), hybrid, dfa) + . . . . }; + . . . . Ok(Core { + . . . . info, + 1,215 ( 0.00%) . . . pre, + . . . . nfa, + . . . . nfarev, + 1,296 ( 0.00%) . . . pikevm, + . . . . backtrack, + . . . . onepass, + . . . . hybrid, + . . . . dfa, + . . . . }) + . . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn try_search_mayfail( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . ) -> Option, RetryFailError>> { + 45 ( 0.00%) . . . if let Some(e) = self.dfa.get(input) { + . . . . trace!("using full DFA for search at {:?}", input.get_span()); + . . . . Some(e.try_search(input)) + 45 ( 0.00%) . . . } else if let Some(e) = self.hybrid.get(input) { + . . . . trace!("using lazy DFA for search at {:?}", input.get_span()); + . . . . Some(e.try_search(&mut cache.hybrid, input)) + . . . . } else { + . . . . None + . . . . } + . . . . } + . . . . + . . . . fn search_nofail( +-- line 566 ---------------------------------------- +-- line 602 ---------------------------------------- + . . . . // Only the lazy/full DFA returns half-matches, since the DFA requires + . . . . // a reverse scan to find the start position. These fallback regex + . . . . // engines can find the start and end in a single pass, so we just do + . . . . // that and throw away the start offset to conform to the API. + . . . . let m = self.search_nofail(cache, input)?; + . . . . Some(HalfMatch::new(m.pattern(), m.end())) + . . . . } + . . . . + 42 ( 0.00%) . . . fn search_slots_nofail( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . slots: &mut [Option], + . . . . ) -> Option { + . . . . if let Some(ref e) = self.onepass.get(input) { + . . . . trace!( + . . . . "using OnePass for capture search at {:?}", +-- line 618 ---------------------------------------- +-- line 628 ---------------------------------------- + . . . . } else { + . . . . trace!( + . . . . "using PikeVM for capture search at {:?}", + . . . . input.get_span() + . . . . ); + . . . . let e = self.pikevm.get(); + . . . . e.search_slots(&mut cache.pikevm, input, slots) + . . . . } + 24 ( 0.00%) . . . } + . . . . + . . . . fn is_match_nofail(&self, cache: &mut Cache, input: &Input<'_>) -> bool { + . . . . if let Some(ref e) = self.onepass.get(input) { + . . . . trace!( + . . . . "using OnePass for is-match search at {:?}", + . . . . input.get_span() + . . . . ); + . . . . e.search_slots(&mut cache.onepass, input, &mut []).is_some() +-- line 644 ---------------------------------------- +-- line 654 ---------------------------------------- + . . . . input.get_span() + . . . . ); + . . . . let e = self.pikevm.get(); + . . . . e.is_match(&mut cache.pikevm, input) + . . . . } + . . . . } + . . . . + . . . . fn is_capture_search_needed(&self, slots_len: usize) -> bool { + 70 ( 0.00%) . . . slots_len > self.nfa.group_info().implicit_slot_len() + . . . . } + . . . . } + . . . . + . . . . impl Strategy for Core { + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + 72 ( 0.00%) . . . fn group_info(&self) -> &GroupInfo { + . . . . self.nfa.group_info() + 72 ( 0.00%) . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + 294 ( 0.00%) . . . fn create_cache(&self) -> Cache { + 337 ( 0.00%) . . . Cache { + 330 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (11x) + . . . . capmatches: Captures::all(self.group_info().clone()), + 53 ( 0.00%) . . . pikevm: self.pikevm.create_cache(), + . . . . backtrack: self.backtrack.create_cache(), + . . . . onepass: self.onepass.create_cache(), + 53 ( 0.00%) . . . hybrid: self.hybrid.create_cache(), + . . . . revhybrid: wrappers::ReverseHybridCache::none(), + . . . . } + 378 ( 0.00%) . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn reset_cache(&self, cache: &mut Cache) { + . . . . cache.pikevm.reset(&self.pikevm); + . . . . cache.backtrack.reset(&self.backtrack); + . . . . cache.onepass.reset(&self.onepass); + . . . . cache.hybrid.reset(&self.hybrid); + . . . . } +-- line 690 ---------------------------------------- +-- line 788 ---------------------------------------- + . . . . } + . . . . } + . . . . } else { + . . . . self.is_match_nofail(cache, input) + . . . . } + . . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + 552 ( 0.00%) . . . fn search_slots( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . slots: &mut [Option], + . . . . ) -> Option { + . . . . // Even if the regex has explicit capture groups, if the caller didn't + . . . . // provide any explicit slots, then it doesn't make sense to try and do + . . . . // extra work to get offsets for those slots. Ideally the caller should + . . . . // realize this and not call this routine in the first place, but alas, + . . . . // we try to save the caller from themselves if they do. + 46 ( 0.00%) . . . if !self.is_capture_search_needed(slots.len()) { + . . . . trace!("asked for slots unnecessarily, trying fast path"); + . . . . let m = self.search(cache, input)?; + . . . . copy_match_to_slots(m, slots); + . . . . return Some(m.pattern()); + . . . . } + . . . . // If the onepass DFA is available for this search (which only happens + . . . . // when it's anchored), then skip running a fallible DFA. The onepass + . . . . // DFA isn't as fast as a full or lazy DFA, but it is typically quite +-- line 815 ---------------------------------------- +-- line 821 ---------------------------------------- + . . . . // to say "no match" much more quickly. This does hurt the case of, + . . . . // say, parsing each line in a log file into capture groups, because + . . . . // in that case, the line always matches. So the lazy DFA scan is + . . . . // usually just wasted work. But, the lazy DFA is usually quite fast + . . . . // and doesn't cost too much here. + . . . . if self.onepass.get(&input).is_some() { + . . . . return self.search_slots_nofail(cache, &input, slots); + . . . . } + 90 ( 0.00%) . . . let m = match self.try_search_mayfail(cache, input) { + . . . . Some(Ok(Some(m))) => m, + . . . . Some(Ok(None)) => return None, + . . . . Some(Err(_err)) => { + . . . . trace!("fast capture search failed: {}", _err); + . . . . return self.search_slots_nofail(cache, input, slots); + . . . . } + . . . . None => { + . . . . return self.search_slots_nofail(cache, input, slots); +-- line 837 ---------------------------------------- +-- line 847 ---------------------------------------- + . . . . m.start(), + . . . . m.end(), + . . . . ); + . . . . let input = input + . . . . .clone() + . . . . .span(m.start()..m.end()) + . . . . .anchored(Anchored::Pattern(m.pattern())); + . . . . Some( + 25 ( 0.00%) . . . self.search_slots_nofail(cache, &input, slots) +15,513 ( 0.00%) 6 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/strategy.rs:regex_automata::meta::strategy::Core::search_slots_nofail (5x) + . . . . .expect("should find a match"), + . . . . ) + 368 ( 0.00%) . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn which_overlapping_matches( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . patset: &mut PatternSet, + . . . . ) { +-- line 866 ---------------------------------------- +-- line 902 ---------------------------------------- + . . . . + . . . . #[derive(Debug)] + . . . . struct ReverseAnchored { + . . . . core: Core, + . . . . } + . . . . + . . . . impl ReverseAnchored { + . . . . fn new(core: Core) -> Result { + 81 ( 0.00%) . . . if !core.info.is_always_anchored_end() { + . . . . debug!( + . . . . "skipping reverse anchored optimization because \ + . . . . the regex is not always anchored at the end" + . . . . ); + . . . . return Err(core); + . . . . } + . . . . // Note that the caller can still request an anchored search even when + . . . . // the regex isn't anchored at the start. We detect that case in the +-- line 918 ---------------------------------------- +-- line 1115 ---------------------------------------- + . . . . #[derive(Debug)] + . . . . struct ReverseSuffix { + . . . . core: Core, + . . . . pre: Prefilter, + . . . . } + . . . . + . . . . impl ReverseSuffix { + . . . . fn new(core: Core, hirs: &[&Hir]) -> Result { + 81 ( 0.00%) . . . if !core.info.config().get_auto_prefilter() { + . . . . debug!( + . . . . "skipping reverse suffix optimization because \ + . . . . automatic prefilters are disabled" + . . . . ); + . . . . return Err(core); + . . . . } + . . . . // Like the reverse inner optimization, we don't do this for regexes + . . . . // that are always anchored. It could lead to scanning too much, but +-- line 1131 ---------------------------------------- +-- line 1137 ---------------------------------------- + . . . . // do another forward scan to find the end position.) + . . . . // + . . . . // Note that the caller can still request an anchored search even + . . . . // when the regex isn't anchored. We detect that case in the search + . . . . // routines below and just fallback to the core engine. Currently this + . . . . // optimization assumes all searches are unanchored, so if we do want + . . . . // to enable this optimization for anchored searches, it will need a + . . . . // little work to support it. + 194 ( 0.00%) . . . if core.info.is_always_anchored_start() { + . . . . debug!( + . . . . "skipping reverse suffix optimization because \ + . . . . the regex is always anchored at the start", + . . . . ); + . . . . return Err(core); + . . . . } + . . . . // Only DFAs can do reverse searches (currently), so we need one of + . . . . // them in order to do this optimization. It's possible (although +-- line 1153 ---------------------------------------- +-- line 1162 ---------------------------------------- + . . . . if core.pre.as_ref().map_or(false, |p| p.is_fast()) { + . . . . debug!( + . . . . "skipping reverse suffix optimization because \ + . . . . we already have a prefilter that we think is fast" + . . . . ); + . . . . return Err(core); + . . . . } + . . . . let kind = core.info.config().get_match_kind(); + 13 ( 0.00%) . . . let suffixes = crate::util::prefilter::suffixes(kind, hirs); +2,457,849 ( 0.71%) 5,107 ( 0.63%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/util/prefilter/mod.rs:regex_automata::util::prefilter::suffixes (13x) + 25 ( 0.00%) . . . let lcs = match suffixes.longest_common_suffix() { + . . . . None => { + . . . . debug!( + . . . . "skipping reverse suffix optimization because \ + . . . . a longest common suffix could not be found", + . . . . ); + . . . . return Err(core); + . . . . } + . . . . Some(lcs) if lcs.is_empty() => { +-- line 1179 ---------------------------------------- +-- line 1503 ---------------------------------------- + . . . . preinner: Prefilter, + . . . . nfarev: NFA, + . . . . hybrid: wrappers::ReverseHybrid, + . . . . dfa: wrappers::ReverseDFA, + . . . . } + . . . . + . . . . impl ReverseInner { + . . . . fn new(core: Core, hirs: &[&Hir]) -> Result { + 81 ( 0.00%) . . . if !core.info.config().get_auto_prefilter() { + . . . . debug!( + . . . . "skipping reverse inner optimization because \ + . . . . automatic prefilters are disabled" + . . . . ); + . . . . return Err(core); + . . . . } + . . . . // Currently we hard-code the assumption of leftmost-first match + . . . . // semantics. This isn't a huge deal because 'all' semantics tend to + . . . . // only be used for forward overlapping searches with multiple regexes, + . . . . // and this optimization only supports a single pattern at the moment. + 81 ( 0.00%) . . . if core.info.config().get_match_kind() != MatchKind::LeftmostFirst { + . . . . debug!( + . . . . "skipping reverse inner optimization because \ + . . . . match kind is {:?} but this only supports leftmost-first", + . . . . core.info.config().get_match_kind(), + . . . . ); + . . . . return Err(core); + . . . . } + . . . . // It's likely that a reverse inner scan has too much overhead for it +-- line 1530 ---------------------------------------- +-- line 1537 ---------------------------------------- + . . . . // or reject, which is a fair bit of work. + . . . . // + . . . . // Note that the caller can still request an anchored search even + . . . . // when the regex isn't anchored. We detect that case in the search + . . . . // routines below and just fallback to the core engine. Currently this + . . . . // optimization assumes all searches are unanchored, so if we do want + . . . . // to enable this optimization for anchored searches, it will need a + . . . . // little work to support it. + 162 ( 0.00%) . . . if core.info.is_always_anchored_start() { + . . . . debug!( + . . . . "skipping reverse inner optimization because \ + . . . . the regex is always anchored at the start", + . . . . ); + . . . . return Err(core); + . . . . } + . . . . // Only DFAs can do reverse searches (currently), so we need one of + . . . . // them in order to do this optimization. It's possible (although + . . . . // pretty unlikely) that we have neither and need to give up. + 16 ( 0.00%) . . . if !core.hybrid.is_some() && !core.dfa.is_some() { + . . . . debug!( + . . . . "skipping reverse inner optimization because \ + . . . . we don't have a lazy DFA or a full DFA" + . . . . ); + . . . . return Err(core); + . . . . } + . . . . if core.pre.as_ref().map_or(false, |p| p.is_fast()) { + . . . . debug!( + . . . . "skipping reverse inner optimization because \ + . . . . we already have a prefilter that we think is fast" + . . . . ); + 894 ( 0.00%) . . . return Err(core); + . . . . } else if core.pre.is_some() { + . . . . debug!( + . . . . "core engine has a prefix prefilter, but it is \ + . . . . probably not fast, so continuing with attempt to \ + . . . . use reverse inner prefilter" + . . . . ); + . . . . } + 104 ( 0.00%) . . . let (concat_prefix, preinner) = match reverse_inner::extract(hirs) { +33,494,575 ( 9.68%) 58,000 ( 7.16%) 2 ( 0.65%) . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/reverse_inner.rs:regex_automata::meta::reverse_inner::extract (13x) + 130 ( 0.00%) . . . Some(x) => x, + . . . . // N.B. the 'extract' function emits debug messages explaining + . . . . // why we bailed out here. + . . . . None => return Err(core), + . . . . }; + . . . . debug!("building reverse NFA for prefix before inner literal"); + . . . . let mut lookm = LookMatcher::new(); + . . . . lookm.set_line_terminator(core.info.config().get_line_terminator()); + . . . . let thompson_config = thompson::Config::new() + . . . . .reverse(true) + . . . . .utf8(core.info.config().get_utf8_empty()) + . . . . .nfa_size_limit(core.info.config().get_nfa_size_limit()) + . . . . .shrink(false) + . . . . .which_captures(WhichCaptures::None) + . . . . .look_matcher(lookm); + 52 ( 0.00%) . . . let result = thompson::Compiler::new() + 3,523 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::new (13x) + 351 ( 0.00%) . . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/nfa/thompson/compiler.rs:regex_automata::nfa::thompson::compiler::Compiler::configure (13x) + . . . . .configure(thompson_config) + 26 ( 0.00%) . . . .build_from_hir(&concat_prefix); +43,995 ( 0.01%) 230 ( 0.03%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (13x) + 26 ( 0.00%) . . . let nfarev = match result { + 26 ( 0.00%) . . . Ok(nfarev) => nfarev, + . . . . Err(_err) => { + . . . . debug!( + . . . . "skipping reverse inner optimization because the \ + . . . . reverse NFA failed to build: {}", + . . . . _err, + . . . . ); + . . . . return Err(core); + . . . . } + . . . . }; + . . . . debug!("building reverse DFA for prefix before inner literal"); + . . . . let dfa = if !core.info.config().get_dfa() { + . . . . wrappers::ReverseDFA::none() + . . . . } else { + . . . . wrappers::ReverseDFA::new(&core.info, &nfarev) + . . . . }; + 13 ( 0.00%) . . . let hybrid = if !core.info.config().get_hybrid() { + . . . . wrappers::ReverseHybrid::none() + . . . . } else if dfa.is_some() { + . . . . debug!( + . . . . "skipping lazy DFA for reverse inner optimization \ + . . . . because we have a full DFA" + . . . . ); + . . . . wrappers::ReverseHybrid::none() + . . . . } else { + 13 ( 0.00%) . . . wrappers::ReverseHybrid::new(&core.info, &nfarev) +83,760 ( 0.02%) 39 ( 0.00%) . . => /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.6/src/meta/wrappers.rs:regex_automata::meta::wrappers::ReverseHybrid::new (13x) + . . . . }; + 5,759 ( 0.00%) . . . Ok(ReverseInner { core, preinner, nfarev, hybrid, dfa }) + 2,470 ( 0.00%) . . . => ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:__memcpy_avx_unaligned_erms (26x) + 13 ( 0.00%) . . . } +233,455 ( 0.07%) 1,126 ( 0.14%) . . => /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs:core::ptr::drop_in_place (13x) + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn try_search_full( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . ) -> Result, RetryError> { + . . . . let mut span = input.get_span(); + . . . . let mut min_match_start = 0; + . . . . let mut min_pre_start = 0; + . . . . loop { + 24 ( 0.00%) . . . let litmatch = match self.preinner.find(input.haystack(), span) { + . . . . None => return Ok(None), + . . . . Some(span) => span, + . . . . }; + . . . . if litmatch.start < min_pre_start { + . . . . trace!( + . . . . "found inner prefilter match at {:?}, which starts \ + . . . . before the end of the last forward scan at {}, \ + . . . . quitting to avoid quadratic behavior", +-- line 1643 ---------------------------------------- +-- line 1746 ---------------------------------------- + . . . . } else { + . . . . unreachable!("ReverseInner always has a DFA") + . . . . } + . . . . } + . . . . } + . . . . + . . . . impl Strategy for ReverseInner { + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + 14 ( 0.00%) . . . fn group_info(&self) -> &GroupInfo { + . . . . self.core.group_info() + 14 ( 0.00%) . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + 77 ( 0.00%) . . . fn create_cache(&self) -> Cache { + . . . . let mut cache = self.core.create_cache(); + 11 ( 0.00%) . . . cache.revhybrid = self.hybrid.create_cache(); + . . . . cache + 99 ( 0.00%) . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn reset_cache(&self, cache: &mut Cache) { + . . . . self.core.reset_cache(cache); + . . . . cache.revhybrid.reset(&self.hybrid); + . . . . } + . . . . + . . . . fn is_accelerated(&self) -> bool { +-- line 1771 ---------------------------------------- +-- line 1835 ---------------------------------------- + . . . . self.core.is_match_nofail(cache, input) + . . . . } + . . . . Ok(None) => false, + . . . . Ok(Some(_)) => true, + . . . . } + . . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + 144 ( 0.00%) . . . fn search_slots( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . slots: &mut [Option], + . . . . ) -> Option { + 12 ( 0.00%) . . . if input.get_anchored().is_anchored() { + . . . . return self.core.search_slots(cache, input, slots); + . . . . } + 12 ( 0.00%) . . . if !self.core.is_capture_search_needed(slots.len()) { + . . . . trace!("asked for slots unnecessarily, trying fast path"); + . . . . let m = self.search(cache, input)?; + . . . . copy_match_to_slots(m, slots); + . . . . return Some(m.pattern()); + . . . . } + . . . . let m = match self.try_search_full(cache, input) { + . . . . Err(RetryError::Quadratic(_err)) => { + . . . . trace!("reverse inner captures optimization failed: {}", _err); +-- line 1860 ---------------------------------------- +-- line 1873 ---------------------------------------- + . . . . m.start(), + . . . . m.end(), + . . . . ); + . . . . let input = input + . . . . .clone() + . . . . .span(m.start()..m.end()) + . . . . .anchored(Anchored::Pattern(m.pattern())); + . . . . self.core.search_slots_nofail(cache, &input, slots) + 96 ( 0.00%) . . . } + . . . . + . . . . #[cfg_attr(feature = "perf-inline", inline(always))] + . . . . fn which_overlapping_matches( + . . . . &self, + . . . . cache: &mut Cache, + . . . . input: &Input<'_>, + . . . . patset: &mut PatternSet, + . . . . ) { +-- line 1889 ---------------------------------------- + +33,055 ( 0.01%) . . . + +-------------------------------------------------------------------------------- +The following files chosen for auto-annotation could not be found: +-------------------------------------------------------------------------------- + ./elf/../sysdeps/x86_64/dl-machine.h + ./elf/./elf/dl-lookup.c + ./elf/./elf/dl-tunables.c + ./elf/./elf/do-rel.h + ./malloc/./malloc/arena.c + ./malloc/./malloc/malloc.c + ./stdio-common/./stdio-common/vfscanf-internal.c + ./stdlib/../stdlib/strtol_l.c + ./string/../sysdeps/x86_64/multiarch/memcmp-avx2-movbe.S + ./string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S + ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S + ./string/../sysdeps/x86_64/strcmp.S + /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/map.rs + /cargo/registry/src/index.crates.io-6f17d22bba15001f/hashbrown-0.12.3/src/raw/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/alloc.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/boxed.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/map.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/node.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/btree/search.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/collections/vec_deque/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/macros.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/raw_vec.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/slice.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/string.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/drain.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/into_iter.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/set_len_on_drop.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_extend.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/alloc/src/vec/spec_from_iter.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/alloc/layout.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cell.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/char/methods.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/cmp.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/convert/num.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/fmt/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/hash/sip.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/intrinsics.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/map.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/adapters/take.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/range.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/accum.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/collect.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/iter/traits/iterator.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/macros/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/mem/manually_drop.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/num/uint_macros.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ops/range.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/option.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/const_ptr.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/ptr/mut_ptr.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/cmp.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/index.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/iter/macros.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/slice/sort.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/converts.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/mod.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/traits.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/str/validations.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/alloc.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/collections/hash/map.rs + /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/sys/unix/alloc.rs + +-------------------------------------------------------------------------------- +Ir Ge sysCount sysTime +-------------------------------------------------------------------------------- +65,119,396 (18.81%) 15 ( 0.00%) . . events annotated + diff --git a/releases/0.7.75/cargo-bench.txt b/releases/0.7.75/cargo-bench.txt new file mode 100644 index 00000000..9b0f01dd --- /dev/null +++ b/releases/0.7.75/cargo-bench.txt @@ -0,0 +1,358 @@ +Benchmarking decode_utf/dutf8_baseline_no_decoding +Benchmarking decode_utf/dutf8_baseline_no_decoding: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_baseline_no_decoding: Collecting 100 samples in estimated 5.0002 s (39M iterations) +Benchmarking decode_utf/dutf8_baseline_no_decoding: Analyzing +decode_utf/dutf8_baseline_no_decoding + time: [127.17 ns 127.71 ns 128.36 ns] +Found 20 outliers among 100 measurements (20.00%) + 3 (3.00%) high mild + 17 (17.00%) high severe +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string: Collecting 100 samples in estimated 5.0006 s (17M iterations) +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string: Analyzing +decode_utf/dutf8_encodingrs_decode_to_string + time: [282.15 ns 282.82 ns 283.65 ns] +Found 5 outliers among 100 measurements (5.00%) + 2 (2.00%) high mild + 3 (3.00%) high severe +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string_without_replacement +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string_without_replacement: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string_without_replacement: Collecting 100 samples in estimated 5.0002 s (21M iterations) +Benchmarking decode_utf/dutf8_encodingrs_decode_to_string_without_replacement: Analyzing +decode_utf/dutf8_encodingrs_decode_to_string_without_replacement + time: [243.87 ns 244.20 ns 244.62 ns] +Found 6 outliers among 100 measurements (6.00%) + 5 (5.00%) high mild + 1 (1.00%) high severe +Benchmarking decode_utf/dutf8_encodingrs_mem_utf8_latin1_up_to__std_str_from_utf8_unchecked +Benchmarking decode_utf/dutf8_encodingrs_mem_utf8_latin1_up_to__std_str_from_utf8_unchecked: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_encodingrs_mem_utf8_latin1_up_to__std_str_from_utf8_unchecked: Collecting 100 samples in estimated 5.0006 s (23M iterations) +Benchmarking decode_utf/dutf8_encodingrs_mem_utf8_latin1_up_to__std_str_from_utf8_unchecked: Analyzing +decode_utf/dutf8_encodingrs_mem_utf8_latin1_up_to__std_str_from_utf8_unchecked + time: [216.17 ns 217.83 ns 220.00 ns] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe +Benchmarking decode_utf/dutf8_std_str_from_utf8 +Benchmarking decode_utf/dutf8_std_str_from_utf8: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_std_str_from_utf8: Collecting 100 samples in estimated 5.0010 s (21M iterations) +Benchmarking decode_utf/dutf8_std_str_from_utf8: Analyzing +decode_utf/dutf8_std_str_from_utf8 + time: [233.38 ns 233.97 ns 234.64 ns] +Benchmarking decode_utf/dutf8_std_str_from_utf8_unchecked__allows_invalid +Benchmarking decode_utf/dutf8_std_str_from_utf8_unchecked__allows_invalid: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_std_str_from_utf8_unchecked__allows_invalid: Collecting 100 samples in estimated 5.0006 s (32M iterations) +Benchmarking decode_utf/dutf8_std_str_from_utf8_unchecked__allows_invalid: Analyzing +decode_utf/dutf8_std_str_from_utf8_unchecked__allows_invalid + time: [155.47 ns 156.36 ns 157.46 ns] +Found 10 outliers among 100 measurements (10.00%) + 6 (6.00%) high mild + 4 (4.00%) high severe +Benchmarking decode_utf/dutf8_custom_check1_lt0x80__overzealous +Benchmarking decode_utf/dutf8_custom_check1_lt0x80__overzealous: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_custom_check1_lt0x80__overzealous: Collecting 100 samples in estimated 5.0005 s (26M iterations) +Benchmarking decode_utf/dutf8_custom_check1_lt0x80__overzealous: Analyzing +decode_utf/dutf8_custom_check1_lt0x80__overzealous + time: [187.92 ns 188.70 ns 189.47 ns] +Found 8 outliers among 100 measurements (8.00%) + 4 (4.00%) low mild + 4 (4.00%) high mild +Benchmarking decode_utf/dutf8_custom_check2_lt0x80__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous +Benchmarking decode_utf/dutf8_custom_check2_lt0x80__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_custom_check2_lt0x80__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous: Collecting 100 samples in estimated 5.0004 s (31M iterations) +Benchmarking decode_utf/dutf8_custom_check2_lt0x80__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous: Analyzing +decode_utf/dutf8_custom_check2_lt0x80__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous + time: [164.61 ns 165.64 ns 166.76 ns] +Found 7 outliers among 100 measurements (7.00%) + 1 (1.00%) low mild + 4 (4.00%) high mild + 2 (2.00%) high severe +Benchmarking decode_utf/dutf8_custom_check3__is_ascii__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous +Benchmarking decode_utf/dutf8_custom_check3__is_ascii__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_custom_check3__is_ascii__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous: Collecting 100 samples in estimated 5.0005 s (44M iterations) +Benchmarking decode_utf/dutf8_custom_check3__is_ascii__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous: Analyzing +decode_utf/dutf8_custom_check3__is_ascii__fallback__encodingrs_mem_utf8_latin1_up_to__overzealous + time: [112.60 ns 113.02 ns 113.50 ns] +Benchmarking decode_utf/dutf8_bstr_to_str +Benchmarking decode_utf/dutf8_bstr_to_str: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_bstr_to_str: Collecting 100 samples in estimated 5.0010 s (23M iterations) +Benchmarking decode_utf/dutf8_bstr_to_str: Analyzing +decode_utf/dutf8_bstr_to_str + time: [215.31 ns 215.83 ns 216.46 ns] +Found 7 outliers among 100 measurements (7.00%) + 4 (4.00%) high mild + 3 (3.00%) high severe +Benchmarking decode_utf/dutf8_arraystring__SmallString_from_utf8 +Benchmarking decode_utf/dutf8_arraystring__SmallString_from_utf8: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_arraystring__SmallString_from_utf8: Collecting 100 samples in estimated 5.0021 s (9.4M iterations) +Benchmarking decode_utf/dutf8_arraystring__SmallString_from_utf8: Analyzing +decode_utf/dutf8_arraystring__SmallString_from_utf8 + time: [539.01 ns 541.44 ns 545.33 ns] +Found 12 outliers among 100 measurements (12.00%) + 1 (1.00%) low severe + 2 (2.00%) low mild + 5 (5.00%) high mild + 4 (4.00%) high severe +Benchmarking decode_utf/dutf8_arraystring__CacheString_from_utf8 +Benchmarking decode_utf/dutf8_arraystring__CacheString_from_utf8: Warming up for 3.0000 s +Benchmarking decode_utf/dutf8_arraystring__CacheString_from_utf8: Collecting 100 samples in estimated 5.0016 s (8.3M iterations) +Benchmarking decode_utf/dutf8_arraystring__CacheString_from_utf8: Analyzing +decode_utf/dutf8_arraystring__CacheString_from_utf8 + time: [600.01 ns 601.86 ns 603.48 ns] +Found 12 outliers among 100 measurements (12.00%) + 3 (3.00%) low severe + 6 (6.00%) low mild + 2 (2.00%) high mild + 1 (1.00%) high severe + +Benchmarking bench_prints/print_baseline +Benchmarking bench_prints/print_baseline: Warming up for 3.0000 s +Benchmarking bench_prints/print_baseline: Collecting 100 samples in estimated 5.0000 s (5.4B iterations) +Benchmarking bench_prints/print_baseline: Analyzing +bench_prints/print_baseline + time: [923.77 ps 924.92 ps 926.18 ps] +Found 3 outliers among 100 measurements (3.00%) + 3 (3.00%) high mild +Benchmarking bench_prints/get_byteslice_find_byte_and_repeatlast +Benchmarking bench_prints/get_byteslice_find_byte_and_repeatlast: Warming up for 3.0000 s +Benchmarking bench_prints/get_byteslice_find_byte_and_repeatlast: Collecting 100 samples in estimated 5.0005 s (46M iterations) +Benchmarking bench_prints/get_byteslice_find_byte_and_repeatlast: Analyzing +bench_prints/get_byteslice_find_byte_and_repeatlast + time: [108.90 ns 109.17 ns 109.49 ns] +Found 6 outliers among 100 measurements (6.00%) + 3 (3.00%) high mild + 3 (3.00%) high severe +Benchmarking bench_prints/get_byteslice_find_byte_iter +Benchmarking bench_prints/get_byteslice_find_byte_iter: Warming up for 3.0000 s +Benchmarking bench_prints/get_byteslice_find_byte_iter: Collecting 100 samples in estimated 5.0000 s (1.2B iterations) +Benchmarking bench_prints/get_byteslice_find_byte_iter: Analyzing +bench_prints/get_byteslice_find_byte_iter + time: [4.1771 ns 4.1869 ns 4.2029 ns] +Found 7 outliers among 100 measurements (7.00%) + 3 (3.00%) high mild + 4 (4.00%) high severe + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + +Benchmarking slice_contains/X_2_baseline +Benchmarking slice_contains/X_2_baseline: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_baseline: Collecting 100 samples in estimated 5.0000 s (4.4B iterations) +Benchmarking slice_contains/X_2_baseline: Analyzing +slice_contains/X_2_baseline + time: [1.1244 ns 1.1251 ns 1.1258 ns] +Found 2 outliers among 100 measurements (2.00%) + 2 (2.00%) high mild +Benchmarking slice_contains/X_2_custom1_slice_iter_found +Benchmarking slice_contains/X_2_custom1_slice_iter_found: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_custom1_slice_iter_found: Collecting 100 samples in estimated 5.0000 s (2.0B iterations) +Benchmarking slice_contains/X_2_custom1_slice_iter_found: Analyzing +slice_contains/X_2_custom1_slice_iter_found + time: [2.4590 ns 2.4619 ns 2.4650 ns] +Found 5 outliers among 100 measurements (5.00%) + 1 (1.00%) low mild + 1 (1.00%) high mild + 3 (3.00%) high severe +Benchmarking slice_contains/X_2_custom1_slice_iter_notfound +Benchmarking slice_contains/X_2_custom1_slice_iter_notfound: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_custom1_slice_iter_notfound: Collecting 100 samples in estimated 5.0001 s (138M iterations) +Benchmarking slice_contains/X_2_custom1_slice_iter_notfound: Analyzing +slice_contains/X_2_custom1_slice_iter_notfound + time: [36.080 ns 36.295 ns 36.554 ns] +Found 9 outliers among 100 measurements (9.00%) + 1 (1.00%) low mild + 3 (3.00%) high mild + 5 (5.00%) high severe +Benchmarking slice_contains/X_2_custom2_slice_iter_found +Benchmarking slice_contains/X_2_custom2_slice_iter_found: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_custom2_slice_iter_found: Collecting 100 samples in estimated 5.0000 s (2.0B iterations) +Benchmarking slice_contains/X_2_custom2_slice_iter_found: Analyzing +slice_contains/X_2_custom2_slice_iter_found + time: [2.4540 ns 2.4552 ns 2.4566 ns] +Found 11 outliers among 100 measurements (11.00%) + 1 (1.00%) low severe + 1 (1.00%) low mild + 5 (5.00%) high mild + 4 (4.00%) high severe +Benchmarking slice_contains/X_2_custom2_slice_iter_notfound +Benchmarking slice_contains/X_2_custom2_slice_iter_notfound: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_custom2_slice_iter_notfound: Collecting 100 samples in estimated 5.0001 s (162M iterations) +Benchmarking slice_contains/X_2_custom2_slice_iter_notfound: Analyzing +slice_contains/X_2_custom2_slice_iter_notfound + time: [30.829 ns 31.027 ns 31.293 ns] +Found 10 outliers among 100 measurements (10.00%) + 4 (4.00%) high mild + 6 (6.00%) high severe +Benchmarking slice_contains/X_2_custom3_contains_found +Benchmarking slice_contains/X_2_custom3_contains_found: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_custom3_contains_found: Collecting 100 samples in estimated 5.0000 s (1.0B iterations) +Benchmarking slice_contains/X_2_custom3_contains_found: Analyzing +slice_contains/X_2_custom3_contains_found + time: [4.9036 ns 4.9469 ns 4.9900 ns] +Found 10 outliers among 100 measurements (10.00%) + 2 (2.00%) low mild + 6 (6.00%) high mild + 2 (2.00%) high severe +Benchmarking slice_contains/X_2_custom3_contains_notfound +Benchmarking slice_contains/X_2_custom3_contains_notfound: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_custom3_contains_notfound: Collecting 100 samples in estimated 5.0001 s (242M iterations) +Benchmarking slice_contains/X_2_custom3_contains_notfound: Analyzing +slice_contains/X_2_custom3_contains_notfound + time: [20.567 ns 20.586 ns 20.609 ns] +Found 9 outliers among 100 measurements (9.00%) + 1 (1.00%) low mild + 6 (6.00%) high mild + 2 (2.00%) high severe +Benchmarking slice_contains/X_2_jetscii_found +Benchmarking slice_contains/X_2_jetscii_found: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_jetscii_found: Collecting 100 samples in estimated 5.0000 s (431M iterations) +Benchmarking slice_contains/X_2_jetscii_found: Analyzing +slice_contains/X_2_jetscii_found + time: [11.571 ns 11.576 ns 11.581 ns] +Found 14 outliers among 100 measurements (14.00%) + 1 (1.00%) low mild + 4 (4.00%) high mild + 9 (9.00%) high severe +Benchmarking slice_contains/X_2_jetscii_notfound +Benchmarking slice_contains/X_2_jetscii_notfound: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_jetscii_notfound: Collecting 100 samples in estimated 5.0001 s (208M iterations) +Benchmarking slice_contains/X_2_jetscii_notfound: Analyzing +slice_contains/X_2_jetscii_notfound + time: [23.992 ns 24.035 ns 24.103 ns] +Found 9 outliers among 100 measurements (9.00%) + 4 (4.00%) high mild + 5 (5.00%) high severe +Benchmarking slice_contains/X_2_memchr_found +Benchmarking slice_contains/X_2_memchr_found: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_memchr_found: Collecting 100 samples in estimated 5.0000 s (1.3B iterations) +Benchmarking slice_contains/X_2_memchr_found: Analyzing +slice_contains/X_2_memchr_found + time: [3.7809 ns 3.7835 ns 3.7864 ns] +Found 5 outliers among 100 measurements (5.00%) + 2 (2.00%) high mild + 3 (3.00%) high severe +Benchmarking slice_contains/X_2_memchr_notfound +Benchmarking slice_contains/X_2_memchr_notfound: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_memchr_notfound: Collecting 100 samples in estimated 5.0000 s (1.1B iterations) +Benchmarking slice_contains/X_2_memchr_notfound: Analyzing +slice_contains/X_2_memchr_notfound + time: [4.7379 ns 4.7408 ns 4.7439 ns] +Found 5 outliers among 100 measurements (5.00%) + 1 (1.00%) low severe + 1 (1.00%) low mild + 2 (2.00%) high mild + 1 (1.00%) high severe +Benchmarking slice_contains/X_2_unroll_found_200 +Benchmarking slice_contains/X_2_unroll_found_200: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_unroll_found_200: Collecting 100 samples in estimated 5.0000 s (1.0B iterations) +Benchmarking slice_contains/X_2_unroll_found_200: Analyzing +slice_contains/X_2_unroll_found_200 + time: [4.9241 ns 4.9693 ns 5.0132 ns] +Found 6 outliers among 100 measurements (6.00%) + 1 (1.00%) low mild + 3 (3.00%) high mild + 2 (2.00%) high severe +Benchmarking slice_contains/X_2_unroll_notfound_200 +Benchmarking slice_contains/X_2_unroll_notfound_200: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_unroll_notfound_200: Collecting 100 samples in estimated 5.0001 s (243M iterations) +Benchmarking slice_contains/X_2_unroll_notfound_200: Analyzing +slice_contains/X_2_unroll_notfound_200 + time: [20.541 ns 20.556 ns 20.573 ns] +Found 9 outliers among 100 measurements (9.00%) + 2 (2.00%) low severe + 1 (1.00%) low mild + 5 (5.00%) high mild + 1 (1.00%) high severe +Benchmarking slice_contains/X_2_unroll_found_80 +Benchmarking slice_contains/X_2_unroll_found_80: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_unroll_found_80: Collecting 100 samples in estimated 5.0000 s (2.2B iterations) +Benchmarking slice_contains/X_2_unroll_found_80: Analyzing +slice_contains/X_2_unroll_found_80 + time: [2.3036 ns 2.3225 ns 2.3452 ns] +Found 7 outliers among 100 measurements (7.00%) + 5 (5.00%) high mild + 2 (2.00%) high severe +Benchmarking slice_contains/X_2_unroll_notfound_80 +Benchmarking slice_contains/X_2_unroll_notfound_80: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_unroll_notfound_80: Collecting 100 samples in estimated 5.0000 s (456M iterations) +Benchmarking slice_contains/X_2_unroll_notfound_80: Analyzing +slice_contains/X_2_unroll_notfound_80 + time: [10.858 ns 10.884 ns 10.916 ns] +Found 11 outliers among 100 measurements (11.00%) + 3 (3.00%) high mild + 8 (8.00%) high severe +Benchmarking slice_contains/X_2_stringzilla_found +Benchmarking slice_contains/X_2_stringzilla_found: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_stringzilla_found: Collecting 100 samples in estimated 5.0000 s (533M iterations) +Benchmarking slice_contains/X_2_stringzilla_found: Analyzing +slice_contains/X_2_stringzilla_found + time: [9.5214 ns 9.5303 ns 9.5402 ns] +Found 3 outliers among 100 measurements (3.00%) + 1 (1.00%) high mild + 2 (2.00%) high severe +Benchmarking slice_contains/X_2_stringzilla_notfound +Benchmarking slice_contains/X_2_stringzilla_notfound: Warming up for 3.0000 s +Benchmarking slice_contains/X_2_stringzilla_notfound: Collecting 100 samples in estimated 5.0000 s (417M iterations) +Benchmarking slice_contains/X_2_stringzilla_notfound: Analyzing +slice_contains/X_2_stringzilla_notfound + time: [12.090 ns 12.107 ns 12.126 ns] +Found 2 outliers among 100 measurements (2.00%) + 1 (1.00%) high mild + 1 (1.00%) high severe +Benchmarking slice_contains/D2_baseline +Benchmarking slice_contains/D2_baseline: Warming up for 3.0000 s +Benchmarking slice_contains/D2_baseline: Collecting 100 samples in estimated 5.0000 s (4.4B iterations) +Benchmarking slice_contains/D2_baseline: Analyzing +slice_contains/D2_baseline + time: [1.1291 ns 1.1305 ns 1.1323 ns] +Found 9 outliers among 100 measurements (9.00%) + 1 (1.00%) low mild + 5 (5.00%) high mild + 3 (3.00%) high severe +Benchmarking slice_contains/D2_slice_contains_D2_custom +Benchmarking slice_contains/D2_slice_contains_D2_custom: Warming up for 3.0000 s +Benchmarking slice_contains/D2_slice_contains_D2_custom: Collecting 100 samples in estimated 5.0001 s (179M iterations) +Benchmarking slice_contains/D2_slice_contains_D2_custom: Analyzing +slice_contains/D2_slice_contains_D2_custom + time: [28.072 ns 28.157 ns 28.267 ns] +Found 7 outliers among 100 measurements (7.00%) + 3 (3.00%) high mild + 4 (4.00%) high severe +Benchmarking slice_contains/D2_slice_contains_D2_custom_not +Benchmarking slice_contains/D2_slice_contains_D2_custom_not: Warming up for 3.0000 s +Benchmarking slice_contains/D2_slice_contains_D2_custom_not: Collecting 100 samples in estimated 5.0002 s (101M iterations) +Benchmarking slice_contains/D2_slice_contains_D2_custom_not: Analyzing +slice_contains/D2_slice_contains_D2_custom_not + time: [49.272 ns 49.368 ns 49.488 ns] +Found 7 outliers among 100 measurements (7.00%) + 3 (3.00%) high mild + 4 (4.00%) high severe +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla: Warming up for 3.0000 s +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla: Collecting 100 samples in estimated 5.0000 s (69M iterations) +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla: Analyzing +slice_contains/D2_slice_contains_D2_stringzilla + time: [72.754 ns 72.977 ns 73.225 ns] +Found 6 outliers among 100 measurements (6.00%) + 2 (2.00%) low mild + 4 (4.00%) high severe +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla_not +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla_not: Warming up for 3.0000 s +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla_not: Collecting 100 samples in estimated 5.0001 s (48M iterations) +Benchmarking slice_contains/D2_slice_contains_D2_stringzilla_not: Analyzing +slice_contains/D2_slice_contains_D2_stringzilla_not + time: [106.85 ns 107.20 ns 107.63 ns] +Found 8 outliers among 100 measurements (8.00%) + 2 (2.00%) low severe + 1 (1.00%) low mild + 2 (2.00%) high mild + 3 (3.00%) high severe + + +running 0 tests + +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s + diff --git a/releases/0.7.75/compare-grep-sort.txt b/releases/0.7.75/compare-grep-sort.txt new file mode 100644 index 00000000..f14570e2 --- /dev/null +++ b/releases/0.7.75/compare-grep-sort.txt @@ -0,0 +1,91 @@ ++ uname -a +Linux uboo-ubuntu22 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux ++ git log -n1 '--format=%h %D' +d799548f HEAD -> main ++ ./target/release/s4 --version +super_speedy_syslog_searcher 0.7.75 ++ /usr/bin/grep --version +grep (GNU grep) 3.7 ++ /usr/bin/sort --version +sort (GNU coreutils) 8.32 ++ /usr/bin/time --version +time (GNU Time) UNKNOWN ++ hyperfine --version +hyperfine 1.18.0 + ++ cargo clean --quiet ++ cargo build --release --quiet ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-s4_s4_8om2t.md -N -n 's4 (System)' -- './target/release/s4 -a 20000101T080000 -b 20000101T085959.999999 --color=never ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log' +Benchmark 1: s4 (System) + Time (mean ± σ): 75.2 ms ± 2.0 ms [User: 58.7 ms, System: 71.9 ms] + Range (min … max): 71.9 ms … 80.5 ms 38 runs + + ++ cargo clean --quiet ++ cargo build --release --quiet --features=mimalloc ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-s4_s4_JiHfb.md -N -n 's4 (mimalloc)' -- './target/release/s4 -a 20000101T080000 -b 20000101T085959.999999 --color=never ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log' +Benchmark 1: s4 (mimalloc) + Time (mean ± σ): 43.4 ms ± 1.4 ms [User: 49.6 ms, System: 33.2 ms] + Range (min … max): 41.2 ms … 47.1 ms 66 runs + + ++ cargo clean --quiet ++ cargo build --release --quiet --features=jemalloc ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-s4_s4_CljQs.md -N -n 's4 (jemalloc)' -- './target/release/s4 -a 20000101T080000 -b 20000101T085959.999999 --color=never ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log' +Benchmark 1: s4 (jemalloc) + Time (mean ± σ): 49.7 ms ± 2.0 ms [User: 51.4 ms, System: 40.2 ms] + Range (min … max): 46.8 ms … 61.0 ms 62 runs + + ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-s4_s4_QualE.md --shell sh -n grep+sort -- '/usr/bin/grep -hEe '\''^20000101T08[[:digit:]]{4}'\'' ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log | /usr/bin/sort -t '\'' '\'' -k 1 -s' +Benchmark 1: grep+sort + Time (mean ± σ): 35.7 ms ± 0.8 ms [User: 24.7 ms, System: 6.9 ms] + Range (min … max): 34.7 ms … 39.5 ms 82 runs + ++ cat ./compare-s4_grep_sort.md +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:--- |---: |---: |---: |---: | +| `s4 (System)` | 75.2 ± 2.0 | 71.9 | 80.5 | 1.00 | +| `s4 (mimalloc)` | 43.4 ± 1.4 | 41.2 | 47.1 | 1.00 | +| `s4 (jemalloc)` | 49.7 ± 2.0 | 46.8 | 61.0 | 1.00 | +| `grep+sort` | 35.7 ± 0.8 | 34.7 | 39.5 | 1.00 | + + +COMMAND │ MEAN [MS] │ MIN [MS] │ MAX [MS] │ RELATIVE +────────────────┼────────────┼──────────┼──────────┼─────────── +s4 (System) │ 75.2 ± 2.0 │ 71.9 │ 80.5 │ 1.00 +s4 (mimalloc) │ 43.4 ± 1.4 │ 41.2 │ 47.1 │ 1.00 +s4 (jemalloc) │ 49.7 ± 2.0 │ 46.8 │ 61.0 │ 1.00 +grep+sort │ 35.7 ± 0.8 │ 34.7 │ 39.5 │ 1.00 + ++ cargo clean --quiet ++ cargo build --release --quiet ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- ./target/release/s4 -a 20000101T080000 -b 20000101T085959.999999 --color=never ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log +real 0.07 s, Max RSS 81624 KB, 171% %CPU, (0) + ++ cargo clean --quiet ++ cargo build --release --quiet --features=mimalloc ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- ./target/release/s4 -a 20000101T080000 -b 20000101T085959.999999 --color=never ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log +real 0.04 s, Max RSS 148740 KB, 202% %CPU, (0) + ++ cargo clean --quiet ++ cargo build --release --quiet --features=jemalloc ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- ./target/release/s4 -a 20000101T080000 -b 20000101T085959.999999 --color=never ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log +real 0.04 s, Max RSS 130820 KB, 185% %CPU, (0) + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- sh -c '/usr/bin/grep --color=never --text -hEe '\''^20000101T08[[:digit:]]{4}'\'' -- ./logs/other/tests/gen-100-1-no.log ./logs/other/tests/gen-100-10-.......log ./logs/other/tests/gen-100-10-BRAAAP.log ./logs/other/tests/gen-100-10-FOOBAR.log ./logs/other/tests/gen-100-10-______.log ./logs/other/tests/gen-100-10-skullcrossbones.log ./logs/other/tests/gen-100-4-happyface.log ./logs/other/tests/gen-1000-3-foobar.log ./logs/other/tests/gen-200-1-jajaja.log ./logs/other/tests/gen-400-4-shamrock.log ./logs/other/tests/gen-99999-1-Motley_Crue.log | /usr/bin/sort -t '\'' '\'' -k 1 -s >/dev/null' +real 0.02 s, Max RSS 8256 KB, 81% %CPU, (0) + +The output files will differ due to sorting method differences. +However Line Count and Byte Count should be the same. + +super_speedy_syslog_searcher output file + Line Count 10800 + Byte Count 3552746 +'grep+sort' output file + Line Count 10800 + Byte Count 3552746 +Files /tmp/compare-s4_s4_m9ONG and /tmp/compare-s4_grep_RsG15 differ + +Line Count and Byte Count are the same. (ʘ‿ʘ) + diff --git a/releases/0.7.75/compare-log-mergers.txt b/releases/0.7.75/compare-log-mergers.txt new file mode 100644 index 00000000..c4faf43d --- /dev/null +++ b/releases/0.7.75/compare-log-mergers.txt @@ -0,0 +1,138 @@ ++ git log -n1 --oneline -1 +d799548f (HEAD -> main) (PROJECT) bump version 0.7.75 ++ /usr/bin/time --version +time (GNU Time) UNKNOWN ++ python --version +Python 3.10.12 ++ hyperfine --version +hyperfine 1.18.0 ++ python -m pip install --upgrade --no-python-version-warning --disable-pip-version-check --force --quiet logmerger==0.9.0 +ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. +toolong 1.5.0 requires textual<0.59.0,>=0.58.0, but you have textual 0.71.0 which is incompatible. ++ python -m pip install --upgrade --no-python-version-warning --disable-pip-version-check --force --quiet toolong==1.5.0 ++ python -m pip install --upgrade --no-python-version-warning --disable-pip-version-check --force --quiet logdissect==3.1.1 +---------------------------------------- ++ /usr/bin/grep --version +grep (GNU grep) 3.7 ++ /usr/bin/sort --version +sort (GNU coreutils) 8.32 + ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-log_mergers_Nx7mJ.md --shell sh -n grep+sort -- '/usr/bin/grep -hEe '\''^2000-01-01T00\:([234][[:digit:]]\:[[:digit:]]{2}|50\:00)'\'' -- ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log | /usr/bin/sort -t '\'' '\'' -k 1 -s > /dev/null' +Benchmark 1: grep+sort + Time (mean ± σ): 41.0 ms ± 0.5 ms [User: 31.8 ms, System: 2.2 ms] + Range (min … max): 40.5 ms … 43.8 ms 72 runs + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- /usr/bin/grep -hEe '^2000-01-01T00\:([234][[:digit:]]\:[[:digit:]]{2}|50\:00)' -- ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log ++ /usr/bin/sort -t ' ' -k 1 -s +real 0.01 s, Max RSS 2740 KB, 46% %CPU, (0) + +4403 /tmp/compare-log-mergers_GwxgC.out + +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:---|---:|---:|---:|---:| +| `grep+sort` | 41.0 ± 0.5 | 40.5 | 43.8 | 1.00 | + +---------------------------------------- ++ ./target/release/s4 --version +super_speedy_syslog_searcher 0.7.75 + ++ cargo clean --quiet ++ cargo build --quiet --release ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-log_mergers_F8GHF.md -N -n 's4 (system)' -- ''\''./target/release/s4'\'' -a='\''2000-01-01T00:20:00'\'' -b='\''2000-01-01T00:50:00'\'' --color=never ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log > /dev/null' +Benchmark 1: s4 (system) + Time (mean ± σ): 37.3 ms ± 1.5 ms [User: 35.9 ms, System: 21.1 ms] + Range (min … max): 35.3 ms … 44.6 ms 77 runs + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- ./target/release/s4 -a=2000-01-01T00:20:00 -b=2000-01-01T00:50:00 --color=never ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log +real 0.05 s, Max RSS 48084 KB, 167% %CPU, (0) + +4403 /tmp/compare-log-mergers_GwxgC.out + +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:---|---:|---:|---:|---:| +| `s4 (system)` | 37.3 ± 1.5 | 35.3 | 44.6 | 1.00 | + +---------------------------------------- ++ cargo clean --quiet ++ cargo build --quiet --release --features=mimalloc ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-log_mergers_k1J5E.md -N -n 's4 (mimalloc)' -- ''\''./target/release/s4'\'' -a='\''2000-01-01T00:20:00'\'' -b='\''2000-01-01T00:50:00'\'' --color=never ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log > /dev/null' +Benchmark 1: s4 (mimalloc) + Time (mean ± σ): 30.3 ms ± 1.8 ms [User: 26.7 ms, System: 19.7 ms] + Range (min … max): 27.1 ms … 36.6 ms 104 runs + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- ./target/release/s4 -a=2000-01-01T00:20:00 -b=2000-01-01T00:50:00 --color=never ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log +real 0.04 s, Max RSS 77020 KB, 170% %CPU, (0) + +4403 /tmp/compare-log-mergers_GwxgC.out + +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:---|---:|---:|---:|---:| +| `s4 (mimalloc)` | 30.3 ± 1.8 | 27.1 | 36.6 | 1.00 | + +---------------------------------------- ++ cargo clean --quiet ++ cargo build --quiet --release --features=jemalloc ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-log_mergers_XaTRi.md -N -n 's4 (jemalloc))' -- ''\''./target/release/s4'\'' -a='\''2000-01-01T00:20:00'\'' -b='\''2000-01-01T00:50:00'\'' --color=never ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log > /dev/null' +Benchmark 1: s4 (jemalloc)) + Time (mean ± σ): 36.0 ms ± 2.0 ms [User: 27.3 ms, System: 26.2 ms] + Range (min … max): 32.5 ms … 43.2 ms 82 runs + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- ./target/release/s4 -a=2000-01-01T00:20:00 -b=2000-01-01T00:50:00 --color=never ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log +real 0.05 s, Max RSS 69028 KB, 170% %CPU, (0) + +4403 /tmp/compare-log-mergers_GwxgC.out + +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:---|---:|---:|---:|---:| +| `s4 (jemalloc))` | 36.0 ± 2.0 | 32.5 | 43.2 | 1.00 | + +---------------------------------------- ++ logmerger --version +logmerger 0.9.0 + ++ /home/ulug/.cargo/bin/hyperfine --style=basic --export-markdown /tmp/compare-log_mergers_Gbl2v.md --shell sh -n logmerger -- ''\''logmerger'\'' --inline --output=- --start '\''2000-01-01T00:20:00'\'' --end '\''2000-01-01T00:50:00'\'' ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log > /dev/null' +Benchmark 1: logmerger + Time (mean ± σ): 720.2 ms ± 4.9 ms [User: 693.1 ms, System: 25.0 ms] + Range (min … max): 712.9 ms … 728.0 ms 10 runs + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- logmerger --inline --output=- --start 2000-01-01T00:20:00 --end 2000-01-01T00:50:00 ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log +real 0.72 s, Max RSS 56332 KB, 99% %CPU, (0) + +4908 /tmp/compare-log-mergers_GwxgC.out + +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:---|---:|---:|---:|---:| +| `logmerger` | 720.2 ± 4.9 | 712.9 | 728.0 | 1.00 | + +---------------------------------------- ++ logdissect --version +logdissect 3.1.1 + +TODO: figure out how to use logdissect. I'm unable to get it to match on ANY files. + +---------------------------------------- ++ tl --version +tl, version 1.5.0 + ++ /usr/bin/time '--format=real %e s, Max RSS %M KB, %P %%CPU, (%x)' -- tl --merge --output-merge /tmp/compare-log-mergers_GwxgC.out ./tools/compare-log-mergers/gen-5000-1-faces.log ./tools/compare-log-mergers/gen-2500-1-faces.log ./tools/compare-log-mergers/gen-2000-1-faces.log +real 2.85 s, Max RSS 48784 KB, 15% %CPU, (0) + +10003 /tmp/compare-log-mergers_GwxgC.out + ++ cat ./compare-log_mergers.md +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:--- |---: |---: |---: |---: | +| `grep+sort` | 41.0 ± 0.5 | 40.5 | 43.8 | 1.00 | +| `s4 (system)` | 37.3 ± 1.5 | 35.3 | 44.6 | 1.00 | +| `s4 (mimalloc)` | 30.3 ± 1.8 | 27.1 | 36.6 | 1.00 | +| `s4 (jemalloc))` | 36.0 ± 2.0 | 32.5 | 43.2 | 1.00 | +| `logmerger` | 720.2 ± 4.9 | 712.9 | 728.0 | 1.00 | + + + COMMAND │ MEAN [MS] │ MIN [MS] │ MAX [MS] │ RELATIVE + ─────────────────┼─────────────┼──────────┼──────────┼─────────── + grep+sort │ 41.0 ± 0.5 │ 40.5 │ 43.8 │ 1.00 + s4 (system) │ 37.3 ± 1.5 │ 35.3 │ 44.6 │ 1.00 + s4 (mimalloc) │ 30.3 ± 1.8 │ 27.1 │ 36.6 │ 1.00 + s4 (jemalloc)) │ 36.0 ± 2.0 │ 32.5 │ 43.2 │ 1.00 + logmerger │ 720.2 ± 4.9 │ 712.9 │ 728.0 │ 1.00 \ No newline at end of file diff --git a/releases/0.7.75/compare-s4_grep_sort.md b/releases/0.7.75/compare-s4_grep_sort.md new file mode 100644 index 00000000..f8b4f716 --- /dev/null +++ b/releases/0.7.75/compare-s4_grep_sort.md @@ -0,0 +1,6 @@ +| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | +|:--- |---: |---: |---: |---: | +| `s4 (System)` | 75.2 ± 2.0 | 71.9 | 80.5 | 1.00 | +| `s4 (mimalloc)` | 43.4 ± 1.4 | 41.2 | 47.1 | 1.00 | +| `s4 (jemalloc)` | 49.7 ± 2.0 | 46.8 | 61.0 | 1.00 | +| `grep+sort` | 35.7 ± 0.8 | 34.7 | 39.5 | 1.00 | diff --git a/releases/0.7.75/flamegraph-evtx.svg b/releases/0.7.75/flamegraph-evtx.svg new file mode 100644 index 00000000..839ce42e --- /dev/null +++ b/releases/0.7.75/flamegraph-evtx.svg @@ -0,0 +1,3802 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231051-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/evtx/Microsoft-Windows-Kernel-PnP%4Configuration.evtx + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 3.91%) + + ret_.. + + + schedule_tail (22 samples, 3.91%) + + sche.. + + + finish_task_switch.isra.0 (22 samples, 3.91%) + + fini.. + + + __perf_event_task_sched_in (22 samples, 3.91%) + + __pe.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 3.91%) + + __ra.. + + + __x64_sys_exit_group (1 samples, 0.18%) + + + + + do_group_exit (1 samples, 0.18%) + + + + + do_exit (1 samples, 0.18%) + + + + + mm_update_next_owner (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.36%) + + + + + do_syscall_64 (2 samples, 0.36%) + + + + + __x64_sys_execve (1 samples, 0.18%) + + + + + do_execveat_common.isra.0 (1 samples, 0.18%) + + + + + bprm_execve (1 samples, 0.18%) + + + + + load_elf_binary (1 samples, 0.18%) + + + + + elf_map (1 samples, 0.18%) + + + + + vm_mmap_pgoff (1 samples, 0.18%) + + + + + do_mmap (1 samples, 0.18%) + + + + + mmap_region (1 samples, 0.18%) + + + + + vma_link (1 samples, 0.18%) + + + + + vma_interval_tree_insert (1 samples, 0.18%) + + + + + mmap_region (1 samples, 0.18%) + + + + + perf_event_mmap (1 samples, 0.18%) + + + + + perf_iterate_sb (1 samples, 0.18%) + + + + + start_thread (2 samples, 0.36%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.36%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.36%) + + + + + __mmap (2 samples, 0.36%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.36%) + + + + + do_syscall_64 (2 samples, 0.36%) + + + + + vm_mmap_pgoff (2 samples, 0.36%) + + + + + do_mmap (2 samples, 0.36%) + + + + + get_unmapped_area (1 samples, 0.18%) + + + + + arch_get_unmapped_area_topdown (1 samples, 0.18%) + + + + + clone3 (3 samples, 0.53%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __do_sys_clone3 (1 samples, 0.18%) + + + + + kernel_clone (1 samples, 0.18%) + + + + + copy_process (1 samples, 0.18%) + + + + + user_disable_single_step (1 samples, 0.18%) + + + + + finish_fault (1 samples, 0.18%) + + + + + do_set_pte (1 samples, 0.18%) + + + + + __page_set_anon_rmap (1 samples, 0.18%) + + + + + asm_exc_page_fault (2 samples, 0.36%) + + + + + exc_page_fault (2 samples, 0.36%) + + + + + do_user_addr_fault (2 samples, 0.36%) + + + + + handle_mm_fault (2 samples, 0.36%) + + + + + __handle_mm_fault (2 samples, 0.36%) + + + + + __mem_cgroup_charge (1 samples, 0.18%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.18%) + + + + + _dl_relocate_object (3 samples, 0.53%) + + + + + _dl_lookup_symbol_x (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + __handle_mm_fault (1 samples, 0.18%) + + + + + filemap_map_pages (1 samples, 0.18%) + + + + + xas_find (1 samples, 0.18%) + + + + + xas_load (1 samples, 0.18%) + + + + + _dl_new_object (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + __handle_mm_fault (1 samples, 0.18%) + + + + + filemap_map_pages (1 samples, 0.18%) + + + + + next_uptodate_page (1 samples, 0.18%) + + + + + _dl_map_object_deps (1 samples, 0.18%) + + + + + _dl_catch_exception (1 samples, 0.18%) + + + + + openaux (1 samples, 0.18%) + + + + + _dl_map_object (1 samples, 0.18%) + + + + + _dl_map_object_from_fd (1 samples, 0.18%) + + + + + _dl_start (6 samples, 1.07%) + + + + + _dl_sysdep_start (6 samples, 1.07%) + + + + + dl_main (6 samples, 1.07%) + + + + + __libc_early_init (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + __handle_mm_fault (1 samples, 0.18%) + + + + + __alloc_pages (1 samples, 0.18%) + + + + + get_page_from_freelist (1 samples, 0.18%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.18%) + + + + + clear_page_erms (1 samples, 0.18%) + + + + + syscall_exit_to_user_mode (1 samples, 0.18%) + + + + + do_syscall_64 (2 samples, 0.36%) + + + + + ksys_write (1 samples, 0.18%) + + + + + vfs_write (1 samples, 0.18%) + + + + + std::io::Write::write_all (3 samples, 0.53%) + + + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (3 samples, 0.53%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.53%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.53%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (3 samples, 0.53%) + + + + + __GI___libc_write (3 samples, 0.53%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.53%) + + + + + syscall_return_via_sysret (1 samples, 0.18%) + + + + + fsnotify (1 samples, 0.18%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::flush (3 samples, 0.53%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (3 samples, 0.53%) + + + + + __GI___libc_write (3 samples, 0.53%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.36%) + + + + + do_syscall_64 (2 samples, 0.36%) + + + + + ksys_write (2 samples, 0.36%) + + + + + vfs_write (2 samples, 0.36%) + + + + + __fsnotify_parent (2 samples, 0.36%) + + + + + dput (1 samples, 0.18%) + + + + + s4lib::printer::printers::PrinterLogMessage::print_evtx_color (7 samples, 1.24%) + + + + + <std::io::stdio::Stdout as std::io::Write>::flush (4 samples, 0.71%) + + + + + crossbeam_channel::select::Select::select (12 samples, 2.13%) + + c.. + + + crossbeam_channel::select::run_select (12 samples, 2.13%) + + c.. + + + crossbeam_channel::context::Context::with::{{closure}} (12 samples, 2.13%) + + c.. + + + crossbeam_channel::context::Context::wait_until (12 samples, 2.13%) + + c.. + + + std::thread::park (12 samples, 2.13%) + + s.. + + + syscall (12 samples, 2.13%) + + s.. + + + entry_SYSCALL_64_after_hwframe (12 samples, 2.13%) + + e.. + + + do_syscall_64 (12 samples, 2.13%) + + d.. + + + __x64_sys_futex (12 samples, 2.13%) + + _.. + + + do_futex (12 samples, 2.13%) + + d.. + + + futex_wait (12 samples, 2.13%) + + f.. + + + futex_wait_queue_me (12 samples, 2.13%) + + f.. + + + schedule (12 samples, 2.13%) + + s.. + + + __schedule (12 samples, 2.13%) + + _.. + + + finish_task_switch.isra.0 (12 samples, 2.13%) + + f.. + + + __perf_event_task_sched_in (12 samples, 2.13%) + + _.. + + + s4::processing_loop (20 samples, 3.55%) + + s4::.. + + + std::rt::lang_start::_{{closure}} (21 samples, 3.73%) + + std:.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (21 samples, 3.73%) + + std:.. + + + s4::main (21 samples, 3.73%) + + s4::.. + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.18%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.18%) + + + + + clap_builder::builder::command::Command::_build_self (1 samples, 0.18%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.18%) + + + + + <core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.18%) + + + + + <s4lib::readers::journalreader::JournalOutput as clap_builder::derive::ValueEnum>::to_possible_value (1 samples, 0.18%) + + + + + main (22 samples, 3.91%) + + main + + + std::rt::lang_start_internal (22 samples, 3.91%) + + std:.. + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.18%) + + + + + __getdelim (1 samples, 0.18%) + + + + + _IO_file_underflow@@GLIBC_2.2.5 (1 samples, 0.18%) + + + + + __read_nocancel (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + ksys_read (1 samples, 0.18%) + + + + + vfs_read (1 samples, 0.18%) + + + + + seq_read (1 samples, 0.18%) + + + + + seq_read_iter (1 samples, 0.18%) + + + + + show_map (1 samples, 0.18%) + + + + + show_map_vma (1 samples, 0.18%) + + + + + _start (29 samples, 5.15%) + + _start + + + __libc_start_main@@GLIBC_2.34 (23 samples, 4.09%) + + __li.. + + + __libc_start_call_main (23 samples, 4.09%) + + __li.. + + + exit (1 samples, 0.18%) + + + + + __run_exit_handlers (1 samples, 0.18%) + + + + + _exit (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __x64_sys_exit_group (1 samples, 0.18%) + + + + + do_group_exit (1 samples, 0.18%) + + + + + zap_other_threads (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + select_task_rq_fair (1 samples, 0.18%) + + + + + s4 (57 samples, 10.12%) + + s4 + + + [unknown] (1 samples, 0.18%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.18%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.18%) + + + + + __GI___libc_write (1 samples, 0.18%) + + + + + entry_SYSCALL_64 (1 samples, 0.18%) + + + + + x86_pmu_enable_all (16 samples, 2.84%) + + x8.. + + + perf-exec (17 samples, 3.02%) + + per.. + + + entry_SYSCALL_64_after_hwframe (17 samples, 3.02%) + + ent.. + + + do_syscall_64 (17 samples, 3.02%) + + do_.. + + + __x64_sys_execve (17 samples, 3.02%) + + __x.. + + + do_execveat_common.isra.0 (17 samples, 3.02%) + + do_.. + + + bprm_execve (17 samples, 3.02%) + + bpr.. + + + load_elf_binary (17 samples, 3.02%) + + loa.. + + + begin_new_exec (17 samples, 3.02%) + + beg.. + + + perf_event_exec (17 samples, 3.02%) + + per.. + + + asm_sysvec_irq_work (1 samples, 0.18%) + + + + + sysvec_irq_work (1 samples, 0.18%) + + + + + __sysvec_irq_work (1 samples, 0.18%) + + + + + irq_work_run_list (1 samples, 0.18%) + + + + + __wake_up_common_lock (1 samples, 0.18%) + + + + + __wake_up_common (1 samples, 0.18%) + + + + + ep_poll_callback (1 samples, 0.18%) + + + + + __wake_up_common_lock (1 samples, 0.18%) + + + + + __wake_up_common (1 samples, 0.18%) + + + + + ep_autoremove_wake_function (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.18%) + + + + + __raw_callee_save___pv_queued_spin_unlock (33 samples, 5.86%) + + __raw_c.. + + + __perf_event_task_sched_in (127 samples, 22.56%) + + __perf_event_task_sched_in + + + schedule_tail (150 samples, 26.64%) + + schedule_tail + + + finish_task_switch.isra.0 (150 samples, 26.64%) + + finish_task_switch.isra.0 + + + ret_from_fork (151 samples, 26.82%) + + ret_from_fork + + + calculate_sigpending (1 samples, 0.18%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.18%) + + + + + srso_alias_safe_ret (1 samples, 0.18%) + + + + + __mod_lruvec_page_state (2 samples, 0.36%) + + + + + __mod_memcg_lruvec_state (2 samples, 0.36%) + + + + + cgroup_rstat_updated (1 samples, 0.18%) + + + + + mmput (3 samples, 0.53%) + + + + + exit_mmap (3 samples, 0.53%) + + + + + unmap_vmas (3 samples, 0.53%) + + + + + unmap_page_range (3 samples, 0.53%) + + + + + page_remove_rmap (3 samples, 0.53%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.18%) + + + + + exit_fs (2 samples, 0.36%) + + + + + _raw_spin_lock (2 samples, 0.36%) + + + + + entry_SYSCALL_64_after_hwframe (6 samples, 1.07%) + + + + + do_syscall_64 (6 samples, 1.07%) + + + + + syscall_exit_to_user_mode (6 samples, 1.07%) + + + + + exit_to_user_mode_prepare (6 samples, 1.07%) + + + + + arch_do_signal_or_restart (6 samples, 1.07%) + + + + + get_signal (6 samples, 1.07%) + + + + + do_group_exit (6 samples, 1.07%) + + + + + do_exit (6 samples, 1.07%) + + + + + acct_process (1 samples, 0.18%) + + + + + do_acct_process (1 samples, 0.18%) + + + + + __kernel_write (1 samples, 0.18%) + + + + + ext4_buffered_write_iter (1 samples, 0.18%) + + + + + generic_perform_write (1 samples, 0.18%) + + + + + generic_write_end (1 samples, 0.18%) + + + + + __block_commit_write.constprop.0.isra.0 (1 samples, 0.18%) + + + + + rwsem_wake.isra.0 (1 samples, 0.18%) + + + + + wake_up_q (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + __task_rq_lock (1 samples, 0.18%) + + + + + _raw_spin_lock (1 samples, 0.18%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.18%) + + + + + schedule (1 samples, 0.18%) + + + + + __schedule (1 samples, 0.18%) + + + + + update_rq_clock (1 samples, 0.18%) + + + + + down_write_killable (4 samples, 0.71%) + + + + + rwsem_down_write_slowpath (4 samples, 0.71%) + + + + + __mmap (6 samples, 1.07%) + + + + + entry_SYSCALL_64_after_hwframe (6 samples, 1.07%) + + + + + do_syscall_64 (6 samples, 1.07%) + + + + + vm_mmap_pgoff (6 samples, 1.07%) + + + + + do_mmap (1 samples, 0.18%) + + + + + get_unmapped_area (1 samples, 0.18%) + + + + + arch_get_unmapped_area_topdown (1 samples, 0.18%) + + + + + vm_unmapped_area (1 samples, 0.18%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (7 samples, 1.24%) + + + + + __raw_callee_save___pv_queued_spin_unlock (14 samples, 2.49%) + + __.. + + + asm_exc_page_fault (29 samples, 5.15%) + + asm_ex.. + + + exc_page_fault (29 samples, 5.15%) + + exc_pa.. + + + do_user_addr_fault (29 samples, 5.15%) + + do_use.. + + + down_read (29 samples, 5.15%) + + down_r.. + + + rwsem_down_read_slowpath (29 samples, 5.15%) + + rwsem_.. + + + schedule_preempt_disabled (29 samples, 5.15%) + + schedu.. + + + schedule (29 samples, 5.15%) + + schedu.. + + + __schedule (29 samples, 5.15%) + + __sche.. + + + finish_task_switch.isra.0 (29 samples, 5.15%) + + finish.. + + + __perf_event_task_sched_in (29 samples, 5.15%) + + __perf.. + + + _dl_allocate_tls (1 samples, 0.18%) + + + + + __libc_calloc (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + up_read (1 samples, 0.18%) + + + + + rwsem_wake.isra.0 (1 samples, 0.18%) + + + + + wake_up_q (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + srso_alias_return_thunk (1 samples, 0.18%) + + + + + rwsem_wake.isra.0 (1 samples, 0.18%) + + + + + wake_up_q (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.18%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.18%) + + + + + <rayon_core::registry::DefaultSpawn as rayon_core::registry::ThreadSpawn>::spawn (32 samples, 5.68%) + + <rayon_.. + + + std::thread::Builder::spawn (32 samples, 5.68%) + + std::th.. + + + std::sys::unix::thread::Thread::new (32 samples, 5.68%) + + std::sy.. + + + pthread_create@GLIBC_2.2.5 (32 samples, 5.68%) + + pthread.. + + + __mmap (2 samples, 0.36%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.36%) + + + + + do_syscall_64 (2 samples, 0.36%) + + + + + vm_mmap_pgoff (2 samples, 0.36%) + + + + + do_mmap (1 samples, 0.18%) + + + + + mmap_region (1 samples, 0.18%) + + + + + perf_event_mmap (1 samples, 0.18%) + + + + + perf_iterate_sb (1 samples, 0.18%) + + + + + perf_iterate_ctx (1 samples, 0.18%) + + + + + perf_event_mmap_output (1 samples, 0.18%) + + + + + s4lib::readers::evtxreader::EvtxReader::new (33 samples, 5.86%) + + s4lib::.. + + + evtx::evtx_parser::ParserSettings::num_threads (33 samples, 5.86%) + + evtx::e.. + + + rayon_core::current_num_threads (33 samples, 5.86%) + + rayon_c.. + + + rayon_core::registry::global_registry (33 samples, 5.86%) + + rayon_c.. + + + std::sys_common::once::futex::Once::call (33 samples, 5.86%) + + std::sy.. + + + rayon_core::registry::default_global_registry (33 samples, 5.86%) + + rayon_c.. + + + rayon_core::registry::Registry::new (33 samples, 5.86%) + + rayon_c.. + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.18%) + + + + + __rdl_alloc (1 samples, 0.18%) + + + + + __posix_memalign (1 samples, 0.18%) + + + + + _int_memalign (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + s4lib::data::evtx::Evtx::from_evtxrs (1 samples, 0.18%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.18%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.18%) + + + + + realloc (1 samples, 0.18%) + + + + + _int_realloc (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + sysmalloc (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + __handle_mm_fault (1 samples, 0.18%) + + + + + __mem_cgroup_charge (1 samples, 0.18%) + + + + + charge_memcg (1 samples, 0.18%) + + + + + core::iter::adapters::flatten::and_then_or_clear (1 samples, 0.18%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.18%) + + + + + _int_free (1 samples, 0.18%) + + + + + __madvise (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __x64_sys_madvise (1 samples, 0.18%) + + + + + do_madvise.part.0 (1 samples, 0.18%) + + + + + zap_page_range (1 samples, 0.18%) + + + + + unmap_page_range (1 samples, 0.18%) + + + + + filemap_get_pages (1 samples, 0.18%) + + + + + filemap_get_read_batch (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + std::io::Read::read_to_end (3 samples, 0.53%) + + + + + <std::process::ChildStdout as std::io::Read>::read_buf (3 samples, 0.53%) + + + + + read (3 samples, 0.53%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.53%) + + + + + do_syscall_64 (3 samples, 0.53%) + + + + + ksys_read (3 samples, 0.53%) + + + + + vfs_read (3 samples, 0.53%) + + + + + new_sync_read (3 samples, 0.53%) + + + + + filemap_read (3 samples, 0.53%) + + + + + copy_page_to_iter (2 samples, 0.36%) + + + + + copy_user_enhanced_fast_string (2 samples, 0.36%) + + + + + s4lib::readers::evtxreader::EvtxReader::analyze (36 samples, 6.39%) + + s4lib::r.. + + + <evtx::evtx_parser::IterChunks<T> as core::iter::traits::iterator::Iterator>::next (34 samples, 6.04%) + + <evtx::e.. + + + __sched_yield (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __x64_sys_sched_yield (1 samples, 0.18%) + + + + + schedule (1 samples, 0.18%) + + + + + __schedule (1 samples, 0.18%) + + + + + s4::exec_fileprocessor_thread (72 samples, 12.79%) + + s4::exec_fileproces.. + + + crossbeam_channel::channel::Sender<T>::send (3 samples, 0.53%) + + + + + get_futex_key (1 samples, 0.18%) + + + + + internal_get_user_pages_fast (1 samples, 0.18%) + + + + + try_grab_compound_head (1 samples, 0.18%) + + + + + mm_release (2 samples, 0.36%) + + + + + do_futex (2 samples, 0.36%) + + + + + futex_wake (2 samples, 0.36%) + + + + + do_group_exit (3 samples, 0.53%) + + + + + do_exit (3 samples, 0.53%) + + + + + exit_mm_release (1 samples, 0.18%) + + + + + futex_exit_release (1 samples, 0.18%) + + + + + exit_robust_list (1 samples, 0.18%) + + + + + syscall_exit_to_user_mode (10 samples, 1.78%) + + s.. + + + exit_to_user_mode_prepare (10 samples, 1.78%) + + e.. + + + arch_do_signal_or_restart (10 samples, 1.78%) + + a.. + + + get_signal (10 samples, 1.78%) + + g.. + + + _raw_spin_lock_irq (7 samples, 1.24%) + + + + + __pv_queued_spin_lock_slowpath (7 samples, 1.24%) + + + + + x86_pmu_enable_all (19 samples, 3.37%) + + x86.. + + + __raw_callee_save___pv_queued_spin_unlock (19 samples, 3.37%) + + __r.. + + + std::sys::unix::locks::futex_condvar::Condvar::wait (145 samples, 25.75%) + + std::sys::unix::locks::futex_condvar::Con.. + + + syscall (145 samples, 25.75%) + + syscall + + + entry_SYSCALL_64_after_hwframe (145 samples, 25.75%) + + entry_SYSCALL_64_after_hwframe + + + do_syscall_64 (145 samples, 25.75%) + + do_syscall_64 + + + __x64_sys_futex (135 samples, 23.98%) + + __x64_sys_futex + + + do_futex (135 samples, 23.98%) + + do_futex + + + futex_wait (135 samples, 23.98%) + + futex_wait + + + futex_wait_queue_me (135 samples, 23.98%) + + futex_wait_queue_me + + + schedule (135 samples, 23.98%) + + schedule + + + __schedule (135 samples, 23.98%) + + __schedule + + + finish_task_switch.isra.0 (135 samples, 23.98%) + + finish_task_switch.isra.0 + + + __perf_event_task_sched_in (135 samples, 23.98%) + + __perf_event_task_sched_in + + + rayon_core::sleep::Sleep::sleep (146 samples, 25.93%) + + rayon_core::sleep::Sleep::sleep + + + crossbeam_deque::deque::Stealer<T>::steal (1 samples, 0.18%) + + + + + rayon_core::registry::WorkerThread::find_work (2 samples, 0.36%) + + + + + <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::try_fold (1 samples, 0.18%) + + + + + crossbeam_deque::deque::Stealer<T>::steal (1 samples, 0.18%) + + + + + crossbeam_epoch::default::with_handle (1 samples, 0.18%) + + + + + crossbeam_deque::deque::Stealer<T>::steal (1 samples, 0.18%) + + + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 0.18%) + + + + + crossbeam_epoch::default::default_collector (1 samples, 0.18%) + + + + + crossbeam_epoch::sync::once_lock::OnceLock<T>::initialize (1 samples, 0.18%) + + + + + schedule (1 samples, 0.18%) + + + + + __schedule (1 samples, 0.18%) + + + + + update_rq_clock (1 samples, 0.18%) + + + + + sched_clock_cpu (1 samples, 0.18%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.18%) + + + + + read_hv_clock_tsc (1 samples, 0.18%) + + + + + __x64_sys_sched_yield (3 samples, 0.53%) + + + + + do_sched_yield (2 samples, 0.36%) + + + + + __sched_yield (4 samples, 0.71%) + + + + + entry_SYSCALL_64_after_hwframe (4 samples, 0.71%) + + + + + do_syscall_64 (4 samples, 0.71%) + + + + + quick_xml::writer::Writer<W>::write_event (2 samples, 0.36%) + + + + + <quick_xml::events::BytesCData as core::ops::deref::Deref>::deref (2 samples, 0.36%) + + + + + quick_xml::events::BytesDecl::new (1 samples, 0.18%) + + + + + evtx::model::xml::XmlElementBuilder::attribute_value (1 samples, 0.18%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.18%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.18%) + + + + + malloc (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + sysmalloc (1 samples, 0.18%) + + + + + __mprotect (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __x64_sys_mprotect (1 samples, 0.18%) + + + + + do_mprotect_pkey (1 samples, 0.18%) + + + + + mprotect_fixup (1 samples, 0.18%) + + + + + change_protection (1 samples, 0.18%) + + + + + evtx::binxml::assemble::create_record_model (4 samples, 0.71%) + + + + + quick_xml::writer::Writer<W>::write_event (1 samples, 0.18%) + + + + + evtx::evtx_record::EvtxRecord::into_xml (10 samples, 1.78%) + + e.. + + + evtx::binxml::assemble::parse_tokens (10 samples, 1.78%) + + e.. + + + <evtx::xml_output::XmlOutput<W> as evtx::xml_output::BinXmlOutput>::visit_open_start_element (3 samples, 0.53%) + + + + + quick_xml::events::BytesStart::push_attribute (2 samples, 0.36%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.36%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.36%) + + + + + realloc (2 samples, 0.36%) + + + + + evtx::binxml::value_variant::BinXmlValue::deserialize_value_type (1 samples, 0.18%) + + + + + evtx::utils::binxml_utils::read_utf16_by_size (1 samples, 0.18%) + + + + + evtx::utils::binxml_utils::read_utf16_string (1 samples, 0.18%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (12 samples, 2.13%) + + <.. + + + <evtx::evtx_chunk::IterChunkRecords as core::iter::traits::iterator::Iterator>::next (2 samples, 0.36%) + + + + + <evtx::binxml::deserializer::IterTokens as core::iter::traits::iterator::Iterator>::next (2 samples, 0.36%) + + + + + evtx::binxml::tokens::read_template (2 samples, 0.36%) + + + + + std::panicking::try (13 samples, 2.31%) + + s.. + + + rayon_core::join::join_context::_{{closure}} (13 samples, 2.31%) + + r.. + + + rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 2.31%) + + r.. + + + rayon::iter::plumbing::Folder::consume_iter (13 samples, 2.31%) + + r.. + + + core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once (13 samples, 2.31%) + + c.. + + + evtx::evtx_chunk::EvtxChunkData::parse (1 samples, 0.18%) + + + + + evtx::evtx_chunk::EvtxChunk::new (1 samples, 0.18%) + + + + + evtx::template_cache::TemplateCache::populate (1 samples, 0.18%) + + + + + evtx::binxml::tokens::read_template_definition (1 samples, 0.18%) + + + + + evtx::binxml::deserializer::BinXmlDeserializer::read_binxml_fragment (1 samples, 0.18%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.18%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.18%) + + + + + realloc (1 samples, 0.18%) + + + + + _int_realloc (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + __handle_mm_fault (1 samples, 0.18%) + + + + + lru_cache_add (1 samples, 0.18%) + + + + + __pagevec_lru_add (1 samples, 0.18%) + + + + + release_pages (1 samples, 0.18%) + + + + + evtx::model::xml::XmlElementBuilder::finish (1 samples, 0.18%) + + + + + evtx::binxml::assemble::create_record_model (3 samples, 0.53%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.36%) + + + + + _int_free (2 samples, 0.36%) + + + + + unlink_chunk.constprop.0 (2 samples, 0.36%) + + + + + quick_xml::events::BytesStart::push_attribute (1 samples, 0.18%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.18%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.18%) + + + + + realloc (1 samples, 0.18%) + + + + + _int_realloc (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + <evtx::xml_output::XmlOutput<W> as evtx::xml_output::BinXmlOutput>::visit_open_start_element (3 samples, 0.53%) + + + + + <quick_xml::events::attributes::Attribute as core::convert::From<(&str,&str)>>::from (2 samples, 0.36%) + + + + + evtx::evtx_record::EvtxRecord::into_xml (10 samples, 1.78%) + + e.. + + + evtx::binxml::assemble::parse_tokens (10 samples, 1.78%) + + e.. + + + evtx::binxml::tokens::read_template (1 samples, 0.18%) + + + + + evtx::binxml::value_variant::BinXmlValue::deserialize_value_type (1 samples, 0.18%) + + + + + evtx::utils::binxml_utils::read_utf16_by_size (1 samples, 0.18%) + + + + + evtx::utils::binxml_utils::read_utf16_string (1 samples, 0.18%) + + + + + <alloc::string::String as core::iter::traits::collect::FromIterator<char>>::from_iter (1 samples, 0.18%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold (1 samples, 0.18%) + + + + + rayon_core::registry::in_worker (13 samples, 2.31%) + + r.. + + + rayon_core::join::join_context::_{{closure}} (13 samples, 2.31%) + + r.. + + + rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 2.31%) + + r.. + + + rayon::iter::plumbing::Folder::consume_iter (13 samples, 2.31%) + + r.. + + + core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once (13 samples, 2.31%) + + c.. + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (12 samples, 2.13%) + + <.. + + + <evtx::evtx_chunk::IterChunkRecords as core::iter::traits::iterator::Iterator>::next (2 samples, 0.36%) + + + + + <evtx::binxml::deserializer::IterTokens as core::iter::traits::iterator::Iterator>::next (2 samples, 0.36%) + + + + + evtx::binxml::tokens::read_template (2 samples, 0.36%) + + + + + evtx::binxml::value_variant::BinXmlValue::deserialize_value_type (2 samples, 0.36%) + + + + + evtx::binxml::deserializer::BinXmlDeserializer::read_binxml_fragment (2 samples, 0.36%) + + + + + <evtx::binxml::deserializer::IterTokens as core::iter::traits::iterator::Iterator>::next (2 samples, 0.36%) + + + + + evtx::binxml::assemble::expand_templates (1 samples, 0.18%) + + + + + evtx::binxml::assemble::_expand_templates (1 samples, 0.18%) + + + + + evtx::binxml::assemble::expand_template (1 samples, 0.18%) + + + + + evtx::binxml::assemble::_expand_templates (1 samples, 0.18%) + + + + + evtx::binxml::assemble::_expand_templates (1 samples, 0.18%) + + + + + evtx::binxml::assemble::expand_template (1 samples, 0.18%) + + + + + evtx::binxml::assemble::_expand_templates (1 samples, 0.18%) + + + + + malloc (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + sysmalloc (1 samples, 0.18%) + + + + + __mprotect (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __x64_sys_mprotect (1 samples, 0.18%) + + + + + do_mprotect_pkey (1 samples, 0.18%) + + + + + mprotect_fixup (1 samples, 0.18%) + + + + + perf_event_mmap (1 samples, 0.18%) + + + + + perf_iterate_sb (1 samples, 0.18%) + + + + + perf_iterate_ctx (1 samples, 0.18%) + + + + + perf_event_mmap_output (1 samples, 0.18%) + + + + + perf_output_copy (1 samples, 0.18%) + + + + + memcpy_erms (1 samples, 0.18%) + + + + + evtx::binxml::assemble::create_record_model (3 samples, 0.53%) + + + + + quick_xml::writer::Indentation::current (1 samples, 0.18%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.18%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.18%) + + + + + realloc (1 samples, 0.18%) + + + + + evtx::evtx_record::EvtxRecord::into_xml (7 samples, 1.24%) + + + + + evtx::binxml::assemble::parse_tokens (7 samples, 1.24%) + + + + + <evtx::xml_output::XmlOutput<W> as evtx::xml_output::BinXmlOutput>::visit_open_start_element (3 samples, 0.53%) + + + + + quick_xml::writer::Writer<W>::write_event (3 samples, 0.53%) + + + + + rayon_core::registry::WorkerThread::wait_until_cold (187 samples, 33.21%) + + rayon_core::registry::WorkerThread::wait_until_cold + + + <rayon_core::job::StackJob<L,F,R> as rayon_core::job::Job>::execute (34 samples, 6.04%) + + <rayon_c.. + + + rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 3.73%) + + rayo.. + + + rayon::iter::plumbing::Folder::consume_iter (8 samples, 1.42%) + + + + + core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once (8 samples, 1.42%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (8 samples, 1.42%) + + + + + <evtx::evtx_chunk::IterChunkRecords as core::iter::traits::iterator::Iterator>::next (1 samples, 0.18%) + + + + + <evtx::binxml::deserializer::IterTokens as core::iter::traits::iterator::Iterator>::next (1 samples, 0.18%) + + + + + evtx::binxml::tokens::read_template (1 samples, 0.18%) + + + + + evtx::binxml::value_variant::BinXmlValue::deserialize_value_type (1 samples, 0.18%) + + + + + evtx::binxml::deserializer::BinXmlDeserializer::read_binxml_fragment (1 samples, 0.18%) + + + + + <evtx::binxml::deserializer::IterTokens as core::iter::traits::iterator::Iterator>::next (1 samples, 0.18%) + + + + + evtx::binxml::tokens::read_template (1 samples, 0.18%) + + + + + evtx::binxml::value_variant::BinXmlValue::deserialize_value_type (1 samples, 0.18%) + + + + + evtx::utils::binxml_utils::read_utf16_by_size (1 samples, 0.18%) + + + + + evtx::utils::binxml_utils::read_utf16_string (1 samples, 0.18%) + + + + + <alloc::string::String as core::iter::traits::collect::FromIterator<char>>::from_iter (1 samples, 0.18%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::try_fold (1 samples, 0.18%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.18%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.18%) + + + + + realloc (1 samples, 0.18%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (260 samples, 46.18%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + rayon_core::registry::ThreadBuilder::run (188 samples, 33.39%) + + rayon_core::registry::ThreadBuilder::run + + + <rayon_core::registry::WorkerThread as core::convert::From<rayon_core::registry::ThreadBuilder>>::from (1 samples, 0.18%) + + + + + malloc (1 samples, 0.18%) + + + + + _int_malloc (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + down_read (1 samples, 0.18%) + + + + + rwsem_down_read_slowpath (1 samples, 0.18%) + + + + + schedule_preempt_disabled (1 samples, 0.18%) + + + + + schedule (1 samples, 0.18%) + + + + + __schedule (1 samples, 0.18%) + + + + + dequeue_task_fair (1 samples, 0.18%) + + + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + handle_mm_fault (1 samples, 0.18%) + + + + + __handle_mm_fault (1 samples, 0.18%) + + + + + __alloc_pages (1 samples, 0.18%) + + + + + get_page_from_freelist (1 samples, 0.18%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.18%) + + + + + clear_page_erms (1 samples, 0.18%) + + + + + rwsem_wake.isra.0 (1 samples, 0.18%) + + + + + wake_up_q (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.18%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.18%) + + + + + mprotect_fixup (1 samples, 0.18%) + + + + + __split_vma (1 samples, 0.18%) + + + + + __vma_adjust (1 samples, 0.18%) + + + + + __mprotect (3 samples, 0.53%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.53%) + + + + + do_syscall_64 (3 samples, 0.53%) + + + + + __x64_sys_mprotect (3 samples, 0.53%) + + + + + do_mprotect_pkey (3 samples, 0.53%) + + + + + down_write_killable (1 samples, 0.18%) + + + + + rwsem_down_write_slowpath (1 samples, 0.18%) + + + + + schedule (14 samples, 2.49%) + + sc.. + + + __schedule (14 samples, 2.49%) + + __.. + + + finish_task_switch.isra.0 (14 samples, 2.49%) + + fi.. + + + __perf_event_task_sched_in (14 samples, 2.49%) + + __.. + + + std::sys::unix::thread::Thread::new::thread_start (286 samples, 50.80%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (279 samples, 49.56%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys::unix::thread::guard::current (19 samples, 3.37%) + + std.. + + + pthread_getattr_np@@GLIBC_2.32 (19 samples, 3.37%) + + pth.. + + + malloc (19 samples, 3.37%) + + mal.. + + + tcache_init.part.0 (19 samples, 3.37%) + + tca.. + + + arena_get2.part.0 (19 samples, 3.37%) + + are.. + + + alloc_new_heap (19 samples, 3.37%) + + all.. + + + __mmap (15 samples, 2.66%) + + __.. + + + entry_SYSCALL_64_after_hwframe (15 samples, 2.66%) + + en.. + + + do_syscall_64 (15 samples, 2.66%) + + do.. + + + vm_mmap_pgoff (15 samples, 2.66%) + + vm.. + + + down_write_killable (15 samples, 2.66%) + + do.. + + + rwsem_down_write_slowpath (15 samples, 2.66%) + + rw.. + + + osq_lock (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.18%) + + + + + do_syscall_64 (1 samples, 0.18%) + + + + + __x64_sys_exit (1 samples, 0.18%) + + + + + do_exit (1 samples, 0.18%) + + + + + acct_collect (1 samples, 0.18%) + + + + + _raw_spin_lock_irq (1 samples, 0.18%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.18%) + + + + + start_thread (288 samples, 51.15%) + + start_thread + + + entry_SYSCALL_64 (1 samples, 0.18%) + + + + + memset_erms (1 samples, 0.18%) + + + + + kmem_cache_alloc (2 samples, 0.36%) + + + + + perf_event_init_task (3 samples, 0.53%) + + + + + inherit_task_group.isra.0 (3 samples, 0.53%) + + + + + inherit_event.constprop.0 (3 samples, 0.53%) + + + + + perf_event_alloc (3 samples, 0.53%) + + + + + memset_erms (1 samples, 0.18%) + + + + + entry_SYSCALL_64_after_hwframe (5 samples, 0.89%) + + + + + do_syscall_64 (5 samples, 0.89%) + + + + + __do_sys_clone3 (5 samples, 0.89%) + + + + + kernel_clone (5 samples, 0.89%) + + + + + copy_process (5 samples, 0.89%) + + + + + alloc_pid (1 samples, 0.18%) + + + + + idr_alloc_cyclic (1 samples, 0.18%) + + + + + idr_alloc_u32 (1 samples, 0.18%) + + + + + idr_get_free (1 samples, 0.18%) + + + + + clone3 (294 samples, 52.22%) + + clone3 + + + asm_exc_page_fault (1 samples, 0.18%) + + + + + exc_page_fault (1 samples, 0.18%) + + + + + do_user_addr_fault (1 samples, 0.18%) + + + + + up_read (1 samples, 0.18%) + + + + + rwsem_wake.isra.0 (1 samples, 0.18%) + + + + + wake_up_q (1 samples, 0.18%) + + + + + try_to_wake_up (1 samples, 0.18%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.18%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.18%) + + + + + __mem_cgroup_charge (1 samples, 0.18%) + + + + + charge_memcg (1 samples, 0.18%) + + + + + __alloc_pages (1 samples, 0.18%) + + + + + get_page_from_freelist (1 samples, 0.18%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.18%) + + + + + clear_page_erms (1 samples, 0.18%) + + + + + handle_mm_fault (3 samples, 0.53%) + + + + + __handle_mm_fault (3 samples, 0.53%) + + + + + find_vma (1 samples, 0.18%) + + + + + __perf_event_task_sched_in (22 samples, 3.91%) + + __pe.. + + + asm_exc_page_fault (36 samples, 6.39%) + + asm_exc_.. + + + exc_page_fault (36 samples, 6.39%) + + exc_page.. + + + do_user_addr_fault (36 samples, 6.39%) + + do_user_.. + + + down_read (32 samples, 5.68%) + + down_re.. + + + rwsem_down_read_slowpath (32 samples, 5.68%) + + rwsem_d.. + + + schedule_preempt_disabled (32 samples, 5.68%) + + schedul.. + + + schedule (32 samples, 5.68%) + + schedule + + + __schedule (32 samples, 5.68%) + + __sched.. + + + finish_task_switch.isra.0 (32 samples, 5.68%) + + finish_.. + + + __irqentry_text_end (1 samples, 0.18%) + + + + + all (563 samples, 100%) + + + + + Microsoft-Windo (489 samples, 86.86%) + + Microsoft-Windo + + + [unknown] (1 samples, 0.18%) + + + + + s4lib::readers::filedecompressor::decompress_to_ntf (1 samples, 0.18%) + + + + + diff --git a/releases/0.7.75/flamegraph-help.svg b/releases/0.7.75/flamegraph-help.svg new file mode 100644 index 00000000..08bc6bd0 --- /dev/null +++ b/releases/0.7.75/flamegraph-help.svg @@ -0,0 +1,1287 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 9999; created 20240707T231048-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 --help + + Reset Zoom + Search + + + + __x64_sys_exit_group (1 samples, 3.12%) + + __x.. + + + do_group_exit (1 samples, 3.12%) + + do_.. + + + do_exit (1 samples, 3.12%) + + do_.. + + + mmput (1 samples, 3.12%) + + mmp.. + + + exit_mmap (1 samples, 3.12%) + + exi.. + + + tlb_finish_mmu (1 samples, 3.12%) + + tlb.. + + + release_pages (1 samples, 3.12%) + + rel.. + + + free_unref_page_list (1 samples, 3.12%) + + fre.. + + + free_unref_page_commit.constprop.0 (1 samples, 3.12%) + + fre.. + + + __list_add_valid (1 samples, 3.12%) + + __l.. + + + vm_mmap_pgoff (1 samples, 3.12%) + + vm_.. + + + do_mmap (1 samples, 3.12%) + + do_.. + + + mmap_region (1 samples, 3.12%) + + mma.. + + + perf_event_mmap (1 samples, 3.12%) + + per.. + + + perf_iterate_sb (1 samples, 3.12%) + + per.. + + + perf_iterate_ctx (1 samples, 3.12%) + + per.. + + + perf_event_mmap_output (1 samples, 3.12%) + + per.. + + + memcpy_erms (1 samples, 3.12%) + + mem.. + + + entry_SYSCALL_64_after_hwframe (3 samples, 9.38%) + + entry_SYSCALL.. + + + do_syscall_64 (3 samples, 9.38%) + + do_syscall_64 + + + __x64_sys_execve (2 samples, 6.25%) + + __x64_sy.. + + + do_execveat_common.isra.0 (2 samples, 6.25%) + + do_execv.. + + + bprm_execve (2 samples, 6.25%) + + bprm_exe.. + + + load_elf_binary (2 samples, 6.25%) + + load_elf.. + + + elf_map (1 samples, 3.12%) + + elf.. + + + vm_mmap_pgoff (1 samples, 3.12%) + + vm_.. + + + do_mmap (1 samples, 3.12%) + + do_.. + + + mmap_region (1 samples, 3.12%) + + mma.. + + + vma_set_page_prot (1 samples, 3.12%) + + vma.. + + + init_tls (1 samples, 3.12%) + + ini.. + + + _dl_allocate_tls_storage (1 samples, 3.12%) + + _dl.. + + + __minimal_malloc (1 samples, 3.12%) + + __m.. + + + mmap64 (1 samples, 3.12%) + + mma.. + + + entry_SYSCALL_64_after_hwframe (1 samples, 3.12%) + + ent.. + + + do_syscall_64 (1 samples, 3.12%) + + do_.. + + + vm_mmap_pgoff (1 samples, 3.12%) + + vm_.. + + + do_mmap (1 samples, 3.12%) + + do_.. + + + mmap_region (1 samples, 3.12%) + + mma.. + + + perf_event_mmap (1 samples, 3.12%) + + per.. + + + access (1 samples, 3.12%) + + acc.. + + + entry_SYSCALL_64_after_hwframe (1 samples, 3.12%) + + ent.. + + + do_syscall_64 (1 samples, 3.12%) + + do_.. + + + do_faccessat (1 samples, 3.12%) + + do_.. + + + prepare_creds (1 samples, 3.12%) + + pre.. + + + get_ucounts (1 samples, 3.12%) + + get.. + + + finish_fault (1 samples, 3.12%) + + fin.. + + + do_set_pte (1 samples, 3.12%) + + do_.. + + + _dl_relocate_object (3 samples, 9.38%) + + _dl_relocate_.. + + + asm_exc_page_fault (3 samples, 9.38%) + + asm_exc_page_.. + + + exc_page_fault (3 samples, 9.38%) + + exc_page_fault + + + do_user_addr_fault (3 samples, 9.38%) + + do_user_addr_.. + + + handle_mm_fault (3 samples, 9.38%) + + handle_mm_fau.. + + + __handle_mm_fault (3 samples, 9.38%) + + __handle_mm_f.. + + + copy_page (2 samples, 6.25%) + + copy_page + + + _dl_map_object_deps (1 samples, 3.12%) + + _dl.. + + + _dl_catch_exception (1 samples, 3.12%) + + _dl.. + + + openaux (1 samples, 3.12%) + + ope.. + + + _dl_map_object (1 samples, 3.12%) + + _dl.. + + + _dl_map_object_from_fd (1 samples, 3.12%) + + _dl.. + + + memset (1 samples, 3.12%) + + mem.. + + + asm_exc_page_fault (1 samples, 3.12%) + + asm.. + + + exc_page_fault (1 samples, 3.12%) + + exc.. + + + do_user_addr_fault (1 samples, 3.12%) + + do_.. + + + handle_mm_fault (1 samples, 3.12%) + + han.. + + + __handle_mm_fault (1 samples, 3.12%) + + __h.. + + + __anon_vma_prepare (1 samples, 3.12%) + + __a.. + + + down_write (1 samples, 3.12%) + + dow.. + + + _dl_sysdep_start (7 samples, 21.88%) + + _dl_sysdep_start + + + dl_main (7 samples, 21.88%) + + dl_main + + + __libc_early_init (1 samples, 3.12%) + + __l.. + + + __ctype_init (1 samples, 3.12%) + + __c.. + + + asm_exc_page_fault (1 samples, 3.12%) + + asm.. + + + exc_page_fault (1 samples, 3.12%) + + exc.. + + + do_user_addr_fault (1 samples, 3.12%) + + do_.. + + + handle_mm_fault (1 samples, 3.12%) + + han.. + + + __handle_mm_fault (1 samples, 3.12%) + + __h.. + + + filemap_map_pages (1 samples, 3.12%) + + fil.. + + + next_uptodate_page (1 samples, 3.12%) + + nex.. + + + _dl_start (8 samples, 25.00%) + + _dl_start + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 3.12%) + + cla.. + + + clap_builder::builder::command::Command::_do_parse (1 samples, 3.12%) + + cla.. + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 3.12%) + + cla.. + + + clap_builder::parser::parser::Parser::react (1 samples, 3.12%) + + cla.. + + + clap_builder::output::help::write_help (1 samples, 3.12%) + + cla.. + + + clap_builder::output::help_template::HelpTemplate::write_templated_help (1 samples, 3.12%) + + cla.. + + + clap_builder::output::help_template::HelpTemplate::write_all_args (1 samples, 3.12%) + + cla.. + + + clap_builder::output::help_template::HelpTemplate::write_args (1 samples, 3.12%) + + cla.. + + + clap_builder::output::help_template::HelpTemplate::spec_vals (1 samples, 3.12%) + + cla.. + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 3.12%) + + <al.. + + + std::rt::lang_start::_{{closure}} (2 samples, 6.25%) + + std::rt:.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 6.25%) + + std::sys.. + + + s4::main (2 samples, 6.25%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 3.12%) + + <s4.. + + + <clap_builder::builder::styled_str::StyledStr as core::convert::From<&str>>::from (1 samples, 3.12%) + + <cl.. + + + clap_builder::builder::styled_str::StyledStr::none (1 samples, 3.12%) + + cla.. + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 3.12%) + + all.. + + + alloc::raw_vec::finish_grow (1 samples, 3.12%) + + all.. + + + asm_exc_page_fault (1 samples, 3.12%) + + asm.. + + + exc_page_fault (1 samples, 3.12%) + + exc.. + + + do_user_addr_fault (1 samples, 3.12%) + + do_.. + + + handle_mm_fault (1 samples, 3.12%) + + han.. + + + __handle_mm_fault (1 samples, 3.12%) + + __h.. + + + filemap_map_pages (1 samples, 3.12%) + + fil.. + + + xas_find (1 samples, 3.12%) + + xas.. + + + xas_load (1 samples, 3.12%) + + xas.. + + + _start (11 samples, 34.38%) + + _start + + + __libc_start_main@@GLIBC_2.34 (3 samples, 9.38%) + + __libc_start_.. + + + __libc_start_call_main (3 samples, 9.38%) + + __libc_start_.. + + + main (3 samples, 9.38%) + + main + + + std::rt::lang_start_internal (3 samples, 9.38%) + + std::rt::lang.. + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 3.12%) + + pth.. + + + fopen@@GLIBC_2.2.5 (1 samples, 3.12%) + + fop.. + + + malloc (1 samples, 3.12%) + + mal.. + + + tcache_init.part.0 (1 samples, 3.12%) + + tca.. + + + _int_malloc (1 samples, 3.12%) + + _in.. + + + sysmalloc (1 samples, 3.12%) + + sys.. + + + asm_exc_page_fault (1 samples, 3.12%) + + asm.. + + + exc_page_fault (1 samples, 3.12%) + + exc.. + + + do_user_addr_fault (1 samples, 3.12%) + + do_.. + + + handle_mm_fault (1 samples, 3.12%) + + han.. + + + __handle_mm_fault (1 samples, 3.12%) + + __h.. + + + __alloc_pages (1 samples, 3.12%) + + __a.. + + + get_page_from_freelist (1 samples, 3.12%) + + get.. + + + kernel_init_free_pages.part.0 (1 samples, 3.12%) + + ker.. + + + clear_page_erms (1 samples, 3.12%) + + cle.. + + + s4 (15 samples, 46.88%) + + s4 + + + [[heap]] (1 samples, 3.12%) + + [[h.. + + + __run_exit_handlers (1 samples, 3.12%) + + __r.. + + + [libgcc_s.so.1] (1 samples, 3.12%) + + [li.. + + + asm_exc_page_fault (1 samples, 3.12%) + + asm.. + + + irqentry_exit_to_user_mode (1 samples, 3.12%) + + irq.. + + + amd_clear_divider (1 samples, 3.12%) + + amd.. + + + x86_pmu_enable_all (16 samples, 50.00%) + + x86_pmu_enable_all + + + all (32 samples, 100%) + + + + + perf-exec (17 samples, 53.12%) + + perf-exec + + + entry_SYSCALL_64_after_hwframe (17 samples, 53.12%) + + entry_SYSCALL_64_after_hwframe + + + do_syscall_64 (17 samples, 53.12%) + + do_syscall_64 + + + __x64_sys_execve (17 samples, 53.12%) + + __x64_sys_execve + + + do_execveat_common.isra.0 (17 samples, 53.12%) + + do_execveat_common.isra.0 + + + bprm_execve (17 samples, 53.12%) + + bprm_execve + + + load_elf_binary (17 samples, 53.12%) + + load_elf_binary + + + begin_new_exec (17 samples, 53.12%) + + begin_new_exec + + + perf_event_exec (17 samples, 53.12%) + + perf_event_exec + + + asm_sysvec_irq_work (1 samples, 3.12%) + + asm.. + + + sysvec_irq_work (1 samples, 3.12%) + + sys.. + + + __sysvec_irq_work (1 samples, 3.12%) + + __s.. + + + irq_work_run_list (1 samples, 3.12%) + + irq.. + + + __wake_up_common_lock (1 samples, 3.12%) + + __w.. + + + __wake_up_common (1 samples, 3.12%) + + __w.. + + + autoremove_wake_function (1 samples, 3.12%) + + aut.. + + + try_to_wake_up (1 samples, 3.12%) + + try.. + + + ttwu_queue_wakelist (1 samples, 3.12%) + + ttw.. + + + sched_clock_cpu (1 samples, 3.12%) + + sch.. + + + read_hv_sched_clock_tsc (1 samples, 3.12%) + + rea.. + + + read_hv_clock_tsc (1 samples, 3.12%) + + rea.. + + + diff --git a/releases/0.7.75/flamegraph-journal-bz2.svg b/releases/0.7.75/flamegraph-journal-bz2.svg new file mode 100644 index 00000000..1a21fe1b --- /dev/null +++ b/releases/0.7.75/flamegraph-journal-bz2.svg @@ -0,0 +1,2442 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231057-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/journal/RHE_91_system.journal.bz2 + + Reset Zoom + Search + + + + syscall_return_via_sysret (1 samples, 0.28%) + + + + + ret_from_fork (22 samples, 6.15%) + + ret_from.. + + + schedule_tail (22 samples, 6.15%) + + schedule.. + + + finish_task_switch.isra.0 (22 samples, 6.15%) + + finish_t.. + + + __perf_event_task_sched_in (22 samples, 6.15%) + + __perf_e.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 6.15%) + + __raw_ca.. + + + truncate_cleanup_page (1 samples, 0.28%) + + + + + try_to_free_buffers (1 samples, 0.28%) + + + + + kmem_cache_free.part.0 (1 samples, 0.28%) + + + + + __slab_free.constprop.0 (1 samples, 0.28%) + + + + + find_lock_entries (1 samples, 0.28%) + + + + + task_work_run (4 samples, 1.12%) + + + + + __fput (4 samples, 1.12%) + + + + + dput (4 samples, 1.12%) + + + + + __dentry_kill (4 samples, 1.12%) + + + + + evict (4 samples, 1.12%) + + + + + ext4_evict_inode (4 samples, 1.12%) + + + + + truncate_inode_pages_range (4 samples, 1.12%) + + + + + delete_from_page_cache_batch (2 samples, 0.56%) + + + + + unaccount_page_cache_page (2 samples, 0.56%) + + + + + page_mapped (2 samples, 0.56%) + + + + + unmap_vmas (1 samples, 0.28%) + + + + + unmap_page_range (1 samples, 0.28%) + + + + + page_remove_rmap (1 samples, 0.28%) + + + + + __mod_lruvec_page_state (1 samples, 0.28%) + + + + + __mod_memcg_lruvec_state (1 samples, 0.28%) + + + + + cgroup_rstat_updated (1 samples, 0.28%) + + + + + mmput (2 samples, 0.56%) + + + + + exit_mmap (2 samples, 0.56%) + + + + + free_pgtables (1 samples, 0.28%) + + + + + unlink_anon_vmas (1 samples, 0.28%) + + + + + kmem_cache_free.part.0 (1 samples, 0.28%) + + + + + __slab_free.constprop.0 (1 samples, 0.28%) + + + + + __x64_sys_exit_group (7 samples, 1.96%) + + _.. + + + do_group_exit (7 samples, 1.96%) + + d.. + + + do_exit (7 samples, 1.96%) + + d.. + + + mm_update_next_owner (1 samples, 0.28%) + + + + + setup_arg_pages (1 samples, 0.28%) + + + + + shift_arg_pages (1 samples, 0.28%) + + + + + __vma_adjust (1 samples, 0.28%) + + + + + anon_vma_interval_tree_remove (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (9 samples, 2.51%) + + en.. + + + do_syscall_64 (9 samples, 2.51%) + + do.. + + + __x64_sys_execve (2 samples, 0.56%) + + + + + do_execveat_common.isra.0 (2 samples, 0.56%) + + + + + bprm_execve (2 samples, 0.56%) + + + + + load_elf_binary (2 samples, 0.56%) + + + + + elf_map (1 samples, 0.28%) + + + + + __vm_munmap (1 samples, 0.28%) + + + + + __do_munmap (1 samples, 0.28%) + + + + + __split_vma (1 samples, 0.28%) + + + + + __vma_adjust (1 samples, 0.28%) + + + + + vma_interval_tree_insert (1 samples, 0.28%) + + + + + __sysconf (1 samples, 0.28%) + + + + + clone3 (2 samples, 0.56%) + + + + + start_thread (2 samples, 0.56%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.56%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.56%) + + + + + __mmap (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.28%) + + + + + do_syscall_64 (1 samples, 0.28%) + + + + + vm_mmap_pgoff (1 samples, 0.28%) + + + + + do_mmap (1 samples, 0.28%) + + + + + get_unmapped_area (1 samples, 0.28%) + + + + + arch_get_unmapped_area_topdown (1 samples, 0.28%) + + + + + get_mmap_base (1 samples, 0.28%) + + + + + asm_exc_page_fault (1 samples, 0.28%) + + + + + exc_page_fault (1 samples, 0.28%) + + + + + do_user_addr_fault (1 samples, 0.28%) + + + + + handle_mm_fault (1 samples, 0.28%) + + + + + __handle_mm_fault (1 samples, 0.28%) + + + + + filemap_map_pages (1 samples, 0.28%) + + + + + do_set_pte (1 samples, 0.28%) + + + + + page_add_file_rmap (1 samples, 0.28%) + + + + + __mod_lruvec_page_state (1 samples, 0.28%) + + + + + __mod_lruvec_state (1 samples, 0.28%) + + + + + __mod_node_page_state (1 samples, 0.28%) + + + + + _dl_relocate_object (2 samples, 0.56%) + + + + + _dl_map_object_deps (1 samples, 0.28%) + + + + + _dl_start (4 samples, 1.12%) + + + + + _dl_sysdep_start (4 samples, 1.12%) + + + + + dl_main (4 samples, 1.12%) + + + + + __libc_early_init (1 samples, 0.28%) + + + + + asm_exc_page_fault (1 samples, 0.28%) + + + + + exc_page_fault (1 samples, 0.28%) + + + + + do_user_addr_fault (1 samples, 0.28%) + + + + + handle_mm_fault (1 samples, 0.28%) + + + + + __handle_mm_fault (1 samples, 0.28%) + + + + + filemap_map_pages (1 samples, 0.28%) + + + + + next_uptodate_page (1 samples, 0.28%) + + + + + __memrchr_evex (1 samples, 0.28%) + + + + + syscall_return_via_sysret (1 samples, 0.28%) + + + + + exit_to_user_mode_prepare (1 samples, 0.28%) + + + + + syscall_exit_to_user_mode (2 samples, 0.56%) + + + + + write_null (1 samples, 0.28%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (6 samples, 1.68%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (6 samples, 1.68%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (6 samples, 1.68%) + + + + + __GI___libc_write (5 samples, 1.40%) + + + + + entry_SYSCALL_64_after_hwframe (4 samples, 1.12%) + + + + + do_syscall_64 (4 samples, 1.12%) + + + + + ksys_write (2 samples, 0.56%) + + + + + vfs_write (2 samples, 0.56%) + + + + + std::io::Write::write_all (7 samples, 1.96%) + + s.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (7 samples, 1.96%) + + <.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.28%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (2 samples, 0.56%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.84%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.84%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (5 samples, 1.40%) + + + + + std::io::Write::write_all (5 samples, 1.40%) + + + + + <termcolor::ColorSpec as core::cmp::PartialEq>::eq (1 samples, 0.28%) + + + + + srso_alias_safe_ret (1 samples, 0.28%) + + + + + dget_parent (1 samples, 0.28%) + + + + + __fsnotify_parent (2 samples, 0.56%) + + + + + vfs_write (9 samples, 2.51%) + + vf.. + + + __fdget_pos (1 samples, 0.28%) + + + + + srso_alias_return_thunk (1 samples, 0.28%) + + + + + srso_alias_safe_ret (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (12 samples, 3.35%) + + ent.. + + + do_syscall_64 (12 samples, 3.35%) + + do_.. + + + ksys_write (12 samples, 3.35%) + + ksy.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (13 samples, 3.63%) + + <std.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (13 samples, 3.63%) + + <&st.. + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (13 samples, 3.63%) + + std:.. + + + __GI___libc_write (13 samples, 3.63%) + + __GI.. + + + s4lib::printer::printers::PrinterLogMessage::print_journalentry_color (29 samples, 8.10%) + + s4lib::prin.. + + + _dl_relocate_object (1 samples, 0.28%) + + + + + _dl_lookup_symbol_x (1 samples, 0.28%) + + + + + do_lookup_x (1 samples, 0.28%) + + + + + _dl_map_object_deps (1 samples, 0.28%) + + + + + _dl_catch_exception (1 samples, 0.28%) + + + + + openaux (1 samples, 0.28%) + + + + + _dl_map_object (1 samples, 0.28%) + + + + + strcmp (1 samples, 0.28%) + + + + + s4lib::libload::systemd_dlopen2::load_library_systemd (3 samples, 0.84%) + + + + + dlopen2::wrapper::container::Container<T>::load (3 samples, 0.84%) + + + + + dlopen2::raw::common::Library::open (3 samples, 0.84%) + + + + + dlopen@GLIBC_2.2.5 (3 samples, 0.84%) + + + + + _dlerror_run (3 samples, 0.84%) + + + + + _dl_catch_error (3 samples, 0.84%) + + + + + _dl_catch_exception (3 samples, 0.84%) + + + + + dlopen_doit (3 samples, 0.84%) + + + + + _dl_open (3 samples, 0.84%) + + + + + _dl_catch_exception (3 samples, 0.84%) + + + + + dl_open_worker (3 samples, 0.84%) + + + + + _dl_catch_exception (3 samples, 0.84%) + + + + + dl_open_worker_begin (3 samples, 0.84%) + + + + + _dl_check_map_versions (1 samples, 0.28%) + + + + + _dl_name_match_p (1 samples, 0.28%) + + + + + strcmp (1 samples, 0.28%) + + + + + crossbeam_channel::select::SelectedOperation::recv (2 samples, 0.56%) + + + + + crossbeam_channel::channel::read (2 samples, 0.56%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.56%) + + + + + std::thread::park (1 samples, 0.28%) + + + + + syscall (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.28%) + + + + + do_syscall_64 (1 samples, 0.28%) + + + + + __x64_sys_futex (1 samples, 0.28%) + + + + + do_futex (1 samples, 0.28%) + + + + + futex_wait (1 samples, 0.28%) + + + + + futex_wait_queue_me (1 samples, 0.28%) + + + + + schedule (1 samples, 0.28%) + + + + + __schedule (1 samples, 0.28%) + + + + + finish_task_switch.isra.0 (1 samples, 0.28%) + + + + + __perf_event_task_sched_in (1 samples, 0.28%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.28%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (5 samples, 1.40%) + + + + + crossbeam_channel::context::Context::wait_until (5 samples, 1.40%) + + + + + crossbeam_channel::select::Select::select (6 samples, 1.68%) + + + + + crossbeam_channel::select::run_select (6 samples, 1.68%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (1 samples, 0.28%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (2 samples, 0.56%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (2 samples, 0.56%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (2 samples, 0.56%) + + + + + s4::processing_loop (45 samples, 12.57%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (46 samples, 12.85%) + + std::rt::lang_start.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (46 samples, 12.85%) + + std::sys_common::ba.. + + + s4::main (46 samples, 12.85%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.28%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.28%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.28%) + + + + + clap_builder::parser::parser::Parser::add_defaults (1 samples, 0.28%) + + + + + clap_builder::parser::parser::Parser::react (1 samples, 0.28%) + + + + + clap_builder::parser::parser::Parser::push_arg_values (1 samples, 0.28%) + + + + + <P as clap_builder::builder::value_parser::AnyValueParser>::parse_ref (1 samples, 0.28%) + + + + + <F as clap_builder::builder::value_parser::TypedValueParser>::parse_ref (1 samples, 0.28%) + + + + + s4lib::data::datetime::datetime_parse_from_str_w_tz (1 samples, 0.28%) + + + + + chrono::datetime::DateTime<chrono::offset::fixed::FixedOffset>::parse_from_str (1 samples, 0.28%) + + + + + chrono::format::parsed::Parsed::to_datetime (1 samples, 0.28%) + + + + + s4 (85 samples, 23.74%) + + s4 + + + _start (51 samples, 14.25%) + + _start + + + __libc_start_main@@GLIBC_2.34 (47 samples, 13.13%) + + __libc_start_main@@G.. + + + __libc_start_call_main (47 samples, 13.13%) + + __libc_start_call_ma.. + + + main (47 samples, 13.13%) + + main + + + std::rt::lang_start_internal (47 samples, 13.13%) + + std::rt::lang_start_.. + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.28%) + + + + + pthread_getaffinity_np@GLIBC_2.3.4 (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.28%) + + + + + do_syscall_64 (1 samples, 0.28%) + + + + + perf-exec (11 samples, 3.07%) + + per.. + + + entry_SYSCALL_64_after_hwframe (11 samples, 3.07%) + + ent.. + + + do_syscall_64 (11 samples, 3.07%) + + do_.. + + + __x64_sys_execve (11 samples, 3.07%) + + __x.. + + + do_execveat_common.isra.0 (11 samples, 3.07%) + + do_.. + + + bprm_execve (11 samples, 3.07%) + + bpr.. + + + load_elf_binary (11 samples, 3.07%) + + loa.. + + + begin_new_exec (11 samples, 3.07%) + + beg.. + + + perf_event_exec (11 samples, 3.07%) + + per.. + + + x86_pmu_enable_all (11 samples, 3.07%) + + x86.. + + + ctrl-c (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.28%) + + + + + do_syscall_64 (1 samples, 0.28%) + + + + + syscall_exit_to_user_mode (1 samples, 0.28%) + + + + + exit_to_user_mode_prepare (1 samples, 0.28%) + + + + + arch_do_signal_or_restart (1 samples, 0.28%) + + + + + get_signal (1 samples, 0.28%) + + + + + do_group_exit (1 samples, 0.28%) + + + + + do_exit (1 samples, 0.28%) + + + + + acct_process (1 samples, 0.28%) + + + + + do_acct_process (1 samples, 0.28%) + + + + + __kernel_write (1 samples, 0.28%) + + + + + ext4_buffered_write_iter (1 samples, 0.28%) + + + + + file_update_time (1 samples, 0.28%) + + + + + generic_update_time (1 samples, 0.28%) + + + + + __mark_inode_dirty (1 samples, 0.28%) + + + + + ext4_dirty_inode (1 samples, 0.28%) + + + + + __ext4_journal_start_sb (1 samples, 0.28%) + + + + + jbd2__journal_start (1 samples, 0.28%) + + + + + kmem_cache_alloc (1 samples, 0.28%) + + + + + [libsystemd.so.0.32.0] (2 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (4 samples, 1.12%) + + + + + [libsystemd.so.0.32.0] (11 samples, 3.07%) + + [li.. + + + sd_journal_enumerate_data (13 samples, 3.63%) + + sd_j.. + + + sd_journal_enumerate_available_data (14 samples, 3.91%) + + sd_j.. + + + [libsystemd.so.0.32.0] (3 samples, 0.84%) + + + + + [libsystemd.so.0.32.0] (5 samples, 1.40%) + + + + + [libsystemd.so.0.32.0] (8 samples, 2.23%) + + [.. + + + sd_journal_get_data (9 samples, 2.51%) + + sd.. + + + core::fmt::write (4 samples, 1.12%) + + + + + <str as core::fmt::Debug>::fmt (4 samples, 1.12%) + + + + + core::unicode::unicode_data::grapheme_extend::lookup (4 samples, 1.12%) + + + + + s4lib::readers::journalreader::JournalReader::Error_from_Errno (5 samples, 1.40%) + + + + + alloc::fmt::format::format_inner (5 samples, 1.40%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.28%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.28%) + + + + + [libsystemd.so.0.32.0] (2 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (2 samples, 0.56%) + + + + + s4lib::readers::journalreader::JournalReader::next_common (17 samples, 4.75%) + + s4lib:.. + + + [libsystemd.so.0.32.0] (3 samples, 0.84%) + + + + + [libsystemd.so.0.32.0] (3 samples, 0.84%) + + + + + memchr::arch::x86_64::memchr::memchr_raw::find_avx2 (1 samples, 0.28%) + + + + + memchr::arch::x86_64::avx2::memchr::One::find_raw (1 samples, 0.28%) + + + + + <core::fmt::Formatter as core::fmt::Write>::write_fmt (1 samples, 0.28%) + + + + + chrono::format::formatting::DelayedFormat<I>::new_with_offset (2 samples, 0.56%) + + + + + <chrono::offset::fixed::FixedOffset as core::fmt::Debug>::fmt (2 samples, 0.56%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.28%) + + + + + <chrono::format::formatting::DelayedFormat<I> as core::fmt::Display>::fmt (2 samples, 0.56%) + + + + + <chrono::datetime::DateTime<chrono::offset::utc::Utc> as core::convert::From<std::time::SystemTime>>::from (1 samples, 0.28%) + + + + + s4lib::readers::journalreader::JournalReader::next_short (39 samples, 10.89%) + + s4lib::readers::.. + + + crossbeam_channel::channel::Sender<T>::send (2 samples, 0.56%) + + + + + core::ptr::drop_in_place<s4lib::readers::journalreader::JournalReader> (1 samples, 0.28%) + + + + + core::ptr::drop_in_place<core::option::Option<tempfile::file::NamedTempFile>> (1 samples, 0.28%) + + + + + <tempfile::file::TempPath as core::ops::drop::Drop>::drop (1 samples, 0.28%) + + + + + std::sys::unix::fs::unlink (1 samples, 0.28%) + + + + + __GI___unlink (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.28%) + + + + + do_syscall_64 (1 samples, 0.28%) + + + + + __x64_sys_unlink (1 samples, 0.28%) + + + + + do_unlinkat (1 samples, 0.28%) + + + + + vfs_unlink (1 samples, 0.28%) + + + + + ext4_unlink (1 samples, 0.28%) + + + + + __ext4_unlink (1 samples, 0.28%) + + + + + ext4_orphan_add (1 samples, 0.28%) + + + + + ext4_mark_iloc_dirty (1 samples, 0.28%) + + + + + map_id_up (1 samples, 0.28%) + + + + + clone3 (43 samples, 12.01%) + + clone3 + + + start_thread (43 samples, 12.01%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (43 samples, 12.01%) + + std::sys::unix::th.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (43 samples, 12.01%) + + core::ops::functio.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (43 samples, 12.01%) + + std::sys_common::b.. + + + s4::exec_fileprocessor_thread (43 samples, 12.01%) + + s4::exec_fileproce.. + + + asm_exc_page_fault (1 samples, 0.28%) + + + + + exc_page_fault (1 samples, 0.28%) + + + + + do_user_addr_fault (1 samples, 0.28%) + + + + + handle_mm_fault (1 samples, 0.28%) + + + + + __handle_mm_fault (1 samples, 0.28%) + + + + + __alloc_pages (1 samples, 0.28%) + + + + + get_page_from_freelist (1 samples, 0.28%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.28%) + + + + + clear_page_erms (1 samples, 0.28%) + + + + + unlock_page (1 samples, 0.28%) + + + + + ext4_reserve_inode_write (2 samples, 0.56%) + + + + + ext4_get_inode_loc (2 samples, 0.56%) + + + + + __ext4_get_inode_loc (2 samples, 0.56%) + + + + + chksum_update (2 samples, 0.56%) + + + + + crc32_body (2 samples, 0.56%) + + + + + ext4_dirty_inode (5 samples, 1.40%) + + + + + __ext4_mark_inode_dirty (5 samples, 1.40%) + + + + + ext4_mark_iloc_dirty (3 samples, 0.84%) + + + + + ext4_inode_csum_set (3 samples, 0.84%) + + + + + ext4_inode_csum (3 samples, 0.84%) + + + + + generic_write_end (7 samples, 1.96%) + + g.. + + + __mark_inode_dirty (6 samples, 1.68%) + + + + + add_to_page_cache_lru (3 samples, 0.84%) + + + + + __add_to_page_cache_locked (3 samples, 0.84%) + + + + + rmqueue_bulk (3 samples, 0.84%) + + + + + __list_del_entry_valid (3 samples, 0.84%) + + + + + grab_cache_page_write_begin (7 samples, 1.96%) + + g.. + + + pagecache_get_page (7 samples, 1.96%) + + p.. + + + __alloc_pages (4 samples, 1.12%) + + + + + get_page_from_freelist (4 samples, 1.12%) + + + + + __list_del_entry_valid (1 samples, 0.28%) + + + + + kmem_cache_alloc (1 samples, 0.28%) + + + + + get_obj_cgroup_from_current (1 samples, 0.28%) + + + + + alloc_page_buffers (2 samples, 0.56%) + + + + + alloc_buffer_head (2 samples, 0.56%) + + + + + _raw_spin_lock (1 samples, 0.28%) + + + + + ext4_da_write_begin (11 samples, 3.07%) + + ext.. + + + __block_write_begin_int (4 samples, 1.12%) + + + + + create_page_buffers (4 samples, 1.12%) + + + + + create_empty_buffers (4 samples, 1.12%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.28%) + + + + + copy_page_from_iter_atomic (3 samples, 0.84%) + + + + + copy_user_enhanced_fast_string (3 samples, 0.84%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::write_all_cold (22 samples, 6.15%) + + std::io:.. + + + std::io::Write::write_all (22 samples, 6.15%) + + std::io:.. + + + std::os::unix::net::datagram::UnixDatagram::send (22 samples, 6.15%) + + std::os:.. + + + __GI___libc_write (22 samples, 6.15%) + + __GI___l.. + + + entry_SYSCALL_64_after_hwframe (22 samples, 6.15%) + + entry_SY.. + + + do_syscall_64 (22 samples, 6.15%) + + do_sysca.. + + + ksys_write (22 samples, 6.15%) + + ksys_wri.. + + + vfs_write (22 samples, 6.15%) + + vfs_write + + + new_sync_write (22 samples, 6.15%) + + new_sync.. + + + ext4_buffered_write_iter (22 samples, 6.15%) + + ext4_buf.. + + + generic_perform_write (22 samples, 6.15%) + + generic_.. + + + __close (1 samples, 0.28%) + + + + + __GI___pthread_enable_asynccancel (1 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.28%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.28%) + + + + + realloc (1 samples, 0.28%) + + + + + bzip2_rs::decoder::Decoder::write (2 samples, 0.56%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.28%) + + + + + asm_exc_page_fault (1 samples, 0.28%) + + + + + exc_page_fault (1 samples, 0.28%) + + + + + do_user_addr_fault (1 samples, 0.28%) + + + + + handle_mm_fault (1 samples, 0.28%) + + + + + __handle_mm_fault (1 samples, 0.28%) + + + + + __alloc_pages (1 samples, 0.28%) + + + + + get_page_from_freelist (1 samples, 0.28%) + + + + + __list_del_entry_valid (1 samples, 0.28%) + + + + + s4lib::readers::filedecompressor::decompress_to_ntf (26 samples, 7.26%) + + s4lib::rea.. + + + <bzip2_rs::decoder::reader::DecoderReader<R> as std::io::Read>::read (3 samples, 0.84%) + + + + + <std::process::ChildStdout as std::io::Read>::read (1 samples, 0.28%) + + + + + read (1 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.28%) + + + + + do_syscall_64 (1 samples, 0.28%) + + + + + ksys_read (1 samples, 0.28%) + + + + + vfs_read (1 samples, 0.28%) + + + + + new_sync_read (1 samples, 0.28%) + + + + + filemap_read (1 samples, 0.28%) + + + + + __cond_resched (1 samples, 0.28%) + + + + + crc32fast::Hasher::update (4 samples, 1.12%) + + + + + crc32fast::specialized::pclmulqdq::calculate (4 samples, 1.12%) + + + + + bzip2_rs::huffman::HuffmanTree::decode (18 samples, 5.03%) + + bzip2_.. + + + bzip2_rs::block::bwt::inverse_bwt (11 samples, 3.07%) + + bzi.. + + + do_huge_pmd_anonymous_page (1 samples, 0.28%) + + + + + clear_huge_page (1 samples, 0.28%) + + + + + clear_subpage (1 samples, 0.28%) + + + + + clear_page_erms (1 samples, 0.28%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.28%) + + + + + asm_exc_page_fault (3 samples, 0.84%) + + + + + exc_page_fault (3 samples, 0.84%) + + + + + do_user_addr_fault (3 samples, 0.84%) + + + + + handle_mm_fault (3 samples, 0.84%) + + + + + __handle_mm_fault (3 samples, 0.84%) + + + + + __mem_cgroup_charge (2 samples, 0.56%) + + + + + charge_memcg (1 samples, 0.28%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.28%) + + + + + alloc::vec::Vec<T,A>::resize (7 samples, 1.96%) + + a.. + + + alloc::vec::Vec<T,A>::push (1 samples, 0.28%) + + + + + __memmove_avx512_unaligned_erms (46 samples, 12.85%) + + __memmove_avx512_un.. + + + all (358 samples, 100%) + + + + + RHE_91_system.j (261 samples, 72.91%) + + RHE_91_system.j + + + [unknown] (217 samples, 60.61%) + + [unknown] + + + bzip2_rs::block::Block::read (191 samples, 53.35%) + + bzip2_rs::block::Block::read + + + diff --git a/releases/0.7.75/flamegraph-journal-gz.svg b/releases/0.7.75/flamegraph-journal-gz.svg new file mode 100644 index 00000000..39cd34bc --- /dev/null +++ b/releases/0.7.75/flamegraph-journal-gz.svg @@ -0,0 +1,2477 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231059-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/journal/RHE_91_system.journal.gz + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 11.22%) + + ret_from_fork + + + schedule_tail (22 samples, 11.22%) + + schedule_tail + + + finish_task_switch.isra.0 (22 samples, 11.22%) + + finish_task_switc.. + + + __perf_event_task_sched_in (22 samples, 11.22%) + + __perf_event_task.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 11.22%) + + __raw_callee_save.. + + + truncate_cleanup_page (1 samples, 0.51%) + + + + + try_to_free_buffers (1 samples, 0.51%) + + + + + kmem_cache_free.part.0 (1 samples, 0.51%) + + + + + __slab_free.constprop.0 (1 samples, 0.51%) + + + + + __pagevec_release (1 samples, 0.51%) + + + + + release_pages (1 samples, 0.51%) + + + + + __cond_resched (1 samples, 0.51%) + + + + + srso_alias_safe_ret (1 samples, 0.51%) + + + + + task_work_run (4 samples, 2.04%) + + t.. + + + __fput (4 samples, 2.04%) + + _.. + + + dput (4 samples, 2.04%) + + d.. + + + __dentry_kill (4 samples, 2.04%) + + _.. + + + evict (4 samples, 2.04%) + + e.. + + + ext4_evict_inode (4 samples, 2.04%) + + e.. + + + truncate_inode_pages_range (4 samples, 2.04%) + + t.. + + + mmput (1 samples, 0.51%) + + + + + exit_mmap (1 samples, 0.51%) + + + + + unmap_vmas (1 samples, 0.51%) + + + + + unmap_page_range (1 samples, 0.51%) + + + + + __x64_sys_exit_group (6 samples, 3.06%) + + __x.. + + + do_group_exit (6 samples, 3.06%) + + do_.. + + + do_exit (6 samples, 3.06%) + + do_.. + + + mm_update_next_owner (1 samples, 0.51%) + + + + + setup_arg_pages (1 samples, 0.51%) + + + + + shift_arg_pages (1 samples, 0.51%) + + + + + move_page_tables.part.0 (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (8 samples, 4.08%) + + entr.. + + + do_syscall_64 (8 samples, 4.08%) + + do_s.. + + + __x64_sys_execve (2 samples, 1.02%) + + + + + do_execveat_common.isra.0 (2 samples, 1.02%) + + + + + bprm_execve (2 samples, 1.02%) + + + + + load_elf_binary (2 samples, 1.02%) + + + + + map_vdso_randomized (1 samples, 0.51%) + + + + + mmap_region (1 samples, 0.51%) + + + + + security_vm_enough_memory_mm (1 samples, 0.51%) + + + + + cap_vm_enough_memory (1 samples, 0.51%) + + + + + clone3 (2 samples, 1.02%) + + + + + start_thread (2 samples, 1.02%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 1.02%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 1.02%) + + + + + __mmap (2 samples, 1.02%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 1.02%) + + + + + do_syscall_64 (2 samples, 1.02%) + + + + + vm_mmap_pgoff (2 samples, 1.02%) + + + + + do_mmap (2 samples, 1.02%) + + + + + get_unmapped_area (1 samples, 0.51%) + + + + + asm_exc_page_fault (1 samples, 0.51%) + + + + + exc_page_fault (1 samples, 0.51%) + + + + + do_user_addr_fault (1 samples, 0.51%) + + + + + handle_mm_fault (1 samples, 0.51%) + + + + + __handle_mm_fault (1 samples, 0.51%) + + + + + filemap_map_pages (1 samples, 0.51%) + + + + + next_uptodate_page (1 samples, 0.51%) + + + + + _dl_relocate_object (2 samples, 1.02%) + + + + + asm_exc_page_fault (2 samples, 1.02%) + + + + + exc_page_fault (2 samples, 1.02%) + + + + + do_user_addr_fault (2 samples, 1.02%) + + + + + handle_mm_fault (2 samples, 1.02%) + + + + + __handle_mm_fault (2 samples, 1.02%) + + + + + _dl_start (3 samples, 1.53%) + + + + + _dl_sysdep_start (3 samples, 1.53%) + + + + + dl_main (3 samples, 1.53%) + + + + + _dl_map_object_deps (1 samples, 0.51%) + + + + + _dl_catch_exception (1 samples, 0.51%) + + + + + openaux (1 samples, 0.51%) + + + + + _dl_map_object (1 samples, 0.51%) + + + + + _dl_map_object_from_fd (1 samples, 0.51%) + + + + + memset (1 samples, 0.51%) + + + + + asm_exc_page_fault (1 samples, 0.51%) + + + + + exc_page_fault (1 samples, 0.51%) + + + + + do_user_addr_fault (1 samples, 0.51%) + + + + + handle_mm_fault (1 samples, 0.51%) + + + + + __handle_mm_fault (1 samples, 0.51%) + + + + + copy_page (1 samples, 0.51%) + + + + + std::io::Write::write_all (1 samples, 0.51%) + + + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (1 samples, 0.51%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.51%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.51%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.51%) + + + + + __GI___libc_write (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + ksys_write (1 samples, 0.51%) + + + + + vfs_write (1 samples, 0.51%) + + + + + write_null (1 samples, 0.51%) + + + + + std::io::Write::write_all (1 samples, 0.51%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.51%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.51%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.51%) + + + + + __memrchr_evex (1 samples, 0.51%) + + + + + termcolor::Ansi<W>::write_color (2 samples, 1.02%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.51%) + + + + + std::io::Write::write_all (2 samples, 1.02%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (2 samples, 1.02%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (2 samples, 1.02%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (5 samples, 2.55%) + + <t.. + + + srso_alias_return_thunk (1 samples, 0.51%) + + + + + srso_alias_safe_ret (1 samples, 0.51%) + + + + + syscall_exit_to_user_mode (1 samples, 0.51%) + + + + + lockref_put_return (2 samples, 1.02%) + + + + + __fsnotify_parent (4 samples, 2.04%) + + _.. + + + dput (4 samples, 2.04%) + + d.. + + + vfs_write (8 samples, 4.08%) + + vfs_.. + + + __fdget_pos (1 samples, 0.51%) + + + + + __fget_light (1 samples, 0.51%) + + + + + __fget_files (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (13 samples, 6.63%) + + entry_SYS.. + + + do_syscall_64 (12 samples, 6.12%) + + do_sysca.. + + + ksys_write (11 samples, 5.61%) + + ksys_wr.. + + + __GI___pthread_disable_asynccancel (1 samples, 0.51%) + + + + + s4lib::printer::printers::PrinterLogMessage::print_journalentry_color (22 samples, 11.22%) + + s4lib::printer::p.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (16 samples, 8.16%) + + <std::io::s.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (16 samples, 8.16%) + + <&std::io::.. + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (16 samples, 8.16%) + + std::io::bu.. + + + __GI___libc_write (16 samples, 8.16%) + + __GI___libc.. + + + _dl_relocate_object (1 samples, 0.51%) + + + + + _dl_lookup_symbol_x (1 samples, 0.51%) + + + + + do_lookup_x (1 samples, 0.51%) + + + + + check_match (1 samples, 0.51%) + + + + + strcmp (1 samples, 0.51%) + + + + + s4lib::libload::systemd_dlopen2::load_library_systemd (2 samples, 1.02%) + + + + + dlopen2::wrapper::container::Container<T>::load (2 samples, 1.02%) + + + + + dlopen2::raw::common::Library::open (2 samples, 1.02%) + + + + + dlopen@GLIBC_2.2.5 (2 samples, 1.02%) + + + + + _dlerror_run (2 samples, 1.02%) + + + + + _dl_catch_error (2 samples, 1.02%) + + + + + _dl_catch_exception (2 samples, 1.02%) + + + + + dlopen_doit (2 samples, 1.02%) + + + + + _dl_open (2 samples, 1.02%) + + + + + _dl_catch_exception (2 samples, 1.02%) + + + + + dl_open_worker (2 samples, 1.02%) + + + + + _dl_catch_exception (2 samples, 1.02%) + + + + + dl_open_worker_begin (2 samples, 1.02%) + + + + + _dl_map_object_deps (1 samples, 0.51%) + + + + + _dl_catch_exception (1 samples, 0.51%) + + + + + openaux (1 samples, 0.51%) + + + + + _dl_map_object (1 samples, 0.51%) + + + + + _dl_map_object_from_fd (1 samples, 0.51%) + + + + + mmap64 (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + ksys_mmap_pgoff (1 samples, 0.51%) + + + + + vm_mmap_pgoff (1 samples, 0.51%) + + + + + do_mmap (1 samples, 0.51%) + + + + + mmap_region (1 samples, 0.51%) + + + + + __do_munmap (1 samples, 0.51%) + + + + + hashbrown::set::HashSet<T,S,A>::remove (1 samples, 0.51%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.51%) + + + + + crossbeam_channel::select::SelectedOperation::recv (2 samples, 1.02%) + + + + + crossbeam_channel::channel::read (2 samples, 1.02%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 1.02%) + + + + + std::thread::park (1 samples, 0.51%) + + + + + syscall (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + __x64_sys_futex (1 samples, 0.51%) + + + + + do_futex (1 samples, 0.51%) + + + + + futex_wait (1 samples, 0.51%) + + + + + futex_wait_queue_me (1 samples, 0.51%) + + + + + schedule (1 samples, 0.51%) + + + + + __schedule (1 samples, 0.51%) + + + + + dequeue_task_fair (1 samples, 0.51%) + + + + + dequeue_entity (1 samples, 0.51%) + + + + + update_load_avg (1 samples, 0.51%) + + + + + __update_load_avg_se (1 samples, 0.51%) + + + + + _raw_spin_lock (1 samples, 0.51%) + + + + + __sched_yield (2 samples, 1.02%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 1.02%) + + + + + do_syscall_64 (2 samples, 1.02%) + + + + + __x64_sys_sched_yield (2 samples, 1.02%) + + + + + schedule (2 samples, 1.02%) + + + + + __schedule (2 samples, 1.02%) + + + + + crossbeam_channel::context::Context::wait_until (7 samples, 3.57%) + + cros.. + + + crossbeam_channel::context::Context::with::{{closure}} (9 samples, 4.59%) + + cross.. + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::register (2 samples, 1.02%) + + + + + crossbeam_channel::waker::SyncWaker::register (2 samples, 1.02%) + + + + + crossbeam_channel::select::Select::select (10 samples, 5.10%) + + crossb.. + + + crossbeam_channel::select::run_select (10 samples, 5.10%) + + crossb.. + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.51%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.51%) + + + + + __lll_lock_wake_private (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + __x64_sys_futex (1 samples, 0.51%) + + + + + do_futex (1 samples, 0.51%) + + + + + futex_wake (1 samples, 0.51%) + + + + + s4::processing_loop (40 samples, 20.41%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (41 samples, 20.92%) + + std::rt::lang_start::_{{closure}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (41 samples, 20.92%) + + std::sys_common::backtrace::__rus.. + + + s4::main (41 samples, 20.92%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.51%) + + + + + clap_builder::builder::app_settings::AppFlags::is_set (1 samples, 0.51%) + + + + + _start (45 samples, 22.96%) + + _start + + + __libc_start_main@@GLIBC_2.34 (42 samples, 21.43%) + + __libc_start_main@@GLIBC_2.34 + + + __libc_start_call_main (42 samples, 21.43%) + + __libc_start_call_main + + + main (42 samples, 21.43%) + + main + + + std::rt::lang_start_internal (42 samples, 21.43%) + + std::rt::lang_start_internal + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.51%) + + + + + __getdelim (1 samples, 0.51%) + + + + + malloc (1 samples, 0.51%) + + + + + _int_malloc (1 samples, 0.51%) + + + + + s4 (79 samples, 40.31%) + + s4 + + + [[heap]] (1 samples, 0.51%) + + + + + __GI___libc_write (1 samples, 0.51%) + + + + + entry_SYSCALL_64 (1 samples, 0.51%) + + + + + perf-exec (11 samples, 5.61%) + + perf-ex.. + + + entry_SYSCALL_64_after_hwframe (11 samples, 5.61%) + + entry_S.. + + + do_syscall_64 (11 samples, 5.61%) + + do_sysc.. + + + __x64_sys_execve (11 samples, 5.61%) + + __x64_s.. + + + do_execveat_common.isra.0 (11 samples, 5.61%) + + do_exec.. + + + bprm_execve (11 samples, 5.61%) + + bprm_ex.. + + + load_elf_binary (11 samples, 5.61%) + + load_el.. + + + begin_new_exec (11 samples, 5.61%) + + begin_n.. + + + perf_event_exec (11 samples, 5.61%) + + perf_ev.. + + + x86_pmu_enable_all (11 samples, 5.61%) + + x86_pmu.. + + + ctrl-c (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + syscall_exit_to_user_mode (1 samples, 0.51%) + + + + + exit_to_user_mode_prepare (1 samples, 0.51%) + + + + + arch_do_signal_or_restart (1 samples, 0.51%) + + + + + get_signal (1 samples, 0.51%) + + + + + do_group_exit (1 samples, 0.51%) + + + + + do_exit (1 samples, 0.51%) + + + + + acct_process (1 samples, 0.51%) + + + + + do_acct_process (1 samples, 0.51%) + + + + + __kernel_write (1 samples, 0.51%) + + + + + ext4_buffered_write_iter (1 samples, 0.51%) + + + + + generic_perform_write (1 samples, 0.51%) + + + + + ext4_da_write_begin (1 samples, 0.51%) + + + + + grab_cache_page_write_begin (1 samples, 0.51%) + + + + + pagecache_get_page (1 samples, 0.51%) + + + + + xas_load (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (6 samples, 3.06%) + + [li.. + + + [libsystemd.so.0.32.0] (11 samples, 5.61%) + + [libsys.. + + + sd_journal_enumerate_available_data (12 samples, 6.12%) + + sd_journ.. + + + sd_journal_enumerate_data (12 samples, 6.12%) + + sd_journ.. + + + [libsystemd.so.0.32.0] (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (3 samples, 1.53%) + + + + + sd_journal_get_data (4 samples, 2.04%) + + s.. + + + [libsystemd.so.0.32.0] (4 samples, 2.04%) + + [.. + + + core::unicode::unicode_data::grapheme_extend::lookup (1 samples, 0.51%) + + + + + s4lib::readers::journalreader::JournalReader::Error_from_Errno (2 samples, 1.02%) + + + + + alloc::fmt::format::format_inner (2 samples, 1.02%) + + + + + core::fmt::write (2 samples, 1.02%) + + + + + <str as core::fmt::Debug>::fmt (2 samples, 1.02%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.51%) + + + + + [libsystemd.so.0.32.0] (2 samples, 1.02%) + + + + + [libsystemd.so.0.32.0] (2 samples, 1.02%) + + + + + s4lib::readers::journalreader::JournalReader::next_common (9 samples, 4.59%) + + s4lib.. + + + memchr::arch::x86_64::avx2::memchr::One::find_raw_avx2 (2 samples, 1.02%) + + + + + memchr::arch::x86_64::memchr::memchr_raw::find_avx2 (4 samples, 2.04%) + + m.. + + + memchr::arch::x86_64::avx2::memchr::One::find_raw (4 samples, 2.04%) + + m.. + + + malloc (1 samples, 0.51%) + + + + + _int_malloc (1 samples, 0.51%) + + + + + core::fmt::write (1 samples, 0.51%) + + + + + core::fmt::num::imp::<impl core::fmt::Display for i32>::fmt (1 samples, 0.51%) + + + + + core::fmt::Formatter::pad_integral (1 samples, 0.51%) + + + + + <alloc::string::String as core::fmt::Write>::write_str (1 samples, 0.51%) + + + + + <chrono::offset::fixed::FixedOffset as core::fmt::Debug>::fmt (3 samples, 1.53%) + + + + + <core::fmt::Formatter as core::fmt::Write>::write_fmt (3 samples, 1.53%) + + + + + chrono::format::formatting::DelayedFormat<I>::new_with_offset (4 samples, 2.04%) + + c.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.51%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.51%) + + + + + _int_free (1 samples, 0.51%) + + + + + s4lib::readers::journalreader::JournalReader::next_short (36 samples, 18.37%) + + s4lib::readers::journalreader.. + + + <chrono::format::formatting::DelayedFormat<I> as core::fmt::Display>::fmt (5 samples, 2.55%) + + <c.. + + + crossbeam_channel::waker::SyncWaker::notify (1 samples, 0.51%) + + + + + std::sys::unix::futex::futex_wake (1 samples, 0.51%) + + + + + syscall (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + __x64_sys_futex (1 samples, 0.51%) + + + + + do_futex (1 samples, 0.51%) + + + + + futex_wake (1 samples, 0.51%) + + + + + wake_up_q (1 samples, 0.51%) + + + + + try_to_wake_up (1 samples, 0.51%) + + + + + crossbeam_channel::channel::Sender<T>::send (2 samples, 1.02%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (1 samples, 0.51%) + + + + + std::thread::park (1 samples, 0.51%) + + + + + syscall (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + __x64_sys_futex (1 samples, 0.51%) + + + + + do_futex (1 samples, 0.51%) + + + + + futex_wait (1 samples, 0.51%) + + + + + futex_wait_queue_me (1 samples, 0.51%) + + + + + schedule (1 samples, 0.51%) + + + + + __schedule (1 samples, 0.51%) + + + + + update_rq_clock (1 samples, 0.51%) + + + + + sched_clock_cpu (1 samples, 0.51%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.51%) + + + + + read_hv_clock_tsc (1 samples, 0.51%) + + + + + clone3 (39 samples, 19.90%) + + clone3 + + + start_thread (39 samples, 19.90%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (39 samples, 19.90%) + + std::sys::unix::thread::Thread:.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (39 samples, 19.90%) + + core::ops::function::FnOnce::ca.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (39 samples, 19.90%) + + std::sys_common::backtrace::__r.. + + + s4::exec_fileprocessor_thread (39 samples, 19.90%) + + s4::exec_fileprocessor_thread + + + core::ptr::drop_in_place<s4lib::readers::journalreader::JournalReader> (1 samples, 0.51%) + + + + + core::ptr::drop_in_place<core::option::Option<tempfile::file::NamedTempFile>> (1 samples, 0.51%) + + + + + <tempfile::file::TempPath as core::ops::drop::Drop>::drop (1 samples, 0.51%) + + + + + std::sys::unix::fs::unlink (1 samples, 0.51%) + + + + + __GI___unlink (1 samples, 0.51%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.51%) + + + + + do_syscall_64 (1 samples, 0.51%) + + + + + __x64_sys_unlink (1 samples, 0.51%) + + + + + do_unlinkat (1 samples, 0.51%) + + + + + vfs_unlink (1 samples, 0.51%) + + + + + ext4_unlink (1 samples, 0.51%) + + + + + __ext4_unlink (1 samples, 0.51%) + + + + + ext4_orphan_add (1 samples, 0.51%) + + + + + asm_exc_page_fault (2 samples, 1.02%) + + + + + exc_page_fault (2 samples, 1.02%) + + + + + do_user_addr_fault (2 samples, 1.02%) + + + + + handle_mm_fault (2 samples, 1.02%) + + + + + __handle_mm_fault (2 samples, 1.02%) + + + + + __alloc_pages (2 samples, 1.02%) + + + + + get_page_from_freelist (2 samples, 1.02%) + + + + + kernel_init_free_pages.part.0 (2 samples, 1.02%) + + + + + clear_page_erms (2 samples, 1.02%) + + + + + chksum_update (2 samples, 1.02%) + + + + + crc32_body (2 samples, 1.02%) + + + + + ext4_inode_csum_set (3 samples, 1.53%) + + + + + ext4_inode_csum (3 samples, 1.53%) + + + + + __ext4_handle_dirty_metadata (1 samples, 0.51%) + + + + + ext4_dirty_inode (5 samples, 2.55%) + + ex.. + + + __ext4_mark_inode_dirty (5 samples, 2.55%) + + __.. + + + ext4_mark_iloc_dirty (5 samples, 2.55%) + + ex.. + + + stop_this_handle (1 samples, 0.51%) + + + + + __wake_up_common_lock (1 samples, 0.51%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.51%) + + + + + __mark_inode_dirty (7 samples, 3.57%) + + __ma.. + + + __ext4_journal_stop (2 samples, 1.02%) + + + + + jbd2_journal_stop (2 samples, 1.02%) + + + + + _raw_spin_unlock_irqrestore (1 samples, 0.51%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.51%) + + + + + generic_write_end (9 samples, 4.59%) + + gener.. + + + __block_commit_write.constprop.0.isra.0 (2 samples, 1.02%) + + + + + mark_buffer_dirty (2 samples, 1.02%) + + + + + xas_find_conflict (1 samples, 0.51%) + + + + + add_to_page_cache_lru (4 samples, 2.04%) + + a.. + + + __add_to_page_cache_locked (4 samples, 2.04%) + + _.. + + + node_dirty_ok (1 samples, 0.51%) + + + + + grab_cache_page_write_begin (6 samples, 3.06%) + + gra.. + + + pagecache_get_page (6 samples, 3.06%) + + pag.. + + + __alloc_pages (2 samples, 1.02%) + + + + + get_page_from_freelist (2 samples, 1.02%) + + + + + __list_del_entry_valid (1 samples, 0.51%) + + + + + _raw_write_lock (2 samples, 1.02%) + + + + + ext4_es_insert_delayed_block (3 samples, 1.53%) + + + + + ext4_da_write_begin (10 samples, 5.10%) + + ext4_d.. + + + __block_write_begin_int (4 samples, 2.04%) + + _.. + + + ext4_da_get_block_prep (4 samples, 2.04%) + + e.. + + + ext4_da_reserve_space (1 samples, 0.51%) + + + + + __dquot_alloc_space (1 samples, 0.51%) + + + + + std::io::Write::write_all (24 samples, 12.24%) + + std::io::Write::wr.. + + + std::os::unix::net::datagram::UnixDatagram::send (24 samples, 12.24%) + + std::os::unix::net.. + + + __GI___libc_write (24 samples, 12.24%) + + __GI___libc_write + + + entry_SYSCALL_64_after_hwframe (24 samples, 12.24%) + + entry_SYSCALL_64_a.. + + + do_syscall_64 (24 samples, 12.24%) + + do_syscall_64 + + + ksys_write (24 samples, 12.24%) + + ksys_write + + + vfs_write (24 samples, 12.24%) + + vfs_write + + + new_sync_write (24 samples, 12.24%) + + new_sync_write + + + ext4_buffered_write_iter (24 samples, 12.24%) + + ext4_buffered_writ.. + + + generic_perform_write (24 samples, 12.24%) + + generic_perform_wr.. + + + copy_page_from_iter_atomic (5 samples, 2.55%) + + co.. + + + copy_user_enhanced_fast_string (5 samples, 2.55%) + + co.. + + + std::io::buffered::bufwriter::BufWriter<W>::write_all_cold (25 samples, 12.76%) + + std::io::buffered::.. + + + miniz_oxide::inflate::core::transfer (19 samples, 9.69%) + + miniz_oxide::i.. + + + miniz_oxide::inflate::core::init_tree (1 samples, 0.51%) + + + + + miniz_oxide::inflate::core::apply_match (1 samples, 0.51%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 1.02%) + + + + + flate2::zio::read (36 samples, 18.37%) + + flate2::zio::read + + + <flate2::ffi::rust::Inflate as flate2::ffi::InflateBackend>::decompress (36 samples, 18.37%) + + <flate2::ffi::rust::Inflate a.. + + + miniz_oxide::inflate::stream::inflate (36 samples, 18.37%) + + miniz_oxide::inflate::stream:.. + + + miniz_oxide::inflate::core::decompress (36 samples, 18.37%) + + miniz_oxide::inflate::core::d.. + + + all (196 samples, 100%) + + + + + RHE_91_system.j (105 samples, 53.57%) + + RHE_91_system.j + + + [unknown] (64 samples, 32.65%) + + [unknown] + + + s4lib::readers::filedecompressor::decompress_to_ntf (64 samples, 32.65%) + + s4lib::readers::filedecompressor::decompress_to_ntf + + + <flate2::gz::bufread::GzDecoder<R> as std::io::Read>::read (39 samples, 19.90%) + + <flate2::gz::bufread::GzDecoder.. + + + crc32fast::Hasher::update (3 samples, 1.53%) + + + + + crc32fast::specialized::pclmulqdq::calculate (3 samples, 1.53%) + + + + + diff --git a/releases/0.7.75/flamegraph-journal-lz4.svg b/releases/0.7.75/flamegraph-journal-lz4.svg new file mode 100644 index 00000000..0ecd2273 --- /dev/null +++ b/releases/0.7.75/flamegraph-journal-lz4.svg @@ -0,0 +1,2592 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231102-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/journal/RHE_91_system.journal.lz4 + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 12.22%) + + ret_from_fork + + + schedule_tail (22 samples, 12.22%) + + schedule_tail + + + finish_task_switch.isra.0 (22 samples, 12.22%) + + finish_task_switch.. + + + __perf_event_task_sched_in (22 samples, 12.22%) + + __perf_event_task_.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 12.22%) + + __raw_callee_save_.. + + + kmem_cache_free.part.0 (1 samples, 0.56%) + + + + + __slab_free.constprop.0 (1 samples, 0.56%) + + + + + truncate_cleanup_page (2 samples, 1.11%) + + + + + try_to_free_buffers (2 samples, 1.11%) + + + + + __cancel_dirty_page (1 samples, 0.56%) + + + + + account_page_cleaned (1 samples, 0.56%) + + + + + __mod_lruvec_page_state (1 samples, 0.56%) + + + + + __mod_lruvec_state (1 samples, 0.56%) + + + + + __list_del_entry_valid (1 samples, 0.56%) + + + + + evict (4 samples, 2.22%) + + e.. + + + ext4_evict_inode (4 samples, 2.22%) + + e.. + + + truncate_inode_pages_range (4 samples, 2.22%) + + t.. + + + __pagevec_release (2 samples, 1.11%) + + + + + release_pages (2 samples, 1.11%) + + + + + free_unref_page_list (2 samples, 1.11%) + + + + + free_pcppages_bulk (2 samples, 1.11%) + + + + + task_work_run (5 samples, 2.78%) + + ta.. + + + __fput (5 samples, 2.78%) + + __.. + + + dput (5 samples, 2.78%) + + dp.. + + + __dentry_kill (5 samples, 2.78%) + + __.. + + + destroy_inode (1 samples, 0.56%) + + + + + __destroy_inode (1 samples, 0.56%) + + + + + fsnotify_destroy_marks (1 samples, 0.56%) + + + + + fsnotify_grab_connector (1 samples, 0.56%) + + + + + __srcu_read_unlock (1 samples, 0.56%) + + + + + unmap_vmas (1 samples, 0.56%) + + + + + unmap_page_range (1 samples, 0.56%) + + + + + page_remove_rmap (1 samples, 0.56%) + + + + + __mod_lruvec_page_state (1 samples, 0.56%) + + + + + __mod_lruvec_state (1 samples, 0.56%) + + + + + __mod_node_page_state (1 samples, 0.56%) + + + + + mmput (2 samples, 1.11%) + + + + + exit_mmap (2 samples, 1.11%) + + + + + free_pgtables (1 samples, 0.56%) + + + + + unlink_anon_vmas (1 samples, 0.56%) + + + + + kmem_cache_free.part.0 (1 samples, 0.56%) + + + + + __slab_free.constprop.0 (1 samples, 0.56%) + + + + + __x64_sys_exit_group (8 samples, 4.44%) + + __x64.. + + + do_group_exit (8 samples, 4.44%) + + do_gr.. + + + do_exit (8 samples, 4.44%) + + do_ex.. + + + mm_update_next_owner (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (9 samples, 5.00%) + + entry_.. + + + do_syscall_64 (9 samples, 5.00%) + + do_sys.. + + + __x64_sys_execve (1 samples, 0.56%) + + + + + do_execveat_common.isra.0 (1 samples, 0.56%) + + + + + bprm_execve (1 samples, 0.56%) + + + + + load_elf_binary (1 samples, 0.56%) + + + + + setup_arg_pages (1 samples, 0.56%) + + + + + expand_downwards (1 samples, 0.56%) + + + + + perf_event_mmap (1 samples, 0.56%) + + + + + perf_iterate_sb (1 samples, 0.56%) + + + + + perf_iterate_ctx (1 samples, 0.56%) + + + + + perf_event_mmap_output (1 samples, 0.56%) + + + + + perf_output_copy (1 samples, 0.56%) + + + + + memcpy_erms (1 samples, 0.56%) + + + + + __mprotect (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + __x64_sys_mprotect (1 samples, 0.56%) + + + + + do_mprotect_pkey (1 samples, 0.56%) + + + + + mprotect_fixup (1 samples, 0.56%) + + + + + __split_vma (1 samples, 0.56%) + + + + + start_thread (2 samples, 1.11%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 1.11%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 1.11%) + + + + + __GI___sigaltstack (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + syscall_exit_to_user_mode (1 samples, 0.56%) + + + + + srso_alias_safe_ret (1 samples, 0.56%) + + + + + clone3 (3 samples, 1.67%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + __do_sys_clone3 (1 samples, 0.56%) + + + + + kernel_clone (1 samples, 0.56%) + + + + + add_device_randomness (1 samples, 0.56%) + + + + + srso_alias_safe_ret (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + __x64_sys_execve (1 samples, 0.56%) + + + + + do_execveat_common.isra.0 (1 samples, 0.56%) + + + + + kfree (1 samples, 0.56%) + + + + + _dl_relocate_object (1 samples, 0.56%) + + + + + asm_exc_page_fault (1 samples, 0.56%) + + + + + exc_page_fault (1 samples, 0.56%) + + + + + do_user_addr_fault (1 samples, 0.56%) + + + + + handle_mm_fault (1 samples, 0.56%) + + + + + __handle_mm_fault (1 samples, 0.56%) + + + + + filemap_map_pages (1 samples, 0.56%) + + + + + next_uptodate_page (1 samples, 0.56%) + + + + + _dl_map_object_deps (1 samples, 0.56%) + + + + + _dl_catch_exception (1 samples, 0.56%) + + + + + openaux (1 samples, 0.56%) + + + + + _dl_map_object (1 samples, 0.56%) + + + + + _dl_map_object_from_fd (1 samples, 0.56%) + + + + + mmap64 (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + vm_mmap_pgoff (1 samples, 0.56%) + + + + + do_mmap (1 samples, 0.56%) + + + + + mmap_region (1 samples, 0.56%) + + + + + perf_event_mmap (1 samples, 0.56%) + + + + + perf_iterate_sb (1 samples, 0.56%) + + + + + perf_iterate_ctx (1 samples, 0.56%) + + + + + _dl_start (3 samples, 1.67%) + + + + + _dl_sysdep_start (3 samples, 1.67%) + + + + + dl_main (3 samples, 1.67%) + + + + + _dl_find_object_init (1 samples, 0.56%) + + + + + _dlfo_sort_mappings (1 samples, 0.56%) + + + + + __memrchr_evex (1 samples, 0.56%) + + + + + vfs_write (2 samples, 1.11%) + + + + + ksys_write (3 samples, 1.67%) + + + + + entry_SYSCALL_64_after_hwframe (4 samples, 2.22%) + + e.. + + + do_syscall_64 (4 samples, 2.22%) + + d.. + + + std::io::Write::write_all (6 samples, 3.33%) + + std.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (6 samples, 3.33%) + + <te.. + + + <std::io::stdio::Stdout as std::io::Write>::write (6 samples, 3.33%) + + <st.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (6 samples, 3.33%) + + <&s.. + + + <std::io::stdio::StdoutLock as std::io::Write>::write (6 samples, 3.33%) + + <st.. + + + __GI___libc_write (5 samples, 2.78%) + + __.. + + + alloc::vec::Vec<T,A>::extend_from_slice (1 samples, 0.56%) + + + + + termcolor::Ansi<W>::write_color (3 samples, 1.67%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (4 samples, 2.22%) + + <.. + + + std::io::Write::write_all (1 samples, 0.56%) + + + + + srso_alias_return_thunk (1 samples, 0.56%) + + + + + srso_alias_safe_ret (1 samples, 0.56%) + + + + + write_null (2 samples, 1.11%) + + + + + srso_alias_return_thunk (1 samples, 0.56%) + + + + + srso_alias_safe_ret (1 samples, 0.56%) + + + + + dput (1 samples, 0.56%) + + + + + lockref_put_return (1 samples, 0.56%) + + + + + __fsnotify_parent (2 samples, 1.11%) + + + + + dget_parent (1 samples, 0.56%) + + + + + rcu_read_unlock_strict (1 samples, 0.56%) + + + + + vfs_write (9 samples, 5.00%) + + vfs_wr.. + + + srso_alias_return_thunk (1 samples, 0.56%) + + + + + srso_alias_safe_ret (1 samples, 0.56%) + + + + + __fdget_pos (3 samples, 1.67%) + + + + + __fget_light (2 samples, 1.11%) + + + + + __fget_files (2 samples, 1.11%) + + + + + do_syscall_64 (15 samples, 8.33%) + + do_syscall_64 + + + ksys_write (14 samples, 7.78%) + + ksys_write + + + entry_SYSCALL_64_after_hwframe (17 samples, 9.44%) + + entry_SYSCALL_.. + + + __x86_indirect_thunk_rax (1 samples, 0.56%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (19 samples, 10.56%) + + std::io::buffer.. + + + __GI___libc_write (19 samples, 10.56%) + + __GI___libc_wri.. + + + s4lib::printer::printers::PrinterLogMessage::print_journalentry_color (31 samples, 17.22%) + + s4lib::printer::printers::P.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (20 samples, 11.11%) + + <std::io::stdio:.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (20 samples, 11.11%) + + <&std::io::stdio.. + + + _dl_relocate_object (1 samples, 0.56%) + + + + + _dl_lookup_symbol_x (1 samples, 0.56%) + + + + + do_lookup_x (1 samples, 0.56%) + + + + + s4lib::libload::systemd_dlopen2::load_library_systemd (2 samples, 1.11%) + + + + + dlopen2::wrapper::container::Container<T>::load (2 samples, 1.11%) + + + + + dlopen2::raw::common::Library::open (2 samples, 1.11%) + + + + + dlopen@GLIBC_2.2.5 (2 samples, 1.11%) + + + + + _dlerror_run (2 samples, 1.11%) + + + + + _dl_catch_error (2 samples, 1.11%) + + + + + _dl_catch_exception (2 samples, 1.11%) + + + + + dlopen_doit (2 samples, 1.11%) + + + + + _dl_open (2 samples, 1.11%) + + + + + _dl_catch_exception (2 samples, 1.11%) + + + + + dl_open_worker (2 samples, 1.11%) + + + + + _dl_catch_exception (2 samples, 1.11%) + + + + + dl_open_worker_begin (2 samples, 1.11%) + + + + + _dl_map_object_deps (1 samples, 0.56%) + + + + + _dl_catch_exception (1 samples, 0.56%) + + + + + openaux (1 samples, 0.56%) + + + + + _dl_map_object (1 samples, 0.56%) + + + + + _dl_map_object_from_fd (1 samples, 0.56%) + + + + + mmap64 (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + ksys_mmap_pgoff (1 samples, 0.56%) + + + + + vm_mmap_pgoff (1 samples, 0.56%) + + + + + do_mmap (1 samples, 0.56%) + + + + + mmap_region (1 samples, 0.56%) + + + + + perf_event_mmap (1 samples, 0.56%) + + + + + perf_iterate_sb (1 samples, 0.56%) + + + + + perf_iterate_ctx (1 samples, 0.56%) + + + + + perf_event_mmap_output (1 samples, 0.56%) + + + + + hashbrown::set::HashSet<T,S,A>::remove (2 samples, 1.11%) + + + + + core::hash::BuildHasher::hash_one (2 samples, 1.11%) + + + + + crossbeam_channel::context::Context::wait_until (3 samples, 1.67%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (4 samples, 2.22%) + + c.. + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::register (1 samples, 0.56%) + + + + + crossbeam_channel::waker::SyncWaker::register (1 samples, 0.56%) + + + + + crossbeam_channel::select::Select::select (6 samples, 3.33%) + + cro.. + + + crossbeam_channel::select::run_select (6 samples, 3.33%) + + cro.. + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (2 samples, 1.11%) + + + + + s4::processing_loop (43 samples, 23.89%) + + s4::processing_loop + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (2 samples, 1.11%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (2 samples, 1.11%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (2 samples, 1.11%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (2 samples, 1.11%) + + + + + std::rt::lang_start::_{{closure}} (44 samples, 24.44%) + + std::rt::lang_start::_{{closure}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (44 samples, 24.44%) + + std::sys_common::backtrace::__rust_begi.. + + + s4::main (44 samples, 24.44%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.56%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.56%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.56%) + + + + + clap_builder::parser::parser::Parser::add_defaults (1 samples, 0.56%) + + + + + clap_builder::parser::parser::Parser::react (1 samples, 0.56%) + + + + + clap_builder::parser::parser::Parser::push_arg_values (1 samples, 0.56%) + + + + + <P as clap_builder::builder::value_parser::AnyValueParser>::parse_ref (1 samples, 0.56%) + + + + + <F as clap_builder::builder::value_parser::TypedValueParser>::parse_ref (1 samples, 0.56%) + + + + + s4lib::data::datetime::datetime_parse_from_str_w_tz (1 samples, 0.56%) + + + + + chrono::datetime::DateTime<chrono::offset::fixed::FixedOffset>::parse_from_str (1 samples, 0.56%) + + + + + chrono::format::parsed::Parsed::to_datetime (1 samples, 0.56%) + + + + + chrono::format::parsed::Parsed::to_naive_datetime_with_offset (1 samples, 0.56%) + + + + + chrono::format::parsed::Parsed::to_naive_date (1 samples, 0.56%) + + + + + s4 (83 samples, 46.11%) + + s4 + + + _start (49 samples, 27.22%) + + _start + + + __libc_start_main@@GLIBC_2.34 (45 samples, 25.00%) + + __libc_start_main@@GLIBC_2.34 + + + __libc_start_call_main (45 samples, 25.00%) + + __libc_start_call_main + + + main (45 samples, 25.00%) + + main + + + std::rt::lang_start_internal (45 samples, 25.00%) + + std::rt::lang_start_internal + + + <&[u8] as alloc::ffi::c_str::CString::new::SpecNewImpl>::spec_new_impl (1 samples, 0.56%) + + + + + asm_exc_page_fault (1 samples, 0.56%) + + + + + exc_page_fault (1 samples, 0.56%) + + + + + do_user_addr_fault (1 samples, 0.56%) + + + + + handle_mm_fault (1 samples, 0.56%) + + + + + __handle_mm_fault (1 samples, 0.56%) + + + + + filemap_map_pages (1 samples, 0.56%) + + + + + do_set_pte (1 samples, 0.56%) + + + + + page_add_file_rmap (1 samples, 0.56%) + + + + + __mod_lruvec_page_state (1 samples, 0.56%) + + + + + __mod_memcg_lruvec_state (1 samples, 0.56%) + + + + + cgroup_rstat_updated (1 samples, 0.56%) + + + + + perf-exec (11 samples, 6.11%) + + perf-exec + + + entry_SYSCALL_64_after_hwframe (11 samples, 6.11%) + + entry_SY.. + + + do_syscall_64 (11 samples, 6.11%) + + do_sysca.. + + + __x64_sys_execve (11 samples, 6.11%) + + __x64_sy.. + + + do_execveat_common.isra.0 (11 samples, 6.11%) + + do_execv.. + + + bprm_execve (11 samples, 6.11%) + + bprm_exe.. + + + load_elf_binary (11 samples, 6.11%) + + load_elf.. + + + begin_new_exec (11 samples, 6.11%) + + begin_ne.. + + + perf_event_exec (11 samples, 6.11%) + + perf_eve.. + + + __raw_callee_save___pv_queued_spin_unlock (11 samples, 6.11%) + + __raw_ca.. + + + [libsystemd.so.0.32.0] (2 samples, 1.11%) + + + + + [libsystemd.so.0.32.0] (8 samples, 4.44%) + + [libs.. + + + [libsystemd.so.0.32.0] (11 samples, 6.11%) + + [libsyst.. + + + sd_journal_enumerate_available_data (13 samples, 7.22%) + + sd_journal.. + + + sd_journal_enumerate_data (13 samples, 7.22%) + + sd_journal.. + + + __strlen_evex (1 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (6 samples, 3.33%) + + [li.. + + + [libsystemd.so.0.32.0] (9 samples, 5.00%) + + [libsy.. + + + [libsystemd.so.0.32.0] (10 samples, 5.56%) + + [libsys.. + + + sd_journal_get_data (11 samples, 6.11%) + + sd_journ.. + + + core::unicode::unicode_data::grapheme_extend::lookup (1 samples, 0.56%) + + + + + <str as core::fmt::Debug>::fmt (2 samples, 1.11%) + + + + + s4lib::readers::journalreader::JournalReader::Error_from_Errno (3 samples, 1.67%) + + + + + alloc::fmt::format::format_inner (3 samples, 1.67%) + + + + + core::fmt::write (3 samples, 1.67%) + + + + + <&mut W as core::fmt::Write>::write_str (1 samples, 0.56%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.56%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.56%) + + + + + realloc (1 samples, 0.56%) + + + + + asm_exc_page_fault (1 samples, 0.56%) + + + + + exc_page_fault (1 samples, 0.56%) + + + + + do_user_addr_fault (1 samples, 0.56%) + + + + + handle_mm_fault (1 samples, 0.56%) + + + + + __handle_mm_fault (1 samples, 0.56%) + + + + + filemap_map_pages (1 samples, 0.56%) + + + + + next_uptodate_page (1 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (2 samples, 1.11%) + + + + + [libsystemd.so.0.32.0] (4 samples, 2.22%) + + [.. + + + [libsystemd.so.0.32.0] (4 samples, 2.22%) + + [.. + + + s4lib::readers::journalreader::JournalReader::next_common (19 samples, 10.56%) + + s4lib::readers:.. + + + [libsystemd.so.0.32.0] (5 samples, 2.78%) + + [l.. + + + [libsystemd.so.0.32.0] (5 samples, 2.78%) + + [l.. + + + nix::errno::consts::from_i32 (1 samples, 0.56%) + + + + + memchr::arch::x86_64::memchr::memchr_raw::find_avx2 (2 samples, 1.11%) + + + + + memchr::arch::x86_64::avx2::memchr::One::find_raw (2 samples, 1.11%) + + + + + chrono::format::formatting::DelayedFormat<I>::format_numeric::write_two (1 samples, 0.56%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.56%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.56%) + + + + + realloc (1 samples, 0.56%) + + + + + _int_realloc (1 samples, 0.56%) + + + + + s4lib::readers::journalreader::JournalReader::next_short (39 samples, 21.67%) + + s4lib::readers::journalreader::Jou.. + + + <chrono::format::formatting::DelayedFormat<I> as core::fmt::Display>::fmt (4 samples, 2.22%) + + <.. + + + s4lib::readers::journalreader::JournalReader::new (1 samples, 0.56%) + + + + + sd_journal_open_files (1 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.56%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.56%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (1 samples, 0.56%) + + + + + std::thread::park (1 samples, 0.56%) + + + + + syscall (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + __x64_sys_futex (1 samples, 0.56%) + + + + + do_futex (1 samples, 0.56%) + + + + + futex_wait (1 samples, 0.56%) + + + + + futex_wait_queue_me (1 samples, 0.56%) + + + + + schedule (1 samples, 0.56%) + + + + + __schedule (1 samples, 0.56%) + + + + + clone3 (42 samples, 23.33%) + + clone3 + + + start_thread (42 samples, 23.33%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (42 samples, 23.33%) + + std::sys::unix::thread::Thread::new::.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (42 samples, 23.33%) + + core::ops::function::FnOnce::call_onc.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (42 samples, 23.33%) + + std::sys_common::backtrace::__rust_be.. + + + s4::exec_fileprocessor_thread (42 samples, 23.33%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (2 samples, 1.11%) + + + + + asm_exc_page_fault (1 samples, 0.56%) + + + + + exc_page_fault (1 samples, 0.56%) + + + + + do_user_addr_fault (1 samples, 0.56%) + + + + + handle_mm_fault (1 samples, 0.56%) + + + + + __handle_mm_fault (1 samples, 0.56%) + + + + + __mem_cgroup_charge (1 samples, 0.56%) + + + + + charge_memcg (1 samples, 0.56%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.56%) + + + + + ext4_file_write_iter (1 samples, 0.56%) + + + + + ext4_reserve_inode_write (1 samples, 0.56%) + + + + + __ext4_journal_get_write_access (1 samples, 0.56%) + + + + + ext4_dirty_inode (2 samples, 1.11%) + + + + + __ext4_mark_inode_dirty (2 samples, 1.11%) + + + + + ext4_mark_iloc_dirty (1 samples, 0.56%) + + + + + ext4_inode_csum_set (1 samples, 0.56%) + + + + + ext4_inode_csum (1 samples, 0.56%) + + + + + chksum_update (1 samples, 0.56%) + + + + + crc32_body (1 samples, 0.56%) + + + + + stop_this_handle (1 samples, 0.56%) + + + + + __mark_inode_dirty (4 samples, 2.22%) + + _.. + + + __ext4_journal_stop (2 samples, 1.11%) + + + + + jbd2_journal_stop (2 samples, 1.11%) + + + + + kmem_cache_free.part.0 (1 samples, 0.56%) + + + + + generic_write_end (6 samples, 3.33%) + + gen.. + + + __block_commit_write.constprop.0.isra.0 (2 samples, 1.11%) + + + + + mark_buffer_dirty (2 samples, 1.11%) + + + + + lru_cache_add (1 samples, 0.56%) + + + + + __pagevec_lru_add (1 samples, 0.56%) + + + + + release_pages (1 samples, 0.56%) + + + + + add_to_page_cache_lru (2 samples, 1.11%) + + + + + __add_to_page_cache_locked (1 samples, 0.56%) + + + + + rmqueue_bulk (3 samples, 1.67%) + + + + + __list_del_entry_valid (3 samples, 1.67%) + + + + + grab_cache_page_write_begin (6 samples, 3.33%) + + gra.. + + + pagecache_get_page (6 samples, 3.33%) + + pag.. + + + __alloc_pages (4 samples, 2.22%) + + _.. + + + get_page_from_freelist (4 samples, 2.22%) + + g.. + + + ext4_claim_free_clusters (1 samples, 0.56%) + + + + + ext4_da_get_block_prep (2 samples, 1.11%) + + + + + ext4_da_reserve_space (2 samples, 1.11%) + + + + + __dquot_alloc_space (1 samples, 0.56%) + + + + + __block_write_begin_int (3 samples, 1.67%) + + + + + ext4_da_write_begin (10 samples, 5.56%) + + ext4_da.. + + + std::io::buffered::bufwriter::BufWriter<W>::write_all_cold (22 samples, 12.22%) + + std::io::buffered:.. + + + std::io::Write::write_all (22 samples, 12.22%) + + std::io::Write::wr.. + + + std::os::unix::net::datagram::UnixDatagram::send (22 samples, 12.22%) + + std::os::unix::net.. + + + __GI___libc_write (22 samples, 12.22%) + + __GI___libc_write + + + entry_SYSCALL_64_after_hwframe (22 samples, 12.22%) + + entry_SYSCALL_64_a.. + + + do_syscall_64 (22 samples, 12.22%) + + do_syscall_64 + + + ksys_write (22 samples, 12.22%) + + ksys_write + + + vfs_write (22 samples, 12.22%) + + vfs_write + + + new_sync_write (22 samples, 12.22%) + + new_sync_write + + + ext4_buffered_write_iter (21 samples, 11.67%) + + ext4_buffered_wri.. + + + generic_perform_write (21 samples, 11.67%) + + generic_perform_w.. + + + copy_page_from_iter_atomic (5 samples, 2.78%) + + co.. + + + copy_user_enhanced_fast_string (5 samples, 2.78%) + + co.. + + + cfree@GLIBC_2.2.5 (1 samples, 0.56%) + + + + + __munmap (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + __x64_sys_munmap (1 samples, 0.56%) + + + + + __vm_munmap (1 samples, 0.56%) + + + + + __do_munmap (1 samples, 0.56%) + + + + + unmap_region (1 samples, 0.56%) + + + + + unmap_vmas (1 samples, 0.56%) + + + + + unmap_page_range (1 samples, 0.56%) + + + + + page_remove_rmap (1 samples, 0.56%) + + + + + __mod_lruvec_page_state (1 samples, 0.56%) + + + + + __mod_lruvec_state (1 samples, 0.56%) + + + + + std::io::default_read_exact (1 samples, 0.56%) + + + + + <std::io::buffered::bufreader::BufReader<R> as std::io::Read>::read (1 samples, 0.56%) + + + + + <std::process::ChildStdout as std::io::Read>::read (1 samples, 0.56%) + + + + + read (1 samples, 0.56%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.56%) + + + + + do_syscall_64 (1 samples, 0.56%) + + + + + ksys_read (1 samples, 0.56%) + + + + + vfs_read (1 samples, 0.56%) + + + + + new_sync_read (1 samples, 0.56%) + + + + + filemap_read (1 samples, 0.56%) + + + + + copy_page_to_iter (1 samples, 0.56%) + + + + + copy_user_enhanced_fast_string (1 samples, 0.56%) + + + + + lru_cache_add (1 samples, 0.56%) + + + + + __pagevec_lru_add (1 samples, 0.56%) + + + + + clear_subpage (1 samples, 0.56%) + + + + + clear_page_erms (1 samples, 0.56%) + + + + + do_huge_pmd_anonymous_page (2 samples, 1.11%) + + + + + clear_huge_page (2 samples, 1.11%) + + + + + __mem_cgroup_charge (1 samples, 0.56%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.56%) + + + + + handle_mm_fault (5 samples, 2.78%) + + ha.. + + + __handle_mm_fault (5 samples, 2.78%) + + __.. + + + __alloc_pages (1 samples, 0.56%) + + + + + get_page_from_freelist (1 samples, 0.56%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.56%) + + + + + clear_page_erms (1 samples, 0.56%) + + + + + do_user_addr_fault (6 samples, 3.33%) + + do_.. + + + find_vma (1 samples, 0.56%) + + + + + asm_exc_page_fault (8 samples, 4.44%) + + asm_e.. + + + exc_page_fault (8 samples, 4.44%) + + exc_p.. + + + __memset_avx512_unaligned_erms (10 samples, 5.56%) + + __memse.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.56%) + + + + + <twox_hash::thirty_two::XxHash32 as core::hash::Hasher>::write (5 samples, 2.78%) + + <t.. + + + all (180 samples, 100%) + + + + + RHE_91_system.j (86 samples, 47.78%) + + RHE_91_system.j + + + [unknown] (43 samples, 23.89%) + + [unknown] + + + s4lib::readers::filedecompressor::decompress_to_ntf (43 samples, 23.89%) + + s4lib::readers::filedecompressor::deco.. + + + <lz4_flex::frame::decompress::FrameDecoder<R> as std::io::Read>::read (20 samples, 11.11%) + + <lz4_flex::frame.. + + + diff --git a/releases/0.7.75/flamegraph-journal-tar.svg b/releases/0.7.75/flamegraph-journal-tar.svg new file mode 100644 index 00000000..d2f2e7df --- /dev/null +++ b/releases/0.7.75/flamegraph-journal-tar.svg @@ -0,0 +1,2512 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231108-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/journal/RHE_91_system.tar + + Reset Zoom + Search + + + + __raw_callee_save___pv_queued_spin_unlock (11 samples, 6.40%) + + __raw_ca.. + + + ret_from_fork (22 samples, 12.79%) + + ret_from_fork + + + schedule_tail (22 samples, 12.79%) + + schedule_tail + + + finish_task_switch.isra.0 (22 samples, 12.79%) + + finish_task_switch... + + + __perf_event_task_sched_in (22 samples, 12.79%) + + __perf_event_task_s.. + + + try_to_free_buffers (1 samples, 0.58%) + + + + + kmem_cache_free.part.0 (1 samples, 0.58%) + + + + + __slab_free.constprop.0 (1 samples, 0.58%) + + + + + jbd2_journal_try_to_free_buffers (1 samples, 0.58%) + + + + + jbd2_journal_grab_journal_head (1 samples, 0.58%) + + + + + truncate_cleanup_page (3 samples, 1.74%) + + + + + block_invalidatepage (1 samples, 0.58%) + + + + + find_lock_entries (1 samples, 0.58%) + + + + + task_work_run (5 samples, 2.91%) + + ta.. + + + __fput (5 samples, 2.91%) + + __.. + + + dput (5 samples, 2.91%) + + dp.. + + + __dentry_kill (5 samples, 2.91%) + + __.. + + + evict (5 samples, 2.91%) + + ev.. + + + ext4_evict_inode (5 samples, 2.91%) + + ex.. + + + truncate_inode_pages_range (5 samples, 2.91%) + + tr.. + + + __pagevec_release (1 samples, 0.58%) + + + + + release_pages (1 samples, 0.58%) + + + + + free_unref_page_list (1 samples, 0.58%) + + + + + free_pcppages_bulk (1 samples, 0.58%) + + + + + __x64_sys_exit_group (7 samples, 4.07%) + + __x6.. + + + do_group_exit (7 samples, 4.07%) + + do_g.. + + + do_exit (7 samples, 4.07%) + + do_e.. + + + mmput (2 samples, 1.16%) + + + + + exit_mmap (2 samples, 1.16%) + + + + + unmap_vmas (2 samples, 1.16%) + + + + + unmap_page_range (2 samples, 1.16%) + + + + + page_remove_rmap (2 samples, 1.16%) + + + + + entry_SYSCALL_64_after_hwframe (8 samples, 4.65%) + + entry.. + + + do_syscall_64 (8 samples, 4.65%) + + do_sy.. + + + __x64_sys_execve (1 samples, 0.58%) + + + + + do_execveat_common.isra.0 (1 samples, 0.58%) + + + + + bprm_execve (1 samples, 0.58%) + + + + + load_elf_binary (1 samples, 0.58%) + + + + + __clear_user (1 samples, 0.58%) + + + + + __mprotect (1 samples, 0.58%) + + + + + __x86_indirect_thunk_r12 (1 samples, 0.58%) + + + + + start_thread (2 samples, 1.16%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 1.16%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 1.16%) + + + + + __mmap (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + vm_mmap_pgoff (1 samples, 0.58%) + + + + + do_mmap (1 samples, 0.58%) + + + + + get_unmapped_area (1 samples, 0.58%) + + + + + arch_get_unmapped_area_topdown (1 samples, 0.58%) + + + + + vm_unmapped_area (1 samples, 0.58%) + + + + + clone3 (3 samples, 1.74%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + __do_sys_clone3 (1 samples, 0.58%) + + + + + kernel_clone (1 samples, 0.58%) + + + + + copy_process (1 samples, 0.58%) + + + + + account_kernel_stack.isra.0 (1 samples, 0.58%) + + + + + _dl_lookup_symbol_x (1 samples, 0.58%) + + + + + do_lookup_x (1 samples, 0.58%) + + + + + _dl_relocate_object (2 samples, 1.16%) + + + + + _dl_start (3 samples, 1.74%) + + + + + _dl_sysdep_start (3 samples, 1.74%) + + + + + dl_main (3 samples, 1.74%) + + + + + _dl_map_object_deps (1 samples, 0.58%) + + + + + _dl_catch_exception (1 samples, 0.58%) + + + + + openaux (1 samples, 0.58%) + + + + + _dl_map_object (1 samples, 0.58%) + + + + + open_verify.constprop.0 (1 samples, 0.58%) + + + + + __GI___open64_nocancel (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + __x64_sys_openat (1 samples, 0.58%) + + + + + do_sys_openat2 (1 samples, 0.58%) + + + + + getname_flags.part.0 (1 samples, 0.58%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.58%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.58%) + + + + + __GI___libc_write (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + ksys_write (1 samples, 0.58%) + + + + + vfs_write (1 samples, 0.58%) + + + + + std::io::Write::write_all (2 samples, 1.16%) + + + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (2 samples, 1.16%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (2 samples, 1.16%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (1 samples, 0.58%) + + + + + termcolor::Ansi<W>::write_color (1 samples, 0.58%) + + + + + write_null (1 samples, 0.58%) + + + + + srso_alias_safe_ret (1 samples, 0.58%) + + + + + syscall_return_via_sysret (1 samples, 0.58%) + + + + + syscall_exit_to_user_mode (1 samples, 0.58%) + + + + + fsnotify (3 samples, 1.74%) + + + + + __fsnotify_parent (4 samples, 2.33%) + + _.. + + + vfs_write (10 samples, 5.81%) + + vfs_wri.. + + + srso_alias_return_thunk (2 samples, 1.16%) + + + + + srso_alias_safe_ret (2 samples, 1.16%) + + + + + do_syscall_64 (14 samples, 8.14%) + + do_syscall_.. + + + ksys_write (13 samples, 7.56%) + + ksys_write + + + __fdget_pos (3 samples, 1.74%) + + + + + __fget_light (1 samples, 0.58%) + + + + + __fget_files (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (16 samples, 9.30%) + + entry_SYSCALL.. + + + entry_SYSCALL_64 (1 samples, 0.58%) + + + + + __GI___pthread_disable_asynccancel (1 samples, 0.58%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (21 samples, 12.21%) + + std::io::buffered:.. + + + __GI___libc_write (21 samples, 12.21%) + + __GI___libc_write + + + s4lib::printer::printers::PrinterLogMessage::print_journalentry_color (26 samples, 15.12%) + + s4lib::printer::printer.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (23 samples, 13.37%) + + <std::io::stdio::Std.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (23 samples, 13.37%) + + <&std::io::stdio::St.. + + + _dl_relocate_object (1 samples, 0.58%) + + + + + mprotect (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + __x64_sys_mprotect (1 samples, 0.58%) + + + + + do_mprotect_pkey (1 samples, 0.58%) + + + + + mprotect_fixup (1 samples, 0.58%) + + + + + perf_event_mmap (1 samples, 0.58%) + + + + + perf_iterate_sb (1 samples, 0.58%) + + + + + perf_iterate_ctx (1 samples, 0.58%) + + + + + perf_event_mmap_output (1 samples, 0.58%) + + + + + __perf_event__output_id_sample (1 samples, 0.58%) + + + + + s4lib::libload::systemd_dlopen2::load_library_systemd (2 samples, 1.16%) + + + + + dlopen2::wrapper::container::Container<T>::load (2 samples, 1.16%) + + + + + dlopen2::raw::common::Library::open (2 samples, 1.16%) + + + + + dlopen@GLIBC_2.2.5 (2 samples, 1.16%) + + + + + _dlerror_run (2 samples, 1.16%) + + + + + _dl_catch_error (2 samples, 1.16%) + + + + + _dl_catch_exception (2 samples, 1.16%) + + + + + dlopen_doit (2 samples, 1.16%) + + + + + _dl_open (2 samples, 1.16%) + + + + + _dl_catch_exception (2 samples, 1.16%) + + + + + dl_open_worker (2 samples, 1.16%) + + + + + _dl_catch_exception (2 samples, 1.16%) + + + + + dl_open_worker_begin (2 samples, 1.16%) + + + + + _dl_map_object_deps (1 samples, 0.58%) + + + + + _dl_catch_exception (1 samples, 0.58%) + + + + + openaux (1 samples, 0.58%) + + + + + _dl_map_object (1 samples, 0.58%) + + + + + open_verify.constprop.0 (1 samples, 0.58%) + + + + + __GI___open64_nocancel (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + __x64_sys_openat (1 samples, 0.58%) + + + + + do_sys_openat2 (1 samples, 0.58%) + + + + + do_filp_open (1 samples, 0.58%) + + + + + path_openat (1 samples, 0.58%) + + + + + lookup_fast (1 samples, 0.58%) + + + + + __d_lookup_rcu (1 samples, 0.58%) + + + + + crossbeam_channel::channel::read (1 samples, 0.58%) + + + + + crossbeam_channel::waker::SyncWaker::notify (1 samples, 0.58%) + + + + + crossbeam_channel::select::SelectedOperation::recv (2 samples, 1.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.58%) + + + + + crossbeam_channel::context::Context::wait_until (2 samples, 1.16%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.58%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::unregister (1 samples, 0.58%) + + + + + crossbeam_channel::waker::SyncWaker::unregister (1 samples, 0.58%) + + + + + crossbeam_channel::select::Select::select (5 samples, 2.91%) + + cr.. + + + crossbeam_channel::select::run_select (5 samples, 2.91%) + + cr.. + + + crossbeam_channel::context::Context::with::{{closure}} (5 samples, 2.91%) + + cr.. + + + cfree@GLIBC_2.2.5 (1 samples, 0.58%) + + + + + _int_free (1 samples, 0.58%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (1 samples, 0.58%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (1 samples, 0.58%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (2 samples, 1.16%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (2 samples, 1.16%) + + + + + s4::processing_loop (41 samples, 23.84%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (42 samples, 24.42%) + + std::rt::lang_start::_{{closure}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (42 samples, 24.42%) + + std::sys_common::backtrace::__rust_begi.. + + + s4::main (42 samples, 24.42%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.58%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.58%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.58%) + + + + + clap_builder::parser::parser::Parser::resolve_pending (1 samples, 0.58%) + + + + + clap_builder::parser::parser::Parser::react (1 samples, 0.58%) + + + + + clap_builder::parser::parser::Parser::start_custom_arg (1 samples, 0.58%) + + + + + clap_builder::parser::matches::matched_arg::MatchedArg::new_val_group (1 samples, 0.58%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.58%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.58%) + + + + + malloc (1 samples, 0.58%) + + + + + _int_malloc (1 samples, 0.58%) + + + + + _start (46 samples, 26.74%) + + _start + + + __libc_start_main@@GLIBC_2.34 (43 samples, 25.00%) + + __libc_start_main@@GLIBC_2.34 + + + __libc_start_call_main (43 samples, 25.00%) + + __libc_start_call_main + + + main (43 samples, 25.00%) + + main + + + std::rt::lang_start_internal (43 samples, 25.00%) + + std::rt::lang_start_internal + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.58%) + + + + + __getdelim (1 samples, 0.58%) + + + + + _IO_file_underflow@@GLIBC_2.2.5 (1 samples, 0.58%) + + + + + __read_nocancel (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + ksys_read (1 samples, 0.58%) + + + + + vfs_read (1 samples, 0.58%) + + + + + seq_read (1 samples, 0.58%) + + + + + seq_read_iter (1 samples, 0.58%) + + + + + show_map (1 samples, 0.58%) + + + + + show_map_vma (1 samples, 0.58%) + + + + + seq_path (1 samples, 0.58%) + + + + + mangle_path (1 samples, 0.58%) + + + + + strchr (1 samples, 0.58%) + + + + + tar::archive::EntriesFields::next_entry_raw (5 samples, 2.91%) + + ta.. + + + <std::process::ChildStdout as std::io::Read>::read (5 samples, 2.91%) + + <s.. + + + read (5 samples, 2.91%) + + re.. + + + entry_SYSCALL_64_after_hwframe (5 samples, 2.91%) + + en.. + + + do_syscall_64 (5 samples, 2.91%) + + do.. + + + ksys_read (5 samples, 2.91%) + + ks.. + + + vfs_read (5 samples, 2.91%) + + vf.. + + + new_sync_read (5 samples, 2.91%) + + ne.. + + + filemap_read (5 samples, 2.91%) + + fi.. + + + copy_page_to_iter (5 samples, 2.91%) + + co.. + + + copy_user_enhanced_fast_string (5 samples, 2.91%) + + co.. + + + [unknown] (6 samples, 3.49%) + + [un.. + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.58%) + + + + + __GI___libc_write (1 samples, 0.58%) + + + + + entry_SYSCALL_64 (1 samples, 0.58%) + + + + + s4 (87 samples, 50.58%) + + s4 + + + [[heap]] (2 samples, 1.16%) + + + + + __GI___libc_write (2 samples, 1.16%) + + + + + entry_SYSCALL_64 (2 samples, 1.16%) + + + + + perf_event_exec (14 samples, 8.14%) + + perf_event_.. + + + x86_pmu_enable_all (14 samples, 8.14%) + + x86_pmu_ena.. + + + perf-exec (15 samples, 8.72%) + + perf-exec + + + entry_SYSCALL_64_after_hwframe (15 samples, 8.72%) + + entry_SYSCAL.. + + + do_syscall_64 (15 samples, 8.72%) + + do_syscall_64 + + + __x64_sys_execve (15 samples, 8.72%) + + __x64_sys_ex.. + + + do_execveat_common.isra.0 (15 samples, 8.72%) + + do_execveat_.. + + + bprm_execve (15 samples, 8.72%) + + bprm_execve + + + load_elf_binary (15 samples, 8.72%) + + load_elf_bin.. + + + begin_new_exec (15 samples, 8.72%) + + begin_new_ex.. + + + __set_task_comm (1 samples, 0.58%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.58%) + + + + + ctrl-c (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + syscall_exit_to_user_mode (1 samples, 0.58%) + + + + + exit_to_user_mode_prepare (1 samples, 0.58%) + + + + + arch_do_signal_or_restart (1 samples, 0.58%) + + + + + get_signal (1 samples, 0.58%) + + + + + do_group_exit (1 samples, 0.58%) + + + + + do_exit (1 samples, 0.58%) + + + + + acct_process (1 samples, 0.58%) + + + + + do_acct_process (1 samples, 0.58%) + + + + + __kernel_write (1 samples, 0.58%) + + + + + ext4_buffered_write_iter (1 samples, 0.58%) + + + + + file_update_time (1 samples, 0.58%) + + + + + generic_update_time (1 samples, 0.58%) + + + + + __mark_inode_dirty (1 samples, 0.58%) + + + + + ext4_dirty_inode (1 samples, 0.58%) + + + + + __ext4_mark_inode_dirty (1 samples, 0.58%) + + + + + ext4_mark_iloc_dirty (1 samples, 0.58%) + + + + + ext4_inode_csum_set (1 samples, 0.58%) + + + + + ext4_inode_csum (1 samples, 0.58%) + + + + + chksum_update (1 samples, 0.58%) + + + + + crc32_body (1 samples, 0.58%) + + + + + [libsystemd.so.0.32.0] (3 samples, 1.74%) + + + + + [libsystemd.so.0.32.0] (7 samples, 4.07%) + + [lib.. + + + [libsystemd.so.0.32.0] (10 samples, 5.81%) + + [libsys.. + + + sd_journal_enumerate_available_data (12 samples, 6.98%) + + sd_journa.. + + + sd_journal_enumerate_data (12 samples, 6.98%) + + sd_journa.. + + + sd_journal_restart_data (1 samples, 0.58%) + + + + + sd_journal_get_realtime_usec (1 samples, 0.58%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.58%) + + + + + asm_exc_page_fault (3 samples, 1.74%) + + + + + exc_page_fault (3 samples, 1.74%) + + + + + do_user_addr_fault (3 samples, 1.74%) + + + + + handle_mm_fault (3 samples, 1.74%) + + + + + __handle_mm_fault (3 samples, 1.74%) + + + + + filemap_map_pages (3 samples, 1.74%) + + + + + next_uptodate_page (3 samples, 1.74%) + + + + + __strlen_evex (1 samples, 0.58%) + + + + + [libsystemd.so.0.32.0] (4 samples, 2.33%) + + [.. + + + [libsystemd.so.0.32.0] (6 samples, 3.49%) + + [li.. + + + sd_journal_get_data (11 samples, 6.40%) + + sd_journ.. + + + [libsystemd.so.0.32.0] (8 samples, 4.65%) + + [libs.. + + + malloc (1 samples, 0.58%) + + + + + _int_malloc (1 samples, 0.58%) + + + + + s4lib::readers::journalreader::JournalReader::Error_from_Errno (2 samples, 1.16%) + + + + + alloc::fmt::format::format_inner (2 samples, 1.16%) + + + + + core::fmt::write (1 samples, 0.58%) + + + + + <str as core::fmt::Debug>::fmt (1 samples, 0.58%) + + + + + core::unicode::printable::is_printable (1 samples, 0.58%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.58%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.58%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.58%) + + + + + s4lib::readers::journalreader::JournalReader::next_common (17 samples, 9.88%) + + s4lib::readers.. + + + [libsystemd.so.0.32.0] (2 samples, 1.16%) + + + + + memchr::arch::x86_64::memchr::memchr_raw::find_avx2 (1 samples, 0.58%) + + + + + memchr::arch::x86_64::avx2::memchr::One::find_raw (1 samples, 0.58%) + + + + + memchr::arch::x86_64::avx2::memchr::One::find_raw_avx2 (1 samples, 0.58%) + + + + + _int_malloc (1 samples, 0.58%) + + + + + malloc (2 samples, 1.16%) + + + + + __lll_lock_wait_private (1 samples, 0.58%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + __x64_sys_futex (1 samples, 0.58%) + + + + + do_futex (1 samples, 0.58%) + + + + + futex_wait (1 samples, 0.58%) + + + + + futex_wait_setup (1 samples, 0.58%) + + + + + hash_futex (1 samples, 0.58%) + + + + + chrono::format::formatting::DelayedFormat<I>::new_with_offset (2 samples, 1.16%) + + + + + realloc (1 samples, 0.58%) + + + + + _int_realloc (1 samples, 0.58%) + + + + + chrono::format::formatting::DelayedFormat<I>::format_numeric::write_two (2 samples, 1.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 1.16%) + + + + + alloc::raw_vec::finish_grow (2 samples, 1.16%) + + + + + <chrono::format::formatting::DelayedFormat<I> as core::fmt::Display>::fmt (5 samples, 2.91%) + + <c.. + + + std::time::SystemTime::duration_since (1 samples, 0.58%) + + + + + std::sys::unix::time::Timespec::sub_timespec (1 samples, 0.58%) + + + + + s4lib::readers::journalreader::JournalReader::next_short (41 samples, 23.84%) + + s4lib::readers::journalreader::Journal.. + + + <chrono::datetime::DateTime<chrono::offset::utc::Utc> as core::convert::From<std::time::SystemTime>>::from (2 samples, 1.16%) + + + + + chrono::naive::date::NaiveDate::from_num_days_from_ce_opt (1 samples, 0.58%) + + + + + std::sys::unix::thread::Thread::new::thread_start (42 samples, 24.42%) + + std::sys::unix::thread::Thread::new::th.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (42 samples, 24.42%) + + core::ops::function::FnOnce::call_once{.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (42 samples, 24.42%) + + std::sys_common::backtrace::__rust_begi.. + + + s4::exec_fileprocessor_thread (42 samples, 24.42%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (1 samples, 0.58%) + + + + + crossbeam_channel::waker::SyncWaker::notify (1 samples, 0.58%) + + + + + crossbeam_channel::waker::Waker::notify (1 samples, 0.58%) + + + + + <alloc::vec::drain::Drain<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.58%) + + + + + clone3 (43 samples, 25.00%) + + clone3 + + + start_thread (43 samples, 25.00%) + + start_thread + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.58%) + + + + + do_syscall_64 (1 samples, 0.58%) + + + + + __x64_sys_exit (1 samples, 0.58%) + + + + + do_exit (1 samples, 0.58%) + + + + + mm_release (1 samples, 0.58%) + + + + + do_futex (1 samples, 0.58%) + + + + + futex_wake (1 samples, 0.58%) + + + + + tempfile::Builder::tempfile (1 samples, 0.58%) + + + + + tempfile::util::create_helper (1 samples, 0.58%) + + + + + tempfile::util::tmpname (1 samples, 0.58%) + + + + + std::sys::unix::os_str::Buf::push_slice (1 samples, 0.58%) + + + + + ext4_reserve_inode_write (1 samples, 0.58%) + + + + + __ext4_journal_get_write_access (1 samples, 0.58%) + + + + + ext4_inode_csum_set (1 samples, 0.58%) + + + + + ext4_inode_csum (1 samples, 0.58%) + + + + + chksum_update (1 samples, 0.58%) + + + + + crc32_body (1 samples, 0.58%) + + + + + ext4_dirty_inode (3 samples, 1.74%) + + + + + __ext4_mark_inode_dirty (3 samples, 1.74%) + + + + + ext4_mark_iloc_dirty (2 samples, 1.16%) + + + + + _raw_spin_unlock_irqrestore (1 samples, 0.58%) + + + + + __mark_inode_dirty (5 samples, 2.91%) + + __.. + + + __ext4_journal_stop (2 samples, 1.16%) + + + + + jbd2_journal_stop (2 samples, 1.16%) + + + + + stop_this_handle (2 samples, 1.16%) + + + + + __wake_up_common_lock (2 samples, 1.16%) + + + + + generic_write_end (7 samples, 4.07%) + + gene.. + + + __block_commit_write.constprop.0.isra.0 (2 samples, 1.16%) + + + + + mark_buffer_dirty (2 samples, 1.16%) + + + + + fault_in_iov_iter_readable (2 samples, 1.16%) + + + + + fault_in_readable (2 samples, 1.16%) + + + + + __get_user_nocheck_1 (2 samples, 1.16%) + + + + + grab_cache_page_write_begin (1 samples, 0.58%) + + + + + pagecache_get_page (1 samples, 0.58%) + + + + + add_to_page_cache_lru (1 samples, 0.58%) + + + + + __add_to_page_cache_locked (1 samples, 0.58%) + + + + + ext4_es_lookup_extent (2 samples, 1.16%) + + + + + ext4_es_insert_delayed_block (1 samples, 0.58%) + + + + + __es_insert_extent (1 samples, 0.58%) + + + + + ext4_da_reserve_space (1 samples, 0.58%) + + + + + down_read (1 samples, 0.58%) + + + + + ext4_da_get_block_prep (6 samples, 3.49%) + + ext.. + + + ext4_da_write_begin (8 samples, 4.65%) + + ext4_.. + + + __block_write_begin_int (7 samples, 4.07%) + + __bl.. + + + create_page_buffers (1 samples, 0.58%) + + + + + create_empty_buffers (1 samples, 0.58%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.58%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::write_all_cold (19 samples, 11.05%) + + std::io::buffere.. + + + std::io::Write::write_all (19 samples, 11.05%) + + std::io::Write::.. + + + std::os::unix::net::datagram::UnixDatagram::send (19 samples, 11.05%) + + std::os::unix::n.. + + + __GI___libc_write (19 samples, 11.05%) + + __GI___libc_write + + + entry_SYSCALL_64_after_hwframe (19 samples, 11.05%) + + entry_SYSCALL_64.. + + + do_syscall_64 (19 samples, 11.05%) + + do_syscall_64 + + + ksys_write (19 samples, 11.05%) + + ksys_write + + + vfs_write (19 samples, 11.05%) + + vfs_write + + + new_sync_write (19 samples, 11.05%) + + new_sync_write + + + ext4_buffered_write_iter (19 samples, 11.05%) + + ext4_buffered_wr.. + + + generic_perform_write (19 samples, 11.05%) + + generic_perform_.. + + + copy_page_from_iter_atomic (2 samples, 1.16%) + + + + + copy_user_enhanced_fast_string (2 samples, 1.16%) + + + + + filemap_get_pages (1 samples, 0.58%) + + + + + filemap_get_read_batch (1 samples, 0.58%) + + + + + copy_user_enhanced_fast_string (3 samples, 1.74%) + + + + + copy_page_to_iter (4 samples, 2.33%) + + c.. + + + all (172 samples, 100%) + + + + + RHE_91_system.t (69 samples, 40.12%) + + RHE_91_system.t + + + [unknown] (26 samples, 15.12%) + + [unknown] + + + s4lib::readers::filedecompressor::decompress_to_ntf (26 samples, 15.12%) + + s4lib::readers::filedec.. + + + <tar::entry::EntryFields as std::io::Read>::read (6 samples, 3.49%) + + <ta.. + + + <std::io::Take<T> as std::io::Read>::read (6 samples, 3.49%) + + <st.. + + + <std::process::ChildStdout as std::io::Read>::read (6 samples, 3.49%) + + <st.. + + + read (6 samples, 3.49%) + + read + + + entry_SYSCALL_64_after_hwframe (6 samples, 3.49%) + + ent.. + + + do_syscall_64 (6 samples, 3.49%) + + do_.. + + + ksys_read (6 samples, 3.49%) + + ksy.. + + + vfs_read (6 samples, 3.49%) + + vfs.. + + + new_sync_read (6 samples, 3.49%) + + new.. + + + filemap_read (6 samples, 3.49%) + + fil.. + + + diff --git a/releases/0.7.75/flamegraph-journal-xz.svg b/releases/0.7.75/flamegraph-journal-xz.svg new file mode 100644 index 00000000..06385975 --- /dev/null +++ b/releases/0.7.75/flamegraph-journal-xz.svg @@ -0,0 +1,2892 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231105-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/journal/RHE_91_system.journal.xz + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 5.95%) + + ret_from.. + + + schedule_tail (22 samples, 5.95%) + + schedule.. + + + finish_task_switch.isra.0 (22 samples, 5.95%) + + finish_t.. + + + __perf_event_task_sched_in (22 samples, 5.95%) + + __perf_e.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 5.95%) + + __raw_ca.. + + + truncate_cleanup_page (1 samples, 0.27%) + + + + + try_to_free_buffers (1 samples, 0.27%) + + + + + kmem_cache_free.part.0 (1 samples, 0.27%) + + + + + __slab_free.constprop.0 (1 samples, 0.27%) + + + + + delete_from_page_cache_batch (1 samples, 0.27%) + + + + + unaccount_page_cache_page (1 samples, 0.27%) + + + + + PageHuge (1 samples, 0.27%) + + + + + __list_del_entry_valid (2 samples, 0.54%) + + + + + __pagevec_release (3 samples, 0.81%) + + + + + release_pages (3 samples, 0.81%) + + + + + free_unref_page_list (3 samples, 0.81%) + + + + + free_pcppages_bulk (3 samples, 0.81%) + + + + + __free_one_page (1 samples, 0.27%) + + + + + task_work_run (6 samples, 1.62%) + + + + + __fput (6 samples, 1.62%) + + + + + dput (6 samples, 1.62%) + + + + + __dentry_kill (6 samples, 1.62%) + + + + + evict (6 samples, 1.62%) + + + + + ext4_evict_inode (6 samples, 1.62%) + + + + + truncate_inode_pages_range (6 samples, 1.62%) + + + + + __x64_sys_exit_group (8 samples, 2.16%) + + _.. + + + do_group_exit (8 samples, 2.16%) + + d.. + + + do_exit (8 samples, 2.16%) + + d.. + + + mmput (2 samples, 0.54%) + + + + + exit_mmap (2 samples, 0.54%) + + + + + unmap_vmas (2 samples, 0.54%) + + + + + unmap_page_range (2 samples, 0.54%) + + + + + page_remove_rmap (2 samples, 0.54%) + + + + + vm_mmap_pgoff (1 samples, 0.27%) + + + + + do_mmap (1 samples, 0.27%) + + + + + mmap_region (1 samples, 0.27%) + + + + + vma_link (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (10 samples, 2.70%) + + en.. + + + do_syscall_64 (10 samples, 2.70%) + + do.. + + + __x64_sys_execve (2 samples, 0.54%) + + + + + do_execveat_common.isra.0 (2 samples, 0.54%) + + + + + bprm_execve (2 samples, 0.54%) + + + + + load_elf_binary (2 samples, 0.54%) + + + + + begin_new_exec (1 samples, 0.27%) + + + + + perf_event_comm (1 samples, 0.27%) + + + + + perf_iterate_sb (1 samples, 0.27%) + + + + + perf_iterate_ctx (1 samples, 0.27%) + + + + + perf_event_comm_output (1 samples, 0.27%) + + + + + __mmap (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + vm_mmap_pgoff (1 samples, 0.27%) + + + + + do_mmap (1 samples, 0.27%) + + + + + mmap_region (1 samples, 0.27%) + + + + + perf_event_mmap (1 samples, 0.27%) + + + + + perf_iterate_sb (1 samples, 0.27%) + + + + + perf_iterate_ctx (1 samples, 0.27%) + + + + + perf_event_mmap_output (1 samples, 0.27%) + + + + + __perf_event_header__init_id (1 samples, 0.27%) + + + + + clone3 (2 samples, 0.54%) + + + + + start_thread (2 samples, 0.54%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.54%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.54%) + + + + + __GI___sigaltstack (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_sigaltstack (1 samples, 0.27%) + + + + + _copy_to_user (1 samples, 0.27%) + + + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + do_user_addr_fault (1 samples, 0.27%) + + + + + handle_mm_fault (1 samples, 0.27%) + + + + + __handle_mm_fault (1 samples, 0.27%) + + + + + finish_fault (1 samples, 0.27%) + + + + + do_set_pte (1 samples, 0.27%) + + + + + lru_cache_add_inactive_or_unevictable (1 samples, 0.27%) + + + + + error_entry (1 samples, 0.27%) + + + + + sync_regs (1 samples, 0.27%) + + + + + memcpy_erms (1 samples, 0.27%) + + + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + do_user_addr_fault (1 samples, 0.27%) + + + + + handle_mm_fault (1 samples, 0.27%) + + + + + __handle_mm_fault (1 samples, 0.27%) + + + + + copy_page (1 samples, 0.27%) + + + + + _dl_lookup_symbol_x (1 samples, 0.27%) + + + + + do_lookup_x (1 samples, 0.27%) + + + + + _dl_relocate_object (4 samples, 1.08%) + + + + + _dl_start (6 samples, 1.62%) + + + + + _dl_sysdep_start (5 samples, 1.35%) + + + + + dl_main (5 samples, 1.35%) + + + + + _dl_map_object_deps (1 samples, 0.27%) + + + + + _dl_catch_exception (1 samples, 0.27%) + + + + + openaux (1 samples, 0.27%) + + + + + _dl_map_object (1 samples, 0.27%) + + + + + _dl_map_object_from_fd (1 samples, 0.27%) + + + + + mmap64 (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + ksys_mmap_pgoff (1 samples, 0.27%) + + + + + vm_mmap_pgoff (1 samples, 0.27%) + + + + + do_mmap (1 samples, 0.27%) + + + + + mmap_region (1 samples, 0.27%) + + + + + __do_munmap (1 samples, 0.27%) + + + + + __split_vma (1 samples, 0.27%) + + + + + __vma_adjust (1 samples, 0.27%) + + + + + vma_interval_tree_remove (1 samples, 0.27%) + + + + + __memrchr_evex (1 samples, 0.27%) + + + + + write_null (1 samples, 0.27%) + + + + + std::io::Write::write_all (4 samples, 1.08%) + + + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (4 samples, 1.08%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (4 samples, 1.08%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (4 samples, 1.08%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (4 samples, 1.08%) + + + + + __GI___libc_write (3 samples, 0.81%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.81%) + + + + + do_syscall_64 (3 samples, 0.81%) + + + + + ksys_write (3 samples, 0.81%) + + + + + vfs_write (3 samples, 0.81%) + + + + + __memrchr_evex (1 samples, 0.27%) + + + + + termcolor::Ansi<W>::write_color (2 samples, 0.54%) + + + + + std::io::Write::write_all (2 samples, 0.54%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.54%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.54%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (2 samples, 0.54%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (3 samples, 0.81%) + + + + + std::io::Write::write_all (1 samples, 0.27%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.27%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.27%) + + + + + <termcolor::ColorSpec as core::clone::Clone>::clone (3 samples, 0.81%) + + + + + syscall_exit_to_user_mode (2 samples, 0.54%) + + + + + __fsnotify_parent (1 samples, 0.27%) + + + + + dput (1 samples, 0.27%) + + + + + vfs_write (4 samples, 1.08%) + + + + + fput_many (1 samples, 0.27%) + + + + + srso_alias_return_thunk (1 samples, 0.27%) + + + + + srso_alias_safe_ret (1 samples, 0.27%) + + + + + __fget_light (1 samples, 0.27%) + + + + + __fget_files (1 samples, 0.27%) + + + + + ksys_write (10 samples, 2.70%) + + ks.. + + + __fdget_pos (5 samples, 1.35%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (13 samples, 3.51%) + + std.. + + + __GI___libc_write (13 samples, 3.51%) + + __G.. + + + entry_SYSCALL_64_after_hwframe (13 samples, 3.51%) + + ent.. + + + do_syscall_64 (13 samples, 3.51%) + + do_.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (14 samples, 3.78%) + + <&st.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (15 samples, 4.05%) + + <std.. + + + s4lib::printer::printers::PrinterLogMessage::print_journalentry_color (27 samples, 7.30%) + + s4lib::pri.. + + + check_match (1 samples, 0.27%) + + + + + strcmp (1 samples, 0.27%) + + + + + _dl_relocate_object (2 samples, 0.54%) + + + + + _dl_lookup_symbol_x (2 samples, 0.54%) + + + + + do_lookup_x (2 samples, 0.54%) + + + + + dlopen2::wrapper::container::Container<T>::load (3 samples, 0.81%) + + + + + dlopen2::raw::common::Library::open (3 samples, 0.81%) + + + + + dlopen@GLIBC_2.2.5 (3 samples, 0.81%) + + + + + _dlerror_run (3 samples, 0.81%) + + + + + _dl_catch_error (3 samples, 0.81%) + + + + + _dl_catch_exception (3 samples, 0.81%) + + + + + dlopen_doit (3 samples, 0.81%) + + + + + _dl_open (3 samples, 0.81%) + + + + + _dl_catch_exception (3 samples, 0.81%) + + + + + dl_open_worker (3 samples, 0.81%) + + + + + _dl_catch_exception (3 samples, 0.81%) + + + + + dl_open_worker_begin (3 samples, 0.81%) + + + + + _dl_map_object_deps (1 samples, 0.27%) + + + + + _dl_catch_exception (1 samples, 0.27%) + + + + + openaux (1 samples, 0.27%) + + + + + _dl_map_object (1 samples, 0.27%) + + + + + _dl_map_object_from_fd (1 samples, 0.27%) + + + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + do_user_addr_fault (1 samples, 0.27%) + + + + + handle_mm_fault (1 samples, 0.27%) + + + + + __handle_mm_fault (1 samples, 0.27%) + + + + + wp_page_copy (1 samples, 0.27%) + + + + + add_mm_counter_fast (1 samples, 0.27%) + + + + + s4lib::libload::systemd_dlopen2::load_library_systemd (4 samples, 1.08%) + + + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + do_user_addr_fault (1 samples, 0.27%) + + + + + hashbrown::set::HashSet<T,S,A>::remove (1 samples, 0.27%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.27%) + + + + + __sched_yield (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_sched_yield (1 samples, 0.27%) + + + + + schedule (1 samples, 0.27%) + + + + + __schedule (1 samples, 0.27%) + + + + + crossbeam_channel::context::Context::wait_until (2 samples, 0.54%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::register (1 samples, 0.27%) + + + + + crossbeam_channel::waker::SyncWaker::register (1 samples, 0.27%) + + + + + crossbeam_channel::select::Select::select (4 samples, 1.08%) + + + + + crossbeam_channel::select::run_select (4 samples, 1.08%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (4 samples, 1.08%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.27%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.27%) + + + + + _int_free (1 samples, 0.27%) + + + + + s4::processing_loop (42 samples, 11.35%) + + s4::processing_lo.. + + + std::rt::lang_start::_{{closure}} (43 samples, 11.62%) + + std::rt::lang_sta.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (43 samples, 11.62%) + + std::sys_common::.. + + + s4::main (43 samples, 11.62%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 0.27%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.27%) + + + + + __poll (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_poll (1 samples, 0.27%) + + + + + do_sys_poll (1 samples, 0.27%) + + + + + tty_poll (1 samples, 0.27%) + + + + + n_tty_poll (1 samples, 0.27%) + + + + + tty_buffer_space_avail (1 samples, 0.27%) + + + + + _start (51 samples, 13.78%) + + _start + + + __libc_start_main@@GLIBC_2.34 (45 samples, 12.16%) + + __libc_start_main@.. + + + __libc_start_call_main (45 samples, 12.16%) + + __libc_start_call_.. + + + main (45 samples, 12.16%) + + main + + + std::rt::lang_start_internal (45 samples, 12.16%) + + std::rt::lang_star.. + + + <&[u8] as alloc::ffi::c_str::CString::new::SpecNewImpl>::spec_new_impl (1 samples, 0.27%) + + + + + __rust_alloc (1 samples, 0.27%) + + + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + syscall (1 samples, 0.27%) + + + + + entry_SYSCALL_64 (1 samples, 0.27%) + + + + + s4 (87 samples, 23.51%) + + s4 + + + [unknown] (2 samples, 0.54%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.27%) + + + + + __GI___libc_write (1 samples, 0.27%) + + + + + entry_SYSCALL_64 (1 samples, 0.27%) + + + + + perf-exec (14 samples, 3.78%) + + perf.. + + + entry_SYSCALL_64_after_hwframe (14 samples, 3.78%) + + entr.. + + + do_syscall_64 (14 samples, 3.78%) + + do_s.. + + + __x64_sys_execve (14 samples, 3.78%) + + __x6.. + + + do_execveat_common.isra.0 (14 samples, 3.78%) + + do_e.. + + + bprm_execve (14 samples, 3.78%) + + bprm.. + + + load_elf_binary (14 samples, 3.78%) + + load.. + + + begin_new_exec (14 samples, 3.78%) + + begi.. + + + perf_event_exec (14 samples, 3.78%) + + perf.. + + + x86_pmu_enable_all (14 samples, 3.78%) + + x86_.. + + + ctrl-c (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + syscall_exit_to_user_mode (1 samples, 0.27%) + + + + + exit_to_user_mode_prepare (1 samples, 0.27%) + + + + + arch_do_signal_or_restart (1 samples, 0.27%) + + + + + get_signal (1 samples, 0.27%) + + + + + do_group_exit (1 samples, 0.27%) + + + + + do_exit (1 samples, 0.27%) + + + + + acct_process (1 samples, 0.27%) + + + + + do_acct_process (1 samples, 0.27%) + + + + + override_creds (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (7 samples, 1.89%) + + [.. + + + [libsystemd.so.0.32.0] (7 samples, 1.89%) + + [.. + + + sd_journal_enumerate_available_data (14 samples, 3.78%) + + sd_j.. + + + sd_journal_enumerate_data (14 samples, 3.78%) + + sd_j.. + + + [libsystemd.so.0.32.0] (14 samples, 3.78%) + + [lib.. + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + do_user_addr_fault (1 samples, 0.27%) + + + + + handle_mm_fault (1 samples, 0.27%) + + + + + __handle_mm_fault (1 samples, 0.27%) + + + + + filemap_map_pages (1 samples, 0.27%) + + + + + next_uptodate_page (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (6 samples, 1.62%) + + + + + [libsystemd.so.0.32.0] (7 samples, 1.89%) + + [.. + + + sd_journal_get_data (9 samples, 2.43%) + + sd.. + + + [libsystemd.so.0.32.0] (8 samples, 2.16%) + + [.. + + + core::unicode::unicode_data::grapheme_extend::lookup (2 samples, 0.54%) + + + + + <&mut W as core::fmt::Write>::write_str (1 samples, 0.27%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.27%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.27%) + + + + + realloc (1 samples, 0.27%) + + + + + _int_realloc (1 samples, 0.27%) + + + + + <str as core::fmt::Debug>::fmt (4 samples, 1.08%) + + + + + s4lib::readers::journalreader::JournalReader::Error_from_Errno (5 samples, 1.35%) + + + + + alloc::fmt::format::format_inner (5 samples, 1.35%) + + + + + core::fmt::write (5 samples, 1.35%) + + + + + <&mut W as core::fmt::Write>::write_str (1 samples, 0.27%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.27%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.27%) + + + + + realloc (1 samples, 0.27%) + + + + + __lll_lock_wake_private (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_futex (1 samples, 0.27%) + + + + + core::str::converts::from_utf8 (1 samples, 0.27%) + + + + + s4lib::readers::journalreader::JournalReader::next_common (16 samples, 4.32%) + + s4lib.. + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + memchr::arch::x86_64::avx2::memchr::One::find_raw (1 samples, 0.27%) + + + + + memchr::arch::x86_64::memchr::memchr_raw::find_avx2 (2 samples, 0.54%) + + + + + core::fmt::num::imp::<impl core::fmt::Display for i32>::fmt (1 samples, 0.27%) + + + + + chrono::format::formatting::DelayedFormat<I>::new_with_offset (2 samples, 0.54%) + + + + + <chrono::offset::fixed::FixedOffset as core::fmt::Debug>::fmt (2 samples, 0.54%) + + + + + <core::fmt::Formatter as core::fmt::Write>::write_fmt (2 samples, 0.54%) + + + + + core::fmt::write (2 samples, 0.54%) + + + + + chrono::format::formatting::DelayedFormat<I>::format_numeric::write_two (1 samples, 0.27%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.27%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.27%) + + + + + realloc (1 samples, 0.27%) + + + + + s4lib::readers::journalreader::JournalReader::next_short (36 samples, 9.73%) + + s4lib::readers.. + + + <chrono::format::formatting::DelayedFormat<I> as core::fmt::Display>::fmt (2 samples, 0.54%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.27%) + + + + + _int_free (1 samples, 0.27%) + + + + + s4lib::readers::journalreader::JournalReader::new (1 samples, 0.27%) + + + + + sd_journal_open_files (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.27%) + + + + + __libc_fcntl64 (1 samples, 0.27%) + + + + + __fcntl64_nocancel_adjusted (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_fcntl (1 samples, 0.27%) + + + + + do_fcntl (1 samples, 0.27%) + + + + + std::sys::unix::thread::Thread::new::thread_start (39 samples, 10.54%) + + std::sys::unix:.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (39 samples, 10.54%) + + core::ops::func.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (39 samples, 10.54%) + + std::sys_common.. + + + s4::exec_fileprocessor_thread (39 samples, 10.54%) + + s4::exec_filepr.. + + + crossbeam_channel::channel::Sender<T>::send (2 samples, 0.54%) + + + + + clone3 (40 samples, 10.81%) + + clone3 + + + start_thread (40 samples, 10.81%) + + start_thread + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_exit (1 samples, 0.27%) + + + + + do_exit (1 samples, 0.27%) + + + + + acct_collect (1 samples, 0.27%) + + + + + _raw_spin_lock_irq (1 samples, 0.27%) + + + + + __pv_queued_spin_lock_slowpath (1 samples, 0.27%) + + + + + asm_exc_page_fault (1 samples, 0.27%) + + + + + exc_page_fault (1 samples, 0.27%) + + + + + do_user_addr_fault (1 samples, 0.27%) + + + + + handle_mm_fault (1 samples, 0.27%) + + + + + __handle_mm_fault (1 samples, 0.27%) + + + + + lru_cache_add (1 samples, 0.27%) + + + + + __pagevec_lru_add (1 samples, 0.27%) + + + + + page_mapping (1 samples, 0.27%) + + + + + crc32_body (2 samples, 0.54%) + + + + + __crc32c_le (1 samples, 0.27%) + + + + + ext4_inode_csum_set (4 samples, 1.08%) + + + + + ext4_inode_csum (4 samples, 1.08%) + + + + + chksum_update (4 samples, 1.08%) + + + + + ext4_dirty_inode (5 samples, 1.35%) + + + + + __ext4_mark_inode_dirty (5 samples, 1.35%) + + + + + ext4_mark_iloc_dirty (5 samples, 1.35%) + + + + + generic_write_end (6 samples, 1.62%) + + + + + __mark_inode_dirty (6 samples, 1.62%) + + + + + __ext4_journal_stop (1 samples, 0.27%) + + + + + jbd2_journal_stop (1 samples, 0.27%) + + + + + stop_this_handle (1 samples, 0.27%) + + + + + __wake_up_common_lock (1 samples, 0.27%) + + + + + _raw_spin_unlock_irqrestore (1 samples, 0.27%) + + + + + add_to_page_cache_lru (1 samples, 0.27%) + + + + + lru_cache_add (1 samples, 0.27%) + + + + + grab_cache_page_write_begin (2 samples, 0.54%) + + + + + pagecache_get_page (2 samples, 0.54%) + + + + + __alloc_pages (1 samples, 0.27%) + + + + + get_page_from_freelist (1 samples, 0.27%) + + + + + up_read (1 samples, 0.27%) + + + + + ext4_es_insert_delayed_block (1 samples, 0.27%) + + + + + srso_alias_return_thunk (1 samples, 0.27%) + + + + + srso_alias_safe_ret (1 samples, 0.27%) + + + + + ext4_claim_free_clusters (1 samples, 0.27%) + + + + + ext4_da_get_block_prep (4 samples, 1.08%) + + + + + ext4_da_reserve_space (2 samples, 0.54%) + + + + + __dquot_alloc_space (1 samples, 0.27%) + + + + + _raw_spin_lock (1 samples, 0.27%) + + + + + ext4_da_write_begin (7 samples, 1.89%) + + e.. + + + __block_write_begin_int (5 samples, 1.35%) + + + + + create_page_buffers (1 samples, 0.27%) + + + + + create_empty_buffers (1 samples, 0.27%) + + + + + alloc_page_buffers (1 samples, 0.27%) + + + + + alloc_buffer_head (1 samples, 0.27%) + + + + + kmem_cache_alloc (1 samples, 0.27%) + + + + + get_obj_cgroup_from_current (1 samples, 0.27%) + + + + + copy_page_from_iter_atomic (1 samples, 0.27%) + + + + + copy_user_enhanced_fast_string (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (15 samples, 4.05%) + + entr.. + + + do_syscall_64 (15 samples, 4.05%) + + do_s.. + + + ksys_write (15 samples, 4.05%) + + ksys.. + + + vfs_write (15 samples, 4.05%) + + vfs_.. + + + new_sync_write (15 samples, 4.05%) + + new_.. + + + ext4_buffered_write_iter (15 samples, 4.05%) + + ext4.. + + + generic_perform_write (15 samples, 4.05%) + + gene.. + + + std::io::buffered::bufwriter::BufWriter<W>::write_all_cold (16 samples, 4.32%) + + std::.. + + + std::io::Write::write_all (16 samples, 4.32%) + + std::.. + + + std::os::unix::net::datagram::UnixDatagram::send (16 samples, 4.32%) + + std::.. + + + __GI___libc_write (16 samples, 4.32%) + + __GI_.. + + + __x86_indirect_thunk_rax (1 samples, 0.27%) + + + + + lzma_rs::decode::xz::validate_block_check (58 samples, 15.68%) + + lzma_rs::decode::xz::val.. + + + crc::crc64::<impl crc::Crc<u64>>::checksum (58 samples, 15.68%) + + crc::crc64::<impl crc::C.. + + + <std::io::buffered::bufreader::BufReader<R> as std::io::Read>::read (3 samples, 0.81%) + + + + + std::io::Read::read_exact (7 samples, 1.89%) + + s.. + + + lzma_rs::decode::rangecoder::RangeDecoder<R>::parse_reverse_bit_tree (10 samples, 2.70%) + + lz.. + + + std::io::Read::read_exact (1 samples, 0.27%) + + + + + lzma_rs::decode::rangecoder::RangeDecoder<R>::get (8 samples, 2.16%) + + l.. + + + <std::io::buffered::bufreader::BufReader<R> as std::io::Read>::read (1 samples, 0.27%) + + + + + std::io::Read::read_exact (2 samples, 0.54%) + + + + + lzma_rs::decode::rangecoder::BitTree::parse (10 samples, 2.70%) + + lz.. + + + lzma_rs::decode::rangecoder::LenDecoder::decode (13 samples, 3.51%) + + lzm.. + + + <std::io::buffered::bufreader::BufReader<R> as std::io::Read>::read (1 samples, 0.27%) + + + + + lzma_rs::decode::rangecoder::BitTree::parse (2 samples, 0.54%) + + + + + std::io::Read::read_exact (2 samples, 0.54%) + + + + + <std::process::ChildStdout as std::io::Read>::read_buf (1 samples, 0.27%) + + + + + read (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + ksys_read (1 samples, 0.27%) + + + + + vfs_read (1 samples, 0.27%) + + + + + __fsnotify_parent (1 samples, 0.27%) + + + + + <std::io::buffered::bufreader::BufReader<R> as std::io::BufRead>::fill_buf (4 samples, 1.08%) + + + + + __mod_memcg_lruvec_state (1 samples, 0.27%) + + + + + page_add_new_anon_rmap (2 samples, 0.54%) + + + + + __mod_lruvec_page_state (2 samples, 0.54%) + + + + + do_huge_pmd_anonymous_page (1 samples, 0.27%) + + + + + clear_huge_page (1 samples, 0.27%) + + + + + __cond_resched (1 samples, 0.27%) + + + + + __mem_cgroup_charge (1 samples, 0.27%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.27%) + + + + + rmqueue_bulk (1 samples, 0.27%) + + + + + __list_del_entry_valid (1 samples, 0.27%) + + + + + asm_exc_page_fault (8 samples, 2.16%) + + a.. + + + exc_page_fault (8 samples, 2.16%) + + e.. + + + do_user_addr_fault (8 samples, 2.16%) + + d.. + + + handle_mm_fault (8 samples, 2.16%) + + h.. + + + __handle_mm_fault (8 samples, 2.16%) + + _.. + + + __alloc_pages (4 samples, 1.08%) + + + + + get_page_from_freelist (4 samples, 1.08%) + + + + + kernel_init_free_pages.part.0 (3 samples, 0.81%) + + + + + clear_page_erms (3 samples, 0.81%) + + + + + <lzma_rs::decode::lzbuffer::LzAccumBuffer<W> as lzma_rs::decode::lzbuffer::LzBuffer<W>>::append_lz (47 samples, 12.70%) + + <lzma_rs::decode::l.. + + + lzma_rs::decode::lzma::DecoderState::process (142 samples, 38.38%) + + lzma_rs::decode::lzma::DecoderState::process + + + cfree@GLIBC_2.2.5 (1 samples, 0.27%) + + + + + __munmap (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_munmap (1 samples, 0.27%) + + + + + __vm_munmap (1 samples, 0.27%) + + + + + __do_munmap (1 samples, 0.27%) + + + + + unmap_region (1 samples, 0.27%) + + + + + tlb_finish_mmu (1 samples, 0.27%) + + + + + release_pages (1 samples, 0.27%) + + + + + do_huge_pmd_anonymous_page (1 samples, 0.27%) + + + + + clear_huge_page (1 samples, 0.27%) + + + + + clear_subpage (1 samples, 0.27%) + + + + + clear_page_erms (1 samples, 0.27%) + + + + + get_mem_cgroup_from_mm (2 samples, 0.54%) + + + + + __mem_cgroup_charge (3 samples, 0.81%) + + + + + charge_memcg (1 samples, 0.27%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.27%) + + + + + handle_mm_fault (5 samples, 1.35%) + + + + + __handle_mm_fault (5 samples, 1.35%) + + + + + __alloc_pages (1 samples, 0.27%) + + + + + get_page_from_freelist (1 samples, 0.27%) + + + + + exc_page_fault (6 samples, 1.62%) + + + + + do_user_addr_fault (6 samples, 1.62%) + + + + + asm_exc_page_fault (8 samples, 2.16%) + + a.. + + + lzma_rs::decode::xz::decode_filter (152 samples, 41.08%) + + lzma_rs::decode::xz::decode_filter + + + lzma_rs::decode::lzma2::Lzma2Decoder::decompress (152 samples, 41.08%) + + lzma_rs::decode::lzma2::Lzma2Decoder::decompress + + + __memmove_avx512_unaligned_erms (9 samples, 2.43%) + + __.. + + + all (370 samples, 100%) + + + + + RHE_91_system.j (268 samples, 72.43%) + + RHE_91_system.j + + + [unknown] (227 samples, 61.35%) + + [unknown] + + + s4lib::readers::filedecompressor::decompress_to_ntf (227 samples, 61.35%) + + s4lib::readers::filedecompressor::decompress_to_ntf + + + lzma_rs::decode::xz::decode_stream (227 samples, 61.35%) + + lzma_rs::decode::xz::decode_stream + + + cfree@GLIBC_2.2.5 (1 samples, 0.27%) + + + + + __munmap (1 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.27%) + + + + + do_syscall_64 (1 samples, 0.27%) + + + + + __x64_sys_munmap (1 samples, 0.27%) + + + + + __vm_munmap (1 samples, 0.27%) + + + + + __do_munmap (1 samples, 0.27%) + + + + + find_vma (1 samples, 0.27%) + + + + + diff --git a/releases/0.7.75/flamegraph-journal.svg b/releases/0.7.75/flamegraph-journal.svg new file mode 100644 index 00000000..6dd9fc3c --- /dev/null +++ b/releases/0.7.75/flamegraph-journal.svg @@ -0,0 +1,2097 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231054-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/programs/journal/RHE_91_system.journal + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 16.06%) + + ret_from_fork + + + schedule_tail (22 samples, 16.06%) + + schedule_tail + + + finish_task_switch.isra.0 (22 samples, 16.06%) + + finish_task_switch.isra.0 + + + __perf_event_task_sched_in (22 samples, 16.06%) + + __perf_event_task_sched_in + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 16.06%) + + __raw_callee_save___pv_qu.. + + + unmap_vmas (1 samples, 0.73%) + + + + + unmap_page_range (1 samples, 0.73%) + + + + + page_remove_rmap (1 samples, 0.73%) + + + + + __x64_sys_exit_group (2 samples, 1.46%) + + + + + do_group_exit (2 samples, 1.46%) + + + + + do_exit (2 samples, 1.46%) + + + + + mmput (2 samples, 1.46%) + + + + + exit_mmap (2 samples, 1.46%) + + + + + tlb_finish_mmu (1 samples, 0.73%) + + + + + free_pages_and_swap_cache (1 samples, 0.73%) + + + + + elf_map (1 samples, 0.73%) + + + + + vm_mmap_pgoff (1 samples, 0.73%) + + + + + security_mmap_file (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (4 samples, 2.92%) + + en.. + + + do_syscall_64 (4 samples, 2.92%) + + do.. + + + __x64_sys_execve (2 samples, 1.46%) + + + + + do_execveat_common.isra.0 (2 samples, 1.46%) + + + + + bprm_execve (2 samples, 1.46%) + + + + + load_elf_binary (2 samples, 1.46%) + + + + + __clear_user (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + handle_mm_fault (1 samples, 0.73%) + + + + + __handle_mm_fault (1 samples, 0.73%) + + + + + copy_page (1 samples, 0.73%) + + + + + vm_unmapped_area (1 samples, 0.73%) + + + + + clone3 (2 samples, 1.46%) + + + + + start_thread (2 samples, 1.46%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 1.46%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 1.46%) + + + + + __mmap (2 samples, 1.46%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 1.46%) + + + + + do_syscall_64 (2 samples, 1.46%) + + + + + vm_mmap_pgoff (2 samples, 1.46%) + + + + + do_mmap (2 samples, 1.46%) + + + + + get_unmapped_area (2 samples, 1.46%) + + + + + arch_get_unmapped_area_topdown (2 samples, 1.46%) + + + + + get_mmap_base (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + handle_mm_fault (1 samples, 0.73%) + + + + + __handle_mm_fault (1 samples, 0.73%) + + + + + copy_page (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + _dl_relocate_object (3 samples, 2.19%) + + _.. + + + _dl_map_object_from_fd (1 samples, 0.73%) + + + + + mmap64 (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + do_syscall_64 (1 samples, 0.73%) + + + + + vm_mmap_pgoff (1 samples, 0.73%) + + + + + do_mmap (1 samples, 0.73%) + + + + + mmap_region (1 samples, 0.73%) + + + + + __do_munmap (1 samples, 0.73%) + + + + + unmap_region (1 samples, 0.73%) + + + + + unmap_vmas (1 samples, 0.73%) + + + + + unmap_page_range (1 samples, 0.73%) + + + + + _dl_start (6 samples, 4.38%) + + _dl_s.. + + + _dl_sysdep_start (5 samples, 3.65%) + + _dl_.. + + + dl_main (5 samples, 3.65%) + + dl_m.. + + + _dl_map_object_deps (2 samples, 1.46%) + + + + + _dl_catch_exception (2 samples, 1.46%) + + + + + openaux (2 samples, 1.46%) + + + + + _dl_map_object (2 samples, 1.46%) + + + + + _dl_load_cache_lookup (1 samples, 0.73%) + + + + + _dl_sysdep_read_whole_file (1 samples, 0.73%) + + + + + __GI___open64_nocancel (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + do_syscall_64 (1 samples, 0.73%) + + + + + __x64_sys_openat (1 samples, 0.73%) + + + + + do_sys_openat2 (1 samples, 0.73%) + + + + + do_filp_open (1 samples, 0.73%) + + + + + path_openat (1 samples, 0.73%) + + + + + lookup_fast (1 samples, 0.73%) + + + + + __d_lookup_rcu (1 samples, 0.73%) + + + + + s4lib::readers::filepreprocessor::process_path (1 samples, 0.73%) + + + + + std::sys::unix::fs::canonicalize (1 samples, 0.73%) + + + + + realpath@@GLIBC_2.3 (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + handle_mm_fault (1 samples, 0.73%) + + + + + __handle_mm_fault (1 samples, 0.73%) + + + + + filemap_map_pages (1 samples, 0.73%) + + + + + next_uptodate_page (1 samples, 0.73%) + + + + + syscall_exit_to_user_mode (1 samples, 0.73%) + + + + + __fsnotify_parent (1 samples, 0.73%) + + + + + dput (1 samples, 0.73%) + + + + + lockref_put_return (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (4 samples, 2.92%) + + en.. + + + do_syscall_64 (4 samples, 2.92%) + + do.. + + + ksys_write (3 samples, 2.19%) + + k.. + + + vfs_write (3 samples, 2.19%) + + v.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (5 samples, 3.65%) + + <ter.. + + + <std::io::stdio::Stdout as std::io::Write>::write (5 samples, 3.65%) + + <std.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (5 samples, 3.65%) + + <&st.. + + + <std::io::stdio::StdoutLock as std::io::Write>::write (5 samples, 3.65%) + + <std.. + + + __GI___libc_write (5 samples, 3.65%) + + __GI.. + + + std::io::Write::write_all (6 samples, 4.38%) + + std::.. + + + core::ptr::drop_in_place<std::io::stdio::StdoutLock> (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + irqentry_exit_to_user_mode (1 samples, 0.73%) + + + + + exit_to_user_mode_prepare (1 samples, 0.73%) + + + + + alloc::vec::Vec<T,A>::extend_from_slice (1 samples, 0.73%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.73%) + + + + + <termcolor::ColorSpec as core::clone::Clone>::clone (1 samples, 0.73%) + + + + + syscall_exit_to_user_mode (2 samples, 1.46%) + + + + + __fsnotify_parent (1 samples, 0.73%) + + + + + fsnotify (1 samples, 0.73%) + + + + + vfs_write (5 samples, 3.65%) + + vfs_.. + + + fput_many (1 samples, 0.73%) + + + + + __fget_files (2 samples, 1.46%) + + + + + rcu_read_unlock_strict (2 samples, 1.46%) + + + + + __fdget_pos (4 samples, 2.92%) + + __.. + + + __fget_light (4 samples, 2.92%) + + __.. + + + ksys_write (11 samples, 8.03%) + + ksys_write + + + entry_SYSCALL_64_after_hwframe (14 samples, 10.22%) + + entry_SYSCALL_6.. + + + do_syscall_64 (14 samples, 10.22%) + + do_syscall_64 + + + entry_SYSCALL_64 (1 samples, 0.73%) + + + + + __x86_indirect_thunk_rax (1 samples, 0.73%) + + + + + <std::io::stdio::Stdout as std::io::Write>::flush (18 samples, 13.14%) + + <std::io::stdio::Std.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (18 samples, 13.14%) + + <&std::io::stdio::St.. + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (18 samples, 13.14%) + + std::io::buffered::b.. + + + __GI___libc_write (18 samples, 13.14%) + + __GI___libc_write + + + s4lib::printer::printers::PrinterLogMessage::print_journalentry_color (29 samples, 21.17%) + + s4lib::printer::printers::Printer.. + + + _dl_relocate_object (1 samples, 0.73%) + + + + + _dl_lookup_symbol_x (1 samples, 0.73%) + + + + + do_lookup_x (1 samples, 0.73%) + + + + + check_match (1 samples, 0.73%) + + + + + dl_open_worker_begin (2 samples, 1.46%) + + + + + _dl_map_object_deps (1 samples, 0.73%) + + + + + _dl_catch_exception (1 samples, 0.73%) + + + + + openaux (1 samples, 0.73%) + + + + + _dl_map_object (1 samples, 0.73%) + + + + + _dl_map_object_from_fd (1 samples, 0.73%) + + + + + mmap64 (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + s4lib::libload::systemd_dlopen2::load_library_systemd (3 samples, 2.19%) + + s.. + + + dlopen2::wrapper::container::Container<T>::load (3 samples, 2.19%) + + d.. + + + dlopen2::raw::common::Library::open (3 samples, 2.19%) + + d.. + + + dlopen@GLIBC_2.2.5 (3 samples, 2.19%) + + d.. + + + _dlerror_run (3 samples, 2.19%) + + _.. + + + _dl_catch_error (3 samples, 2.19%) + + _.. + + + _dl_catch_exception (3 samples, 2.19%) + + _.. + + + dlopen_doit (3 samples, 2.19%) + + d.. + + + _dl_open (3 samples, 2.19%) + + _.. + + + _dl_catch_exception (3 samples, 2.19%) + + _.. + + + dl_open_worker (3 samples, 2.19%) + + d.. + + + _dl_catch_exception (3 samples, 2.19%) + + _.. + + + _dl_init (1 samples, 0.73%) + + + + + call_init.part.0 (1 samples, 0.73%) + + + + + gpg_err_init (1 samples, 0.73%) + + + + + __bindtextdomain (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + handle_mm_fault (1 samples, 0.73%) + + + + + __handle_mm_fault (1 samples, 0.73%) + + + + + filemap_map_pages (1 samples, 0.73%) + + + + + next_uptodate_page (1 samples, 0.73%) + + + + + hashbrown::set::HashSet<T,S,A>::remove (1 samples, 0.73%) + + + + + crossbeam_channel::select::SelectedOperation::recv (1 samples, 0.73%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.73%) + + + + + __sched_yield (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (2 samples, 1.46%) + + + + + crossbeam_channel::context::Context::wait_until (2 samples, 1.46%) + + + + + crossbeam_channel::select::Select::select (3 samples, 2.19%) + + c.. + + + crossbeam_channel::select::run_select (3 samples, 2.19%) + + c.. + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.73%) + + + + + _int_free (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + do_syscall_64 (1 samples, 0.73%) + + + + + syscall_exit_to_user_mode (1 samples, 0.73%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 2.19%) + + c.. + + + __lll_lock_wake_private (2 samples, 1.46%) + + + + + s4::processing_loop (42 samples, 30.66%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (44 samples, 32.12%) + + std::rt::lang_start::_{{closure}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (44 samples, 32.12%) + + std::sys_common::backtrace::__rust_begin_short_backt.. + + + s4::main (44 samples, 32.12%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 0.73%) + + + + + <clap_builder::builder::styled_str::StyledStr as core::convert::From<&str>>::from (1 samples, 0.73%) + + + + + clap_builder::builder::styled_str::StyledStr::none (1 samples, 0.73%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.73%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.73%) + + + + + malloc (1 samples, 0.73%) + + + + + _int_malloc (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + s4 (79 samples, 57.66%) + + s4 + + + _start (51 samples, 37.23%) + + _start + + + __libc_start_main@@GLIBC_2.34 (45 samples, 32.85%) + + __libc_start_main@@GLIBC_2.34 + + + __libc_start_call_main (45 samples, 32.85%) + + __libc_start_call_main + + + main (45 samples, 32.85%) + + main + + + std::rt::lang_start_internal (45 samples, 32.85%) + + std::rt::lang_start_internal + + + __poll (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + do_syscall_64 (1 samples, 0.73%) + + + + + __x64_sys_poll (1 samples, 0.73%) + + + + + do_sys_poll (1 samples, 0.73%) + + + + + tty_poll (1 samples, 0.73%) + + + + + n_tty_poll (1 samples, 0.73%) + + + + + tty_buffer_flush_work (1 samples, 0.73%) + + + + + perf_event_exec (14 samples, 10.22%) + + perf_event_exec + + + x86_pmu_enable_all (14 samples, 10.22%) + + x86_pmu_enable_.. + + + perf-exec (15 samples, 10.95%) + + perf-exec + + + entry_SYSCALL_64_after_hwframe (15 samples, 10.95%) + + entry_SYSCALL_64.. + + + do_syscall_64 (15 samples, 10.95%) + + do_syscall_64 + + + __x64_sys_execve (15 samples, 10.95%) + + __x64_sys_execve + + + do_execveat_common.isra.0 (15 samples, 10.95%) + + do_execveat_comm.. + + + bprm_execve (15 samples, 10.95%) + + bprm_execve + + + load_elf_binary (15 samples, 10.95%) + + load_elf_binary + + + begin_new_exec (15 samples, 10.95%) + + begin_new_exec + + + perf_event_comm (1 samples, 0.73%) + + + + + perf_iterate_sb (1 samples, 0.73%) + + + + + perf_event_comm_output (1 samples, 0.73%) + + + + + ctrl-c (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + do_syscall_64 (1 samples, 0.73%) + + + + + syscall_exit_to_user_mode (1 samples, 0.73%) + + + + + exit_to_user_mode_prepare (1 samples, 0.73%) + + + + + arch_do_signal_or_restart (1 samples, 0.73%) + + + + + get_signal (1 samples, 0.73%) + + + + + do_group_exit (1 samples, 0.73%) + + + + + do_exit (1 samples, 0.73%) + + + + + acct_process (1 samples, 0.73%) + + + + + do_acct_process (1 samples, 0.73%) + + + + + __kernel_write (1 samples, 0.73%) + + + + + ext4_buffered_write_iter (1 samples, 0.73%) + + + + + file_update_time (1 samples, 0.73%) + + + + + generic_update_time (1 samples, 0.73%) + + + + + __mark_inode_dirty (1 samples, 0.73%) + + + + + ext4_dirty_inode (1 samples, 0.73%) + + + + + __ext4_mark_inode_dirty (1 samples, 0.73%) + + + + + ext4_reserve_inode_write (1 samples, 0.73%) + + + + + ext4_get_inode_loc (1 samples, 0.73%) + + + + + __ext4_get_inode_loc (1 samples, 0.73%) + + + + + __getblk_gfp (1 samples, 0.73%) + + + + + __find_get_block (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (4 samples, 2.92%) + + [l.. + + + [libsystemd.so.0.32.0] (7 samples, 5.11%) + + [libsy.. + + + sd_journal_enumerate_available_data (8 samples, 5.84%) + + sd_jour.. + + + sd_journal_enumerate_data (8 samples, 5.84%) + + sd_jour.. + + + sd_journal_get_realtime_usec (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (4 samples, 2.92%) + + [l.. + + + [libsystemd.so.0.32.0] (5 samples, 3.65%) + + [lib.. + + + sd_journal_get_data (8 samples, 5.84%) + + sd_jour.. + + + [libsystemd.so.0.32.0] (8 samples, 5.84%) + + [libsys.. + + + __lll_lock_wake_private (1 samples, 0.73%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.73%) + + + + + do_syscall_64 (1 samples, 0.73%) + + + + + __x64_sys_futex (1 samples, 0.73%) + + + + + do_futex (1 samples, 0.73%) + + + + + futex_wake (1 samples, 0.73%) + + + + + malloc (2 samples, 1.46%) + + + + + s4lib::readers::journalreader::JournalReader::Error_from_Errno (4 samples, 2.92%) + + s4.. + + + alloc::fmt::format::format_inner (4 samples, 2.92%) + + al.. + + + core::fmt::write (2 samples, 1.46%) + + + + + <str as core::fmt::Debug>::fmt (2 samples, 1.46%) + + + + + core::unicode::unicode_data::grapheme_extend::lookup (2 samples, 1.46%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + handle_mm_fault (1 samples, 0.73%) + + + + + __handle_mm_fault (1 samples, 0.73%) + + + + + filemap_map_pages (1 samples, 0.73%) + + + + + next_uptodate_page (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (2 samples, 1.46%) + + + + + [libsystemd.so.0.32.0] (2 samples, 1.46%) + + + + + [libsystemd.so.0.32.0] (4 samples, 2.92%) + + [l.. + + + [libsystemd.so.0.32.0] (4 samples, 2.92%) + + [l.. + + + [libsystemd.so.0.32.0] (5 samples, 3.65%) + + [lib.. + + + s4lib::readers::journalreader::JournalReader::next_common (19 samples, 13.87%) + + s4lib::readers::journ.. + + + [libsystemd.so.0.32.0] (6 samples, 4.38%) + + [libs.. + + + memchr::arch::x86_64::memchr::memchr_raw::find_avx2 (2 samples, 1.46%) + + + + + memchr::arch::x86_64::avx2::memchr::One::find_raw (2 samples, 1.46%) + + + + + malloc (1 samples, 0.73%) + + + + + _int_malloc (1 samples, 0.73%) + + + + + chrono::format::formatting::DelayedFormat<I>::new_with_offset (1 samples, 0.73%) + + + + + s4lib::readers::journalreader::JournalReader::next_short (38 samples, 27.74%) + + s4lib::readers::journalreader::JournalReader:.. + + + <chrono::format::formatting::DelayedFormat<I> as core::fmt::Display>::fmt (7 samples, 5.11%) + + <chron.. + + + s4lib::readers::journalreader::JournalReader::new (1 samples, 0.73%) + + + + + sd_journal_open_files (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.73%) + + + + + [libsystemd.so.0.32.0] (1 samples, 0.73%) + + + + + crossbeam_channel::waker::SyncWaker::notify (1 samples, 0.73%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (41 samples, 29.93%) + + std::sys_common::backtrace::__rust_begin_short_b.. + + + s4::exec_fileprocessor_thread (41 samples, 29.93%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (2 samples, 1.46%) + + + + + all (137 samples, 100%) + + + + + RHE_91_system.j (42 samples, 30.66%) + + RHE_91_system.j + + + clone3 (42 samples, 30.66%) + + clone3 + + + start_thread (42 samples, 30.66%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (42 samples, 30.66%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (42 samples, 30.66%) + + core::ops::function::FnOnce::call_once{{vtable.sh.. + + + std::sys::unix::thread::guard::current (1 samples, 0.73%) + + + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.73%) + + + + + malloc (1 samples, 0.73%) + + + + + tcache_init.part.0 (1 samples, 0.73%) + + + + + arena_get2.part.0 (1 samples, 0.73%) + + + + + alloc_new_heap (1 samples, 0.73%) + + + + + asm_exc_page_fault (1 samples, 0.73%) + + + + + exc_page_fault (1 samples, 0.73%) + + + + + do_user_addr_fault (1 samples, 0.73%) + + + + + handle_mm_fault (1 samples, 0.73%) + + + + + __handle_mm_fault (1 samples, 0.73%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog-bz2.svg b/releases/0.7.75/flamegraph-syslog-bz2.svg new file mode 100644 index 00000000..a1909ae0 --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-bz2.svg @@ -0,0 +1,4997 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231119-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/gen-1000-3-foobar.log.bz2 + + Reset Zoom + Search + + + + __raw_callee_save___pv_queued_spin_unlock (11 samples, 1.51%) + + + + + ret_from_fork (22 samples, 3.03%) + + ret.. + + + schedule_tail (22 samples, 3.03%) + + sch.. + + + finish_task_switch.isra.0 (22 samples, 3.03%) + + fin.. + + + __perf_event_task_sched_in (22 samples, 3.03%) + + __p.. + + + entry_SYSCALL_64_safe_stack (1 samples, 0.14%) + + + + + cgroup_rstat_updated (2 samples, 0.28%) + + + + + page_remove_rmap (5 samples, 0.69%) + + + + + __mod_lruvec_page_state (5 samples, 0.69%) + + + + + __mod_memcg_lruvec_state (5 samples, 0.69%) + + + + + unmap_vmas (7 samples, 0.96%) + + + + + unmap_page_range (7 samples, 0.96%) + + + + + lock_page_lruvec_irqsave (1 samples, 0.14%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.14%) + + + + + free_unref_page_commit.constprop.0 (1 samples, 0.14%) + + + + + __list_del_entry_valid (1 samples, 0.14%) + + + + + free_unref_page_list (3 samples, 0.41%) + + + + + free_pcppages_bulk (2 samples, 0.28%) + + + + + __free_one_page (1 samples, 0.14%) + + + + + mmput (13 samples, 1.79%) + + m.. + + + exit_mmap (13 samples, 1.79%) + + e.. + + + tlb_finish_mmu (6 samples, 0.83%) + + + + + release_pages (6 samples, 0.83%) + + + + + __x64_sys_exit_group (14 samples, 1.93%) + + _.. + + + do_group_exit (14 samples, 1.93%) + + d.. + + + do_exit (14 samples, 1.93%) + + d.. + + + mm_update_next_owner (1 samples, 0.14%) + + + + + vm_mmap_pgoff (1 samples, 0.14%) + + + + + do_mmap (1 samples, 0.14%) + + + + + mmap_region (1 samples, 0.14%) + + + + + vma_link (1 samples, 0.14%) + + + + + vma_interval_tree_insert (1 samples, 0.14%) + + + + + entry_SYSCALL_64_after_hwframe (16 samples, 2.20%) + + e.. + + + do_syscall_64 (16 samples, 2.20%) + + d.. + + + __x64_sys_execve (2 samples, 0.28%) + + + + + do_execveat_common.isra.0 (2 samples, 0.28%) + + + + + bprm_execve (2 samples, 0.28%) + + + + + load_elf_binary (2 samples, 0.28%) + + + + + setup_arg_pages (1 samples, 0.14%) + + + + + shift_arg_pages (1 samples, 0.14%) + + + + + move_page_tables.part.0 (1 samples, 0.14%) + + + + + __pte_alloc (1 samples, 0.14%) + + + + + pte_alloc_one (1 samples, 0.14%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.14%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (1 samples, 0.14%) + + + + + __mprotect (1 samples, 0.14%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.14%) + + + + + do_syscall_64 (1 samples, 0.14%) + + + + + __x64_sys_mprotect (1 samples, 0.14%) + + + + + do_mprotect_pkey (1 samples, 0.14%) + + + + + security_file_mprotect (1 samples, 0.14%) + + + + + start_thread (2 samples, 0.28%) + + + + + entry_SYSCALL_64 (1 samples, 0.14%) + + + + + clone3 (3 samples, 0.41%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.14%) + + + + + do_syscall_64 (1 samples, 0.14%) + + + + + __do_sys_clone3 (1 samples, 0.14%) + + + + + kernel_clone (1 samples, 0.14%) + + + + + copy_process (1 samples, 0.14%) + + + + + perf_event_init_task (1 samples, 0.14%) + + + + + inherit_task_group.isra.0 (1 samples, 0.14%) + + + + + inherit_event.constprop.0 (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + irqentry_enter (1 samples, 0.14%) + + + + + _dl_relocate_object (2 samples, 0.28%) + + + + + _dl_lookup_symbol_x (1 samples, 0.14%) + + + + + do_lookup_x (1 samples, 0.14%) + + + + + _dl_map_object_deps (1 samples, 0.14%) + + + + + _dl_catch_exception (1 samples, 0.14%) + + + + + openaux (1 samples, 0.14%) + + + + + _dl_map_object (1 samples, 0.14%) + + + + + _dl_load_cache_lookup (1 samples, 0.14%) + + + + + _dl_sysdep_read_whole_file (1 samples, 0.14%) + + + + + __GI___close_nocancel (1 samples, 0.14%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.14%) + + + + + do_syscall_64 (1 samples, 0.14%) + + + + + _dl_start (4 samples, 0.55%) + + + + + _dl_sysdep_start (4 samples, 0.55%) + + + + + dl_main (4 samples, 0.55%) + + + + + __libc_early_init (1 samples, 0.14%) + + + + + __getrlimit (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + std::thread::Thread::new (1 samples, 0.14%) + + + + + alloc::sync::arcinner_layout_for_value_layout (1 samples, 0.14%) + + + + + __memrchr_evex (2 samples, 0.28%) + + + + + syscall_return_via_sysret (1 samples, 0.14%) + + + + + syscall_exit_to_user_mode (1 samples, 0.14%) + + + + + srso_alias_safe_ret (1 samples, 0.14%) + + + + + vfs_write (2 samples, 0.28%) + + + + + __fdget_pos (2 samples, 0.28%) + + + + + __fget_light (2 samples, 0.28%) + + + + + __fget_files (2 samples, 0.28%) + + + + + entry_SYSCALL_64_after_hwframe (6 samples, 0.83%) + + + + + do_syscall_64 (6 samples, 0.83%) + + + + + ksys_write (5 samples, 0.69%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (10 samples, 1.38%) + + + + + __GI___libc_write (8 samples, 1.10%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (11 samples, 1.51%) + + + + + std::io::Write::write_all (13 samples, 1.79%) + + s.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (13 samples, 1.79%) + + <.. + + + <std::io::stdio::Stdout as std::io::Write>::write (13 samples, 1.79%) + + <.. + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.14%) + + + + + __memrchr_evex (1 samples, 0.14%) + + + + + termcolor::Ansi<W>::write_color (2 samples, 0.28%) + + + + + std::io::Write::write_all (2 samples, 0.28%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.28%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.28%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.14%) + + + + + __memrchr_evex (1 samples, 0.14%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.28%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (4 samples, 0.55%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (7 samples, 0.96%) + + + + + std::io::Write::write_all (5 samples, 0.69%) + + + + + <termcolor::LossyStandardStream<W> as std::io::Write>::flush (1 samples, 0.14%) + + + + + syscall_return_via_sysret (2 samples, 0.28%) + + + + + srso_alias_return_thunk (1 samples, 0.14%) + + + + + srso_alias_safe_ret (1 samples, 0.14%) + + + + + exit_to_user_mode_prepare (1 samples, 0.14%) + + + + + syscall_exit_to_user_mode (3 samples, 0.41%) + + + + + security_file_permission (1 samples, 0.14%) + + + + + lockref_put_return (3 samples, 0.41%) + + + + + dput (7 samples, 0.96%) + + + + + __fsnotify_parent (9 samples, 1.24%) + + + + + vfs_write (18 samples, 2.48%) + + vf.. + + + fput_many (1 samples, 0.14%) + + + + + __fdget_pos (3 samples, 0.41%) + + + + + __fget_light (3 samples, 0.41%) + + + + + __fget_files (3 samples, 0.41%) + + + + + ksys_write (26 samples, 3.58%) + + ksys.. + + + do_syscall_64 (30 samples, 4.13%) + + do_s.. + + + entry_SYSCALL_64_after_hwframe (33 samples, 4.54%) + + entry.. + + + entry_SYSCALL_64 (1 samples, 0.14%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (39 samples, 5.36%) + + std::io.. + + + __GI___libc_write (39 samples, 5.36%) + + __GI___.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (40 samples, 5.50%) + + <&std::.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (41 samples, 5.64%) + + <std::i.. + + + s4lib::printer::printers::PrinterLogMessage::print_sysline_color (68 samples, 9.35%) + + s4lib::printe.. + + + hashbrown::map::HashMap<K,V,S,A>::get_mut (1 samples, 0.14%) + + + + + crossbeam_channel::select::SelectedOperation::recv (4 samples, 0.55%) + + + + + crossbeam_channel::channel::read (4 samples, 0.55%) + + + + + __memmove_avx512_unaligned_erms (4 samples, 0.55%) + + + + + syscall_exit_to_user_mode (1 samples, 0.14%) + + + + + exit_to_user_mode_prepare (1 samples, 0.14%) + + + + + __rseq_handle_notify_resume (1 samples, 0.14%) + + + + + pick_next_task_fair (1 samples, 0.14%) + + + + + std::thread::park (3 samples, 0.41%) + + + + + syscall (3 samples, 0.41%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.41%) + + + + + do_syscall_64 (3 samples, 0.41%) + + + + + __x64_sys_futex (2 samples, 0.28%) + + + + + do_futex (2 samples, 0.28%) + + + + + futex_wait (2 samples, 0.28%) + + + + + futex_wait_queue_me (2 samples, 0.28%) + + + + + schedule (2 samples, 0.28%) + + + + + __schedule (2 samples, 0.28%) + + + + + __perf_event_task_sched_out (1 samples, 0.14%) + + + + + crossbeam_channel::context::Context::wait_until (7 samples, 0.96%) + + + + + crossbeam_channel::waker::SyncWaker::unregister (1 samples, 0.14%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (9 samples, 1.24%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::unregister (2 samples, 0.28%) + + + + + crossbeam_channel::select::Select::select (10 samples, 1.38%) + + + + + crossbeam_channel::select::run_select (10 samples, 1.38%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.14%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.14%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (1 samples, 0.14%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (3 samples, 0.41%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (3 samples, 0.41%) + + + + + s4::processing_loop (89 samples, 12.24%) + + s4::processing_loop + + + _start (95 samples, 13.07%) + + _start + + + __libc_start_main@@GLIBC_2.34 (91 samples, 12.52%) + + __libc_start_main@@.. + + + __libc_start_call_main (91 samples, 12.52%) + + __libc_start_call_m.. + + + main (91 samples, 12.52%) + + main + + + std::rt::lang_start_internal (91 samples, 12.52%) + + std::rt::lang_start.. + + + std::rt::lang_start::_{{closure}} (90 samples, 12.38%) + + std::rt::lang_star.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (90 samples, 12.38%) + + std::sys_common::b.. + + + s4::main (90 samples, 12.38%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.14%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.14%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.14%) + + + + + clap_builder::parser::parser::Parser::add_defaults (1 samples, 0.14%) + + + + + clap_builder::parser::parser::Parser::react (1 samples, 0.14%) + + + + + clap_builder::parser::parser::Parser::push_arg_values (1 samples, 0.14%) + + + + + clap_builder::parser::arg_matcher::ArgMatcher::add_val_to (1 samples, 0.14%) + + + + + clap_builder::parser::matches::matched_arg::MatchedArg::append_val (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + srso_alias_return_thunk (1 samples, 0.14%) + + + + + s4 (138 samples, 18.98%) + + s4 + + + [unknown] (1 samples, 0.14%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.14%) + + + + + __GI___libc_write (1 samples, 0.14%) + + + + + entry_SYSCALL_64 (1 samples, 0.14%) + + + + + perf-exec (11 samples, 1.51%) + + + + + entry_SYSCALL_64_after_hwframe (11 samples, 1.51%) + + + + + do_syscall_64 (11 samples, 1.51%) + + + + + __x64_sys_execve (11 samples, 1.51%) + + + + + do_execveat_common.isra.0 (11 samples, 1.51%) + + + + + bprm_execve (11 samples, 1.51%) + + + + + load_elf_binary (11 samples, 1.51%) + + + + + begin_new_exec (11 samples, 1.51%) + + + + + perf_event_exec (11 samples, 1.51%) + + + + + __raw_callee_save___pv_queued_spin_unlock (11 samples, 1.51%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (2 samples, 0.28%) + + + + + regex_automata::hybrid::dfa::Cache::new (1 samples, 0.14%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (5 samples, 0.69%) + + + + + alloc::raw_vec::finish_grow (5 samples, 0.69%) + + + + + malloc (5 samples, 0.69%) + + + + + _int_malloc (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (6 samples, 0.83%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (6 samples, 0.83%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + __list_del_entry_valid (1 samples, 0.14%) + + + + + regex_automata::util::sparse_set::SparseSets::new (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (10 samples, 1.38%) + + + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (10 samples, 1.38%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (8 samples, 1.10%) + + + + + regex_automata::hybrid::dfa::Cache::new (2 samples, 0.28%) + + + + + regex_automata::meta::regex::Regex::create_captures (1 samples, 0.14%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.14%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.28%) + + + + + regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.14%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (5 samples, 0.69%) + + + + + regex_syntax::hir::translate::TranslatorI::push (3 samples, 0.41%) + + + + + regex_syntax::hir::translate::HirFrame::unwrap_expr (1 samples, 0.14%) + + + + + regex_syntax::hir::Properties::repetition (1 samples, 0.14%) + + + + + malloc (2 samples, 0.28%) + + + + + regex_syntax::hir::Hir::literal (3 samples, 0.41%) + + + + + regex_syntax::hir::Hir::into_parts (1 samples, 0.14%) + + + + + malloc (2 samples, 0.28%) + + + + + _int_malloc (2 samples, 0.28%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.14%) + + + + + _int_free (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + __rust_alloc (1 samples, 0.14%) + + + + + regex_syntax::hir::Hir::concat (10 samples, 1.38%) + + + + + regex_syntax::hir::Hir::alternation (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + sysmalloc (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __mem_cgroup_charge (1 samples, 0.14%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.14%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (29 samples, 3.99%) + + <reg.. + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.14%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (2 samples, 0.28%) + + + + + regex_syntax::hir::interval::IntervalSet<I>::negate (1 samples, 0.14%) + + + + + regex_syntax::hir::translate::Translator::translate (39 samples, 5.36%) + + regex_s.. + + + regex_syntax::ast::visitor::visit (39 samples, 5.36%) + + regex_s.. + + + regex_syntax::ast::visitor::visit (1 samples, 0.14%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_group (1 samples, 0.14%) + + + + + regex_syntax::ast::Concat::into_ast (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (3 samples, 0.41%) + + + + + regex_syntax::ast::parse::ParserI<P>::maybe_parse_ascii_class (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (4 samples, 0.55%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.14%) + + + + + _int_malloc (2 samples, 0.28%) + + + + + malloc (5 samples, 0.69%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::Parser::parse (27 samples, 3.71%) + + rege.. + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (27 samples, 3.71%) + + rege.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.14%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (2 samples, 0.28%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (2 samples, 0.28%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.14%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.14%) + + + + + _int_free (1 samples, 0.14%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (4 samples, 0.55%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + _int_free (5 samples, 0.69%) + + + + + cfree@GLIBC_2.2.5 (6 samples, 0.83%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (14 samples, 1.93%) + + c.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (14 samples, 1.93%) + + <.. + + + malloc (1 samples, 0.14%) + + + + + core::ptr::drop_in_place<alloc::boxed::Box<regex_syntax::hir::Hir>> (1 samples, 0.14%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.14%) + + + + + regex::builders::Builder::build_one_bytes (84 samples, 11.55%) + + regex::builders::.. + + + regex_automata::meta::regex::Builder::build (84 samples, 11.55%) + + regex_automata::m.. + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (4 samples, 0.55%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (4 samples, 0.55%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.28%) + + + + + _int_free (2 samples, 0.28%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (97 samples, 13.34%) + + s4lib::readers::sysl.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (97 samples, 13.34%) + + s4lib::readers::sysl.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (97 samples, 13.34%) + + s4lib::data::datetim.. + + + once_cell::imp::OnceCell<T>::initialize (86 samples, 11.83%) + + once_cell::imp::On.. + + + once_cell::imp::initialize_or_wait (86 samples, 11.83%) + + once_cell::imp::in.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (86 samples, 11.83%) + + once_cell::imp::On.. + + + regex::regex::bytes::Regex::new (86 samples, 11.83%) + + regex::regex::byte.. + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.28%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.28%) + + + + + malloc (2 samples, 0.28%) + + + + + _int_malloc (2 samples, 0.28%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (98 samples, 13.48%) + + s4lib::readers::sysl.. + + + s4lib::readers::blockreader::BlockReader::read_block (1 samples, 0.14%) + + + + + s4lib::readers::blockreader::BlockReader::read_block_FileBz2 (1 samples, 0.14%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + s4lib::readers::linereader::LineReader::drop_line (1 samples, 0.14%) + + + + + <alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.14%) + + + + + s4lib::readers::linereader::LineReader::drop_lines (3 samples, 0.41%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::drop_data_try (4 samples, 0.55%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_data (4 samples, 0.55%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_sysline (4 samples, 0.55%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (1 samples, 0.14%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (1 samples, 0.14%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (1 samples, 0.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.14%) + + + + + s4lib::data::line::Line::get_boxptrs (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + <chrono::format::strftime::StrftimeItems as core::iter::traits::iterator::Iterator>::next (1 samples, 0.14%) + + + + + s4lib::data::datetime::datetime_parse_from_str (7 samples, 0.96%) + + + + + chrono::naive::datetime::NaiveDateTime::parse_from_str (7 samples, 0.96%) + + + + + chrono::format::parse::parse_internal (7 samples, 0.96%) + + + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.14%) + + + + + core::hash::BuildHasher::hash_one (2 samples, 0.28%) + + + + + regex_automata::util::captures::Captures::get_group_by_name (3 samples, 0.41%) + + + + + regex_automata::meta::regex::Regex::create_captures (1 samples, 0.14%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.14%) + + + + + regex_automata::meta::strategy::Core::search_slots_nofail (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots_imp (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (3 samples, 0.41%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (5 samples, 0.69%) + + + + + regex_automata::hybrid::regex::Regex::try_search (2 samples, 0.28%) + + + + + regex_automata::hybrid::search::find_fwd (2 samples, 0.28%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (17 samples, 2.34%) + + s.. + + + __rdl_alloc (1 samples, 0.14%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (2 samples, 0.28%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (21 samples, 2.89%) + + s4.. + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.14%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (1 samples, 0.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.14%) + + + + + rangemap::map::RangeMap<K,V>::insert (3 samples, 0.41%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (2 samples, 0.28%) + + + + + s4lib::readers::syslinereader::SyslineReader::insert_sysline (4 samples, 0.55%) + + + + + __rdl_alloc (1 samples, 0.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::check_store (1 samples, 0.14%) + + + + + s4lib::readers::linereader::LineReader::insert_line (1 samples, 0.14%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.14%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (3 samples, 0.41%) + + + + + s4lib::readers::linereader::LineReader::get_linep (5 samples, 0.69%) + + + + + s4lib::readers::blockreader::BlockReader::drop_block (1 samples, 0.14%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (1 samples, 0.14%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (1 samples, 0.14%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (1 samples, 0.14%) + + + + + s4lib::readers::blockreader::BlockReader::read_block_FileBz2 (3 samples, 0.41%) + + + + + __memset_avx512_unaligned_erms (2 samples, 0.28%) + + + + + s4lib::readers::blockreader::BlockReader::read_block (4 samples, 0.55%) + + + + + lru::LruCache<K,V,S>::put (2 samples, 0.28%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::contains_key (2 samples, 0.28%) + + + + + s4lib::readers::linereader::LineReader::find_line (27 samples, 3.71%) + + s4li.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_between_datetime_filters (54 samples, 7.43%) + + s4lib::rea.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at_datetime_filter_linear_search (54 samples, 7.43%) + + s4lib::rea.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_year (54 samples, 7.43%) + + s4lib::rea.. + + + crossbeam_channel::context::Context::with::{{closure}} (2 samples, 0.28%) + + + + + crossbeam_channel::channel::Sender<T>::send (3 samples, 0.41%) + + + + + clone3 (160 samples, 22.01%) + + clone3 + + + start_thread (160 samples, 22.01%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (160 samples, 22.01%) + + std::sys::unix::thread::Thread::new.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (160 samples, 22.01%) + + core::ops::function::FnOnce::call_o.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (160 samples, 22.01%) + + std::sys_common::backtrace::__rust_.. + + + s4::exec_fileprocessor_thread (160 samples, 22.01%) + + s4::exec_fileprocessor_thread + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.28%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.28%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.28%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.28%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.28%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.28%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.28%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.28%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.28%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.28%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (2 samples, 0.28%) + + + + + malloc (2 samples, 0.28%) + + + + + _int_malloc (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_bounded (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.55%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.41%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.14%) + + + + + _int_free (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + regex_automata::meta::wrappers::OnePass::new (2 samples, 0.28%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (2 samples, 0.28%) + + + + + regex_automata::dfa::onepass::InternalBuilder::compile_transition (2 samples, 0.28%) + + + + + regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (2 samples, 0.28%) + + + + + __memset_avx512_unaligned_erms (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.14%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.28%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + __memcmp_evex_movbe (1 samples, 0.14%) + + + + + regex_syntax::hir::literal::Extractor::union (2 samples, 0.28%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (11 samples, 1.51%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (11 samples, 1.51%) + + + + + once_cell::imp::OnceCell<T>::initialize (11 samples, 1.51%) + + + + + once_cell::imp::initialize_or_wait (11 samples, 1.51%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (11 samples, 1.51%) + + + + + regex::regex::bytes::Regex::new (11 samples, 1.51%) + + + + + regex::builders::Builder::build_one_bytes (11 samples, 1.51%) + + + + + regex_automata::meta::regex::Builder::build (11 samples, 1.51%) + + + + + regex_automata::meta::strategy::new (11 samples, 1.51%) + + + + + regex_automata::meta::reverse_inner::extract (5 samples, 0.69%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.41%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.41%) + + + + + hashbrown::raw::RawTable<T,A>::insert (1 samples, 0.14%) + + + + + hashbrown::raw::RawTable<T,A>::reserve_rehash (1 samples, 0.14%) + + + + + regex_automata::util::captures::GroupInfo::new (2 samples, 0.28%) + + + + + hashbrown::map::HashMap<K,V,S,A>::insert (2 samples, 0.28%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.14%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::nfa::Inner::into_nfa (2 samples, 0.28%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (5 samples, 0.69%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (5 samples, 0.69%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (5 samples, 0.69%) + + + + + once_cell::imp::OnceCell<T>::initialize (5 samples, 0.69%) + + + + + once_cell::imp::initialize_or_wait (5 samples, 0.69%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (5 samples, 0.69%) + + + + + regex::regex::bytes::Regex::new (5 samples, 0.69%) + + + + + regex::builders::Builder::build_one_bytes (5 samples, 0.69%) + + + + + regex_automata::meta::regex::Builder::build (5 samples, 0.69%) + + + + + regex_automata::meta::strategy::new (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.41%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (8 samples, 1.10%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.28%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.28%) + + + + + malloc (2 samples, 0.28%) + + + + + _int_malloc (2 samples, 0.28%) + + + + + _int_malloc (2 samples, 0.28%) + + + + + malloc (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (6 samples, 0.83%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 0.55%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.55%) + + + + + __rdl_alloc (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (17 samples, 2.34%) + + r.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (17 samples, 2.34%) + + <.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (17 samples, 2.34%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (17 samples, 2.34%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (17 samples, 2.34%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (17 samples, 2.34%) + + r.. + + + cfree@GLIBC_2.2.5 (3 samples, 0.41%) + + + + + _int_free (3 samples, 0.41%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (18 samples, 2.48%) + + s4.. + + + once_cell::imp::OnceCell<T>::initialize (18 samples, 2.48%) + + on.. + + + once_cell::imp::initialize_or_wait (18 samples, 2.48%) + + on.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (18 samples, 2.48%) + + on.. + + + regex::regex::bytes::Regex::new (18 samples, 2.48%) + + re.. + + + regex::builders::Builder::build_one_bytes (18 samples, 2.48%) + + re.. + + + regex_automata::meta::regex::Builder::build (18 samples, 2.48%) + + re.. + + + regex_automata::meta::strategy::new (18 samples, 2.48%) + + re.. + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.14%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.14%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_open (2 samples, 0.28%) + + + + + regex_syntax::ast::parse::Parser::parse (3 samples, 0.41%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (3 samples, 0.41%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (3 samples, 0.41%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_class_open (3 samples, 0.41%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.14%) + + + + + regex_automata::util::prefilter::suffixes (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::Extractor::cross (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.14%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.28%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.28%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.14%) + + + + + __memcmp_evex_movbe (1 samples, 0.14%) + + + + + regex_syntax::hir::literal::Extractor::union (2 samples, 0.28%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.14%) + + + + + regex_automata::util::prefilter::prefixes (5 samples, 0.69%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.41%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_at_least (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (3 samples, 0.41%) + + + + + malloc (1 samples, 0.14%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (1 samples, 0.14%) + + + + + __rust_alloc (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (8 samples, 1.10%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (7 samples, 0.96%) + + + + + regex_automata::meta::wrappers::BoundedBacktracker::new (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::new (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::range_trie::RangeTrie::new (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty (1 samples, 0.14%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (1 samples, 0.14%) + + + + + core::ptr::drop_in_place<alloc::vec::Vec<core::option::Option<alloc::sync::Arc<str>>>> (1 samples, 0.14%) + + + + + malloc_consolidate (1 samples, 0.14%) + + + + + _int_free (4 samples, 0.55%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (26 samples, 3.58%) + + s4li.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (26 samples, 3.58%) + + s4li.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (26 samples, 3.58%) + + s4li.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (26 samples, 3.58%) + + s4li.. + + + once_cell::imp::OnceCell<T>::initialize (26 samples, 3.58%) + + once.. + + + once_cell::imp::initialize_or_wait (26 samples, 3.58%) + + once.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (26 samples, 3.58%) + + once.. + + + regex::regex::bytes::Regex::new (26 samples, 3.58%) + + rege.. + + + regex::builders::Builder::build_one_bytes (26 samples, 3.58%) + + rege.. + + + regex_automata::meta::regex::Builder::build (26 samples, 3.58%) + + rege.. + + + regex_automata::meta::strategy::new (23 samples, 3.16%) + + reg.. + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (7 samples, 0.96%) + + + + + cfree@GLIBC_2.2.5 (5 samples, 0.69%) + + + + + s4::exec_fileprocessor_thread (27 samples, 3.71%) + + s4::.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::new (1 samples, 0.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::new (1 samples, 0.14%) + + + + + s4lib::readers::linereader::LineReader::new (1 samples, 0.14%) + + + + + s4lib::readers::blockreader::BlockReader::new (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + filemap_map_pages (1 samples, 0.14%) + + + + + next_uptodate_page (1 samples, 0.14%) + + + + + regex_automata::meta::wrappers::Hybrid::new (1 samples, 0.14%) + + + + + regex_automata::hybrid::dfa::Builder::build_from_nfa (1 samples, 0.14%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (1 samples, 0.14%) + + + + + aho_corasick::util::remapper::Remapper::remap (1 samples, 0.14%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (1 samples, 0.14%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state (1 samples, 0.14%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (1 samples, 0.14%) + + + + + aho_corasick::nfa::noncontiguous::NFA::init_full_state (1 samples, 0.14%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (1 samples, 0.14%) + + + + + regex_automata::meta::strategy::new (7 samples, 0.96%) + + + + + regex_automata::meta::reverse_inner::extract (6 samples, 0.83%) + + + + + regex_automata::util::prefilter::Choice::new (6 samples, 0.83%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (6 samples, 0.83%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (6 samples, 0.83%) + + + + + regex_automata::util::prefilter::Prefilter::new (1 samples, 0.14%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.14%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (1 samples, 0.14%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + sysmalloc (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.14%) + + + + + clear_page_erms (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.14%) + + + + + clear_page_erms (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (3 samples, 0.41%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (3 samples, 0.41%) + + + + + alloc::vec::Vec<T,A>::extend_with (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.55%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.55%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.14%) + + + + + aho_corasick::packed::api::Builder::extend (1 samples, 0.14%) + + + + + aho_corasick::packed::pattern::Patterns::add (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.14%) + + + + + aho_corasick::packed::rabinkarp::RabinKarp::new (1 samples, 0.14%) + + + + + alloc::vec::from_elem (1 samples, 0.14%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (4 samples, 0.55%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (2 samples, 0.28%) + + + + + aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (2 samples, 0.28%) + + + + + regex_automata::meta::regex::Builder::build (10 samples, 1.38%) + + + + + regex_automata::meta::strategy::new (10 samples, 1.38%) + + + + + regex_automata::meta::reverse_inner::extract (5 samples, 0.69%) + + + + + regex_automata::util::prefilter::Choice::new (5 samples, 0.69%) + + + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.14%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.14%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.14%) + + + + + alloc::vec::from_elem (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + sysmalloc (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.14%) + + + + + clear_page_erms (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (2 samples, 0.28%) + + + + + regex::regex::bytes::Regex::new (5 samples, 0.69%) + + + + + regex::builders::Builder::build_one_bytes (5 samples, 0.69%) + + + + + regex_automata::meta::regex::Builder::build (5 samples, 0.69%) + + + + + regex_automata::meta::strategy::new (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (5 samples, 0.69%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (5 samples, 0.69%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.41%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.28%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.28%) + + + + + malloc (2 samples, 0.28%) + + + + + irqentry_enter (1 samples, 0.14%) + + + + + exc_page_fault (2 samples, 0.28%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.14%) + + + + + clear_page_erms (1 samples, 0.14%) + + + + + asm_exc_page_fault (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (11 samples, 1.51%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (11 samples, 1.51%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (11 samples, 1.51%) + + + + + alloc::vec::Vec<T,A>::extend_with (11 samples, 1.51%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (13 samples, 1.79%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (13 samples, 1.79%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + sysmalloc (1 samples, 0.14%) + + + + + asm_exc_page_fault (1 samples, 0.14%) + + + + + exc_page_fault (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + get_page_from_freelist (1 samples, 0.14%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.14%) + + + + + clear_page_erms (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __mem_cgroup_charge (1 samples, 0.14%) + + + + + asm_exc_page_fault (2 samples, 0.28%) + + + + + exc_page_fault (2 samples, 0.28%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.28%) + + + + + regex::builders::Builder::build_one_bytes (28 samples, 3.85%) + + rege.. + + + regex_automata::meta::regex::Builder::build (28 samples, 3.85%) + + rege.. + + + regex_automata::meta::strategy::new (28 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (28 samples, 3.85%) + + rege.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (28 samples, 3.85%) + + <cor.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (28 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (28 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (28 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (28 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (13 samples, 1.79%) + + r.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (13 samples, 1.79%) + + r.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (13 samples, 1.79%) + + r.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (13 samples, 1.79%) + + <.. + + + alloc::vec::Vec<T,A>::extend_with (12 samples, 1.65%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.28%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.28%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.28%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.28%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.28%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.28%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.28%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + realloc (1 samples, 0.14%) + + + + + _int_realloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + do_user_addr_fault (1 samples, 0.14%) + + + + + handle_mm_fault (1 samples, 0.14%) + + + + + __handle_mm_fault (1 samples, 0.14%) + + + + + __mem_cgroup_charge (1 samples, 0.14%) + + + + + charge_memcg (1 samples, 0.14%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.14%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (2 samples, 0.28%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.28%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.28%) + + + + + realloc (2 samples, 0.28%) + + + + + _int_realloc (2 samples, 0.28%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.28%) + + + + + asm_exc_page_fault (2 samples, 0.28%) + + + + + exc_page_fault (2 samples, 0.28%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (3 samples, 0.41%) + + + + + regex::regex::bytes::Regex::new (3 samples, 0.41%) + + + + + regex::builders::Builder::build_one_bytes (3 samples, 0.41%) + + + + + regex_automata::meta::regex::Builder::build (3 samples, 0.41%) + + + + + regex_automata::meta::strategy::new (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (3 samples, 0.41%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.41%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (3 samples, 0.41%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.14%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.14%) + + + + + malloc (1 samples, 0.14%) + + + + + _int_malloc (1 samples, 0.14%) + + + + + crc32fast::specialized::pclmulqdq::calculate (4 samples, 0.55%) + + + + + crc32fast::Hasher::update (5 samples, 0.69%) + + + + + crc32fast::baseline::update_fast_16 (1 samples, 0.14%) + + + + + bzip2_rs::huffman::HuffmanTree::new (1 samples, 0.14%) + + + + + <tinyvec::arrayvec::ArrayVec<A> as core::default::Default>::default (1 samples, 0.14%) + + + + + bzip2_rs::huffman::HuffmanTree::decode (1 samples, 0.14%) + + + + + bzip2_rs::block::bwt::inverse_bwt (17 samples, 2.34%) + + b.. + + + pte_alloc_one (1 samples, 0.14%) + + + + + __alloc_pages (1 samples, 0.14%) + + + + + do_huge_pmd_anonymous_page (2 samples, 0.28%) + + + + + clear_huge_page (1 samples, 0.14%) + + + + + clear_subpage (1 samples, 0.14%) + + + + + clear_page_erms (1 samples, 0.14%) + + + + + __mem_cgroup_charge (1 samples, 0.14%) + + + + + charge_memcg (1 samples, 0.14%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.14%) + + + + + __alloc_pages (2 samples, 0.28%) + + + + + get_page_from_freelist (2 samples, 0.28%) + + + + + kernel_init_free_pages.part.0 (2 samples, 0.28%) + + + + + clear_page_erms (2 samples, 0.28%) + + + + + __handle_mm_fault (6 samples, 0.83%) + + + + + exc_page_fault (7 samples, 0.96%) + + + + + do_user_addr_fault (7 samples, 0.96%) + + + + + handle_mm_fault (7 samples, 0.96%) + + + + + __count_memcg_events (1 samples, 0.14%) + + + + + asm_exc_page_fault (8 samples, 1.10%) + + + + + alloc::vec::Vec<T,A>::resize (12 samples, 1.65%) + + + + + __memmove_avx512_unaligned_erms (4 samples, 0.55%) + + + + + gen-1000-3-foob (577 samples, 79.37%) + + gen-1000-3-foob + + + [unknown] (417 samples, 57.36%) + + [unknown] + + + bzip2_rs::block::Block::read (299 samples, 41.13%) + + bzip2_rs::block::Block::read + + + all (727 samples, 100%) + + + + + ctrl-c (1 samples, 0.14%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.14%) + + + + + do_syscall_64 (1 samples, 0.14%) + + + + + syscall_exit_to_user_mode (1 samples, 0.14%) + + + + + exit_to_user_mode_prepare (1 samples, 0.14%) + + + + + arch_do_signal_or_restart (1 samples, 0.14%) + + + + + get_signal (1 samples, 0.14%) + + + + + do_group_exit (1 samples, 0.14%) + + + + + do_exit (1 samples, 0.14%) + + + + + exit_fs (1 samples, 0.14%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog-empty.svg b/releases/0.7.75/flamegraph-syslog-empty.svg new file mode 100644 index 00000000..214d731c --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-empty.svg @@ -0,0 +1,1017 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231111-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/empty.log + + Reset Zoom + Search + + + + setup_arg_pages (1 samples, 5.00%) + + setup_.. + + + shift_arg_pages (1 samples, 5.00%) + + shift_.. + + + __vma_adjust (1 samples, 5.00%) + + __vma_.. + + + entry_SYSCALL_64_after_hwframe (2 samples, 10.00%) + + entry_SYSCALL_.. + + + do_syscall_64 (2 samples, 10.00%) + + do_syscall_64 + + + __x64_sys_execve (2 samples, 10.00%) + + __x64_sys_exec.. + + + do_execveat_common.isra.0 (2 samples, 10.00%) + + do_execveat_co.. + + + bprm_execve (2 samples, 10.00%) + + bprm_execve + + + load_elf_binary (2 samples, 10.00%) + + load_elf_binary + + + elf_map (1 samples, 5.00%) + + elf_map + + + vm_mmap_pgoff (1 samples, 5.00%) + + vm_mma.. + + + do_mmap (1 samples, 5.00%) + + do_mmap + + + mmap_region (1 samples, 5.00%) + + mmap_r.. + + + vma_link (1 samples, 5.00%) + + vma_li.. + + + vma_interval_tree_insert (1 samples, 5.00%) + + vma_in.. + + + init_tls (1 samples, 5.00%) + + init_t.. + + + __tls_init_tp (1 samples, 5.00%) + + __tls_.. + + + entry_SYSCALL_64_after_hwframe (1 samples, 5.00%) + + entry_.. + + + do_syscall_64 (1 samples, 5.00%) + + do_sys.. + + + syscall_exit_to_user_mode (1 samples, 5.00%) + + syscal.. + + + wp_page_copy (1 samples, 5.00%) + + wp_pag.. + + + __alloc_pages (1 samples, 5.00%) + + __allo.. + + + get_page_from_freelist (1 samples, 5.00%) + + get_pa.. + + + rmqueue_bulk (1 samples, 5.00%) + + rmqueu.. + + + __list_del_entry_valid (1 samples, 5.00%) + + __list.. + + + _dl_relocate_object (2 samples, 10.00%) + + _dl_relocate_o.. + + + asm_exc_page_fault (2 samples, 10.00%) + + asm_exc_page_f.. + + + exc_page_fault (2 samples, 10.00%) + + exc_page_fault + + + do_user_addr_fault (2 samples, 10.00%) + + do_user_addr_f.. + + + handle_mm_fault (2 samples, 10.00%) + + handle_mm_fault + + + __handle_mm_fault (2 samples, 10.00%) + + __handle_mm_fa.. + + + filemap_map_pages (1 samples, 5.00%) + + filema.. + + + next_uptodate_page (1 samples, 5.00%) + + next_u.. + + + _dl_start (4 samples, 20.00%) + + _dl_start + + + _dl_sysdep_start (4 samples, 20.00%) + + _dl_sysdep_start + + + dl_main (4 samples, 20.00%) + + dl_main + + + _dl_init_paths (1 samples, 5.00%) + + _dl_in.. + + + asm_exc_page_fault (1 samples, 5.00%) + + asm_ex.. + + + exc_page_fault (1 samples, 5.00%) + + exc_pa.. + + + do_user_addr_fault (1 samples, 5.00%) + + do_use.. + + + handle_mm_fault (1 samples, 5.00%) + + handle.. + + + __handle_mm_fault (1 samples, 5.00%) + + __hand.. + + + __anon_vma_prepare (1 samples, 5.00%) + + __anon.. + + + kmem_cache_alloc (1 samples, 5.00%) + + kmem_c.. + + + std::sys::unix::stack_overflow::imp::make_handler (1 samples, 5.00%) + + std::s.. + + + __sysconf (1 samples, 5.00%) + + __sysc.. + + + asm_exc_page_fault (1 samples, 5.00%) + + asm_ex.. + + + exc_page_fault (1 samples, 5.00%) + + exc_pa.. + + + do_user_addr_fault (1 samples, 5.00%) + + do_use.. + + + handle_mm_fault (1 samples, 5.00%) + + handle.. + + + __handle_mm_fault (1 samples, 5.00%) + + __hand.. + + + filemap_map_pages (1 samples, 5.00%) + + filema.. + + + next_uptodate_page (1 samples, 5.00%) + + next_u.. + + + s4::processing_loop (1 samples, 5.00%) + + s4::pr.. + + + hashbrown::raw::RawTable<T,A>::shrink_to (1 samples, 5.00%) + + hashbr.. + + + <hashbrown::raw::RawTable<T,A> as core::ops::drop::Drop>::drop (1 samples, 5.00%) + + <hashb.. + + + s4 (9 samples, 45.00%) + + s4 + + + _start (7 samples, 35.00%) + + _start + + + __libc_start_main@@GLIBC_2.34 (3 samples, 15.00%) + + __libc_start_main@@GLIB.. + + + __libc_start_call_main (3 samples, 15.00%) + + __libc_start_call_main + + + main (3 samples, 15.00%) + + main + + + std::rt::lang_start_internal (3 samples, 15.00%) + + std::rt::lang_start_int.. + + + std::rt::lang_start::_{{closure}} (2 samples, 10.00%) + + std::rt::lang_.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 10.00%) + + std::sys_commo.. + + + s4::main (2 samples, 10.00%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 5.00%) + + <s4::C.. + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 5.00%) + + once_c.. + + + once_cell::imp::initialize_or_wait (1 samples, 5.00%) + + once_c.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 5.00%) + + once_c.. + + + core::ops::function::FnOnce::call_once (1 samples, 5.00%) + + core::.. + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 5.00%) + + std::s.. + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 5.00%) + + std::s.. + + + <chrono::offset::local::Local as chrono::offset::TimeZone>::offset_from_utc_datetime (1 samples, 5.00%) + + <chron.. + + + chrono::offset::local::inner::offset (1 samples, 5.00%) + + chrono.. + + + <chrono::offset::local::inner::Cache as core::default::Default>::default (1 samples, 5.00%) + + <chron.. + + + chrono::offset::local::inner::current_zone (1 samples, 5.00%) + + chrono.. + + + chrono::offset::local::tz_info::timezone::TimeZone::from_posix_tz (1 samples, 5.00%) + + chrono.. + + + std::fs::read::inner (1 samples, 5.00%) + + std::f.. + + + std::sys::unix::fs::try_statx (1 samples, 5.00%) + + std::s.. + + + statx (1 samples, 5.00%) + + statx + + + entry_SYSCALL_64_after_hwframe (1 samples, 5.00%) + + entry_.. + + + do_syscall_64 (1 samples, 5.00%) + + do_sys.. + + + __x64_sys_statx (1 samples, 5.00%) + + __x64_.. + + + do_statx (1 samples, 5.00%) + + do_sta.. + + + vfs_statx (1 samples, 5.00%) + + vfs_st.. + + + user_path_at_empty (1 samples, 5.00%) + + user_p.. + + + filename_lookup (1 samples, 5.00%) + + filena.. + + + path_lookupat (1 samples, 5.00%) + + path_l.. + + + path_init (1 samples, 5.00%) + + path_i.. + + + __fdget_raw (1 samples, 5.00%) + + __fdge.. + + + all (20 samples, 100%) + + + + + perf-exec (11 samples, 55.00%) + + perf-exec + + + entry_SYSCALL_64_after_hwframe (11 samples, 55.00%) + + entry_SYSCALL_64_after_hwframe + + + do_syscall_64 (11 samples, 55.00%) + + do_syscall_64 + + + __x64_sys_execve (11 samples, 55.00%) + + __x64_sys_execve + + + do_execveat_common.isra.0 (11 samples, 55.00%) + + do_execveat_common.isra.0 + + + bprm_execve (11 samples, 55.00%) + + bprm_execve + + + load_elf_binary (11 samples, 55.00%) + + load_elf_binary + + + begin_new_exec (11 samples, 55.00%) + + begin_new_exec + + + perf_event_exec (11 samples, 55.00%) + + perf_event_exec + + + __raw_callee_save___pv_queued_spin_unlock (11 samples, 55.00%) + + __raw_callee_save___pv_queued_spin_unlock + + + diff --git a/releases/0.7.75/flamegraph-syslog-gz.svg b/releases/0.7.75/flamegraph-syslog-gz.svg new file mode 100644 index 00000000..b00e3228 --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-gz.svg @@ -0,0 +1,5222 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231122-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/gen-1000-3-foobar.log.gz + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 5.01%) + + ret_fr.. + + + schedule_tail (22 samples, 5.01%) + + schedu.. + + + finish_task_switch.isra.0 (22 samples, 5.01%) + + finish.. + + + __perf_event_task_sched_in (22 samples, 5.01%) + + __perf.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 5.01%) + + __raw_.. + + + cgroup_rstat_updated (1 samples, 0.23%) + + + + + __mod_memcg_lruvec_state (3 samples, 0.68%) + + + + + page_remove_rmap (4 samples, 0.91%) + + + + + __mod_lruvec_page_state (4 samples, 0.91%) + + + + + unmap_vmas (5 samples, 1.14%) + + + + + unmap_page_range (5 samples, 1.14%) + + + + + free_unref_page_commit.constprop.0 (1 samples, 0.23%) + + + + + __list_add_valid (1 samples, 0.23%) + + + + + __list_del_entry_valid (4 samples, 0.91%) + + + + + __x64_sys_exit_group (11 samples, 2.51%) + + __.. + + + do_group_exit (11 samples, 2.51%) + + do.. + + + do_exit (11 samples, 2.51%) + + do.. + + + mmput (11 samples, 2.51%) + + mm.. + + + exit_mmap (11 samples, 2.51%) + + ex.. + + + tlb_finish_mmu (6 samples, 1.37%) + + + + + release_pages (6 samples, 1.37%) + + + + + free_unref_page_list (6 samples, 1.37%) + + + + + free_pcppages_bulk (5 samples, 1.14%) + + + + + __free_one_page (1 samples, 0.23%) + + + + + mutex_unlock (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (13 samples, 2.96%) + + ent.. + + + do_syscall_64 (13 samples, 2.96%) + + do_.. + + + __x64_sys_execve (2 samples, 0.46%) + + + + + do_execveat_common.isra.0 (2 samples, 0.46%) + + + + + bprm_execve (2 samples, 0.46%) + + + + + load_elf_binary (2 samples, 0.46%) + + + + + __clear_user (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __alloc_pages (1 samples, 0.23%) + + + + + get_page_from_freelist (1 samples, 0.23%) + + + + + __list_del_entry_valid (1 samples, 0.23%) + + + + + __sysconf (1 samples, 0.23%) + + + + + clone3 (2 samples, 0.46%) + + + + + start_thread (2 samples, 0.46%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.46%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.46%) + + + + + __mmap (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + vm_mmap_pgoff (1 samples, 0.23%) + + + + + do_mmap (1 samples, 0.23%) + + + + + mmap_region (1 samples, 0.23%) + + + + + perf_event_mmap (1 samples, 0.23%) + + + + + perf_iterate_sb (1 samples, 0.23%) + + + + + _dl_lookup_symbol_x (1 samples, 0.23%) + + + + + do_lookup_x (1 samples, 0.23%) + + + + + check_match (1 samples, 0.23%) + + + + + strcmp (1 samples, 0.23%) + + + + + _dl_relocate_object (3 samples, 0.68%) + + + + + _dl_map_object_from_fd (1 samples, 0.23%) + + + + + mmap64 (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + ksys_mmap_pgoff (1 samples, 0.23%) + + + + + vm_mmap_pgoff (1 samples, 0.23%) + + + + + do_mmap (1 samples, 0.23%) + + + + + mmap_region (1 samples, 0.23%) + + + + + perf_event_mmap (1 samples, 0.23%) + + + + + d_path (1 samples, 0.23%) + + + + + prepend_path (1 samples, 0.23%) + + + + + prepend_copy (1 samples, 0.23%) + + + + + copy_from_kernel_nofault (1 samples, 0.23%) + + + + + _dl_sysdep_start (5 samples, 1.14%) + + + + + dl_main (5 samples, 1.14%) + + + + + _dl_map_object_deps (2 samples, 0.46%) + + + + + _dl_catch_exception (2 samples, 0.46%) + + + + + openaux (2 samples, 0.46%) + + + + + _dl_map_object (2 samples, 0.46%) + + + + + _dl_start (6 samples, 1.37%) + + + + + _dl_setup_hash (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + filemap_map_pages (1 samples, 0.23%) + + + + + std::sys::unix::args::imp::ARGV_INIT_ARRAY::init_wrapper (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + filemap_map_pages (1 samples, 0.23%) + + + + + next_uptodate_page (1 samples, 0.23%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.23%) + + + + + fsnotify (1 samples, 0.23%) + + + + + dget_parent (1 samples, 0.23%) + + + + + lockref_get_not_zero (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.68%) + + + + + do_syscall_64 (3 samples, 0.68%) + + + + + ksys_write (3 samples, 0.68%) + + + + + vfs_write (3 samples, 0.68%) + + + + + __fsnotify_parent (3 samples, 0.68%) + + + + + std::io::Write::write_all (6 samples, 1.37%) + + + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (6 samples, 1.37%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (6 samples, 1.37%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (6 samples, 1.37%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (6 samples, 1.37%) + + + + + __GI___libc_write (5 samples, 1.14%) + + + + + __memrchr_evex (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (3 samples, 0.68%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (4 samples, 0.91%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (4 samples, 0.91%) + + + + + std::io::Write::write_all (6 samples, 1.37%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (7 samples, 1.59%) + + + + + <termcolor::ColorSpec as core::cmp::PartialEq>::eq (1 samples, 0.23%) + + + + + <termcolor::ColorSpec as core::clone::Clone>::clone (1 samples, 0.23%) + + + + + write_null (1 samples, 0.23%) + + + + + srso_alias_safe_ret (1 samples, 0.23%) + + + + + syscall_return_via_sysret (1 samples, 0.23%) + + + + + srso_alias_safe_ret (1 samples, 0.23%) + + + + + syscall_exit_to_user_mode (2 samples, 0.46%) + + + + + rw_verify_area (1 samples, 0.23%) + + + + + __fsnotify_parent (1 samples, 0.23%) + + + + + dput (1 samples, 0.23%) + + + + + lockref_put_return (1 samples, 0.23%) + + + + + vfs_write (6 samples, 1.37%) + + + + + fput_many (1 samples, 0.23%) + + + + + fput (1 samples, 0.23%) + + + + + __fdget_pos (1 samples, 0.23%) + + + + + ksys_write (10 samples, 2.28%) + + k.. + + + __x64_sys_write (1 samples, 0.23%) + + + + + do_syscall_64 (16 samples, 3.64%) + + do_s.. + + + entry_SYSCALL_64_after_hwframe (17 samples, 3.87%) + + entr.. + + + entry_SYSCALL_64 (3 samples, 0.68%) + + + + + __x86_indirect_thunk_rax (1 samples, 0.23%) + + + + + <std::io::stdio::Stdout as std::io::Write>::flush (24 samples, 5.47%) + + <std::i.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (24 samples, 5.47%) + + <&std::.. + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (24 samples, 5.47%) + + std::io.. + + + __GI___libc_write (24 samples, 5.47%) + + __GI___.. + + + s4lib::printer::printers::PrinterLogMessage::print_sysline_color (42 samples, 9.57%) + + s4lib::printer.. + + + hashbrown::set::HashSet<T,S,A>::remove (2 samples, 0.46%) + + + + + hashbrown::raw::RawTable<T,A>::remove_entry (2 samples, 0.46%) + + + + + ctrlc::set_handler (1 samples, 0.23%) + + + + + crossbeam_channel::select::SelectedOperation::recv (2 samples, 0.46%) + + + + + crossbeam_channel::channel::read (2 samples, 0.46%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.46%) + + + + + std::thread::park (1 samples, 0.23%) + + + + + syscall (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __x64_sys_futex (1 samples, 0.23%) + + + + + do_futex (1 samples, 0.23%) + + + + + futex_wait (1 samples, 0.23%) + + + + + futex_wait_queue_me (1 samples, 0.23%) + + + + + schedule (1 samples, 0.23%) + + + + + __schedule (1 samples, 0.23%) + + + + + pick_next_task_idle (1 samples, 0.23%) + + + + + __update_idle_core (1 samples, 0.23%) + + + + + __x64_sys_sched_yield (1 samples, 0.23%) + + + + + schedule (1 samples, 0.23%) + + + + + __schedule (1 samples, 0.23%) + + + + + _raw_spin_lock (1 samples, 0.23%) + + + + + __sched_yield (2 samples, 0.46%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.46%) + + + + + do_syscall_64 (2 samples, 0.46%) + + + + + crossbeam_channel::context::Context::wait_until (4 samples, 0.91%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (5 samples, 1.14%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::unregister (1 samples, 0.23%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.23%) + + + + + crossbeam_channel::select::Select::select (7 samples, 1.59%) + + + + + crossbeam_channel::select::run_select (7 samples, 1.59%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (1 samples, 0.23%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (1 samples, 0.23%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (2 samples, 0.46%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (2 samples, 0.46%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.46%) + + + + + s4::processing_loop (65 samples, 14.81%) + + s4::processing_loop + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.23%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.23%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.23%) + + + + + clap_builder::parser::parser::Parser::add_defaults (1 samples, 0.23%) + + + + + clap_builder::parser::parser::Parser::react (1 samples, 0.23%) + + + + + clap_builder::parser::parser::Parser::push_arg_values (1 samples, 0.23%) + + + + + <P as clap_builder::builder::value_parser::AnyValueParser>::parse_ref (1 samples, 0.23%) + + + + + <F as clap_builder::builder::value_parser::TypedValueParser>::parse_ref (1 samples, 0.23%) + + + + + s4lib::data::datetime::datetime_parse_from_str_w_tz (1 samples, 0.23%) + + + + + chrono::datetime::DateTime<chrono::offset::fixed::FixedOffset>::parse_from_str (1 samples, 0.23%) + + + + + chrono::format::parsed::Parsed::to_datetime (1 samples, 0.23%) + + + + + std::rt::lang_start::_{{closure}} (67 samples, 15.26%) + + std::rt::lang_start::_{.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (67 samples, 15.26%) + + std::sys_common::backtr.. + + + s4::main (67 samples, 15.26%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.23%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + core::ops::function::FnOnce::call_once (1 samples, 0.23%) + + + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 0.23%) + + + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 0.23%) + + + + + s4::UTC_NOW::__getit (1 samples, 0.23%) + + + + + _start (75 samples, 17.08%) + + _start + + + __libc_start_main@@GLIBC_2.34 (69 samples, 15.72%) + + __libc_start_main@@GLIBC.. + + + __libc_start_call_main (68 samples, 15.49%) + + __libc_start_call_main + + + main (68 samples, 15.49%) + + main + + + std::rt::lang_start_internal (68 samples, 15.49%) + + std::rt::lang_start_inte.. + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.23%) + + + + + __getdelim (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + [unknown] (1 samples, 0.23%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.23%) + + + + + __GI___libc_write (1 samples, 0.23%) + + + + + entry_SYSCALL_64 (1 samples, 0.23%) + + + + + s4 (114 samples, 25.97%) + + s4 + + + [[heap]] (1 samples, 0.23%) + + + + + __GI___libc_write (1 samples, 0.23%) + + + + + entry_SYSCALL_64 (1 samples, 0.23%) + + + + + perf-exec (14 samples, 3.19%) + + per.. + + + entry_SYSCALL_64_after_hwframe (14 samples, 3.19%) + + ent.. + + + do_syscall_64 (14 samples, 3.19%) + + do_.. + + + __x64_sys_execve (14 samples, 3.19%) + + __x.. + + + do_execveat_common.isra.0 (14 samples, 3.19%) + + do_.. + + + bprm_execve (14 samples, 3.19%) + + bpr.. + + + load_elf_binary (14 samples, 3.19%) + + loa.. + + + begin_new_exec (14 samples, 3.19%) + + beg.. + + + perf_event_exec (14 samples, 3.19%) + + per.. + + + __raw_callee_save___pv_queued_spin_unlock (14 samples, 3.19%) + + __r.. + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (1 samples, 0.23%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + malloc (2 samples, 0.46%) + + + + + _int_malloc (2 samples, 0.46%) + + + + + regex_automata::util::sparse_set::SparseSets::new (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.23%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (6 samples, 1.37%) + + + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (6 samples, 1.37%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (5 samples, 1.14%) + + + + + regex_automata::hybrid::dfa::Cache::new (3 samples, 0.68%) + + + + + hashbrown::map::HashMap<K,V,S,A>::insert (1 samples, 0.23%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.23%) + + + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.23%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.23%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.23%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (2 samples, 0.46%) + + + + + regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.23%) + + + + + regex_syntax::hir::translate::TranslatorI::push (3 samples, 0.68%) + + + + + regex_syntax::hir::Properties::repetition (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + malloc (2 samples, 0.46%) + + + + + _int_malloc (2 samples, 0.46%) + + + + + regex_syntax::hir::Hir::into_parts (6 samples, 1.37%) + + + + + _int_free (3 samples, 0.68%) + + + + + cfree@GLIBC_2.2.5 (4 samples, 0.91%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::concat (13 samples, 2.96%) + + reg.. + + + regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + regex_syntax::hir::Properties::alternation (2 samples, 0.46%) + + + + + malloc (1 samples, 0.23%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::into_parts (5 samples, 1.14%) + + + + + regex_syntax::hir::Hir::alternation (9 samples, 2.05%) + + r.. + + + regex_syntax::hir::ClassUnicode::new (1 samples, 0.23%) + + + + + core::str::converts::from_utf8 (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (40 samples, 9.11%) + + <regex_syntax.. + + + regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_syntax::hir::translate::Translator::translate (47 samples, 10.71%) + + regex_syntax::hi.. + + + regex_syntax::ast::visitor::visit (47 samples, 10.71%) + + regex_syntax::as.. + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (4 samples, 0.91%) + + + + + regex_syntax::ast::visitor::visit (2 samples, 0.46%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_group (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_syntax::ast::Concat::into_ast (3 samples, 0.68%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (8 samples, 1.82%) + + r.. + + + regex_syntax::ast::parse::ParserI<P>::pop_group (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_uncounted_repetition (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.23%) + + + + + regex_syntax::ast::ClassSetUnion::push (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + __rust_alloc (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc (3 samples, 0.68%) + + + + + regex_syntax::ast::parse::Parser::parse (23 samples, 5.24%) + + regex_.. + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (23 samples, 5.24%) + + regex_.. + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + malloc_consolidate (3 samples, 0.68%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (5 samples, 1.14%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (5 samples, 1.14%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 0.91%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 0.91%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.91%) + + + + + realloc (4 samples, 0.91%) + + + + + _int_realloc (4 samples, 0.91%) + + + + + _int_malloc (4 samples, 0.91%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (7 samples, 1.59%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.46%) + + + + + _int_free (2 samples, 0.46%) + + + + + _int_free (5 samples, 1.14%) + + + + + cfree@GLIBC_2.2.5 (6 samples, 1.37%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (15 samples, 3.42%) + + cor.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (15 samples, 3.42%) + + <re.. + + + core::ptr::drop_in_place<regex_syntax::hir::HirKind> (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + schedule (15 samples, 3.42%) + + sch.. + + + __schedule (15 samples, 3.42%) + + __s.. + + + finish_task_switch.isra.0 (15 samples, 3.42%) + + fin.. + + + __perf_event_task_sched_in (15 samples, 3.42%) + + __p.. + + + x86_pmu_enable_all (15 samples, 3.42%) + + x86.. + + + asm_sysvec_hyperv_stimer0 (16 samples, 3.64%) + + asm_.. + + + irqentry_exit_to_user_mode (16 samples, 3.64%) + + irqe.. + + + exit_to_user_mode_prepare (16 samples, 3.64%) + + exit.. + + + malloc_consolidate (18 samples, 4.10%) + + mall.. + + + _int_free (23 samples, 5.24%) + + _int_f.. + + + regex::builders::Builder::build_one_bytes (111 samples, 25.28%) + + regex::builders::Builder::build_one_bytes + + + regex_automata::meta::regex::Builder::build (111 samples, 25.28%) + + regex_automata::meta::regex::Builder::bu.. + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (25 samples, 5.69%) + + <alloc:.. + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (25 samples, 5.69%) + + <regex_.. + + + cfree@GLIBC_2.2.5 (24 samples, 5.47%) + + cfree@G.. + + + regex::regex::bytes::Regex::new (112 samples, 25.51%) + + regex::regex::bytes::Regex::new + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.23%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (119 samples, 27.11%) + + s4lib::data::datetime::bytes_to_regex_to_da.. + + + once_cell::imp::OnceCell<T>::initialize (113 samples, 25.74%) + + once_cell::imp::OnceCell<T>::initialize + + + once_cell::imp::initialize_or_wait (113 samples, 25.74%) + + once_cell::imp::initialize_or_wait + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (113 samples, 25.74%) + + once_cell::imp::OnceCell<T>::initialize::.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (120 samples, 27.33%) + + s4lib::readers::syslogprocessor::SyslogProce.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (120 samples, 27.33%) + + s4lib::readers::syslinereader::SyslineReader.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (120 samples, 27.33%) + + s4lib::readers::syslinereader::SyslineReader.. + + + core::slice::sort::merge_sort (1 samples, 0.23%) + + + + + entry_SYSCALL_64 (1 samples, 0.23%) + + + + + lru::LruCache<K,V,S>::pop (1 samples, 0.23%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::drop_data_try (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_data (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_sysline (2 samples, 0.46%) + + + + + s4lib::readers::linereader::LineReader::drop_lines (2 samples, 0.46%) + + + + + s4lib::readers::linereader::LineReader::drop_line (2 samples, 0.46%) + + + + + chrono::offset::LocalResult<T>::and_then (1 samples, 0.23%) + + + + + s4lib::data::datetime::datetime_parse_from_str (2 samples, 0.46%) + + + + + chrono::naive::datetime::NaiveDateTime::parse_from_str (1 samples, 0.23%) + + + + + chrono::format::parse::parse_internal (1 samples, 0.23%) + + + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.23%) + + + + + core::hash::BuildHasher::hash_one (3 samples, 0.68%) + + + + + regex_automata::util::captures::Captures::get_group_by_name (6 samples, 1.37%) + + + + + malloc (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Regex::create_captures (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots_imp (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (3 samples, 0.68%) + + + + + regex_automata::meta::strategy::Core::search_slots_nofail (4 samples, 0.91%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (5 samples, 1.14%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (17 samples, 3.87%) + + s4li.. + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (20 samples, 4.56%) + + s4lib.. + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (2 samples, 0.46%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (3 samples, 0.68%) + + + + + rangemap::map::RangeMap<K,V>::insert (5 samples, 1.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::insert_sysline (6 samples, 1.37%) + + + + + alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (1 samples, 0.23%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (2 samples, 0.46%) + + + + + s4lib::readers::linereader::LineReader::insert_line (3 samples, 0.68%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.23%) + + + + + s4lib::readers::linereader::LineReader::get_linep (3 samples, 0.68%) + + + + + miniz_oxide::inflate::core::transfer (3 samples, 0.68%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + flate2::zio::read (5 samples, 1.14%) + + + + + <flate2::ffi::rust::Inflate as flate2::ffi::InflateBackend>::decompress (5 samples, 1.14%) + + + + + miniz_oxide::inflate::stream::inflate (5 samples, 1.14%) + + + + + miniz_oxide::inflate::core::decompress (5 samples, 1.14%) + + + + + s4lib::readers::blockreader::BlockReader::read_block (7 samples, 1.59%) + + + + + s4lib::readers::blockreader::BlockReader::read_block_FileGz (7 samples, 1.59%) + + + + + <flate2::gz::bufread::GzDecoder<R> as std::io::Read>::read (7 samples, 1.59%) + + + + + crc32fast::Hasher::update (2 samples, 0.46%) + + + + + crc32fast::baseline::update_fast_16 (2 samples, 0.46%) + + + + + malloc (2 samples, 0.46%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (1 samples, 0.23%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.23%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::contains_key (1 samples, 0.23%) + + + + + s4lib::readers::linereader::LineReader::find_line (30 samples, 6.83%) + + s4lib::re.. + + + lru::LruCache<K,V,S>::put (3 samples, 0.68%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_year (60 samples, 13.67%) + + s4lib::readers::sysli.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_between_datetime_filters (61 samples, 13.90%) + + s4lib::readers::sysli.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at_datetime_filter_linear_search (61 samples, 13.90%) + + s4lib::readers::sysli.. + + + std::thread::park (1 samples, 0.23%) + + + + + syscall (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __x64_sys_futex (1 samples, 0.23%) + + + + + do_futex (1 samples, 0.23%) + + + + + futex_wait (1 samples, 0.23%) + + + + + futex_wait_queue_me (1 samples, 0.23%) + + + + + schedule (1 samples, 0.23%) + + + + + __schedule (1 samples, 0.23%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (2 samples, 0.46%) + + + + + __sched_yield (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __x64_sys_sched_yield (1 samples, 0.23%) + + + + + schedule (1 samples, 0.23%) + + + + + __schedule (1 samples, 0.23%) + + + + + update_rq_clock (1 samples, 0.23%) + + + + + sched_clock_cpu (1 samples, 0.23%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.23%) + + + + + read_hv_clock_tsc (1 samples, 0.23%) + + + + + __sched_yield (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + syscall_enter_from_user_mode (1 samples, 0.23%) + + + + + clone3 (187 samples, 42.60%) + + clone3 + + + start_thread (187 samples, 42.60%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (187 samples, 42.60%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (187 samples, 42.60%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (187 samples, 42.60%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::exec_fileprocessor_thread (187 samples, 42.60%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (4 samples, 0.91%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 0.46%) + + + + + s4::exec_fileprocessor_thread (2 samples, 0.46%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.46%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.46%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.46%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.46%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.46%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.46%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.46%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::Parser::parse (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class (2 samples, 0.46%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.23%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.23%) + + + + + regex_automata::meta::strategy::new (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::kind (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (5 samples, 1.14%) + + + + + regex_automata::nfa::thompson::builder::Builder::add_capture_start (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (7 samples, 1.59%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (7 samples, 1.59%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (7 samples, 1.59%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (7 samples, 1.59%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + regex_automata::meta::wrappers::OnePass::new (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::InternalBuilder::stack_push (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::concat (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (11 samples, 2.51%) + + s4.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (11 samples, 2.51%) + + s4.. + + + once_cell::imp::OnceCell<T>::initialize (11 samples, 2.51%) + + on.. + + + once_cell::imp::initialize_or_wait (11 samples, 2.51%) + + on.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (11 samples, 2.51%) + + on.. + + + regex::regex::bytes::Regex::new (11 samples, 2.51%) + + re.. + + + regex::builders::Builder::build_one_bytes (11 samples, 2.51%) + + re.. + + + regex_automata::meta::regex::Builder::build (11 samples, 2.51%) + + re.. + + + regex_automata::meta::strategy::new (11 samples, 2.51%) + + re.. + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.68%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::alternation (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::into_parts (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + alloc::sync::Arc<T>::drop_slow (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<regex_automata::util::prefilter::teddy::Teddy> (1 samples, 0.23%) + + + + + alloc::sync::Arc<T>::drop_slow (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<aho_corasick::packed::teddy::generic::Teddy<16_usize>> (1 samples, 0.23%) + + + + + alloc::sync::Arc<T>::drop_slow (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (3 samples, 0.68%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (3 samples, 0.68%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (3 samples, 0.68%) + + + + + once_cell::imp::OnceCell<T>::initialize (3 samples, 0.68%) + + + + + once_cell::imp::initialize_or_wait (3 samples, 0.68%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (3 samples, 0.68%) + + + + + regex::regex::bytes::Regex::new (3 samples, 0.68%) + + + + + regex::builders::Builder::build_one_bytes (3 samples, 0.68%) + + + + + regex_automata::meta::regex::Builder::build (3 samples, 0.68%) + + + + + regex_automata::meta::strategy::new (3 samples, 0.68%) + + + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.68%) + + + + + s4lib::readers::blockreader::BlockReader::new (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (5 samples, 1.14%) + + + + + realloc (1 samples, 0.23%) + + + + + malloc (4 samples, 0.91%) + + + + + _int_malloc (4 samples, 0.91%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (6 samples, 1.37%) + + + + + alloc::raw_vec::finish_grow (6 samples, 1.37%) + + + + + _int_malloc (3 samples, 0.68%) + + + + + malloc (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (11 samples, 2.51%) + + re.. + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (5 samples, 1.14%) + + + + + alloc::raw_vec::finish_grow (5 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (18 samples, 4.10%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (18 samples, 4.10%) + + rege.. + + + cfree@GLIBC_2.2.5 (2 samples, 0.46%) + + + + + _int_free (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (19 samples, 4.33%) + + regex.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (19 samples, 4.33%) + + <core.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (19 samples, 4.33%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (19 samples, 4.33%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::map::Utf8SuffixMap::clear (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (23 samples, 5.24%) + + s4lib:.. + + + once_cell::imp::OnceCell<T>::initialize (23 samples, 5.24%) + + once_c.. + + + once_cell::imp::initialize_or_wait (23 samples, 5.24%) + + once_c.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (23 samples, 5.24%) + + once_c.. + + + regex::regex::bytes::Regex::new (23 samples, 5.24%) + + regex:.. + + + regex::builders::Builder::build_one_bytes (23 samples, 5.24%) + + regex:.. + + + regex_automata::meta::regex::Builder::build (23 samples, 5.24%) + + regex_.. + + + regex_automata::meta::strategy::new (23 samples, 5.24%) + + regex_.. + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.91%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (4 samples, 0.91%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (4 samples, 0.91%) + + + + + alloc::vec::Vec<T,A>::retain_mut (4 samples, 0.91%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (4 samples, 0.91%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.68%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.68%) + + + + + malloc (3 samples, 0.68%) + + + + + _int_malloc (3 samples, 0.68%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class_op (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::Parser::parse (3 samples, 0.68%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (3 samples, 0.68%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (3 samples, 0.68%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_escape (2 samples, 0.46%) + + + + + regex_automata::util::prefilter::prefixes (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (3 samples, 0.68%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<regex_syntax::hir::Hir> (1 samples, 0.23%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::range_trie::RangeTrie>> (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (9 samples, 2.05%) + + c.. + + + cfree@GLIBC_2.2.5 (7 samples, 1.59%) + + + + + _int_free (7 samples, 1.59%) + + + + + s4::exec_fileprocessor_thread (19 samples, 4.33%) + + s4::e.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (19 samples, 4.33%) + + s4lib.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (19 samples, 4.33%) + + s4lib.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (19 samples, 4.33%) + + s4lib.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (19 samples, 4.33%) + + s4lib.. + + + once_cell::imp::OnceCell<T>::initialize (19 samples, 4.33%) + + once_.. + + + once_cell::imp::initialize_or_wait (19 samples, 4.33%) + + once_.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (19 samples, 4.33%) + + once_.. + + + regex::regex::bytes::Regex::new (19 samples, 4.33%) + + regex.. + + + regex::builders::Builder::build_one_bytes (19 samples, 4.33%) + + regex.. + + + regex_automata::meta::regex::Builder::build (19 samples, 4.33%) + + regex.. + + + regex_automata::meta::strategy::new (16 samples, 3.64%) + + rege.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.23%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (1 samples, 0.23%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new (1 samples, 0.23%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (1 samples, 0.23%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (1 samples, 0.23%) + + + + + aho_corasick::packed::pattern::Pattern::low_nybbles (1 samples, 0.23%) + + + + + __libc_calloc (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::Prefilter::new (2 samples, 0.46%) + + + + + regex_automata::util::prefilter::Choice::new (2 samples, 0.46%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (2 samples, 0.46%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (1 samples, 0.23%) + + + + + aho_corasick::util::remapper::Remapper::remap (1 samples, 0.23%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (1 samples, 0.23%) + + + + + regex_automata::meta::wrappers::Hybrid::new (1 samples, 0.23%) + + + + + regex_automata::hybrid::dfa::Builder::build_from_nfa (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (4 samples, 0.91%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (4 samples, 0.91%) + + + + + regex_automata::meta::strategy::new (8 samples, 1.82%) + + r.. + + + regex_automata::meta::reverse_inner::extract (5 samples, 1.14%) + + + + + regex_automata::util::prefilter::Choice::new (5 samples, 1.14%) + + + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.23%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::NFA::init_full_state (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::Prefilter::new (2 samples, 0.46%) + + + + + regex_automata::util::prefilter::Choice::new (2 samples, 0.46%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (2 samples, 0.46%) + + + + + aho_corasick::packed::api::Builder::build (2 samples, 0.46%) + + + + + aho_corasick::packed::rabinkarp::RabinKarp::new (2 samples, 0.46%) + + + + + alloc::vec::from_elem (2 samples, 0.46%) + + + + + __alloc_pages (1 samples, 0.23%) + + + + + get_page_from_freelist (1 samples, 0.23%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.23%) + + + + + clear_page_erms (1 samples, 0.23%) + + + + + asm_exc_page_fault (2 samples, 0.46%) + + + + + exc_page_fault (2 samples, 0.46%) + + + + + do_user_addr_fault (2 samples, 0.46%) + + + + + handle_mm_fault (2 samples, 0.46%) + + + + + __handle_mm_fault (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (3 samples, 0.68%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (3 samples, 0.68%) + + + + + alloc::vec::Vec<T,A>::extend_with (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.91%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + aho_corasick::packed::api::Builder::extend (1 samples, 0.23%) + + + + + aho_corasick::packed::pattern::Patterns::add (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (2 samples, 0.46%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.23%) + + + + + aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (9 samples, 2.05%) + + r.. + + + regex_automata::meta::strategy::new (9 samples, 2.05%) + + r.. + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.68%) + + + + + regex_automata::util::prefilter::Choice::new (3 samples, 0.68%) + + + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.23%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.23%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + __mprotect (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __x64_sys_mprotect (1 samples, 0.23%) + + + + + do_mprotect_pkey (1 samples, 0.23%) + + + + + mprotect_fixup (1 samples, 0.23%) + + + + + perf_event_mmap (1 samples, 0.23%) + + + + + perf_iterate_sb (1 samples, 0.23%) + + + + + perf_iterate_ctx (1 samples, 0.23%) + + + + + perf_event_mmap_output (1 samples, 0.23%) + + + + + __perf_event_header__init_id (1 samples, 0.23%) + + + + + sched_clock_cpu (1 samples, 0.23%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.23%) + + + + + read_hv_clock_tsc (1 samples, 0.23%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __alloc_pages (1 samples, 0.23%) + + + + + get_page_from_freelist (1 samples, 0.23%) + + + + + rmqueue_bulk (1 samples, 0.23%) + + + + + __list_del_entry_valid (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (3 samples, 0.68%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + realloc (2 samples, 0.46%) + + + + + _int_realloc (2 samples, 0.46%) + + + + + _int_malloc (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.68%) + + + + + regex::regex::bytes::Regex::new (8 samples, 1.82%) + + r.. + + + regex::builders::Builder::build_one_bytes (8 samples, 1.82%) + + r.. + + + regex_automata::meta::regex::Builder::build (8 samples, 1.82%) + + r.. + + + regex_automata::meta::strategy::new (8 samples, 1.82%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (8 samples, 1.82%) + + r.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (8 samples, 1.82%) + + <.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (8 samples, 1.82%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (8 samples, 1.82%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (8 samples, 1.82%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (8 samples, 1.82%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::finish (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + irqentry_enter (1 samples, 0.23%) + + + + + lru_cache_add (1 samples, 0.23%) + + + + + __pagevec_lru_add (1 samples, 0.23%) + + + + + page_mapping (1 samples, 0.23%) + + + + + __mem_cgroup_charge (1 samples, 0.23%) + + + + + charge_memcg (1 samples, 0.23%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.23%) + + + + + rmqueue_bulk (2 samples, 0.46%) + + + + + __list_del_entry_valid (2 samples, 0.46%) + + + + + __alloc_pages (3 samples, 0.68%) + + + + + get_page_from_freelist (3 samples, 0.68%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.23%) + + + + + clear_page_erms (1 samples, 0.23%) + + + + + handle_mm_fault (6 samples, 1.37%) + + + + + __handle_mm_fault (6 samples, 1.37%) + + + + + asm_exc_page_fault (8 samples, 1.82%) + + a.. + + + exc_page_fault (8 samples, 1.82%) + + e.. + + + do_user_addr_fault (7 samples, 1.59%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (12 samples, 2.73%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (12 samples, 2.73%) + + re.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (12 samples, 2.73%) + + re.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (12 samples, 2.73%) + + re.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (12 samples, 2.73%) + + <T.. + + + alloc::vec::Vec<T,A>::extend_with (12 samples, 2.73%) + + al.. + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __mem_cgroup_charge (1 samples, 0.23%) + + + + + perf_event_mmap_output (1 samples, 0.23%) + + + + + perf_output_copy (1 samples, 0.23%) + + + + + memcpy_erms (1 samples, 0.23%) + + + + + malloc (3 samples, 0.68%) + + + + + _int_malloc (3 samples, 0.68%) + + + + + sysmalloc (3 samples, 0.68%) + + + + + __mprotect (2 samples, 0.46%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.46%) + + + + + do_syscall_64 (2 samples, 0.46%) + + + + + __x64_sys_mprotect (2 samples, 0.46%) + + + + + do_mprotect_pkey (2 samples, 0.46%) + + + + + mprotect_fixup (2 samples, 0.46%) + + + + + perf_event_mmap (2 samples, 0.46%) + + + + + perf_iterate_sb (2 samples, 0.46%) + + + + + perf_iterate_ctx (2 samples, 0.46%) + + + + + kernel_init_free_pages.part.0 (3 samples, 0.68%) + + + + + clear_page_erms (3 samples, 0.68%) + + + + + __alloc_pages (4 samples, 0.91%) + + + + + get_page_from_freelist (4 samples, 0.91%) + + + + + exc_page_fault (5 samples, 1.14%) + + + + + do_user_addr_fault (5 samples, 1.14%) + + + + + handle_mm_fault (5 samples, 1.14%) + + + + + __handle_mm_fault (5 samples, 1.14%) + + + + + asm_exc_page_fault (7 samples, 1.59%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (33 samples, 7.52%) + + regex::bui.. + + + regex_automata::meta::regex::Builder::build (33 samples, 7.52%) + + regex_auto.. + + + regex_automata::meta::strategy::new (33 samples, 7.52%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (33 samples, 7.52%) + + regex_auto.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (33 samples, 7.52%) + + <core::ite.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (33 samples, 7.52%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (33 samples, 7.52%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (33 samples, 7.52%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (33 samples, 7.52%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (18 samples, 4.10%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (18 samples, 4.10%) + + rege.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (18 samples, 4.10%) + + rege.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (18 samples, 4.10%) + + <T a.. + + + alloc::vec::Vec<T,A>::extend_with (15 samples, 3.42%) + + all.. + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + irqentry_enter (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (4 samples, 0.91%) + + + + + regex::regex::bytes::Regex::new (4 samples, 0.91%) + + + + + regex::builders::Builder::build_one_bytes (4 samples, 0.91%) + + + + + regex_automata::meta::regex::Builder::build (4 samples, 0.91%) + + + + + regex_automata::meta::strategy::new (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.91%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + realloc (2 samples, 0.46%) + + + + + _int_realloc (2 samples, 0.46%) + + + + + _int_malloc (2 samples, 0.46%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + miniz_oxide::inflate::stream::InflateState::new_boxed (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __mem_cgroup_charge (1 samples, 0.23%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.23%) + + + + + all (439 samples, 100%) + + + + + gen-1000-3-foob (311 samples, 70.84%) + + gen-1000-3-foob + + + [unknown] (124 samples, 28.25%) + + [unknown] + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.23%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.23%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.23%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.23%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.23%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog-lz4.svg b/releases/0.7.75/flamegraph-syslog-lz4.svg new file mode 100644 index 00000000..c1ef67e4 --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-lz4.svg @@ -0,0 +1,5292 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231125-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/gen-1000-3-foobar.log.lz4 + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 5.29%) + + ret_fr.. + + + schedule_tail (22 samples, 5.29%) + + schedu.. + + + finish_task_switch.isra.0 (22 samples, 5.29%) + + finish.. + + + __perf_event_task_sched_in (22 samples, 5.29%) + + __perf.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 5.29%) + + __raw_.. + + + cgroup_rstat_updated (1 samples, 0.24%) + + + + + __mod_memcg_lruvec_state (2 samples, 0.48%) + + + + + __mod_lruvec_state (1 samples, 0.24%) + + + + + srso_alias_return_thunk (1 samples, 0.24%) + + + + + srso_alias_safe_ret (1 samples, 0.24%) + + + + + unmap_vmas (5 samples, 1.20%) + + + + + unmap_page_range (5 samples, 1.20%) + + + + + page_remove_rmap (5 samples, 1.20%) + + + + + __mod_lruvec_page_state (5 samples, 1.20%) + + + + + __list_del_entry_valid (2 samples, 0.48%) + + + + + __free_one_page (1 samples, 0.24%) + + + + + __x64_sys_exit_group (10 samples, 2.40%) + + __.. + + + do_group_exit (10 samples, 2.40%) + + do.. + + + do_exit (10 samples, 2.40%) + + do.. + + + mmput (10 samples, 2.40%) + + mm.. + + + exit_mmap (10 samples, 2.40%) + + ex.. + + + tlb_finish_mmu (5 samples, 1.20%) + + + + + release_pages (5 samples, 1.20%) + + + + + free_unref_page_list (5 samples, 1.20%) + + + + + free_pcppages_bulk (5 samples, 1.20%) + + + + + entry_SYSCALL_64_after_hwframe (11 samples, 2.64%) + + en.. + + + do_syscall_64 (11 samples, 2.64%) + + do.. + + + __x64_sys_execve (1 samples, 0.24%) + + + + + do_execveat_common.isra.0 (1 samples, 0.24%) + + + + + bprm_execve (1 samples, 0.24%) + + + + + load_elf_binary (1 samples, 0.24%) + + + + + vm_mmap_pgoff (1 samples, 0.24%) + + + + + do_mmap (1 samples, 0.24%) + + + + + mmap_region (1 samples, 0.24%) + + + + + perf_event_mmap (1 samples, 0.24%) + + + + + perf_iterate_sb (1 samples, 0.24%) + + + + + perf_iterate_ctx (1 samples, 0.24%) + + + + + perf_event_mmap_output (1 samples, 0.24%) + + + + + __perf_event_header__init_id (1 samples, 0.24%) + + + + + __task_pid_nr_ns (1 samples, 0.24%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.24%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (1 samples, 0.24%) + + + + + __mmap (1 samples, 0.24%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + vm_mmap_pgoff (1 samples, 0.24%) + + + + + do_mmap (1 samples, 0.24%) + + + + + mmap_region (1 samples, 0.24%) + + + + + perf_event_mmap (1 samples, 0.24%) + + + + + perf_iterate_sb (1 samples, 0.24%) + + + + + perf_iterate_ctx (1 samples, 0.24%) + + + + + clone3 (2 samples, 0.48%) + + + + + start_thread (2 samples, 0.48%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + __x64_sys_rt_sigprocmask (1 samples, 0.24%) + + + + + sigprocmask (1 samples, 0.24%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.24%) + + + + + finish_fault (1 samples, 0.24%) + + + + + do_set_pte (1 samples, 0.24%) + + + + + lru_cache_add (1 samples, 0.24%) + + + + + __pagevec_lru_add (1 samples, 0.24%) + + + + + page_mapping (1 samples, 0.24%) + + + + + copy_page (1 samples, 0.24%) + + + + + _dl_relocate_object (3 samples, 0.72%) + + + + + asm_exc_page_fault (3 samples, 0.72%) + + + + + exc_page_fault (3 samples, 0.72%) + + + + + do_user_addr_fault (3 samples, 0.72%) + + + + + handle_mm_fault (3 samples, 0.72%) + + + + + __handle_mm_fault (3 samples, 0.72%) + + + + + __mem_cgroup_charge (1 samples, 0.24%) + + + + + charge_memcg (1 samples, 0.24%) + + + + + _dl_map_object_from_fd (1 samples, 0.24%) + + + + + mmap64 (1 samples, 0.24%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + ksys_mmap_pgoff (1 samples, 0.24%) + + + + + vm_mmap_pgoff (1 samples, 0.24%) + + + + + do_mmap (1 samples, 0.24%) + + + + + mmap_region (1 samples, 0.24%) + + + + + perf_event_mmap (1 samples, 0.24%) + + + + + perf_iterate_sb (1 samples, 0.24%) + + + + + perf_iterate_ctx (1 samples, 0.24%) + + + + + perf_event_mmap_output (1 samples, 0.24%) + + + + + memcpy_erms (1 samples, 0.24%) + + + + + _dl_start (5 samples, 1.20%) + + + + + _dl_sysdep_start (5 samples, 1.20%) + + + + + dl_main (5 samples, 1.20%) + + + + + _dl_map_object_deps (2 samples, 0.48%) + + + + + _dl_catch_exception (2 samples, 0.48%) + + + + + openaux (2 samples, 0.48%) + + + + + _dl_map_object (2 samples, 0.48%) + + + + + _dl_load_cache_lookup (1 samples, 0.24%) + + + + + _dl_sysdep_read_whole_file (1 samples, 0.24%) + + + + + __GI___open64_nocancel (1 samples, 0.24%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + __x64_sys_openat (1 samples, 0.24%) + + + + + do_sys_openat2 (1 samples, 0.24%) + + + + + do_filp_open (1 samples, 0.24%) + + + + + path_openat (1 samples, 0.24%) + + + + + vfs_open (1 samples, 0.24%) + + + + + __memrchr_evex (3 samples, 0.72%) + + + + + dput (1 samples, 0.24%) + + + + + lockref_put_return (1 samples, 0.24%) + + + + + __fsnotify_parent (2 samples, 0.48%) + + + + + dget_parent (1 samples, 0.24%) + + + + + rcu_read_unlock_strict (1 samples, 0.24%) + + + + + vfs_write (4 samples, 0.96%) + + + + + entry_SYSCALL_64_after_hwframe (6 samples, 1.44%) + + + + + do_syscall_64 (6 samples, 1.44%) + + + + + ksys_write (6 samples, 1.44%) + + + + + __fdget_pos (2 samples, 0.48%) + + + + + __GI___libc_write (7 samples, 1.68%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (11 samples, 2.64%) + + <s.. + + + std::io::Write::write_all (12 samples, 2.88%) + + st.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (12 samples, 2.88%) + + <t.. + + + <std::io::stdio::Stdout as std::io::Write>::write (12 samples, 2.88%) + + <s.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (12 samples, 2.88%) + + <&.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + termcolor::Ansi<W>::write_color (3 samples, 0.72%) + + + + + std::io::Write::write_all (3 samples, 0.72%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.72%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.72%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (3 samples, 0.72%) + + + + + __memrchr_evex (1 samples, 0.24%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.48%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.48%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (2 samples, 0.48%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (6 samples, 1.44%) + + + + + std::io::Write::write_all (3 samples, 0.72%) + + + + + syscall_exit_to_user_mode (1 samples, 0.24%) + + + + + write_null (1 samples, 0.24%) + + + + + fsnotify (2 samples, 0.48%) + + + + + lockref_put_return (1 samples, 0.24%) + + + + + dput (3 samples, 0.72%) + + + + + __fsnotify_parent (7 samples, 1.68%) + + + + + vfs_write (10 samples, 2.40%) + + vf.. + + + fput_many (3 samples, 0.72%) + + + + + __fget_light (1 samples, 0.24%) + + + + + ksys_write (15 samples, 3.61%) + + ksys.. + + + __fdget_pos (2 samples, 0.48%) + + + + + entry_SYSCALL_64_after_hwframe (18 samples, 4.33%) + + entry.. + + + do_syscall_64 (18 samples, 4.33%) + + do_sy.. + + + entry_SYSCALL_64 (2 samples, 0.48%) + + + + + __GI___libc_write (23 samples, 5.53%) + + __GI___.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (24 samples, 5.77%) + + <&std::.. + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (24 samples, 5.77%) + + std::io.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (25 samples, 6.01%) + + <std::io.. + + + s4lib::printer::printers::PrinterLogMessage::print_sysline_color (47 samples, 11.30%) + + s4lib::printer::p.. + + + hashbrown::map::HashMap<K,V,S,A>::insert (1 samples, 0.24%) + + + + + crossbeam_channel::select::SelectedOperation::recv (1 samples, 0.24%) + + + + + crossbeam_channel::channel::read (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + __put_user_nocheck_8 (1 samples, 0.24%) + + + + + syscall_exit_to_user_mode (2 samples, 0.48%) + + + + + exit_to_user_mode_prepare (2 samples, 0.48%) + + + + + __rseq_handle_notify_resume (2 samples, 0.48%) + + + + + std::thread::park (3 samples, 0.72%) + + + + + syscall (3 samples, 0.72%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 0.72%) + + + + + do_syscall_64 (3 samples, 0.72%) + + + + + __x64_sys_futex (1 samples, 0.24%) + + + + + do_futex (1 samples, 0.24%) + + + + + futex_wait (1 samples, 0.24%) + + + + + futex_wait_queue_me (1 samples, 0.24%) + + + + + schedule (1 samples, 0.24%) + + + + + __schedule (1 samples, 0.24%) + + + + + __perf_event_task_sched_out (1 samples, 0.24%) + + + + + amd_pmu_disable_all (1 samples, 0.24%) + + + + + x86_pmu_disable_all (1 samples, 0.24%) + + + + + amd_pmu_addr_offset (1 samples, 0.24%) + + + + + crossbeam_channel::context::Context::wait_until (5 samples, 1.20%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (6 samples, 1.44%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.24%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.24%) + + + + + crossbeam_channel::select::Select::select (8 samples, 1.92%) + + c.. + + + crossbeam_channel::select::run_select (8 samples, 1.92%) + + c.. + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (1 samples, 0.24%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (1 samples, 0.24%) + + + + + s4::processing_loop (61 samples, 14.66%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (62 samples, 14.90%) + + std::rt::lang_start::_{.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (62 samples, 14.90%) + + std::sys_common::backtr.. + + + s4::main (62 samples, 14.90%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 0.24%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.24%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.24%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.24%) + + + + + core::ops::function::FnOnce::call_once (1 samples, 0.24%) + + + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 0.24%) + + + + + std::sys::common::thread_local::fast_local::fast::Key<T>::try_initialize (1 samples, 0.24%) + + + + + <chrono::offset::local::Local as chrono::offset::TimeZone>::offset_from_utc_datetime (1 samples, 0.24%) + + + + + chrono::offset::local::inner::offset (1 samples, 0.24%) + + + + + <chrono::offset::local::inner::Cache as core::default::Default>::default (1 samples, 0.24%) + + + + + chrono::offset::local::inner::current_zone (1 samples, 0.24%) + + + + + chrono::offset::local::tz_info::timezone::TimeZone::from_posix_tz (1 samples, 0.24%) + + + + + std::fs::read::inner (1 samples, 0.24%) + + + + + __close (1 samples, 0.24%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + syscall_exit_to_user_mode (1 samples, 0.24%) + + + + + exit_to_user_mode_prepare (1 samples, 0.24%) + + + + + __rseq_handle_notify_resume (1 samples, 0.24%) + + + + + __put_user_nocheck_8 (1 samples, 0.24%) + + + + + main (63 samples, 15.14%) + + main + + + std::rt::lang_start_internal (63 samples, 15.14%) + + std::rt::lang_start_int.. + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.24%) + + + + + fopen@@GLIBC_2.2.5 (1 samples, 0.24%) + + + + + _IO_new_file_init_internal (1 samples, 0.24%) + + + + + _IO_link_in (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + srso_alias_return_thunk (1 samples, 0.24%) + + + + + srso_alias_safe_ret (1 samples, 0.24%) + + + + + __libc_start_main@@GLIBC_2.34 (64 samples, 15.38%) + + __libc_start_main@@GLIBC.. + + + __libc_start_call_main (64 samples, 15.38%) + + __libc_start_call_main + + + exit (1 samples, 0.24%) + + + + + __run_exit_handlers (1 samples, 0.24%) + + + + + _dl_fini (1 samples, 0.24%) + + + + + _dl_sort_maps (1 samples, 0.24%) + + + + + dfs_traversal.part.0 (1 samples, 0.24%) + + + + + s4 (105 samples, 25.24%) + + s4 + + + _start (70 samples, 16.83%) + + _start + + + [[kernel.kallsyms]] (1 samples, 0.24%) + + + + + perf_event_exec (14 samples, 3.37%) + + per.. + + + x86_pmu_enable_all (14 samples, 3.37%) + + x86.. + + + perf-exec (15 samples, 3.61%) + + perf.. + + + entry_SYSCALL_64_after_hwframe (15 samples, 3.61%) + + entr.. + + + do_syscall_64 (15 samples, 3.61%) + + do_s.. + + + __x64_sys_execve (15 samples, 3.61%) + + __x6.. + + + do_execveat_common.isra.0 (15 samples, 3.61%) + + do_e.. + + + bprm_execve (15 samples, 3.61%) + + bprm.. + + + load_elf_binary (15 samples, 3.61%) + + load.. + + + begin_new_exec (15 samples, 3.61%) + + begi.. + + + perf_event_comm (1 samples, 0.24%) + + + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (1 samples, 0.24%) + + + + + regex_automata::hybrid::dfa::Cache::new (1 samples, 0.24%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.24%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + malloc_consolidate (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (4 samples, 0.96%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 0.96%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.96%) + + + + + malloc (4 samples, 0.96%) + + + + + _int_malloc (4 samples, 0.96%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (6 samples, 1.44%) + + + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (6 samples, 1.44%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (5 samples, 1.20%) + + + + + regex_automata::hybrid::dfa::Cache::new (1 samples, 0.24%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.24%) + + + + + regex_automata::hybrid::dfa::Lazy::set_transition (1 samples, 0.24%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.24%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.48%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (3 samples, 0.72%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.48%) + + + + + regex_syntax::hir::Properties::capture (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + regex_syntax::hir::Hir::literal (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.24%) + + + + + regex_syntax::hir::Hir::into_parts (4 samples, 0.96%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.72%) + + + + + _int_free (3 samples, 0.72%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + __rdl_alloc (1 samples, 0.24%) + + + + + regex_syntax::hir::Hir::concat (11 samples, 2.64%) + + re.. + + + regex_syntax::hir::lift_common_prefix (1 samples, 0.24%) + + + + + regex_syntax::hir::Properties::alternation (2 samples, 0.48%) + + + + + regex_syntax::hir::Hir::alternation (6 samples, 1.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + malloc_consolidate (1 samples, 0.24%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (30 samples, 7.21%) + + <regex_syn.. + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre (1 samples, 0.24%) + + + + + regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.24%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + regex_syntax::hir::translate::Translator::translate (37 samples, 8.89%) + + regex_syntax:.. + + + regex_syntax::ast::visitor::visit (37 samples, 8.89%) + + regex_syntax:.. + + + regex_syntax::ast::visitor::visit (2 samples, 0.48%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_group (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_capture_name (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_group (3 samples, 0.72%) + + + + + regex_syntax::ast::Concat::into_ast (2 samples, 0.48%) + + + + + malloc (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (3 samples, 0.72%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_group (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_counted_repetition (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_decimal (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (2 samples, 0.48%) + + + + + _int_malloc (3 samples, 0.72%) + + + + + malloc (6 samples, 1.44%) + + + + + regex_syntax::ast::parse::Parser::parse (28 samples, 6.73%) + + regex_syn.. + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (28 samples, 6.73%) + + regex_syn.. + + + regex_automata::meta::regex::RegexInfo::new (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + malloc_consolidate (2 samples, 0.48%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (4 samples, 0.96%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (4 samples, 0.96%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (3 samples, 0.72%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.72%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.72%) + + + + + realloc (3 samples, 0.72%) + + + + + _int_realloc (3 samples, 0.72%) + + + + + _int_malloc (3 samples, 0.72%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.72%) + + + + + _int_free (3 samples, 0.72%) + + + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (2 samples, 0.48%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (10 samples, 2.40%) + + co.. + + + cfree@GLIBC_2.2.5 (3 samples, 0.72%) + + + + + _int_free (3 samples, 0.72%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (15 samples, 3.61%) + + core.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (15 samples, 3.61%) + + <reg.. + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + regex::builders::Builder::build_one_bytes (83 samples, 19.95%) + + regex::builders::Builder::build.. + + + regex_automata::meta::regex::Builder::build (83 samples, 19.95%) + + regex_automata::meta::regex::Bu.. + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.48%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (2 samples, 0.48%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.48%) + + + + + _int_free (2 samples, 0.48%) + + + + + malloc_consolidate (1 samples, 0.24%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.48%) + + + + + malloc (2 samples, 0.48%) + + + + + _int_malloc (2 samples, 0.48%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (92 samples, 22.12%) + + s4lib::readers::syslinereader::Sysl.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (92 samples, 22.12%) + + s4lib::readers::syslinereader::Sysl.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (92 samples, 22.12%) + + s4lib::data::datetime::bytes_to_reg.. + + + once_cell::imp::OnceCell<T>::initialize (86 samples, 20.67%) + + once_cell::imp::OnceCell<T>::init.. + + + once_cell::imp::initialize_or_wait (86 samples, 20.67%) + + once_cell::imp::initialize_or_wait + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (86 samples, 20.67%) + + once_cell::imp::OnceCell<T>::init.. + + + regex::regex::bytes::Regex::new (86 samples, 20.67%) + + regex::regex::bytes::Regex::new + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (3 samples, 0.72%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + handle_mm_fault (1 samples, 0.24%) + + + + + __handle_mm_fault (1 samples, 0.24%) + + + + + do_huge_pmd_anonymous_page (1 samples, 0.24%) + + + + + clear_huge_page (1 samples, 0.24%) + + + + + clear_subpage (1 samples, 0.24%) + + + + + clear_page_erms (1 samples, 0.24%) + + + + + asm_exc_page_fault (3 samples, 0.72%) + + + + + exc_page_fault (3 samples, 0.72%) + + + + + __memset_avx512_unaligned_erms (4 samples, 0.96%) + + + + + __irqentry_text_end (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (100 samples, 24.04%) + + s4lib::readers::syslogprocessor::Syslo.. + + + s4lib::readers::blockreader::BlockReader::read_block (8 samples, 1.92%) + + s.. + + + s4lib::readers::blockreader::BlockReader::read_block_FileLz4 (8 samples, 1.92%) + + s.. + + + <lz4_flex::frame::decompress::FrameDecoder<R> as std::io::Read>::read (7 samples, 1.68%) + + + + + <twox_hash::thirty_two::XxHash32 as core::hash::Hasher>::write (2 samples, 0.48%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.24%) + + + + + _int_free (1 samples, 0.24%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::drop_data_try (3 samples, 0.72%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_data (3 samples, 0.72%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_sysline (3 samples, 0.72%) + + + + + s4lib::data::line::Line::get_boxptrs (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + chrono::format::parsed::Parsed::to_naive_date (1 samples, 0.24%) + + + + + chrono::format::parsed::Parsed::to_naive_datetime_with_offset (2 samples, 0.48%) + + + + + asm_sysvec_hyperv_stimer0 (1 samples, 0.24%) + + + + + sysvec_hyperv_stimer0 (1 samples, 0.24%) + + + + + irq_exit_rcu (1 samples, 0.24%) + + + + + __softirqentry_text_start (1 samples, 0.24%) + + + + + try_to_wake_up (1 samples, 0.24%) + + + + + _raw_spin_lock (1 samples, 0.24%) + + + + + s4lib::data::datetime::datetime_parse_from_str (4 samples, 0.96%) + + + + + chrono::naive::datetime::NaiveDateTime::parse_from_str (4 samples, 0.96%) + + + + + chrono::format::parse::parse_internal (2 samples, 0.48%) + + + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (1 samples, 0.24%) + + + + + regex_automata::util::captures::Captures::get_group_by_name (4 samples, 0.96%) + + + + + core::hash::BuildHasher::hash_one (4 samples, 0.96%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.24%) + + + + + regex_automata::meta::regex::Regex::create_captures (2 samples, 0.48%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + regex_automata::meta::strategy::Core::search_slots_nofail (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots_imp (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (3 samples, 0.72%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (4 samples, 0.96%) + + + + + regex_automata::hybrid::regex::Regex::try_search (1 samples, 0.24%) + + + + + regex_automata::hybrid::search::find_fwd (1 samples, 0.24%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (18 samples, 4.33%) + + s4lib.. + + + lru::LruCache<K,V,S>::put (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (22 samples, 5.29%) + + s4lib:.. + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (6 samples, 1.44%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::insert_sysline (8 samples, 1.92%) + + s.. + + + rangemap::map::RangeMap<K,V>::insert (8 samples, 1.92%) + + r.. + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::check_store (2 samples, 0.48%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (1 samples, 0.24%) + + + + + s4lib::readers::linereader::LineReader::get_linep (2 samples, 0.48%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.24%) + + + + + s4lib::readers::blockreader::BlockReader::read_block_FileLz4 (1 samples, 0.24%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.24%) + + + + + s4lib::readers::blockreader::BlockReader::read_block (2 samples, 0.48%) + + + + + s4lib::data::line::LinePart::new (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + lru::LruCache<K,V,S>::put (1 samples, 0.24%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (2 samples, 0.48%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (1 samples, 0.24%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::contains_key (2 samples, 0.48%) + + + + + s4lib::readers::linereader::LineReader::find_line (18 samples, 4.33%) + + s4lib.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_between_datetime_filters (51 samples, 12.26%) + + s4lib::readers::sy.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at_datetime_filter_linear_search (51 samples, 12.26%) + + s4lib::readers::sy.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_year (51 samples, 12.26%) + + s4lib::readers::sy.. + + + lru::LruCache<K,V,S>::put (1 samples, 0.24%) + + + + + std::sys::unix::futex::futex_wake (1 samples, 0.24%) + + + + + syscall (1 samples, 0.24%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + __x64_sys_futex (1 samples, 0.24%) + + + + + do_futex (1 samples, 0.24%) + + + + + futex_wake (1 samples, 0.24%) + + + + + crossbeam_channel::waker::SyncWaker::notify (2 samples, 0.48%) + + + + + __sched_yield (1 samples, 0.24%) + + + + + entry_SYSCALL_64 (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + clone3 (159 samples, 38.22%) + + clone3 + + + start_thread (159 samples, 38.22%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (159 samples, 38.22%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (159 samples, 38.22%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (159 samples, 38.22%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::exec_fileprocessor_thread (159 samples, 38.22%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (5 samples, 1.20%) + + + + + start_thread (1 samples, 0.24%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.24%) + + + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.24%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.24%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.24%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.24%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.24%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.24%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.24%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.24%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.24%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.24%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_group (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_group (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_capture_name (1 samples, 0.24%) + + + + + <alloc::string::String as core::clone::Clone>::clone (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.24%) + + + + + _int_free (1 samples, 0.24%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.48%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.48%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.48%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.48%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.48%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.48%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.48%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.48%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.48%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.48%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (2 samples, 0.48%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_bounded (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (8 samples, 1.92%) + + r.. + + + cfree@GLIBC_2.2.5 (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (14 samples, 3.37%) + + reg.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (16 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + handle_mm_fault (1 samples, 0.24%) + + + + + __handle_mm_fault (1 samples, 0.24%) + + + + + __alloc_pages (1 samples, 0.24%) + + + + + get_page_from_freelist (1 samples, 0.24%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.24%) + + + + + clear_page_erms (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (17 samples, 4.09%) + + rege.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (17 samples, 4.09%) + + <cor.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (17 samples, 4.09%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (17 samples, 4.09%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.24%) + + + + + regex_automata::meta::wrappers::OnePass::new (1 samples, 0.24%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (1 samples, 0.24%) + + + + + regex_automata::dfa::onepass::InternalBuilder::compile_transition (1 samples, 0.24%) + + + + + regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (1 samples, 0.24%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (3 samples, 0.72%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (3 samples, 0.72%) + + + + + alloc::vec::Vec<T,A>::retain_mut (3 samples, 0.72%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (3 samples, 0.72%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.72%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.72%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.24%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.24%) + + + + + regex_syntax::hir::Properties::literal (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (24 samples, 5.77%) + + s4lib::.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (24 samples, 5.77%) + + s4lib::.. + + + once_cell::imp::OnceCell<T>::initialize (24 samples, 5.77%) + + once_ce.. + + + once_cell::imp::initialize_or_wait (24 samples, 5.77%) + + once_ce.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (24 samples, 5.77%) + + once_ce.. + + + regex::regex::bytes::Regex::new (24 samples, 5.77%) + + regex::.. + + + regex::builders::Builder::build_one_bytes (24 samples, 5.77%) + + regex::.. + + + regex_automata::meta::regex::Builder::build (24 samples, 5.77%) + + regex_a.. + + + regex_automata::meta::strategy::new (24 samples, 5.77%) + + regex_a.. + + + regex_automata::meta::reverse_inner::extract (6 samples, 1.44%) + + + + + regex_automata::meta::reverse_inner::flatten (2 samples, 0.48%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (2 samples, 0.48%) + + + + + regex_automata::meta::reverse_inner::flatten (2 samples, 0.48%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::nfa::Inner::into_nfa (1 samples, 0.24%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.48%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.48%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.48%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.48%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.48%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.48%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.48%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.48%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.48%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.48%) + + + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.24%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.24%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + find_vma (1 samples, 0.24%) + + + + + vmacache_update (1 samples, 0.24%) + + + + + do_huge_pmd_anonymous_page (2 samples, 0.48%) + + + + + clear_huge_page (2 samples, 0.48%) + + + + + clear_subpage (2 samples, 0.48%) + + + + + clear_page_erms (2 samples, 0.48%) + + + + + do_user_addr_fault (6 samples, 1.44%) + + + + + handle_mm_fault (6 samples, 1.44%) + + + + + __handle_mm_fault (6 samples, 1.44%) + + + + + __alloc_pages (4 samples, 0.96%) + + + + + get_page_from_freelist (4 samples, 0.96%) + + + + + kernel_init_free_pages.part.0 (4 samples, 0.96%) + + + + + clear_page_erms (4 samples, 0.96%) + + + + + __memset_avx512_unaligned_erms (8 samples, 1.92%) + + _.. + + + asm_exc_page_fault (8 samples, 1.92%) + + a.. + + + exc_page_fault (8 samples, 1.92%) + + e.. + + + __memmove_avx512_unaligned_erms (2 samples, 0.48%) + + + + + s4lib::readers::blockreader::BlockReader::new (13 samples, 3.12%) + + s4l.. + + + <lz4_flex::frame::decompress::FrameDecoder<R> as std::io::Read>::read (12 samples, 2.88%) + + <l.. + + + <twox_hash::thirty_two::XxHash32 as core::hash::Hasher>::write (2 samples, 0.48%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.24%) + + + + + _int_free (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (6 samples, 1.44%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + malloc (2 samples, 0.48%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.72%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.72%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (5 samples, 1.20%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.48%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.48%) + + + + + __rdl_alloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::patch (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.24%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (14 samples, 3.37%) + + reg.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (14 samples, 3.37%) + + reg.. + + + cfree@GLIBC_2.2.5 (2 samples, 0.48%) + + + + + _int_free (2 samples, 0.48%) + + + + + malloc_consolidate (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (16 samples, 3.85%) + + rege.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (16 samples, 3.85%) + + <cor.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (16 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (16 samples, 3.85%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.48%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.48%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.48%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.48%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (19 samples, 4.57%) + + s4lib.. + + + once_cell::imp::OnceCell<T>::initialize (19 samples, 4.57%) + + once_.. + + + once_cell::imp::initialize_or_wait (19 samples, 4.57%) + + once_.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (19 samples, 4.57%) + + once_.. + + + regex::regex::bytes::Regex::new (19 samples, 4.57%) + + regex.. + + + regex::builders::Builder::build_one_bytes (19 samples, 4.57%) + + regex.. + + + regex_automata::meta::regex::Builder::build (19 samples, 4.57%) + + regex.. + + + regex_automata::meta::strategy::new (19 samples, 4.57%) + + regex.. + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.72%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.24%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.24%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + malloc_consolidate (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_open (1 samples, 0.24%) + + + + + regex_syntax::ast::parse::Parser::parse (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (2 samples, 0.48%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_class_open (2 samples, 0.48%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + malloc_consolidate (1 samples, 0.24%) + + + + + regex_automata::util::prefilter::suffixes (1 samples, 0.24%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.24%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.24%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.24%) + + + + + _int_free (1 samples, 0.24%) + + + + + regex_automata::util::prefilter::prefixes (2 samples, 0.48%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.48%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.48%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.48%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::new (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + handle_mm_fault (1 samples, 0.24%) + + + + + __handle_mm_fault (1 samples, 0.24%) + + + + + filemap_map_pages (1 samples, 0.24%) + + + + + next_uptodate_page (1 samples, 0.24%) + + + + + regex_syntax::hir::Hir::dot (1 samples, 0.24%) + + + + + regex_syntax::hir::ClassBytes::push (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::nfa::Inner::remap (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (6 samples, 1.44%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (5 samples, 1.20%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (3 samples, 0.72%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + malloc (2 samples, 0.48%) + + + + + _int_malloc (2 samples, 0.48%) + + + + + malloc_consolidate (2 samples, 0.48%) + + + + + __rust_dealloc (1 samples, 0.24%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (3 samples, 0.72%) + + + + + _int_free (1 samples, 0.24%) + + + + + s4::exec_fileprocessor_thread (20 samples, 4.81%) + + s4::ex.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (20 samples, 4.81%) + + s4lib:.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (20 samples, 4.81%) + + s4lib:.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (20 samples, 4.81%) + + s4lib:.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (20 samples, 4.81%) + + s4lib:.. + + + once_cell::imp::OnceCell<T>::initialize (20 samples, 4.81%) + + once_c.. + + + once_cell::imp::initialize_or_wait (20 samples, 4.81%) + + once_c.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (20 samples, 4.81%) + + once_c.. + + + regex::regex::bytes::Regex::new (20 samples, 4.81%) + + regex:.. + + + regex::builders::Builder::build_one_bytes (20 samples, 4.81%) + + regex:.. + + + regex_automata::meta::regex::Builder::build (20 samples, 4.81%) + + regex_.. + + + regex_automata::meta::strategy::new (18 samples, 4.33%) + + regex.. + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (6 samples, 1.44%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.72%) + + + + + aho_corasick::util::alphabet::ByteClassSet::set_range (1 samples, 0.24%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (1 samples, 0.24%) + + + + + aho_corasick::util::remapper::Remapper::remap (1 samples, 0.24%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (1 samples, 0.24%) + + + + + regex_automata::meta::strategy::new (3 samples, 0.72%) + + + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.72%) + + + + + regex_automata::util::prefilter::Choice::new (3 samples, 0.72%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (3 samples, 0.72%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (3 samples, 0.72%) + + + + + regex_automata::util::prefilter::Prefilter::new (1 samples, 0.24%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.24%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (1 samples, 0.24%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.24%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (1 samples, 0.24%) + + + + + aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<1_usize>::new_unchecked (1 samples, 0.24%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (1 samples, 0.24%) + + + + + alloc::vec::from_elem (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + sysmalloc (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + find_vma (1 samples, 0.24%) + + + + + vmacache_find (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (2 samples, 0.48%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (2 samples, 0.48%) + + + + + alloc::vec::Vec<T,A>::extend_with (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.96%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.96%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (1 samples, 0.24%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (3 samples, 0.72%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (3 samples, 0.72%) + + + + + regex_automata::meta::regex::Builder::build (9 samples, 2.16%) + + r.. + + + regex_automata::meta::strategy::new (9 samples, 2.16%) + + r.. + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.96%) + + + + + regex_automata::util::prefilter::Choice::new (4 samples, 0.96%) + + + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.24%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.24%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.24%) + + + + + aho_corasick::dfa::DFA::set_matches (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.48%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.48%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.48%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.48%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_exactly (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.24%) + + + + + <regex_syntax::hir::ClassUnicodeIter as core::iter::traits::iterator::Iterator>::next (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (3 samples, 0.72%) + + + + + malloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + sysmalloc (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + handle_mm_fault (1 samples, 0.24%) + + + + + __handle_mm_fault (1 samples, 0.24%) + + + + + __alloc_pages (1 samples, 0.24%) + + + + + get_page_from_freelist (1 samples, 0.24%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.24%) + + + + + clear_page_erms (1 samples, 0.24%) + + + + + __mem_cgroup_charge (1 samples, 0.24%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.24%) + + + + + rmqueue_bulk (1 samples, 0.24%) + + + + + __list_del_entry_valid (1 samples, 0.24%) + + + + + __alloc_pages (4 samples, 0.96%) + + + + + get_page_from_freelist (4 samples, 0.96%) + + + + + kernel_init_free_pages.part.0 (3 samples, 0.72%) + + + + + clear_page_erms (3 samples, 0.72%) + + + + + handle_mm_fault (6 samples, 1.44%) + + + + + __handle_mm_fault (6 samples, 1.44%) + + + + + vmacache_find (1 samples, 0.24%) + + + + + asm_exc_page_fault (8 samples, 1.92%) + + a.. + + + exc_page_fault (8 samples, 1.92%) + + e.. + + + do_user_addr_fault (8 samples, 1.92%) + + d.. + + + find_vma (2 samples, 0.48%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (15 samples, 3.61%) + + rege.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (15 samples, 3.61%) + + <T a.. + + + alloc::vec::Vec<T,A>::extend_with (14 samples, 3.37%) + + all.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (16 samples, 3.85%) + + rege.. + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + malloc (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (20 samples, 4.81%) + + regex_.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (20 samples, 4.81%) + + regex_.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + __handle_mm_fault (1 samples, 0.24%) + + + + + page_add_new_anon_rmap (1 samples, 0.24%) + + + + + asm_exc_page_fault (2 samples, 0.48%) + + + + + exc_page_fault (2 samples, 0.48%) + + + + + do_user_addr_fault (2 samples, 0.48%) + + + + + handle_mm_fault (2 samples, 0.48%) + + + + + __memmove_avx512_unaligned_erms (4 samples, 0.96%) + + + + + regex::builders::Builder::build_one_bytes (35 samples, 8.41%) + + regex::build.. + + + regex_automata::meta::regex::Builder::build (35 samples, 8.41%) + + regex_automa.. + + + regex_automata::meta::strategy::new (35 samples, 8.41%) + + regex_automa.. + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (35 samples, 8.41%) + + regex_automa.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (35 samples, 8.41%) + + <core::iter:.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (35 samples, 8.41%) + + regex_automa.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (35 samples, 8.41%) + + regex_automa.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (35 samples, 8.41%) + + regex_automa.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (35 samples, 8.41%) + + regex_automa.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (11 samples, 2.64%) + + re.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (11 samples, 2.64%) + + re.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (11 samples, 2.64%) + + re.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (11 samples, 2.64%) + + <T.. + + + alloc::vec::Vec<T,A>::extend_with (11 samples, 2.64%) + + al.. + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.48%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + _int_malloc (1 samples, 0.24%) + + + + + once_cell::imp::initialize_or_wait (3 samples, 0.72%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (3 samples, 0.72%) + + + + + regex::regex::bytes::Regex::new (3 samples, 0.72%) + + + + + regex::builders::Builder::build_one_bytes (3 samples, 0.72%) + + + + + regex_automata::meta::regex::Builder::build (3 samples, 0.72%) + + + + + regex_automata::meta::strategy::new (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (3 samples, 0.72%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.24%) + + + + + regex_syntax::utf8::Utf8Sequence::as_slice (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.24%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.24%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.24%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.24%) + + + + + realloc (1 samples, 0.24%) + + + + + _int_realloc (1 samples, 0.24%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.24%) + + + + + asm_exc_page_fault (1 samples, 0.24%) + + + + + exc_page_fault (1 samples, 0.24%) + + + + + do_user_addr_fault (1 samples, 0.24%) + + + + + handle_mm_fault (1 samples, 0.24%) + + + + + __handle_mm_fault (1 samples, 0.24%) + + + + + __mem_cgroup_charge (1 samples, 0.24%) + + + + + charge_memcg (1 samples, 0.24%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.24%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.24%) + + + + + gen-1000-3-foob (295 samples, 70.91%) + + gen-1000-3-foob + + + [unknown] (136 samples, 32.69%) + + [unknown] + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (3 samples, 0.72%) + + + + + regex::regex::bytes::Regex::new (3 samples, 0.72%) + + + + + regex::builders::Builder::build_one_bytes (3 samples, 0.72%) + + + + + regex_automata::meta::regex::Builder::build (3 samples, 0.72%) + + + + + regex_automata::meta::strategy::new (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (3 samples, 0.72%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.72%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.48%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.48%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.48%) + + + + + realloc (2 samples, 0.48%) + + + + + _int_realloc (2 samples, 0.48%) + + + + + _int_malloc (2 samples, 0.48%) + + + + + malloc_consolidate (2 samples, 0.48%) + + + + + all (416 samples, 100%) + + + + + ctrl-c (1 samples, 0.24%) + + + + + clone3 (1 samples, 0.24%) + + + + + start_thread (1 samples, 0.24%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.24%) + + + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.24%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.24%) + + + + + nix::unistd::read (1 samples, 0.24%) + + + + + read (1 samples, 0.24%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.24%) + + + + + do_syscall_64 (1 samples, 0.24%) + + + + + syscall_exit_to_user_mode (1 samples, 0.24%) + + + + + exit_to_user_mode_prepare (1 samples, 0.24%) + + + + + arch_do_signal_or_restart (1 samples, 0.24%) + + + + + get_signal (1 samples, 0.24%) + + + + + do_group_exit (1 samples, 0.24%) + + + + + do_exit (1 samples, 0.24%) + + + + + acct_collect (1 samples, 0.24%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog-no-matches.svg b/releases/0.7.75/flamegraph-syslog-no-matches.svg new file mode 100644 index 00000000..3fb1f088 --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-no-matches.svg @@ -0,0 +1,6422 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231113-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/numbers3.log + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 3.59%) + + ret_.. + + + schedule_tail (22 samples, 3.59%) + + sche.. + + + finish_task_switch.isra.0 (22 samples, 3.59%) + + fini.. + + + __perf_event_task_sched_in (22 samples, 3.59%) + + __pe.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 3.59%) + + __ra.. + + + __list_del_entry_valid (2 samples, 0.33%) + + + + + __free_one_page (3 samples, 0.49%) + + + + + free_pcppages_bulk (6 samples, 0.98%) + + + + + free_unref_page_list (7 samples, 1.14%) + + + + + __mem_cgroup_uncharge_list (1 samples, 0.16%) + + + + + uncharge_page (1 samples, 0.16%) + + + + + release_pages (10 samples, 1.63%) + + + + + tlb_flush_mmu (11 samples, 1.79%) + + t.. + + + free_pages_and_swap_cache (1 samples, 0.16%) + + + + + free_swap_cache (1 samples, 0.16%) + + + + + cgroup_rstat_updated (3 samples, 0.49%) + + + + + __mod_memcg_lruvec_state (5 samples, 0.82%) + + + + + __mod_lruvec_page_state (6 samples, 0.98%) + + + + + __mod_lruvec_state (1 samples, 0.16%) + + + + + __mod_node_page_state (1 samples, 0.16%) + + + + + page_remove_rmap (7 samples, 1.14%) + + + + + __tlb_remove_page_size (1 samples, 0.16%) + + + + + unmap_vmas (20 samples, 3.26%) + + unm.. + + + unmap_page_range (20 samples, 3.26%) + + unm.. + + + mmput (21 samples, 3.43%) + + mmp.. + + + exit_mmap (21 samples, 3.43%) + + exi.. + + + tlb_finish_mmu (1 samples, 0.16%) + + + + + release_pages (1 samples, 0.16%) + + + + + __x64_sys_exit_group (22 samples, 3.59%) + + __x6.. + + + do_group_exit (22 samples, 3.59%) + + do_g.. + + + do_exit (22 samples, 3.59%) + + do_e.. + + + mm_update_next_owner (1 samples, 0.16%) + + + + + setup_new_exec (1 samples, 0.16%) + + + + + arch_pick_mmap_layout (1 samples, 0.16%) + + + + + get_random_u64 (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (24 samples, 3.92%) + + entr.. + + + do_syscall_64 (24 samples, 3.92%) + + do_s.. + + + __x64_sys_execve (2 samples, 0.33%) + + + + + do_execveat_common.isra.0 (2 samples, 0.33%) + + + + + bprm_execve (2 samples, 0.33%) + + + + + load_elf_binary (2 samples, 0.33%) + + + + + __clear_user (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + __mmap (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + vm_mmap_pgoff (1 samples, 0.16%) + + + + + do_mmap (1 samples, 0.16%) + + + + + mmap_region (1 samples, 0.16%) + + + + + perf_event_mmap (1 samples, 0.16%) + + + + + perf_iterate_sb (1 samples, 0.16%) + + + + + perf_event_mmap_output (1 samples, 0.16%) + + + + + start_thread (2 samples, 0.33%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.33%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.33%) + + + + + __GI___sigaltstack (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __x64_sys_sigaltstack (1 samples, 0.16%) + + + + + _copy_from_user (1 samples, 0.16%) + + + + + copy_user_generic_unrolled (1 samples, 0.16%) + + + + + clone3 (3 samples, 0.49%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __do_sys_clone3 (1 samples, 0.16%) + + + + + kernel_clone (1 samples, 0.16%) + + + + + copy_process (1 samples, 0.16%) + + + + + perf_event_init_task (1 samples, 0.16%) + + + + + inherit_task_group.isra.0 (1 samples, 0.16%) + + + + + inherit_event.constprop.0 (1 samples, 0.16%) + + + + + perf_event_alloc (1 samples, 0.16%) + + + + + perf_try_init_event (1 samples, 0.16%) + + + + + x86_pmu_event_init (1 samples, 0.16%) + + + + + allocate_fake_cpuc (1 samples, 0.16%) + + + + + kmem_cache_alloc_trace (1 samples, 0.16%) + + + + + memset_erms (1 samples, 0.16%) + + + + + irqentry_enter (1 samples, 0.16%) + + + + + srso_alias_return_thunk (1 samples, 0.16%) + + + + + srso_alias_safe_ret (1 samples, 0.16%) + + + + + asm_exc_page_fault (2 samples, 0.33%) + + + + + exc_page_fault (2 samples, 0.33%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + wp_page_copy (1 samples, 0.16%) + + + + + copy_mc_enhanced_fast_string (1 samples, 0.16%) + + + + + _dl_relocate_object (3 samples, 0.49%) + + + + + _dl_receive_error (1 samples, 0.16%) + + + + + version_check_doit (1 samples, 0.16%) + + + + + _dl_check_all_versions (1 samples, 0.16%) + + + + + _dl_check_map_versions (1 samples, 0.16%) + + + + + _dl_name_match_p (1 samples, 0.16%) + + + + + strcmp (1 samples, 0.16%) + + + + + _dl_sysdep_start (5 samples, 0.82%) + + + + + dl_main (5 samples, 0.82%) + + + + + _dl_map_object_deps (1 samples, 0.16%) + + + + + _dl_catch_exception (1 samples, 0.16%) + + + + + openaux (1 samples, 0.16%) + + + + + _dl_map_object (1 samples, 0.16%) + + + + + _dl_map_object_from_fd (1 samples, 0.16%) + + + + + _dl_start (6 samples, 0.98%) + + + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.16%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.16%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.16%) + + + + + clap_builder::parser::parser::Parser::add_defaults (1 samples, 0.16%) + + + + + clap_builder::parser::parser::Parser::react (1 samples, 0.16%) + + + + + clap_builder::parser::parser::Parser::start_custom_arg (1 samples, 0.16%) + + + + + clap_builder::parser::matches::matched_arg::MatchedArg::new_val_group (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + std::rt::lang_start::_{{closure}} (2 samples, 0.33%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 0.33%) + + + + + s4::main (2 samples, 0.33%) + + + + + <clap_builder::builder::str::Str as core::convert::From<&str>>::from (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + filemap_map_pages (1 samples, 0.16%) + + + + + next_uptodate_page (1 samples, 0.16%) + + + + + s4 (58 samples, 9.46%) + + s4 + + + _start (9 samples, 1.47%) + + + + + __libc_start_main@@GLIBC_2.34 (3 samples, 0.49%) + + + + + __libc_start_call_main (3 samples, 0.49%) + + + + + main (3 samples, 0.49%) + + + + + std::rt::lang_start_internal (3 samples, 0.49%) + + + + + __poll (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __x64_sys_poll (1 samples, 0.16%) + + + + + do_sys_poll (1 samples, 0.16%) + + + + + tty_poll (1 samples, 0.16%) + + + + + perf-exec (14 samples, 2.28%) + + p.. + + + entry_SYSCALL_64_after_hwframe (14 samples, 2.28%) + + e.. + + + do_syscall_64 (14 samples, 2.28%) + + d.. + + + __x64_sys_execve (14 samples, 2.28%) + + _.. + + + do_execveat_common.isra.0 (14 samples, 2.28%) + + d.. + + + bprm_execve (14 samples, 2.28%) + + b.. + + + load_elf_binary (14 samples, 2.28%) + + l.. + + + begin_new_exec (14 samples, 2.28%) + + b.. + + + perf_event_exec (14 samples, 2.28%) + + p.. + + + x86_pmu_enable_all (14 samples, 2.28%) + + x.. + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + malloc_consolidate (2 samples, 0.33%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.49%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.49%) + + + + + malloc (3 samples, 0.49%) + + + + + _int_malloc (3 samples, 0.49%) + + + + + asm_exc_page_fault (2 samples, 0.33%) + + + + + exc_page_fault (2 samples, 0.33%) + + + + + do_user_addr_fault (2 samples, 0.33%) + + + + + handle_mm_fault (2 samples, 0.33%) + + + + + __handle_mm_fault (2 samples, 0.33%) + + + + + __alloc_pages (2 samples, 0.33%) + + + + + get_page_from_freelist (2 samples, 0.33%) + + + + + kernel_init_free_pages.part.0 (2 samples, 0.33%) + + + + + clear_page_erms (2 samples, 0.33%) + + + + + __memset_avx512_unaligned_erms (4 samples, 0.65%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (8 samples, 1.31%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (8 samples, 1.31%) + + + + + regex_automata::hybrid::dfa::Lazy::set_transition (1 samples, 0.16%) + + + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (10 samples, 1.63%) + + + + + regex_automata::hybrid::dfa::Cache::new (2 samples, 0.33%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (2 samples, 0.33%) + + + + + hashbrown::map::HashMap<K,V,S,A>::insert (1 samples, 0.16%) + + + + + unlink_chunk.constprop.0 (3 samples, 0.49%) + + + + + malloc_consolidate (7 samples, 1.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (8 samples, 1.31%) + + + + + alloc::raw_vec::finish_grow (8 samples, 1.31%) + + + + + malloc (8 samples, 1.31%) + + + + + _int_malloc (8 samples, 1.31%) + + + + + rmqueue_bulk (1 samples, 0.16%) + + + + + __list_del_entry_valid (1 samples, 0.16%) + + + + + do_user_addr_fault (3 samples, 0.49%) + + + + + handle_mm_fault (3 samples, 0.49%) + + + + + __handle_mm_fault (3 samples, 0.49%) + + + + + __alloc_pages (3 samples, 0.49%) + + + + + get_page_from_freelist (3 samples, 0.49%) + + + + + kernel_init_free_pages.part.0 (2 samples, 0.33%) + + + + + clear_page_erms (2 samples, 0.33%) + + + + + asm_exc_page_fault (6 samples, 0.98%) + + + + + exc_page_fault (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (15 samples, 2.45%) + + re.. + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (15 samples, 2.45%) + + re.. + + + __memset_avx512_unaligned_erms (7 samples, 1.14%) + + + + + regex_automata::hybrid::dfa::Lazy::set_transition (1 samples, 0.16%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (27 samples, 4.40%) + + regex.. + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (27 samples, 4.40%) + + regex.. + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (17 samples, 2.77%) + + <r.. + + + regex_automata::hybrid::dfa::Cache::new (2 samples, 0.33%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (2 samples, 0.33%) + + + + + hashbrown::map::HashMap<K,V,S,A>::insert (1 samples, 0.16%) + + + + + hashbrown::raw::RawTable<T,A>::insert (1 samples, 0.16%) + + + + + hashbrown::raw::RawTable<T,A>::reserve_rehash (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + regex_automata::meta::regex::Regex::create_captures (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + regex_automata::meta::regex::Builder::syntax (1 samples, 0.16%) + + + + + regex_automata::meta::regex::Builder::configure (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + filemap_map_pages (1 samples, 0.16%) + + + + + do_set_pte (1 samples, 0.16%) + + + + + page_add_file_rmap (1 samples, 0.16%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + __mem_cgroup_charge (1 samples, 0.16%) + + + + + charge_memcg (1 samples, 0.16%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + regex_syntax::hir::translate::TranslatorI::push (8 samples, 1.31%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (9 samples, 1.47%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.33%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (2 samples, 0.33%) + + + + + regex_syntax::hir::Hir::literal (4 samples, 0.65%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + regex_syntax::hir::Hir::into_parts (3 samples, 0.49%) + + + + + malloc (3 samples, 0.49%) + + + + + malloc (1 samples, 0.16%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.49%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + sysmalloc (1 samples, 0.16%) + + + + + __mprotect (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __x64_sys_mprotect (1 samples, 0.16%) + + + + + do_mprotect_pkey (1 samples, 0.16%) + + + + + mprotect_fixup (1 samples, 0.16%) + + + + + perf_event_mmap (1 samples, 0.16%) + + + + + perf_iterate_sb (1 samples, 0.16%) + + + + + perf_iterate_ctx (1 samples, 0.16%) + + + + + perf_event_mmap_output (1 samples, 0.16%) + + + + + perf_output_copy (1 samples, 0.16%) + + + + + memcpy_erms (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.33%) + + + + + regex_syntax::hir::Hir::concat (18 samples, 2.94%) + + re.. + + + malloc (2 samples, 0.33%) + + + + + regex_syntax::hir::Properties::class (3 samples, 0.49%) + + + + + regex_syntax::hir::ClassUnicode::literal (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::class (5 samples, 0.82%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.16%) + + + + + _int_free (1 samples, 0.16%) + + + + + regex_syntax::hir::Properties::alternation (2 samples, 0.33%) + + + + + regex_syntax::hir::Hir::into_parts (2 samples, 0.33%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + sysmalloc (1 samples, 0.16%) + + + + + __mprotect (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __x64_sys_mprotect (1 samples, 0.16%) + + + + + do_mprotect_pkey (1 samples, 0.16%) + + + + + mprotect_fixup (1 samples, 0.16%) + + + + + perf_event_mmap (1 samples, 0.16%) + + + + + perf_iterate_sb (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::alternation (8 samples, 1.31%) + + + + + regex_syntax::hir::ClassUnicode::try_case_fold_simple (1 samples, 0.16%) + + + + + <regex_syntax::hir::ClassUnicodeRange as regex_syntax::hir::interval::Interval>::case_fold_simple (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + regex_syntax::hir::ClassUnicode::new (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,alloc::vec::into_iter::IntoIter<T>>>::from_iter (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + core::str::converts::from_utf8 (1 samples, 0.16%) + + + + + core::ptr::drop_in_place<regex_syntax::hir::translate::HirFrame> (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + __alloc_pages (1 samples, 0.16%) + + + + + get_page_from_freelist (1 samples, 0.16%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.16%) + + + + + clear_page_erms (1 samples, 0.16%) + + + + + realloc (4 samples, 0.65%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (5 samples, 0.82%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (64 samples, 10.44%) + + <regex_syntax::.. + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre (1 samples, 0.16%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (2 samples, 0.33%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.33%) + + + + + regex_syntax::hir::translate::Translator::translate (82 samples, 13.38%) + + regex_syntax::hir::t.. + + + regex_syntax::ast::visitor::visit (82 samples, 13.38%) + + regex_syntax::ast::v.. + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (3 samples, 0.49%) + + + + + regex_syntax::ast::visitor::visit (6 samples, 0.98%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_capture_name (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.16%) + + + + + core::str::count::char_count_general_case (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_group (5 samples, 0.82%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_group (5 samples, 0.82%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + malloc (3 samples, 0.49%) + + + + + regex_syntax::ast::Concat::into_ast (5 samples, 0.82%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.49%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (10 samples, 1.63%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_group (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_uncounted_repetition (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::maybe_parse_ascii_class (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.16%) + + + + + regex_syntax::ast::ClassSetUnion::push (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (5 samples, 0.82%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_counted_repetition (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (4 samples, 0.65%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.16%) + + + + + _int_malloc (7 samples, 1.14%) + + + + + malloc (8 samples, 1.31%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + malloc (2 samples, 0.33%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.65%) + + + + + __rdl_alloc (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (5 samples, 0.82%) + + + + + regex_syntax::ast::parse::Parser::parse (61 samples, 9.95%) + + regex_syntax::.. + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (61 samples, 9.95%) + + regex_syntax::.. + + + regex_automata::meta::strategy::new (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + regex_automata::meta::regex::RegexInfo::new (1 samples, 0.16%) + + + + + regex_syntax::hir::Properties::union (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + unlink_chunk.constprop.0 (3 samples, 0.49%) + + + + + malloc_consolidate (8 samples, 1.31%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (10 samples, 1.63%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (10 samples, 1.63%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (9 samples, 1.47%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (9 samples, 1.47%) + + + + + alloc::raw_vec::finish_grow (9 samples, 1.47%) + + + + + realloc (9 samples, 1.47%) + + + + + _int_realloc (9 samples, 1.47%) + + + + + _int_malloc (9 samples, 1.47%) + + + + + cfree@GLIBC_2.2.5 (4 samples, 0.65%) + + + + + _int_free (4 samples, 0.65%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (15 samples, 2.45%) + + co.. + + + _int_free (7 samples, 1.14%) + + + + + cfree@GLIBC_2.2.5 (9 samples, 1.47%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.49%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.49%) + + + + + realloc (3 samples, 0.49%) + + + + + _int_realloc (3 samples, 0.49%) + + + + + _int_malloc (3 samples, 0.49%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (5 samples, 0.82%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (30 samples, 4.89%) + + core::.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (30 samples, 4.89%) + + <regex.. + + + malloc (1 samples, 0.16%) + + + + + core::ptr::drop_in_place<regex_syntax::hir::HirKind> (1 samples, 0.16%) + + + + + _int_free (6 samples, 0.98%) + + + + + cfree@GLIBC_2.2.5 (7 samples, 1.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.33%) + + + + + regex::builders::Builder::build_one_bytes (189 samples, 30.83%) + + regex::builders::Builder::build_one_bytes + + + regex_automata::meta::regex::Builder::build (187 samples, 30.51%) + + regex_automata::meta::regex::Builder::build + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (12 samples, 1.96%) + + <.. + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (12 samples, 1.96%) + + <.. + + + once_cell::imp::OnceCell<T>::initialize (190 samples, 31.00%) + + once_cell::imp::OnceCell<T>::initialize + + + once_cell::imp::initialize_or_wait (190 samples, 31.00%) + + once_cell::imp::initialize_or_wait + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (190 samples, 31.00%) + + once_cell::imp::OnceCell<T>::initialize::_{{closur.. + + + regex::regex::bytes::Regex::new (190 samples, 31.00%) + + regex::regex::bytes::Regex::new + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.16%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (219 samples, 35.73%) + + s4lib::readers::syslogprocessor::SyslogProcessor::process_.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (219 samples, 35.73%) + + s4lib::readers::syslinereader::SyslineReader::find_sysline.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (219 samples, 35.73%) + + s4lib::readers::syslinereader::SyslineReader::parse_dateti.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (219 samples, 35.73%) + + s4lib::data::datetime::bytes_to_regex_to_datetime + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (1 samples, 0.16%) + + + + + regex_automata::hybrid::regex::Regex::try_search (1 samples, 0.16%) + + + + + regex_automata::hybrid::search::find_fwd (1 samples, 0.16%) + + + + + regex_automata::hybrid::dfa::Lazy::cache_start_group (1 samples, 0.16%) + + + + + regex_automata::util::determinize::add_nfa_states (1 samples, 0.16%) + + + + + clone3 (220 samples, 35.89%) + + clone3 + + + start_thread (220 samples, 35.89%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (220 samples, 35.89%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (220 samples, 35.89%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (220 samples, 35.89%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::exec_fileprocessor_thread (220 samples, 35.89%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (1 samples, 0.16%) + + + + + crossbeam_channel::waker::SyncWaker::notify (1 samples, 0.16%) + + + + + std::sys::unix::futex::futex_wake (1 samples, 0.16%) + + + + + syscall (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __x64_sys_futex (1 samples, 0.16%) + + + + + do_futex (1 samples, 0.16%) + + + + + futex_wake (1 samples, 0.16%) + + + + + mark_wake_futex (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (3 samples, 0.49%) + + + + + s4::exec_fileprocessor_thread (3 samples, 0.49%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (3 samples, 0.49%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (3 samples, 0.49%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (3 samples, 0.49%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (3 samples, 0.49%) + + + + + once_cell::imp::OnceCell<T>::initialize (3 samples, 0.49%) + + + + + once_cell::imp::initialize_or_wait (3 samples, 0.49%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (3 samples, 0.49%) + + + + + regex::regex::bytes::Regex::new (3 samples, 0.49%) + + + + + regex::builders::Builder::build_one_bytes (3 samples, 0.49%) + + + + + regex_automata::meta::regex::Builder::build (3 samples, 0.49%) + + + + + regex_syntax::ast::parse::Parser::parse (3 samples, 0.49%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (3 samples, 0.49%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (3 samples, 0.49%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class (3 samples, 0.49%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.16%) + + + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.16%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.16%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.16%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.16%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.16%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.16%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.16%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.16%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.16%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.16%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.16%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.16%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::suffixes (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::prefixes (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + regex_automata::util::captures::GroupInfo::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (5 samples, 0.82%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (5 samples, 0.82%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.33%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.33%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (8 samples, 1.31%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (8 samples, 1.31%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (8 samples, 1.31%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (8 samples, 1.31%) + + + + + once_cell::imp::OnceCell<T>::initialize (8 samples, 1.31%) + + + + + once_cell::imp::initialize_or_wait (8 samples, 1.31%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (8 samples, 1.31%) + + + + + regex::regex::bytes::Regex::new (8 samples, 1.31%) + + + + + regex::builders::Builder::build_one_bytes (8 samples, 1.31%) + + + + + regex_automata::meta::regex::Builder::build (8 samples, 1.31%) + + + + + regex_automata::meta::strategy::new (8 samples, 1.31%) + + + + + regex_automata::meta::wrappers::PikeVM::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::range_trie::RangeTrie::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::range_trie::RangeTrie::add_empty (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (8 samples, 1.31%) + + + + + _int_free (2 samples, 0.33%) + + + + + cfree@GLIBC_2.2.5 (4 samples, 0.65%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (13 samples, 2.12%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (13 samples, 2.12%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (14 samples, 2.28%) + + r.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (14 samples, 2.28%) + + <.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (14 samples, 2.28%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (14 samples, 2.28%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.16%) + + + + + regex_automata::dfa::onepass::InternalBuilder::stack_push (1 samples, 0.16%) + + + + + regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (3 samples, 0.49%) + + + + + regex_automata::meta::wrappers::OnePass::new (5 samples, 0.82%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (5 samples, 0.82%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + realloc (3 samples, 0.49%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.65%) + + + + + malloc (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (5 samples, 0.82%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.33%) + + + + + malloc (2 samples, 0.33%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.49%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (15 samples, 2.45%) + + re.. + + + regex_syntax::hir::literal::PreferenceTrie::minimize (15 samples, 2.45%) + + re.. + + + alloc::vec::Vec<T,A>::retain_mut (15 samples, 2.45%) + + al.. + + + regex_syntax::hir::literal::PreferenceTrie::insert (15 samples, 2.45%) + + re.. + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.16%) + + + + + __memcmp_evex_movbe (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::concat (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::into_parts (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::into_parts (3 samples, 0.49%) + + + + + regex_syntax::hir::Hir::alternation (4 samples, 0.65%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (41 samples, 6.69%) + + s4lib::re.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (41 samples, 6.69%) + + s4lib::da.. + + + once_cell::imp::OnceCell<T>::initialize (41 samples, 6.69%) + + once_cell.. + + + once_cell::imp::initialize_or_wait (41 samples, 6.69%) + + once_cell.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (41 samples, 6.69%) + + once_cell.. + + + regex::regex::bytes::Regex::new (41 samples, 6.69%) + + regex::re.. + + + regex::builders::Builder::build_one_bytes (41 samples, 6.69%) + + regex::bu.. + + + regex_automata::meta::regex::Builder::build (41 samples, 6.69%) + + regex_aut.. + + + regex_automata::meta::strategy::new (41 samples, 6.69%) + + regex_aut.. + + + regex_automata::meta::reverse_inner::extract (22 samples, 3.59%) + + rege.. + + + regex_automata::meta::reverse_inner::flatten (5 samples, 0.82%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.16%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.16%) + + + + + regex_syntax::hir::Properties::literal (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + regex_automata::util::captures::GroupInfoInner::add_first_group (2 samples, 0.33%) + + + + + regex_automata::util::captures::GroupInfo::new (3 samples, 0.49%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.65%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (4 samples, 0.65%) + + + + + regex_automata::nfa::thompson::nfa::Inner::into_nfa (1 samples, 0.16%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.16%) + + + + + <regex_syntax::hir::literal::Literal as core::convert::AsRef<[u8]>>::as_ref (1 samples, 0.16%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (8 samples, 1.31%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (8 samples, 1.31%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (8 samples, 1.31%) + + + + + once_cell::imp::OnceCell<T>::initialize (8 samples, 1.31%) + + + + + once_cell::imp::initialize_or_wait (8 samples, 1.31%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (8 samples, 1.31%) + + + + + regex::regex::bytes::Regex::new (8 samples, 1.31%) + + + + + regex::builders::Builder::build_one_bytes (8 samples, 1.31%) + + + + + regex_automata::meta::regex::Builder::build (8 samples, 1.31%) + + + + + regex_automata::meta::strategy::new (8 samples, 1.31%) + + + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.65%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (2 samples, 0.33%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.33%) + + + + + _int_free (2 samples, 0.33%) + + + + + s4lib::readers::blockreader::BlockReader::new (1 samples, 0.16%) + + + + + std::fs::OpenOptions::_open (1 samples, 0.16%) + + + + + core::ffi::c_str::CStr::from_bytes_with_nul (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + __cgroup_throttle_swaprate (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (4 samples, 0.65%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.16%) + + + + + _int_free (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.33%) + + + + + malloc (2 samples, 0.33%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.49%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (19 samples, 3.10%) + + reg.. + + + _int_malloc (10 samples, 1.63%) + + + + + malloc (12 samples, 1.96%) + + m.. + + + alloc::raw_vec::finish_grow (13 samples, 2.12%) + + a.. + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (15 samples, 2.45%) + + al.. + + + _int_free (1 samples, 0.16%) + + + + + realloc (2 samples, 0.33%) + + + + + _int_realloc (2 samples, 0.33%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + _int_malloc (3 samples, 0.49%) + + + + + malloc (4 samples, 0.65%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (22 samples, 3.59%) + + rege.. + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (7 samples, 1.14%) + + + + + alloc::raw_vec::finish_grow (7 samples, 1.14%) + + + + + __rdl_alloc (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::patch (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (3 samples, 0.49%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (48 samples, 7.83%) + + regex_autom.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (48 samples, 7.83%) + + regex_autom.. + + + cfree@GLIBC_2.2.5 (4 samples, 0.65%) + + + + + _int_free (4 samples, 0.65%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (49 samples, 7.99%) + + regex_autom.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (49 samples, 7.99%) + + <core::iter.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (49 samples, 7.99%) + + regex_autom.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (49 samples, 7.99%) + + regex_autom.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (3 samples, 0.49%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (3 samples, 0.49%) + + + + + alloc::vec::Vec<T,A>::retain_mut (3 samples, 0.49%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (3 samples, 0.49%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.33%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.33%) + + + + + realloc (2 samples, 0.33%) + + + + + _int_realloc (2 samples, 0.33%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (4 samples, 0.65%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.49%) + + + + + malloc (2 samples, 0.33%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::memmem::Memmem::new (1 samples, 0.16%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.16%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::concat (1 samples, 0.16%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.16%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (59 samples, 9.62%) + + s4lib::data::d.. + + + once_cell::imp::OnceCell<T>::initialize (59 samples, 9.62%) + + once_cell::imp.. + + + once_cell::imp::initialize_or_wait (59 samples, 9.62%) + + once_cell::imp.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (59 samples, 9.62%) + + once_cell::imp.. + + + regex::regex::bytes::Regex::new (59 samples, 9.62%) + + regex::regex::.. + + + regex::builders::Builder::build_one_bytes (59 samples, 9.62%) + + regex::builder.. + + + regex_automata::meta::regex::Builder::build (59 samples, 9.62%) + + regex_automata.. + + + regex_automata::meta::strategy::new (59 samples, 9.62%) + + regex_automata.. + + + regex_automata::meta::reverse_inner::extract (10 samples, 1.63%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_class_open (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class_op (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::Parser::parse (4 samples, 0.65%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (4 samples, 0.65%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (4 samples, 0.65%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (2 samples, 0.33%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_escape (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.16%) + + + + + __memcmp_evex_movbe (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::suffixes (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.33%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.16%) + + + + + __memcmp_evex_movbe (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.33%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.16%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.16%) + + + + + _int_free (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::prefixes (5 samples, 0.82%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.49%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::nfa::Inner::remap (3 samples, 0.49%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + lru_cache_add (1 samples, 0.16%) + + + + + __pagevec_lru_add (1 samples, 0.16%) + + + + + release_pages (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (11 samples, 1.79%) + + r.. + + + _int_malloc (1 samples, 0.16%) + + + + + malloc (2 samples, 0.33%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (22 samples, 3.59%) + + rege.. + + + regex_automata::nfa::thompson::builder::Builder::build (22 samples, 3.59%) + + rege.. + + + regex_automata::meta::wrappers::OnePass::new (1 samples, 0.16%) + + + + + regex_automata::meta::wrappers::BoundedBacktracker::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::new (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + malloc (2 samples, 0.33%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.33%) + + + + + _int_free (2 samples, 0.33%) + + + + + malloc_consolidate (2 samples, 0.33%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (5 samples, 0.82%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + malloc_consolidate (2 samples, 0.33%) + + + + + _int_free (6 samples, 0.98%) + + + + + cfree@GLIBC_2.2.5 (7 samples, 1.14%) + + + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (14 samples, 2.28%) + + c.. + + + s4::exec_fileprocessor_thread (52 samples, 8.48%) + + s4::exec_fil.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (52 samples, 8.48%) + + s4lib::reade.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (52 samples, 8.48%) + + s4lib::reade.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (52 samples, 8.48%) + + s4lib::reade.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (52 samples, 8.48%) + + s4lib::data:.. + + + once_cell::imp::OnceCell<T>::initialize (52 samples, 8.48%) + + once_cell::i.. + + + once_cell::imp::initialize_or_wait (52 samples, 8.48%) + + once_cell::i.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (52 samples, 8.48%) + + once_cell::i.. + + + regex::regex::bytes::Regex::new (52 samples, 8.48%) + + regex::regex.. + + + regex::builders::Builder::build_one_bytes (52 samples, 8.48%) + + regex::build.. + + + regex_automata::meta::regex::Builder::build (52 samples, 8.48%) + + regex_automa.. + + + regex_automata::meta::strategy::new (48 samples, 7.83%) + + regex_autom.. + + + cfree@GLIBC_2.2.5 (1 samples, 0.16%) + + + + + _int_free (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::Prefilter::new (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (1 samples, 0.16%) + + + + + regex_automata::meta::wrappers::Hybrid::new (2 samples, 0.33%) + + + + + regex_automata::hybrid::dfa::Builder::build_from_nfa (2 samples, 0.33%) + + + + + aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new (1 samples, 0.16%) + + + + + aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new_unchecked (1 samples, 0.16%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + aho_corasick::packed::pattern::Pattern::low_nybbles (1 samples, 0.16%) + + + + + __libc_calloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + aho_corasick::packed::api::Builder::build (3 samples, 0.49%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (3 samples, 0.49%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new (2 samples, 0.33%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (2 samples, 0.33%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (2 samples, 0.33%) + + + + + __memcmp_evex_movbe (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::NFA::add_transition (2 samples, 0.33%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (3 samples, 0.49%) + + + + + aho_corasick::util::remapper::Remapper::remap (3 samples, 0.49%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (3 samples, 0.49%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::set_anchored_start_state (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::NFA::init_full_state (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + sysmalloc (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (2 samples, 0.33%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::add_dead_state_loop (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::NFA::init_full_state (1 samples, 0.16%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (16 samples, 2.61%) + + re.. + + + aho_corasick::nfa::noncontiguous::Builder::build (13 samples, 2.12%) + + a.. + + + regex_automata::meta::strategy::new (20 samples, 3.26%) + + reg.. + + + regex_automata::meta::reverse_inner::extract (17 samples, 2.77%) + + re.. + + + regex_automata::util::prefilter::Choice::new (17 samples, 2.77%) + + re.. + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.16%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.16%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_free (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + __alloc_pages (1 samples, 0.16%) + + + + + get_page_from_freelist (1 samples, 0.16%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.16%) + + + + + clear_page_erms (1 samples, 0.16%) + + + + + exc_page_fault (3 samples, 0.49%) + + + + + do_user_addr_fault (3 samples, 0.49%) + + + + + handle_mm_fault (3 samples, 0.49%) + + + + + __handle_mm_fault (3 samples, 0.49%) + + + + + asm_exc_page_fault (4 samples, 0.65%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (13 samples, 2.12%) + + r.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (13 samples, 2.12%) + + r.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (13 samples, 2.12%) + + <.. + + + alloc::vec::Vec<T,A>::extend_with (12 samples, 1.96%) + + a.. + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (17 samples, 2.77%) + + re.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (17 samples, 2.77%) + + <c.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (17 samples, 2.77%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (17 samples, 2.77%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (17 samples, 2.77%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (17 samples, 2.77%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (17 samples, 2.77%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (17 samples, 2.77%) + + re.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (16 samples, 2.61%) + + re.. + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + sysmalloc (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + find_vma (1 samples, 0.16%) + + + + + regex_automata::meta::wrappers::Hybrid::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::new (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::range_trie::RangeTrie::new (1 samples, 0.16%) + + + + + aho_corasick::packed::api::Builder::extend (1 samples, 0.16%) + + + + + aho_corasick::packed::pattern::Patterns::add (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.16%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (1 samples, 0.16%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new (1 samples, 0.16%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (1 samples, 0.16%) + + + + + aho_corasick::packed::api::Builder::build (2 samples, 0.33%) + + + + + aho_corasick::packed::rabinkarp::RabinKarp::new (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + malloc (2 samples, 0.33%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.49%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.49%) + + + + + aho_corasick::dfa::DFA::set_matches (4 samples, 0.65%) + + + + + aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (7 samples, 1.14%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.16%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (15 samples, 2.45%) + + ah.. + + + regex_automata::meta::regex::Builder::build (37 samples, 6.04%) + + regex_au.. + + + regex_automata::meta::strategy::new (37 samples, 6.04%) + + regex_au.. + + + regex_automata::meta::reverse_inner::extract (19 samples, 3.10%) + + reg.. + + + regex_automata::util::prefilter::Choice::new (19 samples, 3.10%) + + reg.. + + + regex_automata::util::prefilter::teddy::Teddy::new (19 samples, 3.10%) + + reg.. + + + __rust_dealloc (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (2 samples, 0.33%) + + + + + regex::regex::bytes::Regex::new (6 samples, 0.98%) + + + + + regex::builders::Builder::build_one_bytes (6 samples, 0.98%) + + + + + regex_automata::meta::regex::Builder::build (6 samples, 0.98%) + + + + + regex_automata::meta::strategy::new (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (6 samples, 0.98%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 0.98%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (5 samples, 0.82%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (5 samples, 0.82%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.16%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.16%) + + + + + _int_free (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.49%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.49%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.33%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.33%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.33%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + release_pages (1 samples, 0.16%) + + + + + lru_cache_add (4 samples, 0.65%) + + + + + __pagevec_lru_add (4 samples, 0.65%) + + + + + page_mapping (3 samples, 0.49%) + + + + + __mem_cgroup_charge (4 samples, 0.65%) + + + + + charge_memcg (4 samples, 0.65%) + + + + + mem_cgroup_charge_statistics.constprop.0 (4 samples, 0.65%) + + + + + rmqueue_bulk (1 samples, 0.16%) + + + + + __list_del_entry_valid (1 samples, 0.16%) + + + + + kernel_init_free_pages.part.0 (6 samples, 0.98%) + + + + + clear_page_erms (6 samples, 0.98%) + + + + + get_page_from_freelist (8 samples, 1.31%) + + + + + __list_del_entry_valid (1 samples, 0.16%) + + + + + __alloc_pages (9 samples, 1.47%) + + + + + handle_mm_fault (19 samples, 3.10%) + + han.. + + + __handle_mm_fault (19 samples, 3.10%) + + __h.. + + + vmacache_find (2 samples, 0.33%) + + + + + asm_exc_page_fault (22 samples, 3.59%) + + asm_.. + + + exc_page_fault (22 samples, 3.59%) + + exc_.. + + + do_user_addr_fault (22 samples, 3.59%) + + do_u.. + + + find_vma (3 samples, 0.49%) + + + + + srso_alias_return_thunk (1 samples, 0.16%) + + + + + srso_alias_safe_ret (1 samples, 0.16%) + + + + + __memmove_avx512_unaligned_erms (3 samples, 0.49%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (38 samples, 6.20%) + + regex_au.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (38 samples, 6.20%) + + regex_au.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (38 samples, 6.20%) + + <T as al.. + + + alloc::vec::Vec<T,A>::extend_with (37 samples, 6.04%) + + alloc::v.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (2 samples, 0.33%) + + + + + alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (45 samples, 7.34%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (45 samples, 7.34%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 0.98%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + sysmalloc (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + __alloc_pages (1 samples, 0.16%) + + + + + get_page_from_freelist (1 samples, 0.16%) + + + + + __list_del_entry_valid (1 samples, 0.16%) + + + + + error_return (1 samples, 0.16%) + + + + + memcg_check_events.isra.0 (1 samples, 0.16%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.16%) + + + + + charge_memcg (3 samples, 0.49%) + + + + + __mem_cgroup_charge (4 samples, 0.65%) + + + + + srso_alias_return_thunk (1 samples, 0.16%) + + + + + srso_alias_safe_ret (1 samples, 0.16%) + + + + + rmqueue_bulk (2 samples, 0.33%) + + + + + __list_del_entry_valid (2 samples, 0.33%) + + + + + __alloc_pages (5 samples, 0.82%) + + + + + get_page_from_freelist (5 samples, 0.82%) + + + + + kernel_init_free_pages.part.0 (2 samples, 0.33%) + + + + + clear_page_erms (2 samples, 0.33%) + + + + + exc_page_fault (10 samples, 1.63%) + + + + + do_user_addr_fault (10 samples, 1.63%) + + + + + handle_mm_fault (10 samples, 1.63%) + + + + + __handle_mm_fault (10 samples, 1.63%) + + + + + asm_exc_page_fault (12 samples, 1.96%) + + a.. + + + __memmove_avx512_unaligned_erms (2 samples, 0.33%) + + + + + __irqentry_text_end (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (70 samples, 11.42%) + + regex_automata::n.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (70 samples, 11.42%) + + <core::iter::adap.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (70 samples, 11.42%) + + regex_automata::n.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (70 samples, 11.42%) + + regex_automata::n.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (70 samples, 11.42%) + + regex_automata::n.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (70 samples, 11.42%) + + regex_automata::n.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (22 samples, 3.59%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (22 samples, 3.59%) + + rege.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (22 samples, 3.59%) + + rege.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (22 samples, 3.59%) + + <T a.. + + + alloc::vec::Vec<T,A>::extend_with (21 samples, 3.43%) + + all.. + + + regex::builders::Builder::build_one_bytes (71 samples, 11.58%) + + regex::builders::.. + + + regex_automata::meta::regex::Builder::build (71 samples, 11.58%) + + regex_automata::m.. + + + regex_automata::meta::strategy::new (71 samples, 11.58%) + + regex_automata::m.. + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.33%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + once_cell::imp::initialize_or_wait (3 samples, 0.49%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (3 samples, 0.49%) + + + + + regex::regex::bytes::Regex::new (3 samples, 0.49%) + + + + + regex::builders::Builder::build_one_bytes (3 samples, 0.49%) + + + + + regex_automata::meta::regex::Builder::build (3 samples, 0.49%) + + + + + regex_automata::meta::strategy::new (3 samples, 0.49%) + + + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.16%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.16%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::map::Utf8SuffixMap::clear (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + malloc_consolidate (1 samples, 0.16%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.33%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.33%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.33%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.33%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.33%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.33%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.33%) + + + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.16%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.16%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.16%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.16%) + + + + + regex_syntax::hir::Hir::concat (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + asm_exc_page_fault (1 samples, 0.16%) + + + + + exc_page_fault (1 samples, 0.16%) + + + + + do_user_addr_fault (1 samples, 0.16%) + + + + + handle_mm_fault (1 samples, 0.16%) + + + + + __handle_mm_fault (1 samples, 0.16%) + + + + + __mem_cgroup_charge (1 samples, 0.16%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (3 samples, 0.49%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.49%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.49%) + + + + + realloc (3 samples, 0.49%) + + + + + _int_realloc (3 samples, 0.49%) + + + + + __memmove_avx512_unaligned_erms (3 samples, 0.49%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (5 samples, 0.82%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.33%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.33%) + + + + + malloc (2 samples, 0.33%) + + + + + _int_malloc (2 samples, 0.33%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.16%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.16%) + + + + + realloc (1 samples, 0.16%) + + + + + _int_realloc (1 samples, 0.16%) + + + + + _int_malloc (1 samples, 0.16%) + + + + + sysmalloc (1 samples, 0.16%) + + + + + __mprotect (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + __x64_sys_mprotect (1 samples, 0.16%) + + + + + do_mprotect_pkey (1 samples, 0.16%) + + + + + mprotect_fixup (1 samples, 0.16%) + + + + + perf_event_mmap (1 samples, 0.16%) + + + + + perf_iterate_sb (1 samples, 0.16%) + + + + + perf_iterate_ctx (1 samples, 0.16%) + + + + + perf_event_mmap_output (1 samples, 0.16%) + + + + + __perf_event__output_id_sample (1 samples, 0.16%) + + + + + perf_output_copy (1 samples, 0.16%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (7 samples, 1.14%) + + + + + regex::regex::bytes::Regex::new (7 samples, 1.14%) + + + + + regex::builders::Builder::build_one_bytes (7 samples, 1.14%) + + + + + regex_automata::meta::regex::Builder::build (7 samples, 1.14%) + + + + + regex_automata::meta::strategy::new (7 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (7 samples, 1.14%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (7 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (7 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (7 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (7 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (7 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.16%) + + + + + alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.16%) + + + + + malloc (1 samples, 0.16%) + + + + + numbers3.log (540 samples, 88.09%) + + numbers3.log + + + [unknown] (320 samples, 52.20%) + + [unknown] + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.16%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.16%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.16%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.16%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.16%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.16%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.16%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.16%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.16%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.16%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.16%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.16%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_item (1 samples, 0.16%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.16%) + + + + + all (613 samples, 100%) + + + + + ctrl-c (1 samples, 0.16%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.16%) + + + + + do_syscall_64 (1 samples, 0.16%) + + + + + syscall_exit_to_user_mode (1 samples, 0.16%) + + + + + exit_to_user_mode_prepare (1 samples, 0.16%) + + + + + arch_do_signal_or_restart (1 samples, 0.16%) + + + + + get_signal (1 samples, 0.16%) + + + + + do_group_exit (1 samples, 0.16%) + + + + + do_exit (1 samples, 0.16%) + + + + + acct_process (1 samples, 0.16%) + + + + + do_acct_process (1 samples, 0.16%) + + + + + __kernel_write (1 samples, 0.16%) + + + + + ext4_buffered_write_iter (1 samples, 0.16%) + + + + + file_update_time (1 samples, 0.16%) + + + + + generic_update_time (1 samples, 0.16%) + + + + + __mark_inode_dirty (1 samples, 0.16%) + + + + + __ext4_journal_stop (1 samples, 0.16%) + + + + + jbd2_journal_stop (1 samples, 0.16%) + + + + + kmem_cache_free.part.0 (1 samples, 0.16%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog-tar.svg b/releases/0.7.75/flamegraph-syslog-tar.svg new file mode 100644 index 00000000..d0768ef8 --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-tar.svg @@ -0,0 +1,5282 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231130-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/gen-1000-3-foobar.log.tar + + Reset Zoom + Search + + + + x86_pmu_enable_all (14 samples, 3.19%) + + x86.. + + + ret_from_fork (25 samples, 5.69%) + + ret_fro.. + + + schedule_tail (25 samples, 5.69%) + + schedul.. + + + finish_task_switch.isra.0 (25 samples, 5.69%) + + finish_.. + + + __perf_event_task_sched_in (25 samples, 5.69%) + + __perf_.. + + + __mod_lruvec_page_state (2 samples, 0.46%) + + + + + __mod_memcg_lruvec_state (2 samples, 0.46%) + + + + + page_remove_rmap (3 samples, 0.68%) + + + + + unmap_vmas (4 samples, 0.91%) + + + + + unmap_page_range (4 samples, 0.91%) + + + + + __list_del_entry_valid (1 samples, 0.23%) + + + + + free_unref_page_list (3 samples, 0.68%) + + + + + free_pcppages_bulk (3 samples, 0.68%) + + + + + __free_one_page (2 samples, 0.46%) + + + + + mmput (8 samples, 1.82%) + + m.. + + + exit_mmap (8 samples, 1.82%) + + e.. + + + tlb_finish_mmu (4 samples, 0.91%) + + + + + release_pages (4 samples, 0.91%) + + + + + __mod_zone_page_state (1 samples, 0.23%) + + + + + __x64_sys_exit_group (9 samples, 2.05%) + + _.. + + + do_group_exit (9 samples, 2.05%) + + d.. + + + do_exit (9 samples, 2.05%) + + d.. + + + mm_update_next_owner (1 samples, 0.23%) + + + + + elf_map (1 samples, 0.23%) + + + + + __vm_munmap (1 samples, 0.23%) + + + + + __do_munmap (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (11 samples, 2.51%) + + en.. + + + do_syscall_64 (11 samples, 2.51%) + + do.. + + + __x64_sys_execve (2 samples, 0.46%) + + + + + do_execveat_common.isra.0 (2 samples, 0.46%) + + + + + bprm_execve (2 samples, 0.46%) + + + + + load_elf_binary (2 samples, 0.46%) + + + + + _get_random_bytes.part.0 (1 samples, 0.23%) + + + + + crng_make_state (1 samples, 0.23%) + + + + + crng_fast_key_erasure (1 samples, 0.23%) + + + + + chacha_block_generic (1 samples, 0.23%) + + + + + chacha_permute (1 samples, 0.23%) + + + + + mmap_region (1 samples, 0.23%) + + + + + perf_event_mmap (1 samples, 0.23%) + + + + + perf_iterate_sb (1 samples, 0.23%) + + + + + perf_iterate_ctx (1 samples, 0.23%) + + + + + perf_event_mmap_output (1 samples, 0.23%) + + + + + start_thread (2 samples, 0.46%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.46%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.46%) + + + + + __mmap (2 samples, 0.46%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.46%) + + + + + do_syscall_64 (2 samples, 0.46%) + + + + + vm_mmap_pgoff (2 samples, 0.46%) + + + + + do_mmap (2 samples, 0.46%) + + + + + get_unmapped_area (1 samples, 0.23%) + + + + + arch_get_unmapped_area_topdown (1 samples, 0.23%) + + + + + vm_unmapped_area (1 samples, 0.23%) + + + + + clone3 (3 samples, 0.68%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __do_sys_clone3 (1 samples, 0.23%) + + + + + kernel_clone (1 samples, 0.23%) + + + + + copy_process (1 samples, 0.23%) + + + + + perf_event_init_task (1 samples, 0.23%) + + + + + inherit_task_group.isra.0 (1 samples, 0.23%) + + + + + inherit_event.constprop.0 (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + wp_page_copy (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __do_fault (1 samples, 0.23%) + + + + + filemap_fault (1 samples, 0.23%) + + + + + pagecache_get_page (1 samples, 0.23%) + + + + + xas_load (1 samples, 0.23%) + + + + + asm_exc_page_fault (2 samples, 0.46%) + + + + + _dl_relocate_object (3 samples, 0.68%) + + + + + _dl_lookup_symbol_x (1 samples, 0.23%) + + + + + do_lookup_x (1 samples, 0.23%) + + + + + _dl_map_object_deps (1 samples, 0.23%) + + + + + _dl_catch_exception (1 samples, 0.23%) + + + + + openaux (1 samples, 0.23%) + + + + + _dl_map_object (1 samples, 0.23%) + + + + + _dl_load_cache_lookup (1 samples, 0.23%) + + + + + _dl_start (6 samples, 1.37%) + + + + + _dl_sysdep_start (6 samples, 1.37%) + + + + + dl_main (6 samples, 1.37%) + + + + + __libc_early_init (1 samples, 0.23%) + + + + + __pthread_tunables_init (1 samples, 0.23%) + + + + + _dl_runtime_resolve_xsavec (1 samples, 0.23%) + + + + + _dl_fixup (1 samples, 0.23%) + + + + + syscall_return_via_sysret (1 samples, 0.23%) + + + + + fsnotify (1 samples, 0.23%) + + + + + dput (1 samples, 0.23%) + + + + + lockref_put_return (1 samples, 0.23%) + + + + + __fsnotify_parent (3 samples, 0.68%) + + + + + vfs_write (4 samples, 0.91%) + + + + + entry_SYSCALL_64_after_hwframe (5 samples, 1.14%) + + + + + do_syscall_64 (5 samples, 1.14%) + + + + + ksys_write (5 samples, 1.14%) + + + + + __fdget_pos (1 samples, 0.23%) + + + + + __fget_light (1 samples, 0.23%) + + + + + __GI___libc_write (7 samples, 1.59%) + + + + + std::io::Write::write_all (8 samples, 1.82%) + + s.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (8 samples, 1.82%) + + <.. + + + <std::io::stdio::Stdout as std::io::Write>::write (8 samples, 1.82%) + + <.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (8 samples, 1.82%) + + <.. + + + <std::io::stdio::StdoutLock as std::io::Write>::write (8 samples, 1.82%) + + <.. + + + __memmove_avx512_unaligned_erms (2 samples, 0.46%) + + + + + __memrchr_evex (2 samples, 0.46%) + + + + + std::io::Write::write_all (4 samples, 0.91%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (4 samples, 0.91%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (4 samples, 0.91%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (4 samples, 0.91%) + + + + + termcolor::Ansi<W>::write_color (5 samples, 1.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (2 samples, 0.46%) + + + + + std::io::Write::write_all (3 samples, 0.68%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.68%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (3 samples, 0.68%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (9 samples, 2.05%) + + <.. + + + syscall_exit_to_user_mode (2 samples, 0.46%) + + + + + __fsnotify_parent (2 samples, 0.46%) + + + + + dput (2 samples, 0.46%) + + + + + lockref_put_return (2 samples, 0.46%) + + + + + vfs_write (7 samples, 1.59%) + + + + + srso_alias_safe_ret (1 samples, 0.23%) + + + + + fput_many (3 samples, 0.68%) + + + + + srso_alias_return_thunk (1 samples, 0.23%) + + + + + srso_alias_safe_ret (1 samples, 0.23%) + + + + + ksys_write (13 samples, 2.96%) + + ksy.. + + + __fdget_pos (2 samples, 0.46%) + + + + + __fget_light (1 samples, 0.23%) + + + + + __fget_files (1 samples, 0.23%) + + + + + rcu_read_unlock_strict (1 samples, 0.23%) + + + + + __x64_sys_write (1 samples, 0.23%) + + + + + do_syscall_64 (17 samples, 3.87%) + + do_s.. + + + entry_SYSCALL_64_after_hwframe (18 samples, 4.10%) + + entr.. + + + entry_SYSCALL_64 (3 samples, 0.68%) + + + + + __GI___pthread_disable_asynccancel (2 samples, 0.46%) + + + + + __GI___libc_write (29 samples, 6.61%) + + __GI___li.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (30 samples, 6.83%) + + <std::io:.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (30 samples, 6.83%) + + <&std::io.. + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (30 samples, 6.83%) + + std::io::.. + + + s4lib::printer::printers::PrinterLogMessage::print_sysline_color (53 samples, 12.07%) + + s4lib::printer::pr.. + + + hashbrown::set::HashSet<T,S,A>::remove (1 samples, 0.23%) + + + + + hashbrown::raw::RawTable<T,A>::remove_entry (1 samples, 0.23%) + + + + + ctrlc::set_handler (1 samples, 0.23%) + + + + + std::thread::Builder::spawn (1 samples, 0.23%) + + + + + std::sys::unix::thread::Thread::new (1 samples, 0.23%) + + + + + pthread_create@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __cgroup_throttle_swaprate (1 samples, 0.23%) + + + + + crossbeam_channel::select::SelectedOperation::recv (1 samples, 0.23%) + + + + + crossbeam_channel::channel::read (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + crossbeam_channel::context::Context::wait_until (1 samples, 0.23%) + + + + + __perf_event_task_sched_in (15 samples, 3.42%) + + __p.. + + + x86_pmu_enable_all (15 samples, 3.42%) + + x86.. + + + crossbeam_channel::context::Context::with::{{closure}} (17 samples, 3.87%) + + cros.. + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::unregister (16 samples, 3.64%) + + <cro.. + + + crossbeam_channel::waker::SyncWaker::unregister (16 samples, 3.64%) + + cros.. + + + std::sys::unix::locks::futex_mutex::Mutex::lock_contended (16 samples, 3.64%) + + std:.. + + + syscall (16 samples, 3.64%) + + sysc.. + + + entry_SYSCALL_64_after_hwframe (16 samples, 3.64%) + + entr.. + + + do_syscall_64 (16 samples, 3.64%) + + do_s.. + + + __x64_sys_futex (16 samples, 3.64%) + + __x6.. + + + do_futex (16 samples, 3.64%) + + do_f.. + + + futex_wait (16 samples, 3.64%) + + fute.. + + + futex_wait_queue_me (16 samples, 3.64%) + + fute.. + + + schedule (16 samples, 3.64%) + + sche.. + + + __schedule (16 samples, 3.64%) + + __sc.. + + + finish_task_switch.isra.0 (16 samples, 3.64%) + + fini.. + + + __mmdrop (1 samples, 0.23%) + + + + + free_unref_page (1 samples, 0.23%) + + + + + free_pcp_prepare (1 samples, 0.23%) + + + + + __memcg_kmem_uncharge_page (1 samples, 0.23%) + + + + + obj_cgroup_uncharge_pages (1 samples, 0.23%) + + + + + page_counter_uncharge (1 samples, 0.23%) + + + + + srso_alias_return_thunk (1 samples, 0.23%) + + + + + srso_alias_safe_ret (1 samples, 0.23%) + + + + + crossbeam_channel::select::Select::select (18 samples, 4.10%) + + cros.. + + + crossbeam_channel::select::run_select (18 samples, 4.10%) + + cros.. + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (2 samples, 0.46%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (4 samples, 0.91%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (4 samples, 0.91%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.23%) + + + + + s4::processing_loop (83 samples, 18.91%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (84 samples, 19.13%) + + std::rt::lang_start::_{{closur.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (84 samples, 19.13%) + + std::sys_common::backtrace::__.. + + + s4::main (84 samples, 19.13%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.23%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.23%) + + + + + clap_builder::builder::command::Command::_build_self (1 samples, 0.23%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.23%) + + + + + <core::iter::adapters::filter_map::FilterMap<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.23%) + + + + + <s4lib::readers::journalreader::JournalOutput as clap_builder::derive::ValueEnum>::to_possible_value (1 samples, 0.23%) + + + + + _start (91 samples, 20.73%) + + _start + + + __libc_start_main@@GLIBC_2.34 (85 samples, 19.36%) + + __libc_start_main@@GLIBC_2.34 + + + __libc_start_call_main (85 samples, 19.36%) + + __libc_start_call_main + + + main (85 samples, 19.36%) + + main + + + std::rt::lang_start_internal (85 samples, 19.36%) + + std::rt::lang_start_internal + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.23%) + + + + + wait_on_page_bit_common (1 samples, 0.23%) + + + + + ext4_mpage_readpages (1 samples, 0.23%) + + + + + bio_add_page (1 samples, 0.23%) + + + + + __bio_add_page (1 samples, 0.23%) + + + + + read_pages (2 samples, 0.46%) + + + + + blk_finish_plug (1 samples, 0.23%) + + + + + blk_mq_flush_plug_list (1 samples, 0.23%) + + + + + blk_mq_sched_insert_requests (1 samples, 0.23%) + + + + + blk_mq_try_issue_list_directly (1 samples, 0.23%) + + + + + __blk_mq_try_issue_directly (1 samples, 0.23%) + + + + + scsi_queue_rq (1 samples, 0.23%) + + + + + sd_init_command (1 samples, 0.23%) + + + + + scsi_alloc_sgtables (1 samples, 0.23%) + + + + + sg_alloc_table_chained (1 samples, 0.23%) + + + + + __sg_alloc_table (1 samples, 0.23%) + + + + + mempool_alloc (1 samples, 0.23%) + + + + + xas_store (1 samples, 0.23%) + + + + + add_to_page_cache_lru (2 samples, 0.46%) + + + + + __add_to_page_cache_locked (2 samples, 0.46%) + + + + + new_sync_read (6 samples, 1.37%) + + + + + filemap_read (6 samples, 1.37%) + + + + + filemap_get_pages (6 samples, 1.37%) + + + + + page_cache_ra_unbounded (5 samples, 1.14%) + + + + + __alloc_pages (1 samples, 0.23%) + + + + + s4 (138 samples, 31.44%) + + s4 + + + [unknown] (8 samples, 1.82%) + + [.. + + + tar::archive::EntriesFields::next_entry_raw (8 samples, 1.82%) + + t.. + + + <std::process::ChildStdout as std::io::Read>::read (7 samples, 1.59%) + + + + + read (7 samples, 1.59%) + + + + + entry_SYSCALL_64_after_hwframe (7 samples, 1.59%) + + + + + do_syscall_64 (7 samples, 1.59%) + + + + + ksys_read (7 samples, 1.59%) + + + + + vfs_read (7 samples, 1.59%) + + + + + __fsnotify_parent (1 samples, 0.23%) + + + + + x86_pmu_enable_all (14 samples, 3.19%) + + x86.. + + + perf-exec (15 samples, 3.42%) + + per.. + + + entry_SYSCALL_64_after_hwframe (15 samples, 3.42%) + + ent.. + + + do_syscall_64 (15 samples, 3.42%) + + do_.. + + + __x64_sys_execve (15 samples, 3.42%) + + __x.. + + + do_execveat_common.isra.0 (15 samples, 3.42%) + + do_.. + + + bprm_execve (15 samples, 3.42%) + + bpr.. + + + load_elf_binary (15 samples, 3.42%) + + loa.. + + + begin_new_exec (15 samples, 3.42%) + + beg.. + + + perf_event_exec (15 samples, 3.42%) + + per.. + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (1 samples, 0.23%) + + + + + regex_automata::hybrid::dfa::Cache::new (1 samples, 0.23%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (2 samples, 0.46%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + srso_alias_return_thunk (1 samples, 0.23%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.23%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (5 samples, 1.14%) + + + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (5 samples, 1.14%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (4 samples, 0.91%) + + + + + regex_automata::hybrid::dfa::Cache::new (2 samples, 0.46%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (2 samples, 0.46%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.46%) + + + + + regex_syntax::hir::translate::TranslatorI::push (4 samples, 0.91%) + + + + + regex_syntax::hir::Properties::capture (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc (2 samples, 0.46%) + + + + + _int_malloc (2 samples, 0.46%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::into_parts (5 samples, 1.14%) + + + + + malloc (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.46%) + + + + + _int_free (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_syntax::hir::Hir::concat (14 samples, 3.19%) + + reg.. + + + regex_syntax::hir::Hir::alternation (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + core::str::converts::from_utf8 (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + realloc (2 samples, 0.46%) + + + + + realloc (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (31 samples, 7.06%) + + <regex_sy.. + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (1 samples, 0.23%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.23%) + + + + + regex_syntax::hir::translate::Translator::translate (35 samples, 7.97%) + + regex_synta.. + + + regex_syntax::ast::visitor::visit (35 samples, 7.97%) + + regex_synta.. + + + regex_syntax::ast::visitor::visit (6 samples, 1.37%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (6 samples, 1.37%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_capture_name (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_group (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_group (2 samples, 0.46%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + malloc (2 samples, 0.46%) + + + + + _int_malloc (2 samples, 0.46%) + + + + + regex_syntax::ast::Concat::into_ast (3 samples, 0.68%) + + + + + __rust_alloc (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (4 samples, 0.91%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump_space (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump_space (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + _int_malloc (3 samples, 0.68%) + + + + + malloc (4 samples, 0.91%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::Parser::parse (29 samples, 6.61%) + + regex_syn.. + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (29 samples, 6.61%) + + regex_syn.. + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + malloc_consolidate (3 samples, 0.68%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (5 samples, 1.14%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (5 samples, 1.14%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 0.91%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 0.91%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.91%) + + + + + realloc (4 samples, 0.91%) + + + + + _int_realloc (4 samples, 0.91%) + + + + + _int_malloc (4 samples, 0.91%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (1 samples, 0.23%) + + + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (8 samples, 1.82%) + + c.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (1 samples, 0.23%) + + + + + _int_free (3 samples, 0.68%) + + + + + cfree@GLIBC_2.2.5 (5 samples, 1.14%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.46%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (16 samples, 3.64%) + + core.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (16 samples, 3.64%) + + <reg.. + + + malloc_consolidate (1 samples, 0.23%) + + + + + _int_free (4 samples, 0.91%) + + + + + cfree@GLIBC_2.2.5 (5 samples, 1.14%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (2 samples, 0.46%) + + + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (8 samples, 1.82%) + + <.. + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (8 samples, 1.82%) + + <.. + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (94 samples, 21.41%) + + s4lib::readers::syslinereader::Sys.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (94 samples, 21.41%) + + s4lib::readers::syslinereader::Sys.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (94 samples, 21.41%) + + s4lib::data::datetime::bytes_to_re.. + + + once_cell::imp::OnceCell<T>::initialize (89 samples, 20.27%) + + once_cell::imp::OnceCell<T>::ini.. + + + once_cell::imp::initialize_or_wait (89 samples, 20.27%) + + once_cell::imp::initialize_or_wa.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (89 samples, 20.27%) + + once_cell::imp::OnceCell<T>::ini.. + + + regex::regex::bytes::Regex::new (89 samples, 20.27%) + + regex::regex::bytes::Regex::new + + + regex::builders::Builder::build_one_bytes (89 samples, 20.27%) + + regex::builders::Builder::build_.. + + + regex_automata::meta::regex::Builder::build (89 samples, 20.27%) + + regex_automata::meta::regex::Bui.. + + + mark_page_accessed (1 samples, 0.23%) + + + + + up_read (1 samples, 0.23%) + + + + + __mem_cgroup_charge (2 samples, 0.46%) + + + + + get_mem_cgroup_from_mm (2 samples, 0.46%) + + + + + __handle_mm_fault (5 samples, 1.14%) + + + + + __alloc_pages (3 samples, 0.68%) + + + + + get_page_from_freelist (3 samples, 0.68%) + + + + + kernel_init_free_pages.part.0 (3 samples, 0.68%) + + + + + clear_page_erms (3 samples, 0.68%) + + + + + exc_page_fault (7 samples, 1.59%) + + + + + do_user_addr_fault (7 samples, 1.59%) + + + + + handle_mm_fault (6 samples, 1.37%) + + + + + asm_exc_page_fault (9 samples, 2.05%) + + a.. + + + std::io::default_read_exact (11 samples, 2.51%) + + st.. + + + <tar::entry::EntryFields as std::io::Read>::read (11 samples, 2.51%) + + <t.. + + + <std::io::Take<T> as std::io::Read>::read (11 samples, 2.51%) + + <s.. + + + <std::process::ChildStdout as std::io::Read>::read (11 samples, 2.51%) + + <s.. + + + read (11 samples, 2.51%) + + re.. + + + entry_SYSCALL_64_after_hwframe (11 samples, 2.51%) + + en.. + + + do_syscall_64 (11 samples, 2.51%) + + do.. + + + ksys_read (11 samples, 2.51%) + + ks.. + + + vfs_read (11 samples, 2.51%) + + vf.. + + + new_sync_read (11 samples, 2.51%) + + ne.. + + + filemap_read (11 samples, 2.51%) + + fi.. + + + copy_page_to_iter (10 samples, 2.28%) + + c.. + + + copy_user_enhanced_fast_string (10 samples, 2.28%) + + c.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (106 samples, 24.15%) + + s4lib::readers::syslogprocessor::Syslo.. + + + s4lib::readers::blockreader::BlockReader::read_block (12 samples, 2.73%) + + s4.. + + + s4lib::readers::blockreader::BlockReader::read_block_FileTar (12 samples, 2.73%) + + s4.. + + + __libc_calloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __cgroup_throttle_swaprate (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + __rust_dealloc (1 samples, 0.23%) + + + + + s4lib::readers::linereader::LineReader::drop_lines (4 samples, 0.91%) + + + + + s4lib::readers::linereader::LineReader::drop_line (4 samples, 0.91%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::drop_data_try (5 samples, 1.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_data (5 samples, 1.14%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_sysline (5 samples, 1.14%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (1 samples, 0.23%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (1 samples, 0.23%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (1 samples, 0.23%) + + + + + chrono::offset::LocalResult<T>::and_then (1 samples, 0.23%) + + + + + <chrono::format::strftime::StrftimeItems as core::iter::traits::iterator::Iterator>::next (1 samples, 0.23%) + + + + + chrono::format::parse::parse_internal (4 samples, 0.91%) + + + + + s4lib::data::datetime::datetime_parse_from_str (6 samples, 1.37%) + + + + + chrono::naive::datetime::NaiveDateTime::parse_from_str (5 samples, 1.14%) + + + + + regex_automata::util::captures::Captures::get_group_by_name (4 samples, 0.91%) + + + + + core::hash::BuildHasher::hash_one (4 samples, 0.91%) + + + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (4 samples, 0.91%) + + + + + regex_automata::meta::strategy::Core::search_slots_nofail (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots_imp (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (3 samples, 0.68%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (4 samples, 0.91%) + + + + + regex_automata::hybrid::regex::Regex::try_search (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (15 samples, 3.42%) + + s4l.. + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (20 samples, 4.56%) + + s4lib.. + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (3 samples, 0.68%) + + + + + rangemap::map::RangeMap<K,V>::insert (4 samples, 0.91%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::insert_sysline (6 samples, 1.37%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::check_store (3 samples, 0.68%) + + + + + s4lib::readers::blockreader::BlockReader::read_block (2 samples, 0.46%) + + + + + s4lib::data::line::Line::prepend (1 samples, 0.23%) + + + + + s4lib::data::line::Line::fileoffset_end (1 samples, 0.23%) + + + + + malloc (2 samples, 0.46%) + + + + + lru::LruCache<K,V,S>::put (2 samples, 0.46%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (1 samples, 0.23%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::contains_key (1 samples, 0.23%) + + + + + s4lib::readers::linereader::LineReader::find_line (17 samples, 3.87%) + + s4li.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_between_datetime_filters (50 samples, 11.39%) + + s4lib::readers::s.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at_datetime_filter_linear_search (50 samples, 11.39%) + + s4lib::readers::s.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_year (50 samples, 11.39%) + + s4lib::readers::s.. + + + lru::LruCache<K,V,S>::put (4 samples, 0.91%) + + + + + std::sys::unix::futex::futex_wake (1 samples, 0.23%) + + + + + syscall (1 samples, 0.23%) + + + + + [[kernel.kallsyms]] (1 samples, 0.23%) + + + + + crossbeam_channel::waker::SyncWaker::notify (2 samples, 0.46%) + + + + + alloc::vec::Vec<T,A>::remove (1 samples, 0.23%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (164 samples, 37.36%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::exec_fileprocessor_thread (164 samples, 37.36%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (3 samples, 0.68%) + + + + + clone3 (165 samples, 37.59%) + + clone3 + + + start_thread (165 samples, 37.59%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (165 samples, 37.59%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (165 samples, 37.59%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys::unix::thread::guard::current (1 samples, 0.23%) + + + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.23%) + + + + + pthread_getaffinity_np@GLIBC_2.3.4 (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __x64_sys_sched_getaffinity (1 samples, 0.23%) + + + + + sched_getaffinity (1 samples, 0.23%) + + + + + find_task_by_vpid (1 samples, 0.23%) + + + + + __radix_tree_lookup (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + __alloc_pages (1 samples, 0.23%) + + + + + get_page_from_freelist (1 samples, 0.23%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.23%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.23%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.23%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_class_open (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.23%) + + + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.23%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.23%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.23%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.23%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_class_open (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.46%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.46%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.46%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.46%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.46%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.46%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.46%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.46%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.46%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.91%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::meta::wrappers::OnePass::new (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.23%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (7 samples, 1.59%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (7 samples, 1.59%) + + + + + once_cell::imp::OnceCell<T>::initialize (7 samples, 1.59%) + + + + + once_cell::imp::initialize_or_wait (7 samples, 1.59%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (7 samples, 1.59%) + + + + + regex::regex::bytes::Regex::new (7 samples, 1.59%) + + + + + regex::builders::Builder::build_one_bytes (7 samples, 1.59%) + + + + + regex_automata::meta::regex::Builder::build (7 samples, 1.59%) + + + + + regex_automata::meta::strategy::new (7 samples, 1.59%) + + + + + regex_automata::meta::reverse_inner::extract (2 samples, 0.46%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.23%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.23%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.23%) + + + + + regex_syntax::hir::Properties::literal (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (7 samples, 1.59%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + lru_cache_add (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (4 samples, 0.91%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.91%) + + + + + malloc (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (10 samples, 2.28%) + + r.. + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (6 samples, 1.37%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (20 samples, 4.56%) + + regex.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (20 samples, 4.56%) + + <core.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (20 samples, 4.56%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (20 samples, 4.56%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (20 samples, 4.56%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (20 samples, 4.56%) + + regex.. + + + cfree@GLIBC_2.2.5 (3 samples, 0.68%) + + + + + _int_free (3 samples, 0.68%) + + + + + regex_automata::meta::wrappers::OnePass::new (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (22 samples, 5.01%) + + s4lib:.. + + + once_cell::imp::OnceCell<T>::initialize (22 samples, 5.01%) + + once_c.. + + + once_cell::imp::initialize_or_wait (22 samples, 5.01%) + + once_c.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (22 samples, 5.01%) + + once_c.. + + + regex::regex::bytes::Regex::new (22 samples, 5.01%) + + regex:.. + + + regex::builders::Builder::build_one_bytes (22 samples, 5.01%) + + regex:.. + + + regex_automata::meta::regex::Builder::build (22 samples, 5.01%) + + regex_.. + + + regex_automata::meta::strategy::new (22 samples, 5.01%) + + regex_.. + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + asm_exc_page_fault (1 samples, 0.23%) + + + + + exc_page_fault (1 samples, 0.23%) + + + + + do_user_addr_fault (1 samples, 0.23%) + + + + + handle_mm_fault (1 samples, 0.23%) + + + + + __handle_mm_fault (1 samples, 0.23%) + + + + + lru_cache_add (1 samples, 0.23%) + + + + + __pagevec_lru_add (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_class_open (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::Parser::parse (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (2 samples, 0.46%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class (1 samples, 0.23%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class_op (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::suffixes (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.23%) + + + + + __memcmp_evex_movbe (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.23%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::prefixes (4 samples, 0.91%) + + + + + regex_syntax::hir::literal::Extractor::extract (3 samples, 0.68%) + + + + + regex_syntax::hir::literal::Extractor::cross (2 samples, 0.46%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_at_least (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::nfa::Inner::remap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (2 samples, 0.46%) + + + + + malloc (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (5 samples, 1.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (7 samples, 1.59%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add_capture_start (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (5 samples, 1.14%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + malloc_consolidate (3 samples, 0.68%) + + + + + cfree@GLIBC_2.2.5 (6 samples, 1.37%) + + + + + _int_free (6 samples, 1.37%) + + + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (12 samples, 2.73%) + + co.. + + + s4::exec_fileprocessor_thread (27 samples, 6.15%) + + s4::exec.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (27 samples, 6.15%) + + s4lib::r.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (27 samples, 6.15%) + + s4lib::r.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (27 samples, 6.15%) + + s4lib::r.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (27 samples, 6.15%) + + s4lib::d.. + + + once_cell::imp::OnceCell<T>::initialize (27 samples, 6.15%) + + once_cel.. + + + once_cell::imp::initialize_or_wait (27 samples, 6.15%) + + once_cel.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (27 samples, 6.15%) + + once_cel.. + + + regex::regex::bytes::Regex::new (27 samples, 6.15%) + + regex::r.. + + + regex::builders::Builder::build_one_bytes (27 samples, 6.15%) + + regex::b.. + + + regex_automata::meta::regex::Builder::build (27 samples, 6.15%) + + regex_au.. + + + regex_automata::meta::strategy::new (25 samples, 5.69%) + + regex_a.. + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (1 samples, 0.23%) + + + + + aho_corasick::util::remapper::Remapper::remap (1 samples, 0.23%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (1 samples, 0.23%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.23%) + + + + + _int_free (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (3 samples, 0.68%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::add_dead_state_loop (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::NFA::init_full_state (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (6 samples, 1.37%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (6 samples, 1.37%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::init_unanchored_start_state (1 samples, 0.23%) + + + + + aho_corasick::nfa::noncontiguous::NFA::init_full_state (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + regex_automata::meta::strategy::new (8 samples, 1.82%) + + r.. + + + regex_automata::meta::reverse_inner::extract (8 samples, 1.82%) + + r.. + + + regex_automata::util::prefilter::Choice::new (8 samples, 1.82%) + + r.. + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (2 samples, 0.46%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (2 samples, 0.46%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (2 samples, 0.46%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::Prefilter::new (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.23%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (1 samples, 0.23%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (1 samples, 0.23%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.91%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.91%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (3 samples, 0.68%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (3 samples, 0.68%) + + + + + alloc::vec::Vec<T,A>::extend_with (3 samples, 0.68%) + + + + + aho_corasick::packed::api::Builder::extend (1 samples, 0.23%) + + + + + aho_corasick::packed::pattern::Patterns::add (1 samples, 0.23%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.23%) + + + + + aho_corasick::packed::rabinkarp::RabinKarp::new (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (10 samples, 2.28%) + + r.. + + + regex_automata::meta::strategy::new (10 samples, 2.28%) + + r.. + + + regex_automata::meta::reverse_inner::extract (5 samples, 1.14%) + + + + + regex_automata::util::prefilter::Choice::new (5 samples, 1.14%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (5 samples, 1.14%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (3 samples, 0.68%) + + + + + aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (3 samples, 0.68%) + + + + + regex::regex::bytes::Regex::new (6 samples, 1.37%) + + + + + regex::builders::Builder::build_one_bytes (6 samples, 1.37%) + + + + + regex_automata::meta::regex::Builder::build (6 samples, 1.37%) + + + + + regex_automata::meta::strategy::new (6 samples, 1.37%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (6 samples, 1.37%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 1.37%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.37%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.37%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.37%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.37%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (5 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (5 samples, 1.14%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.68%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (3 samples, 0.68%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.68%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.68%) + + + + + malloc (3 samples, 0.68%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + sysmalloc (1 samples, 0.23%) + + + + + __mprotect (1 samples, 0.23%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.23%) + + + + + do_syscall_64 (1 samples, 0.23%) + + + + + __x64_sys_mprotect (1 samples, 0.23%) + + + + + do_mprotect_pkey (1 samples, 0.23%) + + + + + mprotect_fixup (1 samples, 0.23%) + + + + + perf_event_mmap (1 samples, 0.23%) + + + + + perf_iterate_sb (1 samples, 0.23%) + + + + + perf_iterate_ctx (1 samples, 0.23%) + + + + + perf_event_mmap_output (1 samples, 0.23%) + + + + + __perf_event_header__init_id (1 samples, 0.23%) + + + + + irqentry_enter (1 samples, 0.23%) + + + + + srso_alias_return_thunk (1 samples, 0.23%) + + + + + srso_alias_safe_ret (1 samples, 0.23%) + + + + + __handle_mm_fault (4 samples, 0.91%) + + + + + __alloc_pages (4 samples, 0.91%) + + + + + get_page_from_freelist (4 samples, 0.91%) + + + + + kernel_init_free_pages.part.0 (4 samples, 0.91%) + + + + + clear_page_erms (4 samples, 0.91%) + + + + + asm_exc_page_fault (6 samples, 1.37%) + + + + + exc_page_fault (6 samples, 1.37%) + + + + + do_user_addr_fault (5 samples, 1.14%) + + + + + handle_mm_fault (5 samples, 1.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (13 samples, 2.96%) + + reg.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (13 samples, 2.96%) + + reg.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (13 samples, 2.96%) + + <T .. + + + alloc::vec::Vec<T,A>::extend_with (12 samples, 2.73%) + + al.. + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.68%) + + + + + alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.23%) + + + + + malloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (18 samples, 4.10%) + + rege.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (18 samples, 4.10%) + + rege.. + + + regex_automata::nfa::thompson::builder::Builder::add (2 samples, 0.46%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.46%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.46%) + + + + + realloc (2 samples, 0.46%) + + + + + _int_realloc (2 samples, 0.46%) + + + + + _int_free (1 samples, 0.23%) + + + + + lru_cache_add (1 samples, 0.23%) + + + + + __pagevec_lru_add (1 samples, 0.23%) + + + + + page_mapping (1 samples, 0.23%) + + + + + __mem_cgroup_charge (1 samples, 0.23%) + + + + + charge_memcg (1 samples, 0.23%) + + + + + do_user_addr_fault (3 samples, 0.68%) + + + + + handle_mm_fault (3 samples, 0.68%) + + + + + __handle_mm_fault (3 samples, 0.68%) + + + + + __alloc_pages (1 samples, 0.23%) + + + + + get_page_from_freelist (1 samples, 0.23%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.23%) + + + + + clear_page_erms (1 samples, 0.23%) + + + + + asm_exc_page_fault (5 samples, 1.14%) + + + + + exc_page_fault (5 samples, 1.14%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (10 samples, 2.28%) + + r.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (10 samples, 2.28%) + + r.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (10 samples, 2.28%) + + <.. + + + alloc::vec::Vec<T,A>::extend_with (10 samples, 2.28%) + + a.. + + + regex::builders::Builder::build_one_bytes (32 samples, 7.29%) + + regex::bui.. + + + regex_automata::meta::regex::Builder::build (32 samples, 7.29%) + + regex_auto.. + + + regex_automata::meta::strategy::new (32 samples, 7.29%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (32 samples, 7.29%) + + regex_auto.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (32 samples, 7.29%) + + <core::ite.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (32 samples, 7.29%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (32 samples, 7.29%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (32 samples, 7.29%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (32 samples, 7.29%) + + regex_auto.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (11 samples, 2.51%) + + re.. + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.23%) + + + + + regex_automata::meta::strategy::new (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.23%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.23%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_bounded (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_concat (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.23%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.23%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.46%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.46%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.46%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.46%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.46%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.46%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.46%) + + + + + regex_automata::meta::wrappers::OnePass::new (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::InternalBuilder::compile_transition (1 samples, 0.23%) + + + + + regex_automata::dfa::onepass::InternalBuilder::add_dfa_state_for_nfa_state (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + all (439 samples, 100%) + + + + + gen-1000-3-foob (286 samples, 65.15%) + + gen-1000-3-foob + + + [unknown] (120 samples, 27.33%) + + [unknown] + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.23%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.23%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.23%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.23%) + + + + + regex_automata::meta::strategy::new (1 samples, 0.23%) + + + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.23%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.23%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.23%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.23%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.23%) + + + + + realloc (1 samples, 0.23%) + + + + + _int_realloc (1 samples, 0.23%) + + + + + _int_malloc (1 samples, 0.23%) + + + + + malloc_consolidate (1 samples, 0.23%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.23%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog-xz.svg b/releases/0.7.75/flamegraph-syslog-xz.svg new file mode 100644 index 00000000..fb16d242 --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog-xz.svg @@ -0,0 +1,5467 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231128-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/gen-1000-3-foobar.log.xz + + Reset Zoom + Search + + + + ret_from_fork (22 samples, 4.81%) + + ret_fr.. + + + schedule_tail (22 samples, 4.81%) + + schedu.. + + + finish_task_switch.isra.0 (22 samples, 4.81%) + + finish.. + + + __perf_event_task_sched_in (22 samples, 4.81%) + + __perf.. + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 4.81%) + + __raw_.. + + + page_remove_rmap (3 samples, 0.66%) + + + + + __mod_lruvec_page_state (3 samples, 0.66%) + + + + + __mod_memcg_lruvec_state (3 samples, 0.66%) + + + + + unmap_vmas (4 samples, 0.88%) + + + + + unmap_page_range (4 samples, 0.88%) + + + + + __list_del_entry_valid (1 samples, 0.22%) + + + + + free_pcppages_bulk (3 samples, 0.66%) + + + + + __free_one_page (2 samples, 0.44%) + + + + + __x64_sys_exit_group (9 samples, 1.97%) + + _.. + + + do_group_exit (9 samples, 1.97%) + + d.. + + + do_exit (9 samples, 1.97%) + + d.. + + + mmput (9 samples, 1.97%) + + m.. + + + exit_mmap (9 samples, 1.97%) + + e.. + + + tlb_finish_mmu (5 samples, 1.09%) + + + + + release_pages (5 samples, 1.09%) + + + + + free_unref_page_list (5 samples, 1.09%) + + + + + vm_mmap_pgoff (1 samples, 0.22%) + + + + + do_mmap (1 samples, 0.22%) + + + + + mmap_region (1 samples, 0.22%) + + + + + vma_link (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (11 samples, 2.41%) + + en.. + + + do_syscall_64 (11 samples, 2.41%) + + do.. + + + __x64_sys_execve (2 samples, 0.44%) + + + + + do_execveat_common.isra.0 (2 samples, 0.44%) + + + + + bprm_execve (2 samples, 0.44%) + + + + + load_elf_binary (2 samples, 0.44%) + + + + + setup_arg_pages (1 samples, 0.22%) + + + + + shift_arg_pages (1 samples, 0.22%) + + + + + __vma_adjust (1 samples, 0.22%) + + + + + down_write (1 samples, 0.22%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.22%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (1 samples, 0.22%) + + + + + __mmap (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.22%) + + + + + do_syscall_64 (1 samples, 0.22%) + + + + + __x64_sys_mmap (1 samples, 0.22%) + + + + + clone3 (2 samples, 0.44%) + + + + + start_thread (2 samples, 0.44%) + + + + + entry_SYSCALL_64 (1 samples, 0.22%) + + + + + _dl_unload_cache (1 samples, 0.22%) + + + + + munmap (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.22%) + + + + + do_syscall_64 (1 samples, 0.22%) + + + + + __x64_sys_munmap (1 samples, 0.22%) + + + + + __vm_munmap (1 samples, 0.22%) + + + + + __do_munmap (1 samples, 0.22%) + + + + + find_vma (1 samples, 0.22%) + + + + + vmacache_update (1 samples, 0.22%) + + + + + _dl_relocate_object (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + _dl_start (3 samples, 0.66%) + + + + + _dl_sysdep_start (3 samples, 0.66%) + + + + + dl_main (3 samples, 0.66%) + + + + + _dl_map_object_deps (1 samples, 0.22%) + + + + + _dl_catch_exception (1 samples, 0.22%) + + + + + openaux (1 samples, 0.22%) + + + + + _dl_map_object (1 samples, 0.22%) + + + + + _dl_load_cache_lookup (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + srso_alias_return_thunk (1 samples, 0.22%) + + + + + srso_alias_safe_ret (1 samples, 0.22%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.22%) + + + + + __memrchr_evex (3 samples, 0.66%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + fsnotify (1 samples, 0.22%) + + + + + __fsnotify_parent (2 samples, 0.44%) + + + + + vfs_write (3 samples, 0.66%) + + + + + __fdget_pos (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (5 samples, 1.09%) + + + + + do_syscall_64 (5 samples, 1.09%) + + + + + ksys_write (5 samples, 1.09%) + + + + + __GI___libc_write (6 samples, 1.31%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (13 samples, 2.84%) + + <s.. + + + std::io::Write::write_all (14 samples, 3.06%) + + std.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (14 samples, 3.06%) + + <te.. + + + <std::io::stdio::Stdout as std::io::Write>::write (14 samples, 3.06%) + + <st.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (14 samples, 3.06%) + + <&s.. + + + __memmove_avx512_unaligned_erms (3 samples, 0.66%) + + + + + termcolor::Ansi<W>::write_color (2 samples, 0.44%) + + + + + std::io::Write::write_all (2 samples, 0.44%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.44%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (2 samples, 0.44%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (2 samples, 0.44%) + + + + + __memrchr_evex (2 samples, 0.44%) + + + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (3 samples, 0.66%) + + + + + std::io::Write::write_all (1 samples, 0.22%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.22%) + + + + + <&std::io::stdio::Stdout as std::io::Write>::write (1 samples, 0.22%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + syscall_return_via_sysret (2 samples, 0.44%) + + + + + syscall_exit_to_user_mode (1 samples, 0.22%) + + + + + exit_to_user_mode_prepare (1 samples, 0.22%) + + + + + write_null (1 samples, 0.22%) + + + + + security_file_permission (1 samples, 0.22%) + + + + + fsnotify (1 samples, 0.22%) + + + + + dput (1 samples, 0.22%) + + + + + lockref_put_return (1 samples, 0.22%) + + + + + __fsnotify_parent (4 samples, 0.88%) + + + + + vfs_write (9 samples, 1.97%) + + v.. + + + fput_many (2 samples, 0.44%) + + + + + asm_sysvec_hyperv_stimer0 (1 samples, 0.22%) + + + + + sysvec_hyperv_stimer0 (1 samples, 0.22%) + + + + + irq_exit_rcu (1 samples, 0.22%) + + + + + __softirqentry_text_start (1 samples, 0.22%) + + + + + rcu_core (1 samples, 0.22%) + + + + + tlb_remove_table_rcu (1 samples, 0.22%) + + + + + __put_page (1 samples, 0.22%) + + + + + __mem_cgroup_uncharge (1 samples, 0.22%) + + + + + uncharge_page (1 samples, 0.22%) + + + + + srso_alias_safe_ret (1 samples, 0.22%) + + + + + __fget_light (2 samples, 0.44%) + + + + + __fget_files (1 samples, 0.22%) + + + + + __fdget_pos (3 samples, 0.66%) + + + + + entry_SYSCALL_64_after_hwframe (16 samples, 3.50%) + + ent.. + + + do_syscall_64 (16 samples, 3.50%) + + do_.. + + + ksys_write (15 samples, 3.28%) + + ksy.. + + + entry_SYSCALL_64 (1 samples, 0.22%) + + + + + __x86_indirect_thunk_rax (1 samples, 0.22%) + + + + + __GI___pthread_disable_asynccancel (2 samples, 0.44%) + + + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (24 samples, 5.25%) + + std::i.. + + + __GI___libc_write (24 samples, 5.25%) + + __GI__.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (26 samples, 5.69%) + + <&std::.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (27 samples, 5.91%) + + <std::io.. + + + s4lib::printer::printers::PrinterLogMessage::print_sysline_color (51 samples, 11.16%) + + s4lib::printer::.. + + + hashbrown::set::HashSet<T,S,A>::remove (1 samples, 0.22%) + + + + + hashbrown::raw::RawTable<T,A>::remove_entry (1 samples, 0.22%) + + + + + crossbeam_channel::select::SelectedOperation::recv (1 samples, 0.22%) + + + + + crossbeam_channel::channel::read (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + crossbeam_channel::context::Context::wait_until (1 samples, 0.22%) + + + + + __sched_yield (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + filemap_map_pages (1 samples, 0.22%) + + + + + next_uptodate_page (1 samples, 0.22%) + + + + + crossbeam_channel::select::Select::select (2 samples, 0.44%) + + + + + crossbeam_channel::select::run_select (2 samples, 0.44%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (2 samples, 0.44%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::unregister (1 samples, 0.22%) + + + + + crossbeam_channel::waker::SyncWaker::unregister (1 samples, 0.22%) + + + + + crossbeam_channel::select::Select::new (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + core::ptr::drop_in_place<s4lib::common::FileProcessingResult<std::io::error::Error>> (1 samples, 0.22%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::ValMut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::next_unchecked (1 samples, 0.22%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (2 samples, 0.44%) + + + + + s4::processing_loop (61 samples, 13.35%) + + s4::processing_loop + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (62 samples, 13.57%) + + std::sys_common::bac.. + + + s4::main (62 samples, 13.57%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.22%) + + + + + clap_builder::builder::command::Command::_do_parse (1 samples, 0.22%) + + + + + clap_builder::parser::parser::Parser::get_matches_with (1 samples, 0.22%) + + + + + clap_builder::parser::validator::Validator::validate (1 samples, 0.22%) + + + + + clap_builder::util::flat_map::FlatMap<K,V>::extend_unchecked (1 samples, 0.22%) + + + + + _start (66 samples, 14.44%) + + _start + + + __libc_start_main@@GLIBC_2.34 (63 samples, 13.79%) + + __libc_start_main@@GL.. + + + __libc_start_call_main (63 samples, 13.79%) + + __libc_start_call_main + + + main (63 samples, 13.79%) + + main + + + std::rt::lang_start_internal (63 samples, 13.79%) + + std::rt::lang_start_i.. + + + std::rt::lang_start::_{{closure}} (63 samples, 13.79%) + + std::rt::lang_start::.. + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + filemap_map_pages (1 samples, 0.22%) + + + + + next_uptodate_page (1 samples, 0.22%) + + + + + s4 (102 samples, 22.32%) + + s4 + + + _dl_relocate_object (1 samples, 0.22%) + + + + + _dl_lookup_symbol_x (1 samples, 0.22%) + + + + + perf-exec (11 samples, 2.41%) + + pe.. + + + entry_SYSCALL_64_after_hwframe (11 samples, 2.41%) + + en.. + + + do_syscall_64 (11 samples, 2.41%) + + do.. + + + __x64_sys_execve (11 samples, 2.41%) + + __.. + + + do_execveat_common.isra.0 (11 samples, 2.41%) + + do.. + + + bprm_execve (11 samples, 2.41%) + + bp.. + + + load_elf_binary (11 samples, 2.41%) + + lo.. + + + begin_new_exec (11 samples, 2.41%) + + be.. + + + perf_event_exec (11 samples, 2.41%) + + pe.. + + + __raw_callee_save___pv_queued_spin_unlock (11 samples, 2.41%) + + __.. + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (1 samples, 0.22%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + __alloc_pages (1 samples, 0.22%) + + + + + get_page_from_freelist (1 samples, 0.22%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.22%) + + + + + clear_page_erms (1 samples, 0.22%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.22%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (3 samples, 0.66%) + + + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (3 samples, 0.66%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.44%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.44%) + + + + + malloc (2 samples, 0.44%) + + + + + _int_malloc (2 samples, 0.44%) + + + + + malloc_consolidate (2 samples, 0.44%) + + + + + regex_automata::meta::regex::Regex::create_captures (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + regex_automata::meta::regex::Builder::new (1 samples, 0.22%) + + + + + <regex_syntax::hir::translate::TranslatorBuilder as core::default::Default>::default (1 samples, 0.22%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.22%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (1 samples, 0.22%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.22%) + + + + + regex_syntax::unicode::SimpleCaseFolder::overlaps (1 samples, 0.22%) + + + + + regex_syntax::hir::translate::TranslatorI::push (3 samples, 0.66%) + + + + + regex_syntax::hir::Properties::capture (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_syntax::hir::Hir::into_parts (2 samples, 0.44%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.44%) + + + + + _int_free (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + regex_syntax::hir::Hir::concat (7 samples, 1.53%) + + + + + regex_syntax::hir::Properties::alternation (1 samples, 0.22%) + + + + + regex_syntax::hir::Hir::alternation (2 samples, 0.44%) + + + + + regex_syntax::hir::Hir::into_parts (1 samples, 0.22%) + + + + + regex_syntax::hir::ClassUnicode::new (1 samples, 0.22%) + + + + + core::str::converts::from_utf8 (1 samples, 0.22%) + + + + + core::ptr::drop_in_place<regex_syntax::hir::translate::HirFrame> (1 samples, 0.22%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (2 samples, 0.44%) + + + + + realloc (2 samples, 0.44%) + + + + + _int_malloc (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.66%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.66%) + + + + + realloc (3 samples, 0.66%) + + + + + _int_realloc (3 samples, 0.66%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + __rust_alloc (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (31 samples, 6.78%) + + <regex_sy.. + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre (1 samples, 0.22%) + + + + + regex_syntax::hir::interval::IntervalSet<I>::canonicalize (1 samples, 0.22%) + + + + + regex_syntax::hir::translate::Translator::translate (36 samples, 7.88%) + + regex_synta.. + + + regex_syntax::ast::visitor::visit (36 samples, 7.88%) + + regex_synta.. + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_post (2 samples, 0.44%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (2 samples, 0.44%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_class_set_item_pre (1 samples, 0.22%) + + + + + regex_syntax::ast::visitor::visit (6 samples, 1.31%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::bump (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.44%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.44%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (8 samples, 1.75%) + + + + + regex_syntax::ast::parse::ParserI<P>::maybe_parse_ascii_class (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (1 samples, 0.22%) + + + + + regex_syntax::ast::ClassSetUnion::push (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (5 samples, 1.09%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_counted_repetition (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::char (3 samples, 0.66%) + + + + + malloc (5 samples, 1.09%) + + + + + _int_malloc (5 samples, 1.09%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + filemap_map_pages (1 samples, 0.22%) + + + + + next_uptodate_page (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (33 samples, 7.22%) + + regex_synt.. + + + regex_syntax::ast::parse::Parser::parse (34 samples, 7.44%) + + regex_synt.. + + + malloc (1 samples, 0.22%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.22%) + + + + + malloc_consolidate (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.66%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.66%) + + + + + realloc (3 samples, 0.66%) + + + + + _int_realloc (3 samples, 0.66%) + + + + + _int_malloc (3 samples, 0.66%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (4 samples, 0.88%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (4 samples, 0.88%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 0.88%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.44%) + + + + + _int_free (2 samples, 0.44%) + + + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (1 samples, 0.22%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (8 samples, 1.75%) + + + + + _int_free (1 samples, 0.22%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.66%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.44%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (15 samples, 3.28%) + + cor.. + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (15 samples, 3.28%) + + <re.. + + + _int_free (1 samples, 0.22%) + + + + + regex::builders::Builder::build_one_bytes (89 samples, 19.47%) + + regex::builders::Builder::build.. + + + regex_automata::meta::regex::Builder::build (88 samples, 19.26%) + + regex_automata::meta::regex::B.. + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (3 samples, 0.66%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (3 samples, 0.66%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.66%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (91 samples, 19.91%) + + once_cell::imp::OnceCell<T>::in.. + + + regex::regex::bytes::Regex::new (91 samples, 19.91%) + + regex::regex::bytes::Regex::new + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (2 samples, 0.44%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold (2 samples, 0.44%) + + + + + malloc (2 samples, 0.44%) + + + + + _int_malloc (2 samples, 0.44%) + + + + + malloc_consolidate (2 samples, 0.44%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (96 samples, 21.01%) + + s4lib::readers::syslogprocessor::.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (96 samples, 21.01%) + + s4lib::readers::syslinereader::Sy.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (96 samples, 21.01%) + + s4lib::readers::syslinereader::Sy.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (96 samples, 21.01%) + + s4lib::data::datetime::bytes_to_r.. + + + once_cell::imp::OnceCell<T>::initialize (92 samples, 20.13%) + + once_cell::imp::OnceCell<T>::ini.. + + + once_cell::imp::initialize_or_wait (92 samples, 20.13%) + + once_cell::imp::initialize_or_wa.. + + + s4lib::readers::linereader::LineReader::drop_lines (1 samples, 0.22%) + + + + + s4lib::readers::linereader::LineReader::drop_line (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_sysline (2 samples, 0.44%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + _int_free (1 samples, 0.22%) + + + + + <alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.22%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::drop_data_try (4 samples, 0.88%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_data (4 samples, 0.88%) + + + + + s4lib::data::datetime::datetime_parse_from_str (2 samples, 0.44%) + + + + + chrono::naive::datetime::NaiveDateTime::parse_from_str (2 samples, 0.44%) + + + + + chrono::format::parse::parse_internal (2 samples, 0.44%) + + + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (2 samples, 0.44%) + + + + + core::hash::BuildHasher::hash_one (3 samples, 0.66%) + + + + + regex_automata::util::captures::Captures::get_group_by_name (4 samples, 0.88%) + + + + + regex_automata::meta::regex::RegexInfo::props_union (1 samples, 0.22%) + + + + + regex_automata::meta::regex::Regex::create_captures (1 samples, 0.22%) + + + + + __memset_avx512_unaligned_erms (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots (3 samples, 0.66%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots_imp (3 samples, 0.66%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (3 samples, 0.66%) + + + + + regex_automata::meta::strategy::Core::search_slots_nofail (4 samples, 0.88%) + + + + + regex_automata::hybrid::search::find_fwd (1 samples, 0.22%) + + + + + regex_automata::hybrid::regex::Regex::try_search (2 samples, 0.44%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (7 samples, 1.53%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (18 samples, 3.94%) + + s4li.. + + + hashbrown::map::HashMap<K,V,S,A>::remove (1 samples, 0.22%) + + + + + lru::LruCache<K,V,S>::put (2 samples, 0.44%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + malloc (2 samples, 0.44%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (3 samples, 0.66%) + + + + + <alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (26 samples, 5.69%) + + s4lib::.. + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + rangemap::map::RangeMap<K,V>::insert (3 samples, 0.66%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (3 samples, 0.66%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::insert_sysline (5 samples, 1.09%) + + + + + alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (2 samples, 0.44%) + + + + + s4lib::readers::linereader::LineReader::insert_line (1 samples, 0.22%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.22%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (2 samples, 0.44%) + + + + + s4lib::readers::linereader::LineReader::get_linep (4 samples, 0.88%) + + + + + s4lib::data::line::Line::prepend (1 samples, 0.22%) + + + + + malloc (2 samples, 0.44%) + + + + + s4lib::readers::linereader::LineReader::find_line (20 samples, 4.38%) + + s4lib.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_between_datetime_filters (52 samples, 11.38%) + + s4lib::readers::s.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at_datetime_filter_linear_search (52 samples, 11.38%) + + s4lib::readers::s.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_year (52 samples, 11.38%) + + s4lib::readers::s.. + + + lru::LruCache<K,V,S>::put (1 samples, 0.22%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (1 samples, 0.22%) + + + + + __sched_yield (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.22%) + + + + + do_syscall_64 (1 samples, 0.22%) + + + + + syscall_enter_from_user_mode (1 samples, 0.22%) + + + + + clone3 (157 samples, 34.35%) + + clone3 + + + start_thread (157 samples, 34.35%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (157 samples, 34.35%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (157 samples, 34.35%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (157 samples, 34.35%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::exec_fileprocessor_thread (157 samples, 34.35%) + + s4::exec_fileprocessor_thread + + + crossbeam_channel::channel::Sender<T>::send (5 samples, 1.09%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (2 samples, 0.44%) + + + + + s4::exec_fileprocessor_thread (2 samples, 0.44%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.44%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.44%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.44%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.44%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.44%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.44%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.44%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.44%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.44%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.44%) + + + + + regex_syntax::ast::parse::Parser::parse (2 samples, 0.44%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (2 samples, 0.44%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (2 samples, 0.44%) + + + + + regex_syntax::ast::parse::ParserI<P>::pop_class (2 samples, 0.44%) + + + + + std::sys::unix::thread::Thread::new::thread_start (1 samples, 0.22%) + + + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (1 samples, 0.22%) + + + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1 samples, 0.22%) + + + + + s4::exec_fileprocessor_thread (1 samples, 0.22%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (1 samples, 0.22%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (1 samples, 0.22%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 0.22%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.22%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.22%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.22%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.22%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.22%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (1 samples, 0.22%) + + + + + regex_automata::util::captures::GroupInfo::new (1 samples, 0.22%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.44%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.44%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.44%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.44%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.44%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.44%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.44%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.44%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.44%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.44%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (4 samples, 0.88%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_at_least (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.22%) + + + + + regex_syntax::hir::Hir::kind (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (9 samples, 1.97%) + + r.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (9 samples, 1.97%) + + <.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (9 samples, 1.97%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (9 samples, 1.97%) + + r.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.44%) + + + + + regex_automata::dfa::onepass::InternalBuilder::compile_transition (1 samples, 0.22%) + + + + + regex_automata::meta::wrappers::OnePass::new (2 samples, 0.44%) + + + + + regex_automata::dfa::onepass::Builder::build_from_nfa (2 samples, 0.44%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.22%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.22%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (14 samples, 3.06%) + + s4l.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (14 samples, 3.06%) + + s4l.. + + + once_cell::imp::OnceCell<T>::initialize (14 samples, 3.06%) + + onc.. + + + once_cell::imp::initialize_or_wait (14 samples, 3.06%) + + onc.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (14 samples, 3.06%) + + onc.. + + + regex::regex::bytes::Regex::new (14 samples, 3.06%) + + reg.. + + + regex::builders::Builder::build_one_bytes (14 samples, 3.06%) + + reg.. + + + regex_automata::meta::regex::Builder::build (14 samples, 3.06%) + + reg.. + + + regex_automata::meta::strategy::new (14 samples, 3.06%) + + reg.. + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.66%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.22%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.22%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.22%) + + + + + regex_syntax::hir::Properties::literal (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (1 samples, 0.22%) + + + + + regex_automata::util::captures::GroupInfo::new (1 samples, 0.22%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.44%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.44%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.44%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.44%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.44%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.44%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.44%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.44%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.44%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.44%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::builder::Builder::add_capture_start (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.22%) + + + + + lzma_rs::decode::xz::validate_block_check (29 samples, 6.35%) + + lzma_rs:.. + + + crc::crc64::<impl crc::Crc<u64>>::checksum (29 samples, 6.35%) + + crc::crc.. + + + lzma_rs::decode::lzma2::Lzma2Decoder::new (1 samples, 0.22%) + + + + + lzma_rs::decode::lzma::DecoderState::new (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + filemap_map_pages (1 samples, 0.22%) + + + + + next_uptodate_page (1 samples, 0.22%) + + + + + std::io::Read::read_exact (1 samples, 0.22%) + + + + + <std::io::buffered::bufreader::BufReader<R> as std::io::Read>::read (1 samples, 0.22%) + + + + + lzma_rs::decode::rangecoder::RangeDecoder<R>::parse_reverse_bit_tree (2 samples, 0.44%) + + + + + lzma_rs::decode::rangecoder::BitTree::parse (2 samples, 0.44%) + + + + + lzma_rs::decode::rangecoder::LenDecoder::decode (5 samples, 1.09%) + + + + + lzma_rs::decode::rangecoder::BitTree::parse (1 samples, 0.22%) + + + + + std::io::Read::read_exact (1 samples, 0.22%) + + + + + <std::io::buffered::bufreader::BufReader<R> as std::io::Read>::read (1 samples, 0.22%) + + + + + asm_sysvec_hyperv_stimer0 (1 samples, 0.22%) + + + + + sysvec_hyperv_stimer0 (1 samples, 0.22%) + + + + + __sysvec_hyperv_stimer0 (1 samples, 0.22%) + + + + + hrtimer_interrupt (1 samples, 0.22%) + + + + + ktime_get_update_offsets_now (1 samples, 0.22%) + + + + + lru_cache_add (1 samples, 0.22%) + + + + + __pagevec_lru_add (1 samples, 0.22%) + + + + + page_mapping (1 samples, 0.22%) + + + + + __mem_cgroup_charge (2 samples, 0.44%) + + + + + charge_memcg (2 samples, 0.44%) + + + + + mem_cgroup_charge_statistics.constprop.0 (2 samples, 0.44%) + + + + + handle_mm_fault (4 samples, 0.88%) + + + + + __handle_mm_fault (4 samples, 0.88%) + + + + + __alloc_pages (1 samples, 0.22%) + + + + + get_page_from_freelist (1 samples, 0.22%) + + + + + rmqueue_bulk (1 samples, 0.22%) + + + + + __list_del_entry_valid (1 samples, 0.22%) + + + + + do_user_addr_fault (5 samples, 1.09%) + + + + + find_vma (1 samples, 0.22%) + + + + + vmacache_find (1 samples, 0.22%) + + + + + exc_page_fault (6 samples, 1.31%) + + + + + asm_exc_page_fault (7 samples, 1.53%) + + + + + <lzma_rs::decode::lzbuffer::LzAccumBuffer<W> as lzma_rs::decode::lzbuffer::LzBuffer<W>>::append_lz (15 samples, 3.28%) + + <lz.. + + + lzma_rs::decode::lzma::DecoderState::process (24 samples, 5.25%) + + lzma_r.. + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + __munmap (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.22%) + + + + + do_syscall_64 (1 samples, 0.22%) + + + + + __x64_sys_munmap (1 samples, 0.22%) + + + + + __vm_munmap (1 samples, 0.22%) + + + + + __do_munmap (1 samples, 0.22%) + + + + + unmap_region (1 samples, 0.22%) + + + + + tlb_finish_mmu (1 samples, 0.22%) + + + + + release_pages (1 samples, 0.22%) + + + + + __mod_zone_page_state (1 samples, 0.22%) + + + + + irqentry_enter (2 samples, 0.44%) + + + + + rmqueue_bulk (1 samples, 0.22%) + + + + + __list_del_entry_valid (1 samples, 0.22%) + + + + + asm_exc_page_fault (4 samples, 0.88%) + + + + + exc_page_fault (4 samples, 0.88%) + + + + + do_user_addr_fault (2 samples, 0.44%) + + + + + handle_mm_fault (2 samples, 0.44%) + + + + + __handle_mm_fault (2 samples, 0.44%) + + + + + __alloc_pages (2 samples, 0.44%) + + + + + get_page_from_freelist (2 samples, 0.44%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.22%) + + + + + clear_page_erms (1 samples, 0.22%) + + + + + lzma_rs::decode::xz::decode_filter (31 samples, 6.78%) + + lzma_rs::.. + + + lzma_rs::decode::lzma2::Lzma2Decoder::decompress (30 samples, 6.56%) + + lzma_rs::.. + + + __memmove_avx512_unaligned_erms (5 samples, 1.09%) + + + + + __irqentry_text_end (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + page_add_new_anon_rmap (1 samples, 0.22%) + + + + + __mod_lruvec_page_state (1 samples, 0.22%) + + + + + exc_page_fault (2 samples, 0.44%) + + + + + do_user_addr_fault (2 samples, 0.44%) + + + + + lzma_rs::decode::xz::decode_stream (64 samples, 14.00%) + + lzma_rs::decode::xz::.. + + + __memmove_avx512_unaligned_erms (4 samples, 0.88%) + + + + + asm_exc_page_fault (4 samples, 0.88%) + + + + + exc_page_fault (2 samples, 0.44%) + + + + + asm_exc_page_fault (3 samples, 0.66%) + + + + + alloc::vec::Vec<T,A>::extend_from_slice (4 samples, 0.88%) + + + + + __memmove_avx512_unaligned_erms (4 samples, 0.88%) + + + + + s4lib::readers::blockreader::BlockReader::new (69 samples, 15.10%) + + s4lib::readers::blockre.. + + + alloc::raw_vec::RawVec<T,A>::allocate_in (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + sysmalloc (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.66%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (8 samples, 1.75%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (5 samples, 1.09%) + + + + + malloc (4 samples, 0.88%) + + + + + _int_malloc (4 samples, 0.88%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (6 samples, 1.31%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (8 samples, 1.75%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.44%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::patch (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.22%) + + + + + malloc_consolidate (1 samples, 0.22%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (19 samples, 4.16%) + + regex.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (19 samples, 4.16%) + + <core.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (19 samples, 4.16%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (19 samples, 4.16%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (19 samples, 4.16%) + + regex.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (19 samples, 4.16%) + + regex.. + + + cfree@GLIBC_2.2.5 (2 samples, 0.44%) + + + + + _int_free (2 samples, 0.44%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (1 samples, 0.22%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (23 samples, 5.03%) + + s4lib:.. + + + once_cell::imp::OnceCell<T>::initialize (23 samples, 5.03%) + + once_c.. + + + once_cell::imp::initialize_or_wait (23 samples, 5.03%) + + once_c.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (23 samples, 5.03%) + + once_c.. + + + regex::regex::bytes::Regex::new (23 samples, 5.03%) + + regex:.. + + + regex::builders::Builder::build_one_bytes (23 samples, 5.03%) + + regex:.. + + + regex_automata::meta::regex::Builder::build (23 samples, 5.03%) + + regex_.. + + + regex_automata::meta::strategy::new (23 samples, 5.03%) + + regex_.. + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.88%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.22%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.22%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.22%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (1 samples, 0.22%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.22%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.22%) + + + + + regex_automata::util::prefilter::suffixes (2 samples, 0.44%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.44%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.44%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + _int_free (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.44%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.44%) + + + + + alloc::vec::Vec<T,A>::retain_mut (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + regex_automata::util::prefilter::prefixes (3 samples, 0.66%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (3 samples, 0.66%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + malloc (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (7 samples, 1.53%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (7 samples, 1.53%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (2 samples, 0.44%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + _int_free (1 samples, 0.22%) + + + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (4 samples, 0.88%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (17 samples, 3.72%) + + s4li.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (17 samples, 3.72%) + + s4li.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (17 samples, 3.72%) + + s4li.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (17 samples, 3.72%) + + s4li.. + + + once_cell::imp::OnceCell<T>::initialize (17 samples, 3.72%) + + once.. + + + once_cell::imp::initialize_or_wait (17 samples, 3.72%) + + once.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (17 samples, 3.72%) + + once.. + + + regex::regex::bytes::Regex::new (17 samples, 3.72%) + + rege.. + + + regex::builders::Builder::build_one_bytes (17 samples, 3.72%) + + rege.. + + + regex_automata::meta::regex::Builder::build (17 samples, 3.72%) + + rege.. + + + regex_automata::meta::strategy::new (17 samples, 3.72%) + + rege.. + + + s4::exec_fileprocessor_thread (18 samples, 3.94%) + + s4::.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::new (1 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::new (1 samples, 0.22%) + + + + + s4lib::readers::linereader::LineReader::new (1 samples, 0.22%) + + + + + s4lib::readers::blockreader::BlockReader::new (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + filemap_map_pages (1 samples, 0.22%) + + + + + next_uptodate_page (1 samples, 0.22%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::builder::x86_64::SlimAVX2<3_usize>::new_unchecked (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (1 samples, 0.22%) + + + + + aho_corasick::packed::pattern::Pattern::low_nybbles (1 samples, 0.22%) + + + + + __libc_calloc (1 samples, 0.22%) + + + + + regex_automata::util::prefilter::Prefilter::new (2 samples, 0.44%) + + + + + regex_automata::util::prefilter::Choice::new (2 samples, 0.44%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (2 samples, 0.44%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.22%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (1 samples, 0.22%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (1 samples, 0.22%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (1 samples, 0.22%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::fill_failure_transitions (1 samples, 0.22%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + _int_free (1 samples, 0.22%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.22%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + sysmalloc (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (4 samples, 0.88%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (3 samples, 0.66%) + + + + + regex_automata::meta::strategy::new (7 samples, 1.53%) + + + + + regex_automata::meta::reverse_inner::extract (5 samples, 1.09%) + + + + + regex_automata::util::prefilter::Choice::new (5 samples, 1.09%) + + + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.22%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.22%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.22%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (1 samples, 0.22%) + + + + + aho_corasick::util::remapper::Remapper::remap (1 samples, 0.22%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + sysmalloc (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + __alloc_pages (1 samples, 0.22%) + + + + + get_page_from_freelist (1 samples, 0.22%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.22%) + + + + + clear_page_erms (1 samples, 0.22%) + + + + + asm_exc_page_fault (2 samples, 0.44%) + + + + + exc_page_fault (2 samples, 0.44%) + + + + + do_user_addr_fault (2 samples, 0.44%) + + + + + handle_mm_fault (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (4 samples, 0.88%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (4 samples, 0.88%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (4 samples, 0.88%) + + + + + alloc::vec::Vec<T,A>::extend_with (3 samples, 0.66%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::finish (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile (1 samples, 0.22%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (6 samples, 1.31%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + aho_corasick::packed::api::Builder::extend (1 samples, 0.22%) + + + + + aho_corasick::packed::pattern::Patterns::add (1 samples, 0.22%) + + + + + aho_corasick::dfa::Builder::finish_build_one_start::{{closure}} (1 samples, 0.22%) + + + + + regex_automata::meta::regex::Builder::build (10 samples, 2.19%) + + r.. + + + regex_automata::meta::strategy::new (10 samples, 2.19%) + + r.. + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.88%) + + + + + regex_automata::util::prefilter::Choice::new (4 samples, 0.88%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (4 samples, 0.88%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (3 samples, 0.66%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + sysmalloc (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + sysmalloc (1 samples, 0.22%) + + + + + __mprotect (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.22%) + + + + + do_syscall_64 (1 samples, 0.22%) + + + + + __x64_sys_mprotect (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.44%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.22%) + + + + + _int_free (1 samples, 0.22%) + + + + + regex::regex::bytes::Regex::new (6 samples, 1.31%) + + + + + regex::builders::Builder::build_one_bytes (6 samples, 1.31%) + + + + + regex_automata::meta::regex::Builder::build (6 samples, 1.31%) + + + + + regex_automata::meta::strategy::new (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (6 samples, 1.31%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 1.31%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.44%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + malloc (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (3 samples, 0.66%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (3 samples, 0.66%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.66%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (5 samples, 1.09%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (5 samples, 1.09%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (2 samples, 0.44%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.44%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.44%) + + + + + realloc (2 samples, 0.44%) + + + + + _int_realloc (2 samples, 0.44%) + + + + + malloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + sysmalloc (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + __page_set_anon_rmap (1 samples, 0.22%) + + + + + irqentry_enter (1 samples, 0.22%) + + + + + lru_cache_add (1 samples, 0.22%) + + + + + rmqueue_bulk (1 samples, 0.22%) + + + + + __list_del_entry_valid (1 samples, 0.22%) + + + + + do_user_addr_fault (6 samples, 1.31%) + + + + + handle_mm_fault (6 samples, 1.31%) + + + + + __handle_mm_fault (6 samples, 1.31%) + + + + + __alloc_pages (5 samples, 1.09%) + + + + + get_page_from_freelist (5 samples, 1.09%) + + + + + kernel_init_free_pages.part.0 (4 samples, 0.88%) + + + + + clear_page_erms (4 samples, 0.88%) + + + + + asm_exc_page_fault (8 samples, 1.75%) + + + + + exc_page_fault (8 samples, 1.75%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (12 samples, 2.63%) + + re.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (12 samples, 2.63%) + + re.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (12 samples, 2.63%) + + <T.. + + + alloc::vec::Vec<T,A>::extend_with (11 samples, 2.41%) + + al.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (14 samples, 3.06%) + + reg.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (14 samples, 3.06%) + + reg.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.44%) + + + + + lru_cache_add (1 samples, 0.22%) + + + + + __pagevec_lru_add (1 samples, 0.22%) + + + + + page_mapping (1 samples, 0.22%) + + + + + asm_exc_page_fault (2 samples, 0.44%) + + + + + exc_page_fault (2 samples, 0.44%) + + + + + do_user_addr_fault (2 samples, 0.44%) + + + + + handle_mm_fault (2 samples, 0.44%) + + + + + __handle_mm_fault (2 samples, 0.44%) + + + + + __mem_cgroup_charge (1 samples, 0.22%) + + + + + charge_memcg (1 samples, 0.22%) + + + + + mem_cgroup_charge_statistics.constprop.0 (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (3 samples, 0.66%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (28 samples, 6.13%) + + regex_au.. + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (28 samples, 6.13%) + + <core::i.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (28 samples, 6.13%) + + regex_au.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (28 samples, 6.13%) + + regex_au.. + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (28 samples, 6.13%) + + regex_au.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (28 samples, 6.13%) + + regex_au.. + + + regex_automata::nfa::thompson::compiler::Compiler::c (9 samples, 1.97%) + + r.. + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (9 samples, 1.97%) + + r.. + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (9 samples, 1.97%) + + r.. + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (9 samples, 1.97%) + + <.. + + + alloc::vec::Vec<T,A>::extend_with (9 samples, 1.97%) + + a.. + + + regex::builders::Builder::build_one_bytes (29 samples, 6.35%) + + regex::b.. + + + regex_automata::meta::regex::Builder::build (29 samples, 6.35%) + + regex_au.. + + + regex_automata::meta::strategy::new (29 samples, 6.35%) + + regex_au.. + + + regex_automata::meta::reverse_inner::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.22%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.22%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 0.22%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.22%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.22%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.22%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.22%) + + + + + regex_automata::meta::strategy::new (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.22%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.22%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.22%) + + + + + asm_exc_page_fault (1 samples, 0.22%) + + + + + exc_page_fault (1 samples, 0.22%) + + + + + do_user_addr_fault (1 samples, 0.22%) + + + + + handle_mm_fault (1 samples, 0.22%) + + + + + __handle_mm_fault (1 samples, 0.22%) + + + + + __alloc_pages (1 samples, 0.22%) + + + + + get_page_from_freelist (1 samples, 0.22%) + + + + + __list_del_entry_valid (1 samples, 0.22%) + + + + + gen-1000-3-foob (343 samples, 75.05%) + + gen-1000-3-foob + + + [unknown] (186 samples, 40.70%) + + [unknown] + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.44%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.44%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.44%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.44%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.44%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (2 samples, 0.44%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.22%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.22%) + + + + + realloc (1 samples, 0.22%) + + + + + _int_realloc (1 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.22%) + + + + + malloc_consolidate (1 samples, 0.22%) + + + + + all (457 samples, 100%) + + + + + ctrl-c (1 samples, 0.22%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.22%) + + + + + do_syscall_64 (1 samples, 0.22%) + + + + + syscall_exit_to_user_mode (1 samples, 0.22%) + + + + + exit_to_user_mode_prepare (1 samples, 0.22%) + + + + + arch_do_signal_or_restart (1 samples, 0.22%) + + + + + get_signal (1 samples, 0.22%) + + + + + do_group_exit (1 samples, 0.22%) + + + + + do_exit (1 samples, 0.22%) + + + + + acct_process (1 samples, 0.22%) + + + + + do_acct_process (1 samples, 0.22%) + + + + + __kernel_write (1 samples, 0.22%) + + + + + ext4_buffered_write_iter (1 samples, 0.22%) + + + + + file_update_time (1 samples, 0.22%) + + + + + generic_update_time (1 samples, 0.22%) + + + + + __mark_inode_dirty (1 samples, 0.22%) + + + + + ext4_dirty_inode (1 samples, 0.22%) + + + + + __ext4_journal_start_sb (1 samples, 0.22%) + + + + + jbd2__journal_start (1 samples, 0.22%) + + + + + kmem_cache_alloc (1 samples, 0.22%) + + + + + diff --git a/releases/0.7.75/flamegraph-syslog.svg b/releases/0.7.75/flamegraph-syslog.svg new file mode 100644 index 00000000..def6bb6d --- /dev/null +++ b/releases/0.7.75/flamegraph-syslog.svg @@ -0,0 +1,7287 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231116-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/other/tests/gen-99999-1-Motley_Crue.log + + Reset Zoom + Search + + + + syscall_return_via_sysret (12 samples, 0.30%) + + + + + ret_from_fork (22 samples, 0.55%) + + + + + schedule_tail (22 samples, 0.55%) + + + + + finish_task_switch.isra.0 (22 samples, 0.55%) + + + + + __perf_event_task_sched_in (22 samples, 0.55%) + + + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 0.55%) + + + + + entry_SYSCALL_64_safe_stack (2 samples, 0.05%) + + + + + cgroup_rstat_updated (1 samples, 0.02%) + + + + + __mod_memcg_lruvec_state (4 samples, 0.10%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + page_remove_rmap (6 samples, 0.15%) + + + + + __mod_lruvec_page_state (6 samples, 0.15%) + + + + + __mod_lruvec_state (2 samples, 0.05%) + + + + + _raw_spin_lock (1 samples, 0.02%) + + + + + unmap_vmas (8 samples, 0.20%) + + + + + unmap_page_range (8 samples, 0.20%) + + + + + __free_one_page (2 samples, 0.05%) + + + + + free_pcppages_bulk (4 samples, 0.10%) + + + + + free_unref_page_list (5 samples, 0.12%) + + + + + release_pages (6 samples, 0.15%) + + + + + __x64_sys_exit_group (15 samples, 0.37%) + + + + + do_group_exit (15 samples, 0.37%) + + + + + do_exit (15 samples, 0.37%) + + + + + mmput (15 samples, 0.37%) + + + + + exit_mmap (15 samples, 0.37%) + + + + + tlb_finish_mmu (7 samples, 0.17%) + + + + + free_pages_and_swap_cache (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (16 samples, 0.40%) + + + + + do_syscall_64 (16 samples, 0.40%) + + + + + __x64_sys_execve (1 samples, 0.02%) + + + + + do_execveat_common.isra.0 (1 samples, 0.02%) + + + + + bprm_execve (1 samples, 0.02%) + + + + + load_elf_binary (1 samples, 0.02%) + + + + + vm_mmap_pgoff (1 samples, 0.02%) + + + + + do_mmap (1 samples, 0.02%) + + + + + mmap_region (1 samples, 0.02%) + + + + + perf_event_mmap (1 samples, 0.02%) + + + + + perf_iterate_sb (1 samples, 0.02%) + + + + + perf_iterate_ctx (1 samples, 0.02%) + + + + + perf_event_mmap_output (1 samples, 0.02%) + + + + + vma_link (1 samples, 0.02%) + + + + + clone3 (2 samples, 0.05%) + + + + + start_thread (2 samples, 0.05%) + + + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 0.05%) + + + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 0.05%) + + + + + __mmap (2 samples, 0.05%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.05%) + + + + + do_syscall_64 (2 samples, 0.05%) + + + + + vm_mmap_pgoff (2 samples, 0.05%) + + + + + do_mmap (2 samples, 0.05%) + + + + + mmap_region (2 samples, 0.05%) + + + + + perf_event_mmap (1 samples, 0.02%) + + + + + perf_iterate_sb (1 samples, 0.02%) + + + + + perf_iterate_ctx (1 samples, 0.02%) + + + + + perf_event_mmap_output (1 samples, 0.02%) + + + + + __task_pid_nr_ns (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + syscall_exit_to_user_mode (1 samples, 0.02%) + + + + + exit_to_user_mode_prepare (1 samples, 0.02%) + + + + + task_work_run (1 samples, 0.02%) + + + + + __fput (1 samples, 0.02%) + + + + + pipe_release (1 samples, 0.02%) + + + + + kfree (1 samples, 0.02%) + + + + + __slab_free.constprop.0 (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + __mem_cgroup_charge (1 samples, 0.02%) + + + + + charge_memcg (1 samples, 0.02%) + + + + + memcg_check_events.isra.0 (1 samples, 0.02%) + + + + + _dl_relocate_object (2 samples, 0.05%) + + + + + _dl_receive_error (1 samples, 0.02%) + + + + + version_check_doit (1 samples, 0.02%) + + + + + _dl_check_all_versions (1 samples, 0.02%) + + + + + _dl_check_map_versions (1 samples, 0.02%) + + + + + _dl_map_object_deps (1 samples, 0.02%) + + + + + _dl_catch_exception (1 samples, 0.02%) + + + + + openaux (1 samples, 0.02%) + + + + + _dl_map_object (1 samples, 0.02%) + + + + + _dl_load_cache_lookup (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + _dl_start (5 samples, 0.12%) + + + + + _dl_sysdep_start (5 samples, 0.12%) + + + + + dl_main (5 samples, 0.12%) + + + + + __libc_early_init (1 samples, 0.02%) + + + + + __ctype_init (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + asm_sysvec_hyperv_stimer0 (1 samples, 0.02%) + + + + + sysvec_hyperv_stimer0 (1 samples, 0.02%) + + + + + irq_exit_rcu (1 samples, 0.02%) + + + + + __softirqentry_text_start (1 samples, 0.02%) + + + + + rebalance_domains (1 samples, 0.02%) + + + + + load_balance (1 samples, 0.02%) + + + + + find_busiest_group (1 samples, 0.02%) + + + + + cpumask_next_and (1 samples, 0.02%) + + + + + _find_next_bit (1 samples, 0.02%) + + + + + __memrchr_evex (20 samples, 0.50%) + + + + + __memmove_avx512_unaligned_erms (7 samples, 0.17%) + + + + + write_null (4 samples, 0.10%) + + + + + srso_alias_safe_ret (4 samples, 0.10%) + + + + + syscall_return_via_sysret (4 samples, 0.10%) + + + + + exit_to_user_mode_prepare (4 samples, 0.10%) + + + + + syscall_exit_to_user_mode (12 samples, 0.30%) + + + + + srso_alias_return_thunk (2 samples, 0.05%) + + + + + srso_alias_safe_ret (2 samples, 0.05%) + + + + + write_null (7 samples, 0.17%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + security_file_permission (2 samples, 0.05%) + + + + + fsnotify (4 samples, 0.10%) + + + + + lockref_put_return (8 samples, 0.20%) + + + + + dput (10 samples, 0.25%) + + + + + lockref_get_not_zero (1 samples, 0.02%) + + + + + dget_parent (2 samples, 0.05%) + + + + + __fsnotify_parent (19 samples, 0.47%) + + + + + vfs_write (63 samples, 1.57%) + + + + + fput_many (6 samples, 0.15%) + + + + + srso_alias_return_thunk (3 samples, 0.07%) + + + + + srso_alias_safe_ret (3 samples, 0.07%) + + + + + __fget_files (7 samples, 0.17%) + + + + + __fget_light (9 samples, 0.22%) + + + + + __fdget_pos (23 samples, 0.57%) + + + + + ksys_write (99 samples, 2.47%) + + ks.. + + + __x64_sys_write (1 samples, 0.02%) + + + + + do_syscall_64 (121 samples, 3.02%) + + do_.. + + + entry_SYSCALL_64_after_hwframe (124 samples, 3.10%) + + ent.. + + + __GI___pthread_enable_asynccancel (4 samples, 0.10%) + + + + + __GI___pthread_disable_asynccancel (4 samples, 0.10%) + + + + + __GI___libc_write (154 samples, 3.85%) + + __GI.. + + + <std::io::stdio::StdoutLock as std::io::Write>::write (183 samples, 4.57%) + + <std:.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (192 samples, 4.80%) + + <&std:.. + + + <std::io::stdio::Stdout as std::io::Write>::write (195 samples, 4.87%) + + <std::.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::write (201 samples, 5.02%) + + <termc.. + + + std::io::Write::write_all (203 samples, 5.07%) + + std::i.. + + + __memmove_avx512_unaligned_erms (7 samples, 0.17%) + + + + + __memrchr_evex (25 samples, 0.62%) + + + + + __memmove_avx512_unaligned_erms (6 samples, 0.15%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (68 samples, 1.70%) + + + + + <std::io::stdio::Stdout as std::io::Write>::write (80 samples, 2.00%) + + <.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (80 samples, 2.00%) + + <.. + + + std::io::Write::write_all (83 samples, 2.07%) + + s.. + + + termcolor::Ansi<W>::write_color (92 samples, 2.30%) + + t.. + + + __memrchr_evex (22 samples, 0.55%) + + + + + __memmove_avx512_unaligned_erms (19 samples, 0.47%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (76 samples, 1.90%) + + <.. + + + <&std::io::stdio::Stdout as std::io::Write>::write (113 samples, 2.82%) + + <&.. + + + <std::io::stdio::Stdout as std::io::Write>::write (119 samples, 2.97%) + + <st.. + + + std::io::Write::write_all (133 samples, 3.32%) + + std.. + + + <termcolor::LossyStandardStream<W> as termcolor::WriteColor>::set_color (233 samples, 5.82%) + + <termco.. + + + <termcolor::LossyStandardStream<W> as std::io::Write>::flush (2 samples, 0.05%) + + + + + <termcolor::ColorSpec as core::cmp::PartialEq>::eq (9 samples, 0.22%) + + + + + <termcolor::ColorSpec as core::clone::Clone>::clone (5 samples, 0.12%) + + + + + write_null (4 samples, 0.10%) + + + + + srso_alias_safe_ret (4 samples, 0.10%) + + + + + syscall_return_via_sysret (15 samples, 0.37%) + + + + + srso_alias_return_thunk (2 samples, 0.05%) + + + + + srso_alias_safe_ret (2 samples, 0.05%) + + + + + srso_alias_safe_ret (5 samples, 0.12%) + + + + + srso_alias_return_thunk (3 samples, 0.07%) + + + + + srso_alias_safe_ret (3 samples, 0.07%) + + + + + exit_to_user_mode_prepare (5 samples, 0.12%) + + + + + amd_clear_divider (2 samples, 0.05%) + + + + + syscall_exit_to_user_mode (42 samples, 1.05%) + + + + + srso_alias_return_thunk (5 samples, 0.12%) + + + + + srso_alias_safe_ret (5 samples, 0.12%) + + + + + write_null (49 samples, 1.22%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + srso_alias_return_thunk (8 samples, 0.20%) + + + + + srso_alias_safe_ret (8 samples, 0.20%) + + + + + security_file_permission (11 samples, 0.27%) + + + + + rw_verify_area (6 samples, 0.15%) + + + + + fsnotify (18 samples, 0.45%) + + + + + lockref_put_return (48 samples, 1.20%) + + + + + dput (65 samples, 1.62%) + + + + + rcu_read_unlock_strict (1 samples, 0.02%) + + + + + asm_sysvec_hyperv_stimer0 (1 samples, 0.02%) + + + + + sysvec_hyperv_stimer0 (1 samples, 0.02%) + + + + + irq_exit_rcu (1 samples, 0.02%) + + + + + idle_cpu (1 samples, 0.02%) + + + + + lockref_get_not_zero (6 samples, 0.15%) + + + + + dget_parent (9 samples, 0.22%) + + + + + __fsnotify_parent (119 samples, 2.97%) + + __f.. + + + vfs_write (379 samples, 9.47%) + + vfs_write + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + fput_many (26 samples, 0.65%) + + + + + srso_alias_return_thunk (20 samples, 0.50%) + + + + + srso_alias_safe_ret (20 samples, 0.50%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + rcu_read_unlock_strict (1 samples, 0.02%) + + + + + __fget_files (34 samples, 0.85%) + + + + + __fget_light (49 samples, 1.22%) + + + + + __fdget_pos (118 samples, 2.95%) + + __.. + + + ksys_write (563 samples, 14.07%) + + ksys_write + + + __x64_sys_write (5 samples, 0.12%) + + + + + do_syscall_64 (643 samples, 16.07%) + + do_syscall_64 + + + entry_SYSCALL_64_after_hwframe (661 samples, 16.52%) + + entry_SYSCALL_64_after_hw.. + + + entry_SYSCALL_64 (42 samples, 1.05%) + + + + + __x86_indirect_thunk_rax (5 samples, 0.12%) + + + + + __GI___pthread_enable_asynccancel (2 samples, 0.05%) + + + + + __GI___pthread_disable_asynccancel (11 samples, 0.27%) + + + + + __GI___libc_write (791 samples, 19.77%) + + __GI___libc_write + + + std::io::buffered::bufwriter::BufWriter<W>::flush_buf (792 samples, 19.79%) + + std::io::buffered::bufwriter::B.. + + + <&std::io::stdio::Stdout as std::io::Write>::flush (811 samples, 20.26%) + + <&std::io::stdio::Stdout as std:.. + + + <std::io::stdio::Stdout as std::io::Write>::flush (819 samples, 20.46%) + + <std::io::stdio::Stdout as std::.. + + + s4lib::printer::printers::PrinterLogMessage::print_sysline_color (1,405 samples, 35.11%) + + s4lib::printer::printers::PrinterLogMessage::print_syslin.. + + + hashbrown::raw::RawTable<T,A>::remove_entry (13 samples, 0.32%) + + + + + hashbrown::set::HashSet<T,S,A>::remove (14 samples, 0.35%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.02%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.02%) + + + + + hashbrown::set::HashSet<T,S,A>::insert (2 samples, 0.05%) + + + + + hashbrown::raw::RawTable<T>::with_capacity (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + hashbrown::raw::RawTable<T,A>::insert (1 samples, 0.02%) + + + + + hashbrown::map::HashMap<K,V,S,A>::get_mut (3 samples, 0.07%) + + + + + __memmove_avx512_unaligned_erms (47 samples, 1.17%) + + + + + crossbeam_channel::channel::read (49 samples, 1.22%) + + + + + asm_sysvec_hyperv_stimer0 (1 samples, 0.02%) + + + + + sysvec_hyperv_stimer0 (1 samples, 0.02%) + + + + + irq_exit_rcu (1 samples, 0.02%) + + + + + __softirqentry_text_start (1 samples, 0.02%) + + + + + rebalance_domains (1 samples, 0.02%) + + + + + load_balance (1 samples, 0.02%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + __memmove_avx512_unaligned_erms (11 samples, 0.27%) + + + + + crossbeam_channel::select::SelectedOperation::recv (61 samples, 1.52%) + + + + + syscall_exit_to_user_mode (1 samples, 0.02%) + + + + + exit_to_user_mode_prepare (1 samples, 0.02%) + + + + + __rseq_handle_notify_resume (1 samples, 0.02%) + + + + + __get_user_8 (1 samples, 0.02%) + + + + + finish_task_switch.isra.0 (1 samples, 0.02%) + + + + + dequeue_task_fair (1 samples, 0.02%) + + + + + dequeue_entity (1 samples, 0.02%) + + + + + update_load_avg (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (9 samples, 0.22%) + + + + + do_syscall_64 (9 samples, 0.22%) + + + + + __x64_sys_futex (8 samples, 0.20%) + + + + + do_futex (8 samples, 0.20%) + + + + + futex_wait (8 samples, 0.20%) + + + + + futex_wait_queue_me (8 samples, 0.20%) + + + + + schedule (8 samples, 0.20%) + + + + + __schedule (8 samples, 0.20%) + + + + + __perf_event_task_sched_out (6 samples, 0.15%) + + + + + amd_pmu_disable_all (6 samples, 0.15%) + + + + + x86_pmu_disable_all (6 samples, 0.15%) + + + + + syscall (10 samples, 0.25%) + + + + + std::sys_common::thread_info::current_thread (1 samples, 0.02%) + + + + + std::thread::park (12 samples, 0.30%) + + + + + update_rq_clock (1 samples, 0.02%) + + + + + sched_clock_cpu (1 samples, 0.02%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.02%) + + + + + read_hv_clock_tsc (1 samples, 0.02%) + + + + + update_curr (1 samples, 0.02%) + + + + + cpuacct_charge (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + pick_next_task_fair (5 samples, 0.12%) + + + + + pick_next_entity (3 samples, 0.07%) + + + + + schedule (8 samples, 0.20%) + + + + + __schedule (8 samples, 0.20%) + + + + + yield_task_fair (1 samples, 0.02%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.02%) + + + + + do_sched_yield (3 samples, 0.07%) + + + + + __x64_sys_sched_yield (12 samples, 0.30%) + + + + + entry_SYSCALL_64_after_hwframe (14 samples, 0.35%) + + + + + do_syscall_64 (14 samples, 0.35%) + + + + + entry_SYSCALL_64 (2 samples, 0.05%) + + + + + __sched_yield (18 samples, 0.45%) + + + + + crossbeam_channel::context::Context::wait_until (45 samples, 1.12%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (2 samples, 0.05%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::unregister (1 samples, 0.02%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (49 samples, 1.22%) + + + + + <crossbeam_channel::channel::Receiver<T> as crossbeam_channel::select::SelectHandle>::accept (1 samples, 0.02%) + + + + + <crossbeam_channel::flavors::array::Receiver<T> as crossbeam_channel::select::SelectHandle>::try_select (21 samples, 0.52%) + + + + + crossbeam_channel::select::run_select (77 samples, 1.92%) + + c.. + + + crossbeam_channel::select::Select::select (79 samples, 1.97%) + + c.. + + + crossbeam_channel::select::Select::new (2 samples, 0.05%) + + + + + malloc (2 samples, 0.05%) + + + + + core::ptr::drop_in_place<s4lib::data::common::LogMessage> (1 samples, 0.02%) + + + + + core::hash::BuildHasher::hash_one (1 samples, 0.02%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.02%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (16 samples, 0.40%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (31 samples, 0.77%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::remove (57 samples, 1.42%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (57 samples, 1.42%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (3 samples, 0.07%) + + + + + alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (5 samples, 0.12%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (14 samples, 0.35%) + + + + + __memmove_avx512_unaligned_erms (27 samples, 0.67%) + + + + + s4::processing_loop (1,743 samples, 43.55%) + + s4::processing_loop + + + std::rt::lang_start::_{{closure}} (1,744 samples, 43.58%) + + std::rt::lang_start::_{{closure}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (1,744 samples, 43.58%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::main (1,744 samples, 43.58%) + + s4::main + + + clap_builder::builder::command::Command::get_matches_from (1 samples, 0.02%) + + + + + clap_lex::RawArgs::cursor (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + filemap_map_pages (1 samples, 0.02%) + + + + + next_uptodate_page (1 samples, 0.02%) + + + + + _start (1,751 samples, 43.75%) + + _start + + + __libc_start_main@@GLIBC_2.34 (1,745 samples, 43.60%) + + __libc_start_main@@GLIBC_2.34 + + + __libc_start_call_main (1,745 samples, 43.60%) + + __libc_start_call_main + + + main (1,745 samples, 43.60%) + + main + + + std::rt::lang_start_internal (1,745 samples, 43.60%) + + std::rt::lang_start_internal + + + pthread_getattr_np@@GLIBC_2.32 (1 samples, 0.02%) + + + + + __getdelim (1 samples, 0.02%) + + + + + _IO_file_underflow@@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + __read_nocancel (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + ksys_read (1 samples, 0.02%) + + + + + vfs_read (1 samples, 0.02%) + + + + + seq_read (1 samples, 0.02%) + + + + + seq_read_iter (1 samples, 0.02%) + + + + + show_map (1 samples, 0.02%) + + + + + show_map_vma (1 samples, 0.02%) + + + + + show_vma_header_prefix (1 samples, 0.02%) + + + + + seq_put_hex_ll (1 samples, 0.02%) + + + + + [unknown] (17 samples, 0.42%) + + + + + <std::io::stdio::StdoutLock as std::io::Write>::write (17 samples, 0.42%) + + + + + __GI___libc_write (17 samples, 0.42%) + + + + + entry_SYSCALL_64 (17 samples, 0.42%) + + + + + s4 (1,852 samples, 46.28%) + + s4 + + + [[heap]] (30 samples, 0.75%) + + + + + __GI___libc_write (30 samples, 0.75%) + + + + + entry_SYSCALL_64 (30 samples, 0.75%) + + + + + x86_pmu_enable_all (14 samples, 0.35%) + + + + + perf-exec (15 samples, 0.37%) + + + + + entry_SYSCALL_64_after_hwframe (15 samples, 0.37%) + + + + + do_syscall_64 (15 samples, 0.37%) + + + + + __x64_sys_execve (15 samples, 0.37%) + + + + + do_execveat_common.isra.0 (15 samples, 0.37%) + + + + + bprm_execve (15 samples, 0.37%) + + + + + load_elf_binary (15 samples, 0.37%) + + + + + begin_new_exec (15 samples, 0.37%) + + + + + perf_event_exec (15 samples, 0.37%) + + + + + error_entry (1 samples, 0.02%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + lru_cache_add (1 samples, 0.02%) + + + + + __pagevec_lru_add (1 samples, 0.02%) + + + + + page_mapping (1 samples, 0.02%) + + + + + asm_exc_page_fault (2 samples, 0.05%) + + + + + exc_page_fault (2 samples, 0.05%) + + + + + do_user_addr_fault (2 samples, 0.05%) + + + + + handle_mm_fault (2 samples, 0.05%) + + + + + __handle_mm_fault (2 samples, 0.05%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (3 samples, 0.07%) + + + + + __memset_avx512_unaligned_erms (3 samples, 0.07%) + + + + + <regex_automata::meta::strategy::ReverseInner as regex_automata::meta::strategy::Strategy>::create_cache (4 samples, 0.10%) + + + + + regex_automata::hybrid::dfa::Cache::new (1 samples, 0.02%) + + + + + regex_automata::hybrid::dfa::Lazy::init_cache (1 samples, 0.02%) + + + + + regex_automata::hybrid::dfa::Lazy::set_transition (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (4 samples, 0.10%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.10%) + + + + + malloc (4 samples, 0.10%) + + + + + _int_malloc (4 samples, 0.10%) + + + + + malloc_consolidate (4 samples, 0.10%) + + + + + unlink_chunk.constprop.0 (4 samples, 0.10%) + + + + + page_add_new_anon_rmap (1 samples, 0.02%) + + + + + rmqueue_bulk (1 samples, 0.02%) + + + + + __list_del_entry_valid (1 samples, 0.02%) + + + + + do_user_addr_fault (3 samples, 0.07%) + + + + + handle_mm_fault (3 samples, 0.07%) + + + + + __handle_mm_fault (3 samples, 0.07%) + + + + + __alloc_pages (2 samples, 0.05%) + + + + + get_page_from_freelist (2 samples, 0.05%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.02%) + + + + + clear_page_erms (1 samples, 0.02%) + + + + + asm_exc_page_fault (4 samples, 0.10%) + + + + + exc_page_fault (4 samples, 0.10%) + + + + + regex_automata::util::pool::inner::Pool<T,F>::get_slow (13 samples, 0.32%) + + + + + regex_automata::meta::regex::Builder::build_many_from_hir::{{closure}} (13 samples, 0.32%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::create_cache (9 samples, 0.22%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::new (9 samples, 0.22%) + + + + + regex_automata::nfa::thompson::pikevm::ActiveStates::reset (9 samples, 0.22%) + + + + + __memset_avx512_unaligned_erms (5 samples, 0.12%) + + + + + regex_syntax::hir::translate::TranslatorI::push (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_pre (2 samples, 0.05%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.05%) + + + + + regex_syntax::unicode::SimpleCaseFolder::overlaps (1 samples, 0.02%) + + + + + regex_syntax::hir::translate::TranslatorI::push (2 samples, 0.05%) + + + + + regex_syntax::hir::Properties::repetition (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + regex_syntax::hir::Hir::literal (1 samples, 0.02%) + + + + + alloc::vec::Vec<T,A>::into_boxed_slice (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + _int_malloc (2 samples, 0.05%) + + + + + malloc (3 samples, 0.07%) + + + + + regex_syntax::hir::Hir::into_parts (5 samples, 0.12%) + + + + + malloc (3 samples, 0.07%) + + + + + _int_malloc (3 samples, 0.07%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.05%) + + + + + regex_syntax::hir::Hir::concat (14 samples, 0.35%) + + + + + regex_syntax::hir::Properties::class (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_syntax::hir::Hir::class (2 samples, 0.05%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + sysmalloc (1 samples, 0.02%) + + + + + __mprotect (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + __x64_sys_mprotect (1 samples, 0.02%) + + + + + do_mprotect_pkey (1 samples, 0.02%) + + + + + mprotect_fixup (1 samples, 0.02%) + + + + + perf_event_mmap (1 samples, 0.02%) + + + + + perf_iterate_sb (1 samples, 0.02%) + + + + + regex_syntax::hir::Properties::alternation (1 samples, 0.02%) + + + + + regex_syntax::hir::Hir::into_parts (1 samples, 0.02%) + + + + + regex_syntax::hir::Hir::alternation (3 samples, 0.07%) + + + + + regex_syntax::hir::ClassUnicode::try_case_fold_simple (1 samples, 0.02%) + + + + + <regex_syntax::hir::ClassUnicodeRange as regex_syntax::hir::interval::Interval>::case_fold_simple (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + sysmalloc (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + _int_malloc (2 samples, 0.05%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + __alloc_pages (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (4 samples, 0.10%) + + + + + realloc (4 samples, 0.10%) + + + + + _int_realloc (4 samples, 0.10%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.05%) + + + + + asm_exc_page_fault (2 samples, 0.05%) + + + + + exc_page_fault (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (5 samples, 0.12%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.02%) + + + + + <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast::visitor::Visitor>::visit_post (37 samples, 0.92%) + + + + + regex_syntax::hir::translate::Translator::translate (41 samples, 1.02%) + + + + + regex_syntax::ast::visitor::visit (41 samples, 1.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + <regex_syntax::ast::parse::NestLimiter<P> as regex_syntax::ast::visitor::Visitor>::visit_pre (1 samples, 0.02%) + + + + + regex_syntax::ast::visitor::visit (3 samples, 0.07%) + + + + + malloc (3 samples, 0.07%) + + + + + _int_malloc (3 samples, 0.07%) + + + + + regex_syntax::ast::Concat::into_ast (4 samples, 0.10%) + + + + + regex_syntax::ast::parse::ParserI<P>::push_alternate (10 samples, 0.25%) + + + + + regex_syntax::ast::parse::ParserI<P>::maybe_parse_ascii_class (1 samples, 0.02%) + + + + + regex_syntax::ast::ClassSetUnion::push (1 samples, 0.02%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (3 samples, 0.07%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + malloc (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::Parser::parse (27 samples, 0.67%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (27 samples, 0.67%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::parse::Parser> (1 samples, 0.02%) + + + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + filemap_map_pages (1 samples, 0.02%) + + + + + next_uptodate_page (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::ClassSet> (7 samples, 0.17%) + + + + + <regex_syntax::ast::ClassSet as core::ops::drop::Drop>::drop (7 samples, 0.17%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (7 samples, 0.17%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (7 samples, 0.17%) + + + + + alloc::raw_vec::finish_grow (7 samples, 0.17%) + + + + + realloc (7 samples, 0.17%) + + + + + _int_realloc (7 samples, 0.17%) + + + + + _int_malloc (7 samples, 0.17%) + + + + + malloc_consolidate (7 samples, 0.17%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (8 samples, 0.20%) + + + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (1 samples, 0.02%) + + + + + _int_free (6 samples, 0.15%) + + + + + cfree@GLIBC_2.2.5 (11 samples, 0.27%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + _int_malloc (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (3 samples, 0.07%) + + + + + alloc::raw_vec::finish_grow (3 samples, 0.07%) + + + + + realloc (3 samples, 0.07%) + + + + + _int_realloc (3 samples, 0.07%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.02%) + + + + + core::ptr::drop_in_place<regex_syntax::ast::Ast> (23 samples, 0.57%) + + + + + <regex_syntax::ast::Ast as core::ops::drop::Drop>::drop (23 samples, 0.57%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (4 samples, 0.10%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (107 samples, 2.67%) + + s4.. + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (107 samples, 2.67%) + + s4.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (107 samples, 2.67%) + + s4.. + + + once_cell::imp::OnceCell<T>::initialize (94 samples, 2.35%) + + o.. + + + once_cell::imp::initialize_or_wait (94 samples, 2.35%) + + o.. + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (94 samples, 2.35%) + + o.. + + + regex::regex::bytes::Regex::new (94 samples, 2.35%) + + r.. + + + regex::builders::Builder::build_one_bytes (94 samples, 2.35%) + + r.. + + + regex_automata::meta::regex::Builder::build (94 samples, 2.35%) + + r.. + + + <alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop (2 samples, 0.05%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (2 samples, 0.05%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.05%) + + + + + _int_free (2 samples, 0.05%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (108 samples, 2.70%) + + s4.. + + + s4lib::readers::blockreader::BlockReader::read_block (1 samples, 0.02%) + + + + + s4lib::readers::blockreader::BlockReader::read_block_File (1 samples, 0.02%) + + + + + std::io::default_read_exact (1 samples, 0.02%) + + + + + <std::process::ChildStdout as std::io::Read>::read (1 samples, 0.02%) + + + + + read (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + syscall_exit_to_user_mode (1 samples, 0.02%) + + + + + exit_to_user_mode_prepare (1 samples, 0.02%) + + + + + __rseq_handle_notify_resume (1 samples, 0.02%) + + + + + s4lib::readers::blockreader::BlockReader::drop_block (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + lru::LruCache<K,V,S>::pop (1 samples, 0.02%) + + + + + core::ptr::drop_in_place<core::option::Option<s4lib::common::ResultS3<(u64,alloc::sync::Arc<s4lib::data::line::Line>),std::io::error::Error>>> (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.07%) + + + + + _int_free (3 samples, 0.07%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.05%) + + + + + _int_free (2 samples, 0.05%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.05%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (9 samples, 0.22%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (10 samples, 0.25%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (12 samples, 0.30%) + + + + + __rdl_dealloc (1 samples, 0.02%) + + + + + <alloc::vec::into_iter::IntoIter<T,A> as core::ops::drop::Drop>::drop (4 samples, 0.10%) + + + + + s4lib::readers::linereader::LineReader::drop_line (33 samples, 0.82%) + + + + + _int_free (2 samples, 0.05%) + + + + + cfree@GLIBC_2.2.5 (4 samples, 0.10%) + + + + + s4lib::readers::linereader::LineReader::drop_lines (46 samples, 1.15%) + + + + + lru::LruCache<K,V,S>::pop (3 samples, 0.07%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.05%) + + + + + _int_free (2 samples, 0.05%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.05%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>,alloc::collections::btree::node::marker::KV>>::remove_kv_tracking (5 samples, 0.12%) + + + + + alloc::collections::btree::remove::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::KV>>::remove_leaf_kv (5 samples, 0.12%) + + + + + alloc::collections::btree::map::entry::OccupiedEntry<K,V,A>::remove_entry (9 samples, 0.22%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_sysline (90 samples, 2.25%) + + s.. + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + __cgroup_throttle_swaprate (1 samples, 0.02%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + sysmalloc (2 samples, 0.05%) + + + + + __mprotect (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + __x64_sys_mprotect (1 samples, 0.02%) + + + + + do_mprotect_pkey (1 samples, 0.02%) + + + + + mprotect_fixup (1 samples, 0.02%) + + + + + perf_event_mmap (1 samples, 0.02%) + + + + + perf_iterate_sb (1 samples, 0.02%) + + + + + perf_iterate_ctx (1 samples, 0.02%) + + + + + perf_event_mmap_output (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + malloc_consolidate (18 samples, 0.45%) + + + + + malloc (39 samples, 0.97%) + + + + + _int_malloc (39 samples, 0.97%) + + + + + <alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (2 samples, 0.05%) + + + + + s4lib::readers::syslinereader::SyslineReader::drop_data (146 samples, 3.65%) + + s4li.. + + + s4lib::readers::syslogprocessor::SyslogProcessor::drop_data_try (163 samples, 4.07%) + + s4li.. + + + _int_malloc (12 samples, 0.30%) + + + + + malloc (14 samples, 0.35%) + + + + + __rdl_alloc (1 samples, 0.02%) + + + + + s4lib::data::line::Line::get_boxptrs (17 samples, 0.42%) + + + + + s4lib::data::datetime::datetime_from_str_workaround_Issue660 (3 samples, 0.07%) + + + + + chrono::naive::datetime::NaiveDateTime::checked_sub_offset (2 samples, 0.05%) + + + + + chrono::offset::LocalResult<T>::and_then (26 samples, 0.65%) + + + + + chrono::naive::date::NaiveDate::num_days_from_ce (1 samples, 0.02%) + + + + + chrono::format::parsed::Parsed::to_naive_date (4 samples, 0.10%) + + + + + chrono::format::parsed::Parsed::to_naive_datetime_with_offset (6 samples, 0.15%) + + + + + core::str::<impl str>::trim_start_matches (2 samples, 0.05%) + + + + + <chrono::format::strftime::StrftimeItems as core::iter::traits::iterator::Iterator>::next (8 samples, 0.20%) + + + + + chrono::format::parse::parse_internal (111 samples, 2.77%) + + ch.. + + + chrono::naive::datetime::NaiveDateTime::parse_from_str (121 samples, 3.02%) + + chr.. + + + <chrono::offset::fixed::FixedOffset as chrono::offset::TimeZone>::offset_from_local_datetime (2 samples, 0.05%) + + + + + s4lib::data::datetime::datetime_parse_from_str (157 samples, 3.92%) + + s4li.. + + + <core::hash::sip::Hasher<S> as core::hash::Hasher>::write (44 samples, 1.10%) + + + + + core::hash::BuildHasher::hash_one (98 samples, 2.45%) + + co.. + + + __memcmp_evex_movbe (7 samples, 0.17%) + + + + + regex_automata::util::captures::Captures::get_group_by_name (156 samples, 3.90%) + + rege.. + + + regex_automata::meta::regex::RegexInfo::props_union (5 samples, 0.12%) + + + + + malloc (4 samples, 0.10%) + + + + + __memset_avx512_unaligned_erms (4 samples, 0.10%) + + + + + regex_automata::meta::regex::Regex::create_captures (17 samples, 0.42%) + + + + + _int_free (7 samples, 0.17%) + + + + + cfree@GLIBC_2.2.5 (14 samples, 0.35%) + + + + + __memmove_avx512_unaligned_erms (6 samples, 0.15%) + + + + + __memset_avx512_unaligned_erms (5 samples, 0.12%) + + + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::search_imp (98 samples, 2.45%) + + re.. + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots_imp (99 samples, 2.47%) + + re.. + + + regex_automata::nfa::thompson::backtrack::BoundedBacktracker::try_search_slots (113 samples, 2.82%) + + re.. + + + regex_automata::meta::strategy::Core::search_slots_nofail (142 samples, 3.55%) + + rege.. + + + regex_automata::hybrid::search::find_fwd (36 samples, 0.90%) + + + + + regex_automata::hybrid::regex::Regex::try_search (42 samples, 1.05%) + + + + + <regex_automata::meta::strategy::Core as regex_automata::meta::strategy::Strategy>::search_slots (198 samples, 4.95%) + + <regex.. + + + s4lib::data::datetime::bytes_to_regex_to_datetime (595 samples, 14.87%) + + s4lib::data::datetime::.. + + + hashbrown::map::HashMap<K,V,S,A>::remove (1 samples, 0.02%) + + + + + lru::LruCache<K,V,S>::put (22 samples, 0.55%) + + + + + _int_free (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.07%) + + + + + _int_malloc (6 samples, 0.15%) + + + + + malloc (11 samples, 0.27%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (12 samples, 0.30%) + + + + + alloc::raw_vec::finish_grow (12 samples, 0.30%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::get_mut (4 samples, 0.10%) + + + + + _int_malloc (6 samples, 0.15%) + + + + + malloc (21 samples, 0.52%) + + + + + __rdl_alloc (2 samples, 0.05%) + + + + + <alloc::collections::btree::map::Iter<K,V> as core::iter::traits::iterator::Iterator>::next (3 samples, 0.07%) + + + + + <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter (37 samples, 0.92%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (732 samples, 18.29%) + + s4lib::readers::syslinereader.. + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (4 samples, 0.10%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_back_checked (1 samples, 0.02%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (80 samples, 2.00%) + + a.. + + + malloc (5 samples, 0.12%) + + + + + _int_malloc (5 samples, 0.12%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (12 samples, 0.30%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (40 samples, 1.00%) + + + + + rangemap::map::RangeMap<K,V>::insert (138 samples, 3.45%) + + ran.. + + + malloc (4 samples, 0.10%) + + + + + unlink_chunk.constprop.0 (3 samples, 0.07%) + + + + + malloc (4 samples, 0.10%) + + + + + _int_malloc (4 samples, 0.10%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (7 samples, 0.17%) + + + + + alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (8 samples, 0.20%) + + + + + s4lib::readers::syslinereader::SyslineReader::insert_sysline (154 samples, 3.85%) + + s4li.. + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_back_checked (1 samples, 0.02%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (18 samples, 0.45%) + + + + + s4lib::readers::syslinereader::SyslineReader::check_store (50 samples, 1.25%) + + + + + _int_malloc (3 samples, 0.07%) + + + + + malloc (5 samples, 0.12%) + + + + + __memmove_avx512_unaligned_erms (4 samples, 0.10%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (13 samples, 0.32%) + + + + + alloc::collections::btree::map::entry::VacantEntry<K,V,A>::insert (14 samples, 0.35%) + + + + + __memmove_avx512_unaligned_erms (2 samples, 0.05%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (7 samples, 0.17%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (30 samples, 0.75%) + + + + + s4lib::readers::linereader::LineReader::insert_line (50 samples, 1.25%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (1 samples, 0.02%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (22 samples, 0.55%) + + + + + s4lib::readers::linereader::LineReader::get_linep (38 samples, 0.95%) + + + + + mark_page_accessed (1 samples, 0.02%) + + + + + xa_load (2 samples, 0.05%) + + + + + xas_load (2 samples, 0.05%) + + + + + submit_bio_noacct (1 samples, 0.02%) + + + + + __submit_bio (1 samples, 0.02%) + + + + + submit_bio_checks (1 samples, 0.02%) + + + + + bio_associate_blkg (1 samples, 0.02%) + + + + + bio_add_page (1 samples, 0.02%) + + + + + __bio_try_merge_page (1 samples, 0.02%) + + + + + ext4_mpage_readpages (4 samples, 0.10%) + + + + + read_pages (5 samples, 0.12%) + + + + + blk_finish_plug (1 samples, 0.02%) + + + + + blk_mq_flush_plug_list (1 samples, 0.02%) + + + + + blk_mq_sched_insert_requests (1 samples, 0.02%) + + + + + blk_mq_try_issue_list_directly (1 samples, 0.02%) + + + + + __blk_mq_try_issue_directly (1 samples, 0.02%) + + + + + scsi_queue_rq (1 samples, 0.02%) + + + + + storvsc_queuecommand (1 samples, 0.02%) + + + + + lock_page_lruvec_irqsave (1 samples, 0.02%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.02%) + + + + + lru_cache_add (3 samples, 0.07%) + + + + + __pagevec_lru_add (3 samples, 0.07%) + + + + + xas_nomem (1 samples, 0.02%) + + + + + xas_find_conflict (1 samples, 0.02%) + + + + + __mod_lruvec_page_state (1 samples, 0.02%) + + + + + cgroup_rstat_updated (1 samples, 0.02%) + + + + + mem_cgroup_charge_statistics.constprop.0 (2 samples, 0.05%) + + + + + __mem_cgroup_charge (3 samples, 0.07%) + + + + + charge_memcg (3 samples, 0.07%) + + + + + add_to_page_cache_lru (10 samples, 0.25%) + + + + + __add_to_page_cache_locked (7 samples, 0.17%) + + + + + __list_del_entry_valid (5 samples, 0.12%) + + + + + rmqueue_bulk (6 samples, 0.15%) + + + + + __alloc_pages (7 samples, 0.17%) + + + + + get_page_from_freelist (7 samples, 0.17%) + + + + + page_cache_ra_unbounded (26 samples, 0.65%) + + + + + xas_load (1 samples, 0.02%) + + + + + xas_start (1 samples, 0.02%) + + + + + filemap_get_pages (28 samples, 0.70%) + + + + + filemap_get_read_batch (2 samples, 0.05%) + + + + + copy_page_to_iter (8 samples, 0.20%) + + + + + copy_user_enhanced_fast_string (8 samples, 0.20%) + + + + + __cond_resched (1 samples, 0.02%) + + + + + new_sync_read (39 samples, 0.97%) + + + + + filemap_read (39 samples, 0.97%) + + + + + entry_SYSCALL_64_after_hwframe (40 samples, 1.00%) + + + + + do_syscall_64 (40 samples, 1.00%) + + + + + ksys_read (40 samples, 1.00%) + + + + + vfs_read (40 samples, 1.00%) + + + + + __fsnotify_parent (1 samples, 0.02%) + + + + + std::io::default_read_exact (41 samples, 1.02%) + + + + + <std::process::ChildStdout as std::io::Read>::read (41 samples, 1.02%) + + + + + read (41 samples, 1.02%) + + + + + __GI___pthread_disable_asynccancel (1 samples, 0.02%) + + + + + malloc (2 samples, 0.05%) + + + + + _int_malloc (2 samples, 0.05%) + + + + + sysmalloc (2 samples, 0.05%) + + + + + __mprotect (2 samples, 0.05%) + + + + + entry_SYSCALL_64_after_hwframe (2 samples, 0.05%) + + + + + do_syscall_64 (2 samples, 0.05%) + + + + + __x64_sys_mprotect (2 samples, 0.05%) + + + + + do_mprotect_pkey (2 samples, 0.05%) + + + + + mprotect_fixup (2 samples, 0.05%) + + + + + perf_event_mmap (2 samples, 0.05%) + + + + + perf_iterate_sb (2 samples, 0.05%) + + + + + perf_iterate_ctx (2 samples, 0.05%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::insert (1 samples, 0.02%) + + + + + alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Mut,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>::insert_recursing (1 samples, 0.02%) + + + + + __rdl_alloc (1 samples, 0.02%) + + + + + error_entry (1 samples, 0.02%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + page_add_new_anon_rmap (1 samples, 0.02%) + + + + + __mod_lruvec_page_state (1 samples, 0.02%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.02%) + + + + + lock_page_lruvec_irqsave (2 samples, 0.05%) + + + + + __pagevec_lru_add (3 samples, 0.07%) + + + + + lru_cache_add (5 samples, 0.12%) + + + + + __mem_cgroup_charge (1 samples, 0.02%) + + + + + charge_memcg (1 samples, 0.02%) + + + + + __list_del_entry_valid (1 samples, 0.02%) + + + + + rmqueue_bulk (2 samples, 0.05%) + + + + + kernel_init_free_pages.part.0 (3 samples, 0.07%) + + + + + clear_page_erms (3 samples, 0.07%) + + + + + __alloc_pages (6 samples, 0.15%) + + + + + get_page_from_freelist (6 samples, 0.15%) + + + + + __list_del_entry_valid (1 samples, 0.02%) + + + + + __handle_mm_fault (14 samples, 0.35%) + + + + + do_user_addr_fault (15 samples, 0.37%) + + + + + handle_mm_fault (15 samples, 0.37%) + + + + + asm_exc_page_fault (17 samples, 0.42%) + + + + + exc_page_fault (17 samples, 0.42%) + + + + + __memset_avx512_unaligned_erms (19 samples, 0.47%) + + + + + s4lib::readers::blockreader::BlockReader::read_block_File (65 samples, 1.62%) + + + + + <std::fs::File as std::io::Seek>::seek (1 samples, 0.02%) + + + + + llseek@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + ksys_lseek (1 samples, 0.02%) + + + + + __fdget_pos (1 samples, 0.02%) + + + + + __fget_light (1 samples, 0.02%) + + + + + s4lib::readers::blockreader::BlockReader::filesz (1 samples, 0.02%) + + + + + s4lib::readers::blockreader::BlockReader::read_block (72 samples, 1.80%) + + s.. + + + s4lib::readers::blockreader::BlockReader::filesz (4 samples, 0.10%) + + + + + s4lib::data::line::LinePart::new (4 samples, 0.10%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + s4lib::data::line::Line::prepend (13 samples, 0.32%) + + + + + s4lib::data::line::Line::fileoffset_end (3 samples, 0.07%) + + + + + _int_malloc (4 samples, 0.10%) + + + + + malloc (27 samples, 0.67%) + + + + + lru::LruCache<K,V,S>::put (38 samples, 0.95%) + + + + + alloc::collections::btree::navigate::LeafRange<BorrowType,K,V>::perform_next_checked (2 samples, 0.05%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Immut,K,V,alloc::collections::btree::node::marker::LeafOrInternal>>::range_search (40 samples, 1.00%) + + + + + alloc::collections::btree::map::BTreeMap<K,V,A>::contains_key (25 samples, 0.62%) + + + + + __rust_alloc (2 samples, 0.05%) + + + + + __rdl_alloc (1 samples, 0.02%) + + + + + s4lib::readers::linereader::LineReader::find_line (493 samples, 12.32%) + + s4lib::readers::li.. + + + malloc (1 samples, 0.02%) + + + + + lru::LruCache<K,V,S>::put (56 samples, 1.40%) + + + + + __rdl_alloc (1 samples, 0.02%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_year (1,505 samples, 37.61%) + + s4lib::readers::syslinereader::SyslineReader::find_sysline_ye.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at_datetime_filter_binary_search (1,507 samples, 37.66%) + + s4lib::readers::syslinereader::SyslineReader::find_sysline_at.. + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_between_datetime_filters (1,509 samples, 37.71%) + + s4lib::readers::syslinereader::SyslineReader::find_sysline_be.. + + + s4lib::readers::blockreader::BlockReader::is_streamed_file (2 samples, 0.05%) + + + + + send_call_function_single_ipi (3 samples, 0.07%) + + + + + sched_clock_cpu (1 samples, 0.02%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.02%) + + + + + read_hv_clock_tsc (1 samples, 0.02%) + + + + + ttwu_queue_wakelist (5 samples, 0.12%) + + + + + __smp_call_single_queue (1 samples, 0.02%) + + + + + llist_add_batch (1 samples, 0.02%) + + + + + select_task_rq_fair (1 samples, 0.02%) + + + + + _raw_spin_unlock_irqrestore (3 samples, 0.07%) + + + + + wake_up_q (10 samples, 0.25%) + + + + + try_to_wake_up (10 samples, 0.25%) + + + + + _raw_spin_lock_irqsave (1 samples, 0.02%) + + + + + do_syscall_64 (11 samples, 0.27%) + + + + + __x64_sys_futex (11 samples, 0.27%) + + + + + do_futex (11 samples, 0.27%) + + + + + futex_wake (11 samples, 0.27%) + + + + + entry_SYSCALL_64_after_hwframe (12 samples, 0.30%) + + + + + std::sys::unix::futex::futex_wake (13 samples, 0.32%) + + + + + syscall (13 samples, 0.32%) + + + + + [[kernel.kallsyms]] (1 samples, 0.02%) + + + + + crossbeam_channel::waker::SyncWaker::notify (19 samples, 0.47%) + + + + + switch_fpu_return (1 samples, 0.02%) + + + + + __put_user_8 (1 samples, 0.02%) + + + + + __rseq_handle_notify_resume (2 samples, 0.05%) + + + + + syscall_exit_to_user_mode (4 samples, 0.10%) + + + + + exit_to_user_mode_prepare (4 samples, 0.10%) + + + + + futex_wait_setup (3 samples, 0.07%) + + + + + __get_user_nocheck_4 (3 samples, 0.07%) + + + + + pick_next_task_idle (1 samples, 0.02%) + + + + + __update_idle_core (1 samples, 0.02%) + + + + + newidle_balance (1 samples, 0.02%) + + + + + pick_next_task_fair (3 samples, 0.07%) + + + + + finish_task_switch.isra.0 (1 samples, 0.02%) + + + + + __perf_event_task_sched_in (1 samples, 0.02%) + + + + + update_load_avg (1 samples, 0.02%) + + + + + __update_load_avg_cfs_rq (1 samples, 0.02%) + + + + + dequeue_task_fair (2 samples, 0.05%) + + + + + dequeue_entity (2 samples, 0.05%) + + + + + update_curr (1 samples, 0.02%) + + + + + amd_pmu_addr_offset (1 samples, 0.02%) + + + + + __perf_event_task_sched_out (3 samples, 0.07%) + + + + + amd_pmu_disable_all (3 samples, 0.07%) + + + + + x86_pmu_disable_all (3 samples, 0.07%) + + + + + futex_wait_queue_me (12 samples, 0.30%) + + + + + schedule (12 samples, 0.30%) + + + + + __schedule (12 samples, 0.30%) + + + + + futex_wait (16 samples, 0.40%) + + + + + syscall (22 samples, 0.55%) + + + + + entry_SYSCALL_64_after_hwframe (22 samples, 0.55%) + + + + + do_syscall_64 (22 samples, 0.55%) + + + + + __x64_sys_futex (18 samples, 0.45%) + + + + + do_futex (18 samples, 0.45%) + + + + + std::thread::park (23 samples, 0.57%) + + + + + crossbeam_channel::waker::SyncWaker::register (2 samples, 0.05%) + + + + + update_rq_clock (3 samples, 0.07%) + + + + + sched_clock_cpu (3 samples, 0.07%) + + + + + read_hv_sched_clock_tsc (3 samples, 0.07%) + + + + + read_hv_clock_tsc (3 samples, 0.07%) + + + + + pick_next_entity (1 samples, 0.02%) + + + + + pick_next_task_fair (2 samples, 0.05%) + + + + + _raw_spin_lock (2 samples, 0.05%) + + + + + __schedule (8 samples, 0.20%) + + + + + schedule (9 samples, 0.22%) + + + + + yield_task_fair (2 samples, 0.05%) + + + + + srso_alias_return_thunk (1 samples, 0.02%) + + + + + srso_alias_safe_ret (1 samples, 0.02%) + + + + + __x64_sys_sched_yield (16 samples, 0.40%) + + + + + do_sched_yield (7 samples, 0.17%) + + + + + __sched_yield (18 samples, 0.45%) + + + + + entry_SYSCALL_64_after_hwframe (18 samples, 0.45%) + + + + + do_syscall_64 (18 samples, 0.45%) + + + + + crossbeam_channel::context::Context::with::{{closure}} (52 samples, 1.30%) + + + + + syscall_enter_from_user_mode (1 samples, 0.02%) + + + + + update_rq_clock (1 samples, 0.02%) + + + + + sched_clock_cpu (1 samples, 0.02%) + + + + + read_hv_sched_clock_tsc (1 samples, 0.02%) + + + + + read_hv_clock_tsc (1 samples, 0.02%) + + + + + update_min_vruntime (1 samples, 0.02%) + + + + + update_curr (2 samples, 0.05%) + + + + + cpuacct_charge (1 samples, 0.02%) + + + + + pick_next_task_fair (3 samples, 0.07%) + + + + + pick_next_entity (1 samples, 0.02%) + + + + + _raw_spin_lock (1 samples, 0.02%) + + + + + schedule (8 samples, 0.20%) + + + + + __schedule (8 samples, 0.20%) + + + + + __raw_callee_save___pv_queued_spin_unlock (1 samples, 0.02%) + + + + + __x64_sys_sched_yield (13 samples, 0.32%) + + + + + do_sched_yield (5 samples, 0.12%) + + + + + do_syscall_64 (16 samples, 0.40%) + + + + + entry_SYSCALL_64_after_hwframe (17 samples, 0.42%) + + + + + __sched_yield (18 samples, 0.45%) + + + + + entry_SYSCALL_64 (1 samples, 0.02%) + + + + + __memmove_avx512_unaligned_erms (5 samples, 0.12%) + + + + + crossbeam_channel::channel::Sender<T>::send (193 samples, 4.82%) + + crossb.. + + + core::ptr::drop_in_place<s4lib::readers::syslogprocessor::SyslogProcessor> (1 samples, 0.02%) + + + + + <alloc::collections::btree::map::BTreeMap<K,V,A> as core::ops::drop::Drop>::drop (1 samples, 0.02%) + + + + + alloc::collections::btree::navigate::<impl alloc::collections::btree::node::Handle<alloc::collections::btree::node::NodeRef<alloc::collections::btree::node::marker::Dying,K,V,alloc::collections::btree::node::marker::Leaf>,alloc::collections::btree::node::marker::Edge>>::deallocating_next_unchecked (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + clone3 (2,004 samples, 50.07%) + + clone3 + + + start_thread (2,004 samples, 50.07%) + + start_thread + + + std::sys::unix::thread::Thread::new::thread_start (2,004 samples, 50.07%) + + std::sys::unix::thread::Thread::new::thread_start + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (2,004 samples, 50.07%) + + core::ops::function::FnOnce::call_once{{vtable.shim}} + + + std::sys_common::backtrace::__rust_begin_short_backtrace (2,004 samples, 50.07%) + + std::sys_common::backtrace::__rust_begin_short_backtrace + + + s4::exec_fileprocessor_thread (2,004 samples, 50.07%) + + s4::exec_fileprocessor_thread + + + regex_automata::util::captures::GroupInfo::new (1 samples, 0.02%) + + + + + hashbrown::map::HashMap<K,V,S,A>::insert (1 samples, 0.02%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (2 samples, 0.05%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (2 samples, 0.05%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (2 samples, 0.05%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (2 samples, 0.05%) + + + + + once_cell::imp::OnceCell<T>::initialize (2 samples, 0.05%) + + + + + once_cell::imp::initialize_or_wait (2 samples, 0.05%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (2 samples, 0.05%) + + + + + regex::regex::bytes::Regex::new (2 samples, 0.05%) + + + + + regex::builders::Builder::build_one_bytes (2 samples, 0.05%) + + + + + regex_automata::meta::regex::Builder::build (2 samples, 0.05%) + + + + + regex_automata::meta::strategy::new (2 samples, 0.05%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (2 samples, 0.05%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (4 samples, 0.10%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (4 samples, 0.10%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.10%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.10%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (4 samples, 0.10%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.10%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (3 samples, 0.07%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (3 samples, 0.07%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.05%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.02%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (9 samples, 0.22%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (9 samples, 0.22%) + + + + + once_cell::imp::OnceCell<T>::initialize (9 samples, 0.22%) + + + + + once_cell::imp::initialize_or_wait (9 samples, 0.22%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (9 samples, 0.22%) + + + + + regex::regex::bytes::Regex::new (9 samples, 0.22%) + + + + + regex::builders::Builder::build_one_bytes (9 samples, 0.22%) + + + + + regex_automata::meta::regex::Builder::build (9 samples, 0.22%) + + + + + regex_automata::meta::strategy::new (9 samples, 0.22%) + + + + + regex_automata::meta::reverse_inner::extract (5 samples, 0.12%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::Extractor::cross (2 samples, 0.05%) + + + + + regex_automata::util::captures::GroupInfo::new (1 samples, 0.02%) + + + + + regex_automata::util::captures::GroupInfoInner::add_first_group (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::nfa::Inner::into_nfa (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + sysmalloc (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + regex_automata::meta::reverse_inner::flatten (1 samples, 0.02%) + + + + + alloc::sync::Arc<T>::drop_slow (1 samples, 0.02%) + + + + + alloc::sync::Arc<T>::drop_slow (1 samples, 0.02%) + + + + + core::ptr::drop_in_place<aho_corasick::dfa::DFA> (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (6 samples, 0.15%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (6 samples, 0.15%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (6 samples, 0.15%) + + + + + once_cell::imp::OnceCell<T>::initialize (6 samples, 0.15%) + + + + + once_cell::imp::initialize_or_wait (6 samples, 0.15%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (6 samples, 0.15%) + + + + + regex::regex::bytes::Regex::new (6 samples, 0.15%) + + + + + regex::builders::Builder::build_one_bytes (6 samples, 0.15%) + + + + + regex_automata::meta::regex::Builder::build (6 samples, 0.15%) + + + + + regex_automata::meta::strategy::new (6 samples, 0.15%) + + + + + regex_automata::meta::reverse_inner::extract (3 samples, 0.07%) + + + + + <regex_syntax::hir::Hir as core::ops::drop::Drop>::drop (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + __mem_cgroup_charge (1 samples, 0.02%) + + + + + charge_memcg (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (6 samples, 0.15%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (14 samples, 0.35%) + + + + + _int_malloc (4 samples, 0.10%) + + + + + malloc (7 samples, 0.17%) + + + + + __rdl_alloc (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (9 samples, 0.22%) + + + + + alloc::raw_vec::finish_grow (9 samples, 0.22%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (11 samples, 0.27%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (2 samples, 0.05%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.05%) + + + + + malloc (2 samples, 0.05%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (2 samples, 0.05%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (29 samples, 0.72%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (29 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (29 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (29 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (29 samples, 0.72%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (29 samples, 0.72%) + + + + + cfree@GLIBC_2.2.5 (2 samples, 0.05%) + + + + + _int_free (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (31 samples, 0.77%) + + + + + once_cell::imp::OnceCell<T>::initialize (31 samples, 0.77%) + + + + + once_cell::imp::initialize_or_wait (31 samples, 0.77%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (31 samples, 0.77%) + + + + + regex::regex::bytes::Regex::new (31 samples, 0.77%) + + + + + regex::builders::Builder::build_one_bytes (31 samples, 0.77%) + + + + + regex_automata::meta::regex::Builder::build (31 samples, 0.77%) + + + + + regex_automata::meta::strategy::new (31 samples, 0.77%) + + + + + regex_automata::meta::reverse_inner::extract (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (2 samples, 0.05%) + + + + + alloc::vec::Vec<T,A>::retain_mut (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + sysmalloc (1 samples, 0.02%) + + + + + __mprotect (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + __x64_sys_mprotect (1 samples, 0.02%) + + + + + do_mprotect_pkey (1 samples, 0.02%) + + + + + mprotect_fixup (1 samples, 0.02%) + + + + + vma_merge (1 samples, 0.02%) + + + + + __vma_adjust (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::Parser::parse (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_with_comments (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_set_class_range (1 samples, 0.02%) + + + + + regex_syntax::ast::parse::ParserI<P>::parse_escape (1 samples, 0.02%) + + + + + regex_syntax::hir::literal::Extractor::union (1 samples, 0.02%) + + + + + <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend (1 samples, 0.02%) + + + + + regex_automata::util::prefilter::suffixes (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::Extractor::extract (2 samples, 0.05%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.02%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.02%) + + + + + cfree@GLIBC_2.2.5 (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + regex_syntax::hir::literal::PreferenceTrie::minimize (4 samples, 0.10%) + + + + + alloc::vec::Vec<T,A>::retain_mut (4 samples, 0.10%) + + + + + regex_syntax::hir::literal::PreferenceTrie::insert (4 samples, 0.10%) + + + + + regex_syntax::hir::literal::Seq::optimize_by_preference (5 samples, 0.12%) + + + + + regex_automata::util::prefilter::prefixes (6 samples, 0.15%) + + + + + regex_syntax::hir::literal::Extractor::extract (1 samples, 0.02%) + + + + + regex_syntax::hir::literal::Extractor::cross (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_at_least (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (7 samples, 0.17%) + + + + + regex_automata::nfa::thompson::builder::Builder::build (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::nfa::Inner::add (6 samples, 0.15%) + + + + + core::ptr::drop_in_place<core::cell::RefCell<regex_automata::nfa::thompson::compiler::Utf8State>> (1 samples, 0.02%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + unlink_chunk.constprop.0 (1 samples, 0.02%) + + + + + s4::exec_fileprocessor_thread (20 samples, 0.50%) + + + + + s4lib::readers::syslogprocessor::SyslogProcessor::process_stage1_blockzero_analysis (20 samples, 0.50%) + + + + + s4lib::readers::syslinereader::SyslineReader::find_sysline_in_block_year (20 samples, 0.50%) + + + + + s4lib::readers::syslinereader::SyslineReader::parse_datetime_in_line_cached (20 samples, 0.50%) + + + + + s4lib::data::datetime::bytes_to_regex_to_datetime (20 samples, 0.50%) + + + + + once_cell::imp::OnceCell<T>::initialize (20 samples, 0.50%) + + + + + once_cell::imp::initialize_or_wait (20 samples, 0.50%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (20 samples, 0.50%) + + + + + regex::regex::bytes::Regex::new (20 samples, 0.50%) + + + + + regex::builders::Builder::build_one_bytes (20 samples, 0.50%) + + + + + regex_automata::meta::regex::Builder::build (20 samples, 0.50%) + + + + + regex_automata::meta::strategy::new (19 samples, 0.47%) + + + + + core::ptr::drop_in_place<regex_automata::nfa::thompson::compiler::Compiler> (4 samples, 0.10%) + + + + + cfree@GLIBC_2.2.5 (3 samples, 0.07%) + + + + + _int_free (3 samples, 0.07%) + + + + + regex_automata::util::prefilter::Prefilter::new (1 samples, 0.02%) + + + + + regex_automata::util::prefilter::Choice::new (1 samples, 0.02%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (1 samples, 0.02%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (1 samples, 0.02%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (1 samples, 0.02%) + + + + + aho_corasick::util::remapper::Remapper::remap (1 samples, 0.02%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (1 samples, 0.02%) + + + + + regex_automata::meta::wrappers::Hybrid::new (1 samples, 0.02%) + + + + + regex_automata::hybrid::dfa::Builder::build_from_nfa (1 samples, 0.02%) + + + + + regex_automata::util::determinize::state::State::dead (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%) + + + + + aho_corasick::packed::api::Builder::build (1 samples, 0.02%) + + + + + aho_corasick::packed::teddy::builder::Builder::build (1 samples, 0.02%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new (1 samples, 0.02%) + + + + + aho_corasick::packed::teddy::builder::x86_64::FatAVX2<3_usize>::new_unchecked (1 samples, 0.02%) + + + + + aho_corasick::packed::teddy::generic::Teddy<_>::new (1 samples, 0.02%) + + + + + aho_corasick::packed::pattern::Pattern::low_nybbles (1 samples, 0.02%) + + + + + __libc_calloc (1 samples, 0.02%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::shuffle (2 samples, 0.05%) + + + + + aho_corasick::util::remapper::Remapper::remap (2 samples, 0.05%) + + + + + <aho_corasick::nfa::noncontiguous::NFA as aho_corasick::util::remapper::Remappable>::remap (2 samples, 0.05%) + + + + + regex_automata::meta::strategy::new (6 samples, 0.15%) + + + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.10%) + + + + + regex_automata::util::prefilter::Choice::new (4 samples, 0.10%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (4 samples, 0.10%) + + + + + aho_corasick::nfa::noncontiguous::Builder::build (3 samples, 0.07%) + + + + + aho_corasick::nfa::noncontiguous::Compiler::densify (1 samples, 0.02%) + + + + + lru_cache_add (1 samples, 0.02%) + + + + + __pagevec_lru_add (1 samples, 0.02%) + + + + + page_mapping (1 samples, 0.02%) + + + + + __mem_cgroup_charge (1 samples, 0.02%) + + + + + charge_memcg (1 samples, 0.02%) + + + + + rmqueue_bulk (1 samples, 0.02%) + + + + + __list_del_entry_valid (1 samples, 0.02%) + + + + + asm_exc_page_fault (6 samples, 0.15%) + + + + + exc_page_fault (6 samples, 0.15%) + + + + + do_user_addr_fault (6 samples, 0.15%) + + + + + handle_mm_fault (6 samples, 0.15%) + + + + + __handle_mm_fault (6 samples, 0.15%) + + + + + __alloc_pages (4 samples, 0.10%) + + + + + get_page_from_freelist (4 samples, 0.10%) + + + + + kernel_init_free_pages.part.0 (3 samples, 0.07%) + + + + + clear_page_erms (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (8 samples, 0.20%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (8 samples, 0.20%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (8 samples, 0.20%) + + + + + alloc::vec::Vec<T,A>::extend_with (8 samples, 0.20%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (10 samples, 0.25%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (10 samples, 0.25%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + __alloc_pages (1 samples, 0.02%) + + + + + get_page_from_freelist (1 samples, 0.02%) + + + + + rmqueue_bulk (1 samples, 0.02%) + + + + + __list_del_entry_valid (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_free (1 samples, 0.02%) + + + + + aho_corasick::packed::api::Builder::extend (2 samples, 0.05%) + + + + + aho_corasick::packed::pattern::Patterns::add (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (2 samples, 0.05%) + + + + + alloc::raw_vec::finish_grow (2 samples, 0.05%) + + + + + __rust_realloc (1 samples, 0.02%) + + + + + regex_automata::util::prefilter::teddy::Teddy::new (3 samples, 0.07%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.02%) + + + + + regex_automata::meta::regex::Builder::build (14 samples, 0.35%) + + + + + regex_automata::meta::strategy::new (14 samples, 0.35%) + + + + + regex_automata::meta::reverse_inner::extract (4 samples, 0.10%) + + + + + regex_automata::util::prefilter::Choice::new (4 samples, 0.10%) + + + + + regex_automata::util::prefilter::aho_corasick::AhoCorasick::new (1 samples, 0.02%) + + + + + aho_corasick::ahocorasick::AhoCorasickBuilder::build (1 samples, 0.02%) + + + + + aho_corasick::dfa::Builder::build_from_noncontiguous (1 samples, 0.02%) + + + + + aho_corasick::dfa::DFA::set_matches (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (2 samples, 0.05%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + sysmalloc (1 samples, 0.02%) + + + + + __mprotect (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + __x64_sys_mprotect (1 samples, 0.02%) + + + + + do_mprotect_pkey (1 samples, 0.02%) + + + + + mprotect_fixup (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.02%) + + + + + regex::regex::bytes::Regex::new (6 samples, 0.15%) + + + + + regex::builders::Builder::build_one_bytes (6 samples, 0.15%) + + + + + regex_automata::meta::regex::Builder::build (6 samples, 0.15%) + + + + + regex_automata::meta::strategy::new (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (6 samples, 0.15%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (6 samples, 0.15%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (3 samples, 0.07%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::compile (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + malloc_consolidate (1 samples, 0.02%) + + + + + rcu_read_unlock_strict (1 samples, 0.02%) + + + + + page_add_new_anon_rmap (1 samples, 0.02%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.02%) + + + + + __mem_cgroup_charge (2 samples, 0.05%) + + + + + charge_memcg (1 samples, 0.02%) + + + + + rmqueue_bulk (2 samples, 0.05%) + + + + + __list_del_entry_valid (2 samples, 0.05%) + + + + + __alloc_pages (3 samples, 0.07%) + + + + + get_page_from_freelist (3 samples, 0.07%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.02%) + + + + + clear_page_erms (1 samples, 0.02%) + + + + + asm_exc_page_fault (8 samples, 0.20%) + + + + + exc_page_fault (8 samples, 0.20%) + + + + + do_user_addr_fault (8 samples, 0.20%) + + + + + handle_mm_fault (8 samples, 0.20%) + + + + + __handle_mm_fault (7 samples, 0.17%) + + + + + __memmove_avx512_unaligned_erms (3 samples, 0.07%) + + + + + alloc::vec::Vec<T,A>::extend_with (14 samples, 0.35%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (16 samples, 0.40%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (16 samples, 0.40%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (16 samples, 0.40%) + + + + + __rdl_alloc (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::add (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::compile_from (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve_for_push (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + malloc (1 samples, 0.02%) + + + + + regex_syntax::hir::ClassUnicode::is_ascii (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::builder::Builder::patch (1 samples, 0.02%) + + + + + asm_exc_page_fault (1 samples, 0.02%) + + + + + exc_page_fault (1 samples, 0.02%) + + + + + do_user_addr_fault (1 samples, 0.02%) + + + + + handle_mm_fault (1 samples, 0.02%) + + + + + __handle_mm_fault (1 samples, 0.02%) + + + + + __alloc_pages (1 samples, 0.02%) + + + + + get_page_from_freelist (1 samples, 0.02%) + + + + + rmqueue_bulk (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_alt_iter (21 samples, 0.52%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (21 samples, 0.52%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (4 samples, 0.10%) + + + + + regex_automata::nfa::thompson::builder::Builder::add (2 samples, 0.05%) + + + + + irqentry_enter (1 samples, 0.02%) + + + + + lru_cache_add (1 samples, 0.02%) + + + + + __pagevec_lru_add (1 samples, 0.02%) + + + + + page_mapping (1 samples, 0.02%) + + + + + get_mem_cgroup_from_mm (1 samples, 0.02%) + + + + + __mem_cgroup_charge (2 samples, 0.05%) + + + + + rmqueue_bulk (1 samples, 0.02%) + + + + + __list_del_entry_valid (1 samples, 0.02%) + + + + + asm_exc_page_fault (6 samples, 0.15%) + + + + + exc_page_fault (6 samples, 0.15%) + + + + + do_user_addr_fault (5 samples, 0.12%) + + + + + handle_mm_fault (5 samples, 0.12%) + + + + + __handle_mm_fault (5 samples, 0.12%) + + + + + __alloc_pages (2 samples, 0.05%) + + + + + get_page_from_freelist (2 samples, 0.05%) + + + + + kernel_init_free_pages.part.0 (1 samples, 0.02%) + + + + + clear_page_erms (1 samples, 0.02%) + + + + + __memmove_avx512_unaligned_erms (1 samples, 0.02%) + + + + + regex::builders::Builder::build_one_bytes (34 samples, 0.85%) + + + + + regex_automata::meta::regex::Builder::build (34 samples, 0.85%) + + + + + regex_automata::meta::strategy::new (34 samples, 0.85%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (34 samples, 0.85%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (34 samples, 0.85%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (34 samples, 0.85%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (34 samples, 0.85%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (34 samples, 0.85%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (34 samples, 0.85%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (12 samples, 0.30%) + + + + + regex_automata::nfa::thompson::compiler::Utf8Compiler::new (12 samples, 0.30%) + + + + + regex_automata::nfa::thompson::map::Utf8BoundedMap::clear (12 samples, 0.30%) + + + + + <T as alloc::vec::spec_from_elem::SpecFromElem>::from_elem (12 samples, 0.30%) + + + + + alloc::vec::Vec<T,A>::extend_with (12 samples, 0.30%) + + + + + gen-99999-1-Mot (2,134 samples, 53.32%) + + gen-99999-1-Mot + + + [unknown] (129 samples, 3.22%) + + [un.. + + + once_cell::imp::initialize_or_wait (1 samples, 0.02%) + + + + + once_cell::imp::OnceCell<T>::initialize::_{{closure}} (1 samples, 0.02%) + + + + + regex::regex::bytes::Regex::new (1 samples, 0.02%) + + + + + regex::builders::Builder::build_one_bytes (1 samples, 0.02%) + + + + + regex_automata::meta::regex::Builder::build (1 samples, 0.02%) + + + + + regex_automata::meta::strategy::new (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::build_many_from_hir (1 samples, 0.02%) + + + + + <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::next (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c_cap (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::compiler::Compiler::c (1 samples, 0.02%) + + + + + regex_automata::nfa::thompson::literal_trie::LiteralTrie::add (1 samples, 0.02%) + + + + + alloc::raw_vec::RawVec<T,A>::reserve::do_reserve_and_handle (1 samples, 0.02%) + + + + + alloc::raw_vec::finish_grow (1 samples, 0.02%) + + + + + realloc (1 samples, 0.02%) + + + + + _int_realloc (1 samples, 0.02%) + + + + + _int_malloc (1 samples, 0.02%) + + + + + all (4,002 samples, 100%) + + + + + ctrl-c (1 samples, 0.02%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 0.02%) + + + + + do_syscall_64 (1 samples, 0.02%) + + + + + syscall_exit_to_user_mode (1 samples, 0.02%) + + + + + exit_to_user_mode_prepare (1 samples, 0.02%) + + + + + arch_do_signal_or_restart (1 samples, 0.02%) + + + + + get_signal (1 samples, 0.02%) + + + + + do_group_exit (1 samples, 0.02%) + + + + + do_exit (1 samples, 0.02%) + + + + + acct_process (1 samples, 0.02%) + + + + + do_acct_process (1 samples, 0.02%) + + + + + tty_devnum (1 samples, 0.02%) + + + + + diff --git a/releases/0.7.75/flamegraph-utmp.svg b/releases/0.7.75/flamegraph-utmp.svg new file mode 100644 index 00000000..e8332858 --- /dev/null +++ b/releases/0.7.75/flamegraph-utmp.svg @@ -0,0 +1,1397 @@ + + + + + + + + + + + + + + + Flame Graph: super_speedy_syslog_searcher 0.7.75; git: d799548f; -freq 8000; created 20240707T231133-0700; flamegraph-flamegraph 0.6.5; rustc 1.70.0
; command: s4 ./logs/CentOS7/x86_64/wtmp + + Reset Zoom + Search + + + + s4lib::readers::fixedstructreader::FixedStructReader::process_entry_at (1 samples, 1.72%) + + + + + s4lib::data::fixedstruct::buffer_to_fixedstructptr (1 samples, 1.72%) + + + + + alloc::alloc::exchange_malloc (1 samples, 1.72%) + + + + + malloc (1 samples, 1.72%) + + + + + s4lib::readers::fixedstructreader::FixedStructReader::new (1 samples, 1.72%) + + + + + s4lib::readers::fixedstructreader::FixedStructReader::score_file (1 samples, 1.72%) + + + + + s4lib::data::fixedstruct::FixedStruct::score_fixedstruct (1 samples, 1.72%) + + + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + srso_alias_return_thunk (1 samples, 1.72%) + + + + + clone3 (3 samples, 5.17%) + + clone3 + + + start_thread (3 samples, 5.17%) + + start_.. + + + std::sys::unix::thread::Thread::new::thread_start (3 samples, 5.17%) + + std::s.. + + + core::ops::function::FnOnce::call_once{{vtable.shim}} (3 samples, 5.17%) + + core::.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (3 samples, 5.17%) + + std::s.. + + + s4::exec_fileprocessor_thread (3 samples, 5.17%) + + s4::ex.. + + + crossbeam_channel::channel::Sender<T>::send (1 samples, 1.72%) + + + + + wtmp (4 samples, 6.90%) + + wtmp + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + exc_page_fault (1 samples, 1.72%) + + + + + do_user_addr_fault (1 samples, 1.72%) + + + + + handle_mm_fault (1 samples, 1.72%) + + + + + __handle_mm_fault (1 samples, 1.72%) + + + + + __alloc_pages (1 samples, 1.72%) + + + + + get_page_from_freelist (1 samples, 1.72%) + + + + + kernel_init_free_pages.part.0 (1 samples, 1.72%) + + + + + clear_page_erms (1 samples, 1.72%) + + + + + ret_from_fork (22 samples, 37.93%) + + ret_from_fork + + + schedule_tail (22 samples, 37.93%) + + schedule_tail + + + finish_task_switch.isra.0 (22 samples, 37.93%) + + finish_task_switch.isra.0 + + + __perf_event_task_sched_in (22 samples, 37.93%) + + __perf_event_task_sched_in + + + __raw_callee_save___pv_queued_spin_unlock (22 samples, 37.93%) + + __raw_callee_save___pv_queued_spin_unlock + + + mmput (1 samples, 1.72%) + + + + + exit_mmap (1 samples, 1.72%) + + + + + tlb_finish_mmu (1 samples, 1.72%) + + + + + free_pages_and_swap_cache (1 samples, 1.72%) + + + + + free_swap_cache (1 samples, 1.72%) + + + + + __x64_sys_exit_group (2 samples, 3.45%) + + __x.. + + + do_group_exit (2 samples, 3.45%) + + do_.. + + + do_exit (2 samples, 3.45%) + + do_.. + + + mm_update_next_owner (1 samples, 1.72%) + + + + + entry_SYSCALL_64_after_hwframe (3 samples, 5.17%) + + entry_.. + + + do_syscall_64 (3 samples, 5.17%) + + do_sys.. + + + __x64_sys_execve (1 samples, 1.72%) + + + + + do_execveat_common.isra.0 (1 samples, 1.72%) + + + + + bprm_execve (1 samples, 1.72%) + + + + + load_elf_binary (1 samples, 1.72%) + + + + + vm_mmap_pgoff (1 samples, 1.72%) + + + + + do_mmap (1 samples, 1.72%) + + + + + mmap_region (1 samples, 1.72%) + + + + + perf_event_mmap (1 samples, 1.72%) + + + + + perf_iterate_sb (1 samples, 1.72%) + + + + + perf_iterate_ctx (1 samples, 1.72%) + + + + + perf_event_mmap_output (1 samples, 1.72%) + + + + + perf_output_copy (1 samples, 1.72%) + + + + + security_mmap_addr (1 samples, 1.72%) + + + + + cap_mmap_addr (1 samples, 1.72%) + + + + + clone3 (2 samples, 3.45%) + + clo.. + + + start_thread (2 samples, 3.45%) + + sta.. + + + std::sys::unix::thread::Thread::new::thread_start (2 samples, 3.45%) + + std.. + + + std::sys::unix::stack_overflow::imp::make_handler (2 samples, 3.45%) + + std.. + + + __mmap (2 samples, 3.45%) + + __m.. + + + entry_SYSCALL_64_after_hwframe (2 samples, 3.45%) + + ent.. + + + do_syscall_64 (2 samples, 3.45%) + + do_.. + + + vm_mmap_pgoff (2 samples, 3.45%) + + vm_.. + + + do_mmap (2 samples, 3.45%) + + do_.. + + + get_unmapped_area (2 samples, 3.45%) + + get.. + + + arch_get_unmapped_area_topdown (1 samples, 1.72%) + + + + + vm_unmapped_area (1 samples, 1.72%) + + + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 1.72%) + + + + + do_syscall_64 (1 samples, 1.72%) + + + + + syscall_exit_to_user_mode (1 samples, 1.72%) + + + + + exit_to_user_mode_prepare (1 samples, 1.72%) + + + + + task_work_run (1 samples, 1.72%) + + + + + __fput (1 samples, 1.72%) + + + + + pipe_release (1 samples, 1.72%) + + + + + free_pipe_info (1 samples, 1.72%) + + + + + kfree (1 samples, 1.72%) + + + + + memcg_slab_free_hook (1 samples, 1.72%) + + + + + wp_page_copy (1 samples, 1.72%) + + + + + copy_mc_enhanced_fast_string (1 samples, 1.72%) + + + + + asm_exc_page_fault (2 samples, 3.45%) + + asm.. + + + exc_page_fault (2 samples, 3.45%) + + exc.. + + + do_user_addr_fault (2 samples, 3.45%) + + do_.. + + + handle_mm_fault (2 samples, 3.45%) + + han.. + + + __handle_mm_fault (2 samples, 3.45%) + + __h.. + + + copy_page (1 samples, 1.72%) + + + + + _dl_relocate_object (3 samples, 5.17%) + + _dl_re.. + + + __memrchr_ifunc (1 samples, 1.72%) + + + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + exc_page_fault (1 samples, 1.72%) + + + + + do_user_addr_fault (1 samples, 1.72%) + + + + + handle_mm_fault (1 samples, 1.72%) + + + + + __handle_mm_fault (1 samples, 1.72%) + + + + + _dl_start (4 samples, 6.90%) + + _dl_start + + + _dl_sysdep_start (4 samples, 6.90%) + + _dl_sysde.. + + + dl_main (4 samples, 6.90%) + + dl_main + + + _dl_map_object_deps (1 samples, 1.72%) + + + + + _dl_catch_exception (1 samples, 1.72%) + + + + + openaux (1 samples, 1.72%) + + + + + _dl_map_object (1 samples, 1.72%) + + + + + _dl_map_object_from_fd (1 samples, 1.72%) + + + + + memset (1 samples, 1.72%) + + + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + exc_page_fault (1 samples, 1.72%) + + + + + do_user_addr_fault (1 samples, 1.72%) + + + + + handle_mm_fault (1 samples, 1.72%) + + + + + __handle_mm_fault (1 samples, 1.72%) + + + + + __do_fault (1 samples, 1.72%) + + + + + filemap_fault (1 samples, 1.72%) + + + + + pagecache_get_page (1 samples, 1.72%) + + + + + srso_alias_return_thunk (1 samples, 1.72%) + + + + + srso_alias_safe_ret (1 samples, 1.72%) + + + + + s4lib::readers::filepreprocessor::process_path (1 samples, 1.72%) + + + + + std::path::Path::is_file (1 samples, 1.72%) + + + + + std::sys::unix::fs::stat (1 samples, 1.72%) + + + + + core::ffi::c_str::CStr::from_bytes_with_nul (1 samples, 1.72%) + + + + + core::slice::memchr::memchr_aligned (1 samples, 1.72%) + + + + + s4lib::printer::printers::PrinterLogMessage::print_fixedstruct_color (1 samples, 1.72%) + + + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + exc_page_fault (1 samples, 1.72%) + + + + + do_user_addr_fault (1 samples, 1.72%) + + + + + handle_mm_fault (1 samples, 1.72%) + + + + + __handle_mm_fault (1 samples, 1.72%) + + + + + filemap_map_pages (1 samples, 1.72%) + + + + + next_uptodate_page (1 samples, 1.72%) + + + + + s4::processing_loop (2 samples, 3.45%) + + s4:.. + + + hashbrown::set::HashSet<T,S,A>::remove (1 samples, 1.72%) + + + + + hashbrown::raw::RawTable<T,A>::remove_entry (1 samples, 1.72%) + + + + + std::rt::lang_start::_{{closure}} (4 samples, 6.90%) + + std::rt::.. + + + std::sys_common::backtrace::__rust_begin_short_backtrace (4 samples, 6.90%) + + std::sys_.. + + + s4::main (4 samples, 6.90%) + + s4::main + + + <s4::CLI_Args as clap_builder::derive::Args>::augment_args (1 samples, 1.72%) + + + + + once_cell::imp::OnceCell<T>::initialize (1 samples, 1.72%) + + + + + once_cell::imp::initialize_or_wait (1 samples, 1.72%) + + + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + exc_page_fault (1 samples, 1.72%) + + + + + do_user_addr_fault (1 samples, 1.72%) + + + + + handle_mm_fault (1 samples, 1.72%) + + + + + __handle_mm_fault (1 samples, 1.72%) + + + + + filemap_map_pages (1 samples, 1.72%) + + + + + unlock_page (1 samples, 1.72%) + + + + + s4 (38 samples, 65.52%) + + s4 + + + _start (10 samples, 17.24%) + + _start + + + __libc_start_main@@GLIBC_2.34 (5 samples, 8.62%) + + __libc_start.. + + + __libc_start_call_main (5 samples, 8.62%) + + __libc_start.. + + + main (5 samples, 8.62%) + + main + + + std::rt::lang_start_internal (5 samples, 8.62%) + + std::rt::lan.. + + + asm_exc_page_fault (1 samples, 1.72%) + + + + + exc_page_fault (1 samples, 1.72%) + + + + + do_user_addr_fault (1 samples, 1.72%) + + + + + handle_mm_fault (1 samples, 1.72%) + + + + + __handle_mm_fault (1 samples, 1.72%) + + + + + filemap_map_pages (1 samples, 1.72%) + + + + + next_uptodate_page (1 samples, 1.72%) + + + + + strrchr (1 samples, 1.72%) + + + + + perf-exec (15 samples, 25.86%) + + perf-exec + + + entry_SYSCALL_64_after_hwframe (15 samples, 25.86%) + + entry_SYSCALL_64_after_hwframe + + + do_syscall_64 (15 samples, 25.86%) + + do_syscall_64 + + + __x64_sys_execve (15 samples, 25.86%) + + __x64_sys_execve + + + do_execveat_common.isra.0 (15 samples, 25.86%) + + do_execveat_common.isra.0 + + + bprm_execve (15 samples, 25.86%) + + bprm_execve + + + load_elf_binary (15 samples, 25.86%) + + load_elf_binary + + + begin_new_exec (15 samples, 25.86%) + + begin_new_exec + + + perf_event_exec (14 samples, 24.14%) + + perf_event_exec + + + x86_pmu_enable_all (14 samples, 24.14%) + + x86_pmu_enable_all + + + all (58 samples, 100%) + + + + + ctrl-c (1 samples, 1.72%) + + + + + entry_SYSCALL_64_after_hwframe (1 samples, 1.72%) + + + + + do_syscall_64 (1 samples, 1.72%) + + + + + syscall_exit_to_user_mode (1 samples, 1.72%) + + + + + exit_to_user_mode_prepare (1 samples, 1.72%) + + + + + arch_do_signal_or_restart (1 samples, 1.72%) + + + + + get_signal (1 samples, 1.72%) + + + + + do_group_exit (1 samples, 1.72%) + + + + + do_exit (1 samples, 1.72%) + + + + + acct_process (1 samples, 1.72%) + + + + +