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 <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Gabe Black <gabe.black@gmail.com>
This commit is contained in:
Jui-min Lee
2021-05-17 17:34:26 +08:00
parent 5e2f1a08b7
commit 73a84aafc6

View File

@@ -1177,18 +1177,32 @@ namespace Debug {
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 @@ namespace Debug {
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('''
}