diff options
author | Nathaniel Shead <nathanieloshead@gmail.com> | 2024-07-07 23:19:52 +1000 |
---|---|---|
committer | Nathaniel Shead <nathanieloshead@gmail.com> | 2024-07-18 13:07:32 +1000 |
commit | b7b2434cc7e712dc5055bde02c441393ae881f06 (patch) | |
tree | 3b45aad302d4f046f05c211093e86b77aa9278b5 /gcc/cp/module.cc | |
parent | 30dd420a06ad7d2adf4a672d176caee632f8168a (diff) | |
download | gcc-b7b2434cc7e712dc5055bde02c441393ae881f06.zip gcc-b7b2434cc7e712dc5055bde02c441393ae881f06.tar.gz gcc-b7b2434cc7e712dc5055bde02c441393ae881f06.tar.bz2 |
c++/modules: Conditionally start timer during lazy load [PR115165]
While lazy loading, instantiation of pendings can sometimes recursively
perform name lookup and begin further lazy loading. When using the
'-ftime-report' functionality this causes ICEs as we could start an
already-running timer for the importing.
This patch fixes the issue by using the 'timevar_cond*' API instead to
support such recursive calls.
PR c++/115165
gcc/cp/ChangeLog:
* module.cc (lazy_load_binding): Use 'timevar_cond*' APIs.
(lazy_load_pendings): Likewise.
gcc/testsuite/ChangeLog:
* g++.dg/modules/timevar-1_a.H: New test.
* g++.dg/modules/timevar-1_b.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Diffstat (limited to 'gcc/cp/module.cc')
-rw-r--r-- | gcc/cp/module.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index d385b42..69764fd 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -19604,7 +19604,7 @@ lazy_load_binding (unsigned mod, tree ns, tree id, binding_slot *mslot) { int count = errorcount + warningcount; - timevar_start (TV_MODULE_IMPORT); + bool timer_running = timevar_cond_start (TV_MODULE_IMPORT); /* Make sure lazy loading from a template context behaves as if from a non-template context. */ @@ -19634,7 +19634,7 @@ lazy_load_binding (unsigned mod, tree ns, tree id, binding_slot *mslot) function_depth--; - timevar_stop (TV_MODULE_IMPORT); + timevar_cond_stop (TV_MODULE_IMPORT, timer_running); if (!ok) fatal_error (input_location, @@ -19673,7 +19673,7 @@ lazy_load_pendings (tree decl) int count = errorcount + warningcount; - timevar_start (TV_MODULE_IMPORT); + bool timer_running = timevar_cond_start (TV_MODULE_IMPORT); bool ok = !recursive_lazy (); if (ok) { @@ -19707,7 +19707,7 @@ lazy_load_pendings (tree decl) function_depth--; } - timevar_stop (TV_MODULE_IMPORT); + timevar_cond_stop (TV_MODULE_IMPORT, timer_running); if (!ok) fatal_error (input_location, "failed to load pendings for %<%E%s%E%>", |