diff --git a/build_tools/debugflaghh.py b/build_tools/debugflaghh.py new file mode 100644 index 0000000000..fc05bfc245 --- /dev/null +++ b/build_tools/debugflaghh.py @@ -0,0 +1,86 @@ +# Copyright (c) 2018, 2020 ARM Limited +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Copyright (c) 2004-2005 The Regents of The University of Michigan +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import argparse +import sys + +from code_formatter import code_formatter + +parser = argparse.ArgumentParser() +parser.add_argument("hh", help="the path of the debug flag header file") +parser.add_argument("name", help="the name of the debug flag") +parser.add_argument("fmt", + help="whether the flag is a format flag (True or False)") +parser.add_argument("components", + help="components of a compound flag, if applicable, joined with :") + +args = parser.parse_args() + +fmt = eval(args.fmt) +components = args.components.split(':') if args.components else [] + +code = code_formatter() + +typename = "CompoundFlag" if components else "SimpleFlag" +component_flag_decls = ''.join(f'extern SimpleFlag &{simple};\n' for + simple in components) + +code('''\ +#ifndef __DEBUG_${{args.name}}_HH__ +#define __DEBUG_${{args.name}}_HH__ + +#include "base/compiler.hh" // For namespace deprecation + +namespace gem5 +{ + +GEM5_DEPRECATED_NAMESPACE(Debug, debug); +namespace debug +{ + +class SimpleFlag; +class CompoundFlag; +extern ${typename}& ${{args.name}}; +${component_flag_decls} + +} // namespace debug +} // namespace gem5 + +#endif // __DEBUG_${{args.name}}_HH__ +''') + +code.write(args.hh) diff --git a/src/SConscript b/src/SConscript index a2e54767a8..e181a6d4c3 100644 --- a/src/SConscript +++ b/src/SConscript @@ -376,77 +376,33 @@ Export('GTest') # Debug Flags # -def makeDebugFlagHH(target, source, env): - assert len(target) == 1 - - flag = env['DEBUG_FLAG'][0] - name, desc, components, fmt = \ - flag.name, flag.desc, flag.components, flag.fmt - - code = code_formatter() - - typename = "CompoundFlag" if flag.components else "SimpleFlag" - component_flag_decls = ''.join('extern SimpleFlag& %s;\n' % simple for - simple in components) - - # file header boilerplate - code('''\ -#ifndef __DEBUG_${name}_HH__ -#define __DEBUG_${name}_HH__ - -#include "base/compiler.hh" // For namespace deprecation - -namespace gem5 -{ - -GEM5_DEPRECATED_NAMESPACE(Debug, debug); -namespace debug -{ - -class SimpleFlag; -class CompoundFlag; -extern ${typename}& ${name}; -${component_flag_decls} - -} // namespace debug -} // namespace gem5 - -#endif // __DEBUG_${name}_HH__ -''') - - code.write(str(target[0])) - DebugFlagInfo = collections.namedtuple('DebugFlag', ['name', 'desc', 'components', 'fmt']) -def DebugFlag(name, desc=None, fmt=False): +def DebugFlagCommon(name, flags, desc, fmt): if name == "All": raise AttributeError('The "All" flag name is reserved') debug_flags = env.get('DEBUG_FLAGS', []) if any(name == flag.name for flag in debug_flags): raise AttributeError(f'Flag {name} already specified') - flag = DebugFlagInfo(name, desc, (), fmt) + flag = DebugFlagInfo(name, desc, flags, fmt) env.Append(DEBUG_FLAGS=[flag]) hh_file = Dir(env['BUILDDIR']).Dir('debug').File(f'{name}.hh') - env.Command(hh_file, [], DEBUG_FLAG=[flag], - action=MakeAction(makeDebugFlagHH, Transform("TRACING", 0), - varlist=['DEBUG_FLAG'])) + gem5py_env.Command(hh_file, + [ '${GEM5PY}', '${DEBUGFLAGHH_PY}' ], + MakeAction('"${GEM5PY}" "${DEBUGFLAGHH_PY}" "${TARGET}" "${NAME}" ' \ + '"${FMT}" "${COMPONENTS}"', + Transform("TRACING", 0)), + DEBUGFLAGHH_PY=build_tools.File('debugflaghh.py'), + NAME=name, FMT=('True' if fmt else 'False'), + COMPONENTS=':'.join(flags)) + +def DebugFlag(name, desc=None, fmt=False): + DebugFlagCommon(name, (), desc, fmt) def CompoundFlag(name, flags, desc=None): - if name == "All": - raise AttributeError('The "All" flag name is reserved') - debug_flags = env.get('DEBUG_FLAGS', []) - if any(name == flag[0] for flag in debug_flags): - raise AttributeError(f'Flag {name} already specified') - - flag = DebugFlagInfo(name, desc, flags, None) - env.Append(DEBUG_FLAGS=[flag]) - - hh_file = Dir(env['BUILDDIR']).Dir('debug').File(f'{name}.hh') - env.Command(hh_file, [], DEBUG_FLAG=[flag], - action=MakeAction(makeDebugFlagHH, Transform("TRACING", 0), - varlist=['DEBUG_FLAG'])) + DebugFlagCommon(name, flags, desc, False) def DebugFormatFlag(name, desc=None): DebugFlag(name, desc, True)