[llvm] r257316 - [ORC] Move ORC RPC helper classes that rely on partial specialization into a
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 15 11:07:36 PST 2016
On Fri, Jan 15, 2016 at 8:36 AM, Aaron Ballman via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> On Mon, Jan 11, 2016 at 12:44 AM, Lang Hames via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> > Author: lhames
> > Date: Sun Jan 10 23:44:39 2016
> > New Revision: 257316
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=257316&view=rev
> > Log:
> > [ORC] Move ORC RPC helper classes that rely on partial specialization
> into a
> > non-template base class.
> >
> > Hopefully this should fix the issues with the windows bots arrising from
> > r257305.
> >
> > Modified:
> > llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
> >
> > Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h?rev=257316&r1=257315&r2=257316&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h (original)
> > +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h Sun Jan 10
> 23:44:39 2016
> > @@ -20,6 +20,76 @@ namespace llvm {
> > namespace orc {
> > namespace remote {
> >
> > +// Base class containing utilities that require partial specialization.
> > +// These cannot be included in RPC, as template class members cannot be
> > +// partially specialized.
> > +class RPCBase {
> > +protected:
> > + template <typename ProcedureIdT, ProcedureIdT ProcId, typename... Ts>
> > + class ProcedureHelper {
> > + public:
> > + static const ProcedureIdT Id = ProcId;
> > + };
> > +
> > + template <typename ChannelT, typename Proc> class CallHelper;
> > +
> > + template <typename ChannelT, typename ProcedureIdT, ProcedureIdT
> ProcId,
> > + typename... ArgTs>
> > + class CallHelper<ChannelT, ProcedureHelper<ProcedureIdT, ProcId,
> ArgTs...>> {
> > + public:
> > + static std::error_code call(ChannelT &C, const ArgTs &... Args) {
> > + if (auto EC = serialize(C, ProcId))
> > + return EC;
> > + // If you see a compile-error on this line you're probably
> calling a
> > + // function with the wrong signature.
> > + return serialize_seq(C, Args...);
> > + }
> > + };
> > +
> > + template <typename ChannelT, typename Proc> class HandlerHelper;
> > +
> > + template <typename ChannelT, typename ProcedureIdT, ProcedureIdT
> ProcId,
> > + typename... ArgTs>
> > + class HandlerHelper<ChannelT,
> > + ProcedureHelper<ProcedureIdT, ProcId, ArgTs...>> {
> > + public:
> > + template <typename HandlerT>
> > + static std::error_code handle(ChannelT &C, HandlerT Handler) {
> > + return readAndHandle(C, Handler,
> llvm::index_sequence_for<ArgTs...>());
> > + }
> > +
> > + private:
> > + template <typename HandlerT, size_t... Is>
> > + static std::error_code readAndHandle(ChannelT &C, HandlerT Handler,
> > + llvm::index_sequence<Is...> _)
> {
> > + std::tuple<ArgTs...> RPCArgs;
> > + if (auto EC = deserialize_seq(C, std::get<Is>(RPCArgs)...))
> > + return EC;
> > + return Handler(std::get<Is>(RPCArgs)...);
>
> This is causing several instances of the following diagnostic:
>
>
> /opt/llvm/build-llvm/src/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h:65:28:
> warning: variable ‘RPCArgs’ set but not used
> [-Wunused-but-set-variable]
> /opt/llvm/build-llvm/src/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h:
> In instantiation of ‘static std::error_code
> llvm::orc::remote::RPCBase::HandlerHelper<ChannelT,
> llvm::orc::remote::RPCBase::ProcedureHelper<ProcedureIdT, ProcId,
> ArgTs ...> >::readAndHandle(ChannelT&, HandlerT,
> llvm::index_sequence<Is ...>) [with HandlerT =
>
> llvm::orc::remote::RPCBase::MemberFnWrapper<llvm::orc::remote::OrcRemoteTargetServer<FDRPCChannel,
> llvm::orc::OrcX86_64> >; long unsigned int ...Is = {}; ChannelT =
> llvm::orc::remote::RPCChannel; ProcedureIdT = unsigned int;
> ProcedureIdT ProcId = 15u; ArgTs = {}]’:
>
> /opt/llvm/build-llvm/src/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h:58:76:
> required from ‘static std::error_code
> llvm::orc::remote::RPCBase::HandlerHelper<ChannelT,
> llvm::orc::remote::RPCBase::ProcedureHelper<ProcedureIdT, ProcId,
> ArgTs ...> >::handle(ChannelT&, HandlerT) [with HandlerT =
>
> llvm::orc::remote::RPCBase::MemberFnWrapper<llvm::orc::remote::OrcRemoteTargetServer<FDRPCChannel,
> llvm::orc::OrcX86_64> >; ChannelT = llvm::orc::remote::RPCChannel;
> ProcedureIdT = unsigned int; ProcedureIdT ProcId = 15u; ArgTs = {}]’
>
> /opt/llvm/build-llvm/src/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h:207:60:
> required from ‘static std::error_code
> llvm::orc::remote::RPC<ChannelT, ProcedureIdT>::handle(ChannelT&,
> HandlerT) [with Proc =
> llvm::orc::remote::RPCBase::ProcedureHelper<unsigned int, 15u>;
> HandlerT =
> llvm::orc::remote::RPCBase::MemberFnWrapper<llvm::orc::remote::OrcRemoteTargetServer<FDRPCChannel,
> llvm::orc::OrcX86_64> >; ChannelT = llvm::orc::remote::RPCChannel;
> ProcedureIdT = unsigned int]’
>
> /opt/llvm/build-llvm/src/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h:216:70:
> required from ‘static std::error_code
> llvm::orc::remote::RPC<ChannelT, ProcedureIdT>::handle(ChannelT&,
> ClassT&, std::error_code (ClassT::*)(ArgTs ...)) [with Proc =
> llvm::orc::remote::RPCBase::ProcedureHelper<unsigned int, 15u>; ClassT
> = llvm::orc::remote::OrcRemoteTargetServer<FDRPCChannel,
> llvm::orc::OrcX86_64>; ArgTs = {}; ChannelT =
> llvm::orc::remote::RPCChannel; ProcedureIdT = unsigned int]’
>
> /opt/llvm/build-llvm/src/llvm/include/llvm/ExecutionEngine/Orc/OrcRemoteTargetServer.h:87:75:
> required from ‘std::error_code
> llvm::orc::remote::OrcRemoteTargetServer<ChannelT,
>
> TargetT>::handleKnownProcedure(llvm::orc::remote::OrcRemoteTargetRPCAPI::JITProcId)
> [with ChannelT = FDRPCChannel; TargetT = llvm::orc::OrcX86_64]’
> /opt/llvm/build-llvm/src/llvm/tools/lli/ChildTarget/ChildTarget.cpp:66:51:
> required from here
>
> I'm not comfortable trying to address this myself, but if you could
> fix it, I would appreciate it.
>
My best guess is that this is a GCC diagnostic bug. It is warning about the
local variable being unused when its use in a parameter pack expansion has
no elements.
We could add a (void) cast to workaround it, but I'm not sure how high of a
priority warning cleanliness with GCC 4.7 is. Actually, this reproduces in
4.8 too - not sure beyond that (don't have 4.9/5.0 on hand).
Yep, here's a reproduction of the GCC bug:
blaikie at blaikie-linux:/tmp/dbginfo$ g++-4.7 expand.cpp -std=c++11
-Wunused-but-set-variable
blaikie at blaikie-linux:/tmp/dbginfo$ g++-4.7 expand.cpp -std=c++11
-Wunused-but-set-variable -DFAIL
expand.cpp: In instantiation of ‘static void foo<Args>::func(Args ...)
[with long unsigned int ...Is = {}; Args = {}]’:
expand.cpp:17:17: required from here
expand.cpp:9:23: warning: variable ‘t’ set but not used
[-Wunused-but-set-variable]
blaikie at blaikie-linux:/tmp/dbginfo$ cat expand.cpp
#include <cstdlib>
#include <tuple>
void f(int) { }
void f() { }
template<typename... Args>
struct foo {
template<size_t... Is>
static void func(Args... a) {
std::tuple<Args...> t;
f(std::get<Is>(t)...);
}
};
int main() {
foo<int>::func<0>(0);
#ifdef FAIL
foo<>::func<>();
#endif
}
- Dave
>
> Thanks!
>
> ~Aaron
>
> > + }
> > + };
> > +
> > + template <typename... ArgTs> class ReadArgs {
> > + public:
> > + std::error_code operator()() { return std::error_code(); }
> > + };
> > +
> > + template <typename ArgT, typename... ArgTs>
> > + class ReadArgs<ArgT, ArgTs...> : public ReadArgs<ArgTs...> {
> > + public:
> > + ReadArgs(ArgT &Arg, ArgTs &... Args)
> > + : ReadArgs<ArgTs...>(Args...), Arg(Arg) {}
> > +
> > + std::error_code operator()(ArgT &ArgVal, ArgTs &... ArgVals) {
> > + this->Arg = std::move(ArgVal);
> > + return ReadArgs<ArgTs...>::operator()(ArgVals...);
> > + }
> > +
> > + private:
> > + ArgT &Arg;
> > + };
> > +};
> > +
> > /// Contains primitive utilities for defining, calling and handling
> calls to
> > /// remote procedures. ChannelT is a bidirectional stream conforming to
> the
> > /// RPCChannel interface (see RPCChannel.h), and ProcedureIdT is a
> procedure
> > @@ -62,7 +132,8 @@ namespace remote {
> > /// read yet. Expect will deserialize the id and assert that it matches
> Proc's
> > /// id. If it does not, and unexpected RPC call error is returned.
> >
> > -template <typename ChannelT, typename ProcedureIdT = uint32_t> class
> RPC {
> > +template <typename ChannelT, typename ProcedureIdT = uint32_t>
> > +class RPC : public RPCBase {
> > public:
> > /// Utility class for defining/referring to RPC procedures.
> > ///
> > @@ -89,75 +160,16 @@ public:
> > /// })
> > /// /* handle EC */;
> > ///
> > - template <ProcedureIdT ProcId, typename... Ts> class Procedure {
> > - public:
> > - static const ProcedureIdT Id = ProcId;
> > - };
> > -
> > -private:
> > - template <typename Proc> class CallHelper;
> > -
> > - template <ProcedureIdT ProcId, typename... ArgTs>
> > - class CallHelper<Procedure<ProcId, ArgTs...>> {
> > - public:
> > - static std::error_code call(ChannelT &C, const ArgTs &... Args) {
> > - if (auto EC = serialize(C, ProcId))
> > - return EC;
> > - // If you see a compile-error on this line you're probably
> calling a
> > - // function with the wrong signature.
> > - return serialize_seq(C, Args...);
> > - }
> > - };
> > + template <ProcedureIdT ProcId, typename... Ts>
> > + using Procedure = ProcedureHelper<ProcedureIdT, ProcId, Ts...>;
> >
> > - template <typename Proc> class HandlerHelper;
> > -
> > - template <ProcedureIdT ProcId, typename... ArgTs>
> > - class HandlerHelper<Procedure<ProcId, ArgTs...>> {
> > - public:
> > - template <typename HandlerT>
> > - static std::error_code handle(ChannelT &C, HandlerT Handler) {
> > - return readAndHandle(C, Handler,
> llvm::index_sequence_for<ArgTs...>());
> > - }
> > -
> > - private:
> > - template <typename HandlerT, size_t... Is>
> > - static std::error_code readAndHandle(ChannelT &C, HandlerT Handler,
> > - llvm::index_sequence<Is...> _)
> {
> > - std::tuple<ArgTs...> RPCArgs;
> > - if (auto EC = deserialize_seq(C, std::get<Is>(RPCArgs)...))
> > - return EC;
> > - return Handler(std::get<Is>(RPCArgs)...);
> > - }
> > - };
> > -
> > - template <typename... ArgTs> class ReadArgs {
> > - public:
> > - std::error_code operator()() { return std::error_code(); }
> > - };
> > -
> > - template <typename ArgT, typename... ArgTs>
> > - class ReadArgs<ArgT, ArgTs...> : public ReadArgs<ArgTs...> {
> > - public:
> > - ReadArgs(ArgT &Arg, ArgTs &... Args)
> > - : ReadArgs<ArgTs...>(Args...), Arg(Arg) {}
> > -
> > - std::error_code operator()(ArgT &ArgVal, ArgTs &... ArgVals) {
> > - this->Arg = std::move(ArgVal);
> > - return ReadArgs<ArgTs...>::operator()(ArgVals...);
> > - }
> > -
> > - private:
> > - ArgT &Arg;
> > - };
> > -
> > -public:
> > /// Serialize Args... to channel C, but do not call C.send().
> > ///
> > /// For buffered channels, this can be used to queue up several calls
> before
> > /// flushing the channel.
> > template <typename Proc, typename... ArgTs>
> > static std::error_code appendCall(ChannelT &C, const ArgTs &... Args)
> {
> > - return CallHelper<Proc>::call(C, Args...);
> > + return CallHelper<ChannelT, Proc>::call(C, Args...);
> > }
> >
> > /// Serialize Args... to channel C and call C.send().
> > @@ -178,7 +190,7 @@ public:
> > /// the arguments used in the Proc typedef.
> > template <typename Proc, typename HandlerT>
> > static std::error_code handle(ChannelT &C, HandlerT Handler) {
> > - return HandlerHelper<Proc>::handle(C, Handler);
> > + return HandlerHelper<ChannelT, Proc>::handle(C, Handler);
> > }
> >
> > /// Deserialize a ProcedureIdT from C and verify it matches the id
> for Proc.
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160115/fd288c3d/attachment.html>
More information about the llvm-commits
mailing list