Changes the TargetX8632 to inherit from TargetX86Base<TargetX8632>.
Previously, TargetX8632 was defined as
class TargetX8632 : public TargetLowering;
and its create method would do
TargetX8632 *TargetX8632::create() {
return TargetX86Base<TargetX8632>::create()
}
TargetX86Base<M> was defined was
template <class M> class TargetX86Base : public M;
which meant TargetX8632 had no way to access methods defined in
TargetX86Base<M>. This used to not be a problem, but with the X8664
backend around the corner it became obvious that the actual TargetX86
targets (e.g., X8632. X8664SysV, X8664Win) would need access to some
methods in TargetX86Base (e.g., _mov, _fld, _fstp etc.)
This CL changes the class hierarchy to something like
TargetLowering <-- TargetX86Base<X8632> <-- X8632
<-- TargetX86Base<X8664SysV> <-- X8664SysV (TODO)
<-- TargetX86Base<X8664Win> <-- X8664Win (TODO)
One problem with this new design is that TargetX86Base<M> needs to be
able to invoke methods in the actual backends. For example, each
backend will have its own way of lowering llvm.nacl.read.tp. This
creates a chicken/egg problem that is solved with (you guessed)
template machinery (some would call it voodoo.)
In this CL, as a proof of concept, we introduce the
TargetX86Base::dispatchToConcrete
template method. It is a very simple method: it downcasts "this" from
the template base class (TargetX86Base<TargetX8664>) to the actual
(concrete) class (TargetX8632), and then it invokes the requested
method. It uses perfect forwarding for passing arguments to the method
being invoked, and returns whatever that method returns.
A simple proof-of-concept for using dispatchToConcrete is introduced
with this CL: it is used to invoke createNaClReadTPSrcOperand on the
concrete target class. In a way, dispatchToConcrete is a poor man's
virtual method call, without the virtual method call overhead.
BUG= https://code.google.com/p/nativeclient/issues/detail?id=4077
R=jvoung@chromium.org, stichnot@chromium.org
Review URL: https://codereview.chromium.org/1217443024.
5 files changed