aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2024-07-07 23:19:52 +1000
committerNathaniel Shead <nathanieloshead@gmail.com>2024-07-18 13:07:32 +1000
commitb7b2434cc7e712dc5055bde02c441393ae881f06 (patch)
tree3b45aad302d4f046f05c211093e86b77aa9278b5
parent30dd420a06ad7d2adf4a672d176caee632f8168a (diff)
downloadgcc-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>
-rw-r--r--gcc/cp/module.cc8
-rw-r--r--gcc/testsuite/g++.dg/modules/timevar-1_a.H14
-rw-r--r--gcc/testsuite/g++.dg/modules/timevar-1_b.C10
3 files changed, 28 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%>",
diff --git a/gcc/testsuite/g++.dg/modules/timevar-1_a.H b/gcc/testsuite/g++.dg/modules/timevar-1_a.H
new file mode 100644
index 0000000..efd7f0e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/timevar-1_a.H
@@ -0,0 +1,14 @@
+// PR c++/115165
+// { dg-additional-options "-fmodule-header" }
+// { dg-module-cmi {} }
+
+template <typename> struct A { virtual ~A(); };
+struct B : A<char> {};
+struct C : B { C() {} };
+
+class D { C c; };
+void f(D);
+
+struct X {
+ friend void f(X);
+};
diff --git a/gcc/testsuite/g++.dg/modules/timevar-1_b.C b/gcc/testsuite/g++.dg/modules/timevar-1_b.C
new file mode 100644
index 0000000..645f016
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/timevar-1_b.C
@@ -0,0 +1,10 @@
+// PR c++/115165
+// { dg-additional-options "-fmodules-ts -ftime-report" }
+// { dg-allow-blank-lines-in-output 1 }
+// { dg-prune-output "Time variable" }
+// { dg-prune-output "\[0-9\]+%" }
+// { dg-prune-output "TOTAL" }
+// { dg-prune-output "checks" }
+
+import "timevar-1_a.H";
+X x;