Jui-min Lee has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/45582 )

Change subject: base: Construct debug flags on the heap
......................................................................

base: Construct debug flags on the heap

Debug flags were directly declared as global objects; however, the
destruction order of global objects in different translation units are
not defined in c++, so the destructor of other objects cannot safely
utilize debug flags to output extra information.

We now define those flags as references to objects allocated on the heap
so our flags will never get destructed. Note that this won't really
introduce any memory leak, as the program is getting terminated anyway.

Change-Id: I21f84ae17ac20653636ca67d1111c0c7855c0149
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/45582
Maintainer: Bobby R. Bruce <bbr...@ucdavis.edu>
Tested-by: kokoro <noreply+kok...@google.com>
Reviewed-by: Gabe Black <gabe.bl...@gmail.com>
---
M src/SConscript
1 file changed, 21 insertions(+), 7 deletions(-)

Approvals:
  Gabe Black: Looks good to me, approved
  Bobby R. Bruce: Looks good to me, approved
  kokoro: Regressions pass



diff --git a/src/SConscript b/src/SConscript
index 7a6f9c1..cc51b9f 100644
--- a/src/SConscript
+++ b/src/SConscript
@@ -1177,18 +1177,32 @@
         n, compound, desc, fmt = flag
         assert n == name

+ # We intentionally make flag a reference to a heap allocated object so
+        # (1) It has a similar interface to a global object like before
+        # (2) It does not get destructed at the end of simulation
+        # The second property is desirable as global objects from different
+ # translation units do not have a defined destruction order, so it'll + # be unsafe to access debug flags in their destructor in such cases.
         if not compound:
+            code('SimpleFlag& $name = *(')
+            code.indent()
             if fmt:
-                code('SimpleFlag $name("$name", "$desc", true);')
+                code('new SimpleFlag("$name", "$desc", true)')
             else:
-                code('SimpleFlag $name("$name", "$desc", false);')
+                code('new SimpleFlag("$name", "$desc", false)')
+            code.dedent()
+            code(');')
         else:
-            comp_code('CompoundFlag $name("$name", "$desc", {')
+            comp_code('CompoundFlag& $name = *(')
+            comp_code.indent()
+            comp_code('new CompoundFlag("$name", "$desc", {')
             comp_code.indent()
             for flag in compound:
                 comp_code('&$flag,')
             comp_code.dedent()
-            comp_code('});')
+            comp_code('})')
+            comp_code.dedent()
+            comp_code(');')

     code.append(comp_code)
     code()
@@ -1221,11 +1235,11 @@
     code('class SimpleFlag;')

     if compound:
-        code('extern CompoundFlag $name;')
+        code('extern CompoundFlag& $name;')
         for flag in compound:
-            code('extern SimpleFlag $flag;')
+            code('extern SimpleFlag& $flag;')
     else:
-        code('extern SimpleFlag $name;')
+        code('extern SimpleFlag& $name;')

     code('''
 }

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/45582
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I21f84ae17ac20653636ca67d1111c0c7855c0149
Gerrit-Change-Number: 45582
Gerrit-PatchSet: 7
Gerrit-Owner: Jui-min Lee <f...@google.com>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Bobby R. Bruce <bbr...@ucdavis.edu>
Gerrit-Reviewer: Daniel Carvalho <oda...@yahoo.com.br>
Gerrit-Reviewer: Gabe Black <gabe.bl...@gmail.com>
Gerrit-Reviewer: Jui-min Lee <f...@google.com>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-CC: Jason Lowe-Power <ja...@lowepower.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to