mem-ruby,misc: Fixed clang template def error
Without this fix `error: call to function 'operator<<' that is neither visible in the template definition nor found by argument-dependent loopup` is thrown when compiling HSAIL_X86 using a clang compiler (at `base/cprintf_formats.hhi:139`). This error is due to a "<<" operator in a template declared prior to its definition in the code. The operator is used in `base/cprintf_formats.hh`, included in `base/cprintf.hh`, and defined in `mem/ruby/common/BoolVec.hh`. Therefore, for clang to compile without error, `mem/ruby/common/BoolVec.hh` must be included before `base/cprintf.hh` when generating the `mem/ruby/protocol/RegionBuffer_Controller.cc` in `mem/slicc/symbols/StateMachine.py`. Due to the gem5 style-checker, an overly-verbose solution was required to permit this patch to be committed to the codebase. Change-Id: Ie0ae4053e4adc8c4e918e4a714035637925ca104 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29532 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Jason Lowe-Power <power.jg@gmail.com>
This commit is contained in:
@@ -458,6 +458,31 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
|
||||
ident = self.ident
|
||||
c_ident = "%s_Controller" % self.ident
|
||||
|
||||
# Unfortunately, clang compilers will throw a "call to function ...
|
||||
# that is neither visible in the template definition nor found by
|
||||
# argument-dependent lookup" error if "mem/ruby/common/BoolVec.hh" is
|
||||
# included after "base/cprintf.hh". This is because "base/cprintf.hh"
|
||||
# utilizes a "<<" operator in "base/cprintf_formats.hh" that is
|
||||
# defined in "mem/ruby/common/BoolVec.hh". While GCC compilers permit
|
||||
# the operator definition after usage in this case, clang compilers do
|
||||
# not.
|
||||
#
|
||||
# The reason for this verbose solution below is due to the gem5
|
||||
# style-checker, which will complain if "mem/ruby/common/BoolVec.hh"
|
||||
# is included above "base/cprintf.hh" in this file, despite it being
|
||||
# necessary in this case. This is therefore a bit of a hack to keep
|
||||
# both clang and our style-checker happy.
|
||||
base_include = '''
|
||||
#include "base/compiler.hh"
|
||||
#include "base/cprintf.hh"
|
||||
|
||||
'''
|
||||
|
||||
boolvec_include = '''
|
||||
#include "mem/ruby/common/BoolVec.hh"
|
||||
|
||||
'''
|
||||
|
||||
code('''
|
||||
/** \\file $c_ident.cc
|
||||
*
|
||||
@@ -473,11 +498,11 @@ void unset_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr);
|
||||
#include <string>
|
||||
#include <typeinfo>
|
||||
|
||||
#include "base/compiler.hh"
|
||||
#include "base/cprintf.hh"
|
||||
#include "mem/ruby/common/BoolVec.hh"
|
||||
|
||||
''')
|
||||
|
||||
code(boolvec_include)
|
||||
code(base_include)
|
||||
|
||||
for f in self.debug_flags:
|
||||
code('#include "debug/${{f}}.hh"')
|
||||
code('''
|
||||
|
||||
Reference in New Issue
Block a user