30 #ifndef __SIM_GUEST_ABI_HH__ 31 #define __SIM_GUEST_ABI_HH__ 36 #include <type_traits> 68 template <
typename ABI,
typename Enabled=
void>
71 static typename ABI::Position
74 return typename ABI::Position();
78 template <
typename ABI>
80 std::is_constructible<typename ABI::Position, const ThreadContext *>::value
83 static typename ABI::Position
86 return typename ABI::Position(tc);
90 template <
typename ABI,
typename Ret,
typename Enabled=
void>
109 static void allocate(
ThreadContext *tc,
typename ABI::Position &position);
116 template <
typename ABI>
120 template <
typename ABI,
typename Arg,
typename Enabled=
void>
131 static Arg
get(
ThreadContext *tc,
typename ABI::Position &position);
140 template <
typename ABI,
typename Ret,
typename Enabled=
void>
153 template <
typename ABI,
typename Ret>
188 template <
typename ...Types>
191 template <
typename First,
typename ...Types>
197 virtual void _getImpl(First &) = 0;
221 template <
typename ABI,
typename Base,
typename ...Types>
224 template <
typename ABI,
typename Base,
typename First,
typename ...Types>
244 template <
typename ABI,
typename Base>
257 tc(_tc), position(_pos)
263 template <
typename ...Types>
277 template <
typename Arg>
287 template <
typename T>
290 template <
typename ...Types>
293 template <
typename ...Types>
305 template <
typename ABI,
typename ...Types>
313 return VarArgs<Types...>(
new Impl(tc, position));
330 template <
typename ABI,
typename Ret>
331 static typename std::enable_if<!std::is_void<Ret>::value, Ret>
::type 335 Ret ret = target(tc);
341 template <
typename ABI>
351 template <
typename ABI,
typename Ret,
typename NextArg,
typename ...Args>
352 static typename std::enable_if<!std::is_void<Ret>::value, Ret>
::type 354 std::function<Ret(
ThreadContext *, NextArg, Args...)> target)
362 return target(_tc, next, args...);
366 return callFrom<ABI, Ret, Args...>(tc, position, partial);
371 template <
typename ABI,
typename NextArg,
typename ...Args>
374 std::function<
void(
ThreadContext *, NextArg, Args...)> target)
382 target(_tc, next, args...);
386 callFrom<ABI, Args...>(tc, position, partial);
397 template <
typename ABI,
typename Ret>
400 typename ABI::Position &position)
408 template <
typename ABI,
typename Ret,
typename NextArg,
typename ...Args>
411 typename ABI::Position &position)
415 os << (count ?
", " :
"(");
435 template <
typename ABI,
typename Ret,
typename ...Args>
447 template <
typename ABI,
typename Ret,
typename ...Args>
451 return invokeSimcall<ABI>(
455 template <
typename ABI,
typename ...Args>
466 template <
typename ABI,
typename ...Args>
479 template <
typename ABI,
typename Ret,
typename ...Args>
486 std::ostringstream
ss;
494 template <
typename ABI,
typename Ret,
typename ...Args>
499 return dumpSimcall<ABI>(
503 #endif // __SIM_GUEST_ABI_HH__
static Arg get(ThreadContext *tc, typename ABI::Position &position)
std::string dumpSimcall(std::string name, ThreadContext *tc, std::function< Ret(ThreadContext *, Args...)> target=std::function< Ret(ThreadContext *, Args...)>())
static void dumpArgsFrom(int count, std::ostream &os, ThreadContext *tc, typename ABI::Position &position)
const std::string & name()
VarArgsImpl(ThreadContext *_tc, const typename ABI::Position &_pos)
static void allocate(ThreadContext *tc, typename ABI::Position &position)
static void store(ThreadContext *tc, const Ret &ret)
Overload hash function for BasicBlockRange type.
static std::enable_if<!std::is_void< Ret >::value, Ret >::type callFrom(ThreadContext *tc, typename ABI::Position &position, std::function< Ret(ThreadContext *)> target)
ThreadContext is the external interface to all thread state for anything outside of the CPU...
VarArgs(VarArgsBase< Types... > *ptr)
void _getImpl(First &first) override
static void allocate(ThreadContext *tc, typename ABI::Position &position)
std::shared_ptr< VarArgsBase< Types... > > _ptr
static ABI::Position init(const ThreadContext *tc)
static ABI::Position init(const ThreadContext *tc)
static void allocate(ThreadContext *tc, typename ABI::Position &position)
Ret invokeSimcall(ThreadContext *tc, std::function< Ret(ThreadContext *, Args...)> target)
std::ostream & operator<<(std::ostream &os, const VarArgs< Types... > &va)