mem-ruby,misc: Fixed clang template def error
authorBobby R. Bruce <bbruce@ucdavis.edu>
Wed, 27 May 2020 10:16:06 +0000 (03:16 -0700)
committerBobby R. Bruce <bbruce@ucdavis.edu>
Thu, 28 May 2020 04:48:54 +0000 (04:48 +0000)
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>

src/mem/slicc/symbols/StateMachine.py

index 1263344aa23113c5f439747cdb5cdf79fa4a6d28..8e3a1f84b65214900b4a39e7491933d1852dd31a 100644 (file)
@@ -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('''