From 73a84aafc60ece9beaa4f437f995aa0b8ae15914 Mon Sep 17 00:00:00 2001 From: Jui-min Lee Date: Mon, 17 May 2021 17:34:26 +0800 Subject: [PATCH] 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 Tested-by: kokoro Reviewed-by: Gabe Black --- src/SConscript | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/SConscript b/src/SConscript index 7a6f9c1a75..cc51b9fe31 100644 --- a/src/SConscript +++ b/src/SConscript @@ -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(''' }