From e5a2fbb860afa8221db591535cb874220f05e9d9 Mon Sep 17 00:00:00 2001 From: "Bobby R. Bruce" Date: Wed, 27 May 2020 03:16:06 -0700 Subject: [PATCH] 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 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/mem/slicc/symbols/StateMachine.py | 33 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py index 1263344aa..8e3a1f84b 100644 --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -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 #include -#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(''' -- 2.30.2