base: Add macros to deprecate namespaces and classes

The GEM5_DEPRECATED_NAMESPACE macro temporarily declares
a namespace with the deprecated name that prints a
warning message when used. It also make sure that when
the old namespace name is used the new name is referenced.

The GEM5_DEPRECATED_CLASS macro deprecates classes that
were renamed, or moved to different namespaces.

Attributes in namespaces are an issue, though.
- Clang only allows from version 6 on, and only when
  using C++17.
- GCC has a bug before version 10 where the deprecated
  attribute was not properly recognized in namespaces:
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79817

Possible solutions for GCC < 10:
1)
    \#define GEM5_DEPRECATED_NAMESPACE() \
    namespace gem5 { namespace deprecated { \
        auto namespace_##old_namespace = [](){ \
            GEM5_DEPRECATED("Please use the new namespace: '" \
                          \#new_namespace "'") \
            int old_namespace; \
            return old_namespace; \
        }; \
    }} \
    namespace new_namespace {} \
    namespace old_namespace { \
        using namespace new_namespace; \
    }

    Add the above macro to all headers that previously
    declared the deprecated namespace to trigger a
    warning. This is extremely inconvenient because
    every file that includes that header will trigger
    the deprecation warning, so the compilation output
    gets VERY clogged.
2)  Similar to 1), but do not use the temporary variable
    on declaration. This would require using the variable
    somewhere else, like a respective .c file. This is
    not always possible, so we could resort to adding a
    special file (e.g., base/deprecated_elements.cc)
    containing all uses of the deprecated temporary
    variables.
3)
    \#define GEM5_DEPRECATED_NAMESPACE(old_ns, new_ns) \
        namespace old_ns = new_ns;
    Similar to 3), but simply declare an alias in the
    header files (see above macro) to maintain backwards
    compatibility. Then use the special file to declare
    all deprecation messages.
4)
    Rely on release notes / e-mail to the mailing list
    to inform that those are deprecated.

We have selected option 4 for these problematic instances.

Checking if namespace deprecation is possible is done
through scons.

Jira issues:
https://gem5.atlassian.net/browse/GEM5-975
https://gem5.atlassian.net/browse/GEM5-991

Change-Id: Ide234f6a8707d88a869fa843bf8c61ca7714e4f3
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/45246
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Daniel R. Carvalho
2021-05-08 08:38:44 -03:00
committed by Daniel Carvalho
parent 14b616d440
commit 43b026f3f9
2 changed files with 39 additions and 1 deletions

View File

@@ -56,10 +56,20 @@ with gem5_scons.Configure(main) as conf:
# alternative stacks.
conf.env['HAVE_VALGRIND'] = conf.CheckCHeader('valgrind/valgrind.h')
conf.env['HAVE_DEPRECATED_NAMESPACE'] = conf.TryCompile('''
int main() {return 0;}
namespace [[gnu::deprecated("Test namespace deprecation")]]
test_deprecated_namespace {}
''', '.cc')
if not conf.env['HAVE_DEPRECATED_NAMESPACE']:
warning("Deprecated namespaces are not supported by this compiler.\n"
"Please make sure to check the mailing list for deprecation "
"announcements.")
sticky_vars.Add(BoolVariable('USE_POSIX_CLOCK', 'Use POSIX Clocks',
have_posix_clock))
export_vars.extend([
'HAVE_FENV', 'HAVE_PNG', 'USE_POSIX_CLOCK', 'HAVE_VALGRIND'])
'HAVE_FENV', 'HAVE_PNG', 'USE_POSIX_CLOCK', 'HAVE_VALGRIND',
'HAVE_DEPRECATED_NAMESPACE'])