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>
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py
index 1263344..8e3a1f8 100644
--- a/src/mem/slicc/symbols/StateMachine.py
+++ b/src/mem/slicc/symbols/StateMachine.py
@@ -458,6 +458,31 @@
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 @@
#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('''