blob: 77d2ce1e9512334d00fcc2efd5c6c6914b5e2bb0 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_CCTEST_COMPILER_CALL_TESTER_H_
6#define V8_CCTEST_COMPILER_CALL_TESTER_H_
7
Ben Murdochb8a8cc12014-11-26 15:28:44 +00008#include "src/simulator.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009#include "test/cctest/compiler/c-signature.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010
11#if V8_TARGET_ARCH_IA32
12#if __GNUC__
13#define V8_CDECL __attribute__((cdecl))
14#else
15#define V8_CDECL __cdecl
16#endif
17#else
18#define V8_CDECL
19#endif
20
21namespace v8 {
22namespace internal {
23namespace compiler {
24
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025template <typename R>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026inline R CastReturnValue(uintptr_t r) {
27 return reinterpret_cast<R>(r);
28}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029
30template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000031inline void CastReturnValue(uintptr_t r) {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000032
33template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000034inline bool CastReturnValue(uintptr_t r) {
35 return static_cast<bool>(r);
36}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037
38template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039inline int32_t CastReturnValue(uintptr_t r) {
40 return static_cast<int32_t>(r);
41}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000042
43template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044inline uint32_t CastReturnValue(uintptr_t r) {
45 return static_cast<uint32_t>(r);
46}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000047
48template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000049inline int64_t CastReturnValue(uintptr_t r) {
50 return static_cast<int64_t>(r);
51}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000052
53template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054inline uint64_t CastReturnValue(uintptr_t r) {
55 return static_cast<uint64_t>(r);
56}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057
58template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000059inline int16_t CastReturnValue(uintptr_t r) {
60 return static_cast<int16_t>(r);
61}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000062
63template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000064inline uint16_t CastReturnValue(uintptr_t r) {
65 return static_cast<uint16_t>(r);
66}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000067
68template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000069inline int8_t CastReturnValue(uintptr_t r) {
70 return static_cast<int8_t>(r);
71}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000072
73template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074inline uint8_t CastReturnValue(uintptr_t r) {
75 return static_cast<uint8_t>(r);
76}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000077
78template <>
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079inline double CastReturnValue(uintptr_t r) {
80 UNREACHABLE();
81 return 0.0;
82}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000083
84template <typename R>
85struct ParameterTraits {
86 static uintptr_t Cast(R r) { return static_cast<uintptr_t>(r); }
87};
88
89template <>
90struct ParameterTraits<int*> {
91 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); }
92};
93
94template <typename T>
95struct ParameterTraits<T*> {
96 static uintptr_t Cast(void* r) { return reinterpret_cast<uintptr_t>(r); }
97};
98
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000099
100#if !V8_TARGET_ARCH_32_BIT
101
102// Additional template specialization required for mips64 to sign-extend
103// parameters defined by calling convention.
104template <>
105struct ParameterTraits<int32_t> {
106 static int64_t Cast(int32_t r) { return static_cast<int64_t>(r); }
107};
108
Ben Murdochc5610432016-08-08 18:44:38 +0100109#if !V8_TARGET_ARCH_PPC64
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000110template <>
111struct ParameterTraits<uint32_t> {
112 static int64_t Cast(uint32_t r) {
113 return static_cast<int64_t>(static_cast<int32_t>(r));
114 }
115};
Ben Murdochc5610432016-08-08 18:44:38 +0100116#endif
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117
118#endif // !V8_TARGET_ARCH_64_BIT
119
120
121template <typename R>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000122class CallHelper {
123 public:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100124 explicit CallHelper(Isolate* isolate, MachineSignature* csig)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000125 : csig_(csig), isolate_(isolate) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126 USE(isolate_);
127 }
128 virtual ~CallHelper() {}
129
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000130 R Call() {
131 typedef R V8_CDECL FType();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100132 CSignature::VerifyParams(csig_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133 return DoCall(FUNCTION_CAST<FType*>(Generate()));
134 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000135
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136 template <typename P1>
137 R Call(P1 p1) {
138 typedef R V8_CDECL FType(P1);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100139 CSignature::VerifyParams<P1>(csig_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000140 return DoCall(FUNCTION_CAST<FType*>(Generate()), p1);
141 }
142
143 template <typename P1, typename P2>
144 R Call(P1 p1, P2 p2) {
145 typedef R V8_CDECL FType(P1, P2);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100146 CSignature::VerifyParams<P1, P2>(csig_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2);
148 }
149
150 template <typename P1, typename P2, typename P3>
151 R Call(P1 p1, P2 p2, P3 p3) {
152 typedef R V8_CDECL FType(P1, P2, P3);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100153 CSignature::VerifyParams<P1, P2, P3>(csig_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154 return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3);
155 }
156
157 template <typename P1, typename P2, typename P3, typename P4>
158 R Call(P1 p1, P2 p2, P3 p3, P4 p4) {
159 typedef R V8_CDECL FType(P1, P2, P3, P4);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100160 CSignature::VerifyParams<P1, P2, P3, P4>(csig_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000161 return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3, p4);
162 }
163
164 template <typename P1, typename P2, typename P3, typename P4, typename P5>
165 R Call(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
166 typedef R V8_CDECL FType(P1, P2, P3, P4, P5);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100167 CSignature::VerifyParams<P1, P2, P3, P4, P5>(csig_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000168 return DoCall(FUNCTION_CAST<FType*>(Generate()), p1, p2, p3, p4, p5);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000169 }
170
171 protected:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100172 MachineSignature* csig_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000174 virtual byte* Generate() = 0;
175
176 private:
177#if USE_SIMULATOR && V8_TARGET_ARCH_ARM64
178 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) {
179 Simulator* simulator = Simulator::current(isolate_);
180 return static_cast<uintptr_t>(simulator->CallInt64(f, args));
181 }
182
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000183 template <typename F>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184 R DoCall(F* f) {
185 Simulator::CallArgument args[] = {Simulator::CallArgument::End()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000186 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000188 template <typename F, typename P1>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189 R DoCall(F* f, P1 p1) {
190 Simulator::CallArgument args[] = {Simulator::CallArgument(p1),
191 Simulator::CallArgument::End()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000193 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000194 template <typename F, typename P1, typename P2>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000195 R DoCall(F* f, P1 p1, P2 p2) {
196 Simulator::CallArgument args[] = {Simulator::CallArgument(p1),
197 Simulator::CallArgument(p2),
198 Simulator::CallArgument::End()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000199 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000200 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 template <typename F, typename P1, typename P2, typename P3>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000202 R DoCall(F* f, P1 p1, P2 p2, P3 p3) {
203 Simulator::CallArgument args[] = {
204 Simulator::CallArgument(p1), Simulator::CallArgument(p2),
205 Simulator::CallArgument(p3), Simulator::CallArgument::End()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000206 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000207 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000208 template <typename F, typename P1, typename P2, typename P3, typename P4>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000209 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) {
210 Simulator::CallArgument args[] = {
211 Simulator::CallArgument(p1), Simulator::CallArgument(p2),
212 Simulator::CallArgument(p3), Simulator::CallArgument(p4),
213 Simulator::CallArgument::End()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000215 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000216 template <typename F, typename P1, typename P2, typename P3, typename P4,
217 typename P5>
218 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
219 Simulator::CallArgument args[] = {
220 Simulator::CallArgument(p1), Simulator::CallArgument(p2),
221 Simulator::CallArgument(p3), Simulator::CallArgument(p4),
222 Simulator::CallArgument(p5), Simulator::CallArgument::End()};
223 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args));
224 }
Ben Murdochda12d292016-06-02 14:46:10 +0100225#elif USE_SIMULATOR && \
226 (V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_S390X)
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400227 uintptr_t CallSimulator(byte* f, int64_t p1 = 0, int64_t p2 = 0,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228 int64_t p3 = 0, int64_t p4 = 0, int64_t p5 = 0) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400229 Simulator* simulator = Simulator::current(isolate_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000230 return static_cast<uintptr_t>(simulator->Call(f, 5, p1, p2, p3, p4, p5));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400231 }
232
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000233
234 template <typename F>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400235 R DoCall(F* f) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000236 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f)));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400237 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000238 template <typename F, typename P1>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400239 R DoCall(F* f, P1 p1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000240 return CastReturnValue<R>(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400241 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1)));
242 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000243 template <typename F, typename P1, typename P2>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400244 R DoCall(F* f, P1 p1, P2 p2) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f),
246 ParameterTraits<P1>::Cast(p1),
247 ParameterTraits<P2>::Cast(p2)));
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400248 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000249 template <typename F, typename P1, typename P2, typename P3>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400250 R DoCall(F* f, P1 p1, P2 p2, P3 p3) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000251 return CastReturnValue<R>(CallSimulator(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400252 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1),
253 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3)));
254 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255 template <typename F, typename P1, typename P2, typename P3, typename P4>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400256 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000257 return CastReturnValue<R>(CallSimulator(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400258 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1),
259 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3),
260 ParameterTraits<P4>::Cast(p4)));
261 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000262 template <typename F, typename P1, typename P2, typename P3, typename P4,
263 typename P5>
264 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
265 return CastReturnValue<R>(CallSimulator(
266 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1),
267 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3),
268 ParameterTraits<P4>::Cast(p4), ParameterTraits<P5>::Cast(p5)));
269 }
Ben Murdochda12d292016-06-02 14:46:10 +0100270#elif USE_SIMULATOR && (V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || \
271 V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_S390)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000272 uintptr_t CallSimulator(byte* f, int32_t p1 = 0, int32_t p2 = 0,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000273 int32_t p3 = 0, int32_t p4 = 0, int32_t p5 = 0) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 Simulator* simulator = Simulator::current(isolate_);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000275 return static_cast<uintptr_t>(simulator->Call(f, 5, p1, p2, p3, p4, p5));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000276 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000277 template <typename F>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000278 R DoCall(F* f) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000279 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f)));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000281 template <typename F, typename P1>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000282 R DoCall(F* f, P1 p1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283 return CastReturnValue<R>(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000284 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1)));
285 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 template <typename F, typename P1, typename P2>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287 R DoCall(F* f, P1 p1, P2 p2) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000288 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f),
289 ParameterTraits<P1>::Cast(p1),
290 ParameterTraits<P2>::Cast(p2)));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000291 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 template <typename F, typename P1, typename P2, typename P3>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293 R DoCall(F* f, P1 p1, P2 p2, P3 p3) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000294 return CastReturnValue<R>(CallSimulator(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000295 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1),
296 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3)));
297 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 template <typename F, typename P1, typename P2, typename P3, typename P4>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000299 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300 return CastReturnValue<R>(CallSimulator(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000301 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1),
302 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3),
303 ParameterTraits<P4>::Cast(p4)));
304 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305 template <typename F, typename P1, typename P2, typename P3, typename P4,
306 typename P5>
307 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
308 return CastReturnValue<R>(CallSimulator(
309 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1),
310 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3),
311 ParameterTraits<P4>::Cast(p4), ParameterTraits<P5>::Cast(p5)));
312 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000313#else
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314 template <typename F>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315 R DoCall(F* f) {
316 return f();
317 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318 template <typename F, typename P1>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000319 R DoCall(F* f, P1 p1) {
320 return f(p1);
321 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322 template <typename F, typename P1, typename P2>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000323 R DoCall(F* f, P1 p1, P2 p2) {
324 return f(p1, p2);
325 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000326 template <typename F, typename P1, typename P2, typename P3>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327 R DoCall(F* f, P1 p1, P2 p2, P3 p3) {
328 return f(p1, p2, p3);
329 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000330 template <typename F, typename P1, typename P2, typename P3, typename P4>
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) {
332 return f(p1, p2, p3, p4);
333 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334 template <typename F, typename P1, typename P2, typename P3, typename P4,
335 typename P5>
336 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
337 return f(p1, p2, p3, p4, p5);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338 }
339#endif
340
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000341 Isolate* isolate_;
342};
343
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000344// A call helper that calls the given code object assuming C calling convention.
345template <typename T>
346class CodeRunner : public CallHelper<T> {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000347 public:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100348 CodeRunner(Isolate* isolate, Handle<Code> code, MachineSignature* csig)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000349 : CallHelper<T>(isolate, csig), code_(code) {}
350 virtual ~CodeRunner() {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000351
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 virtual byte* Generate() { return code_->entry(); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000353
354 private:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355 Handle<Code> code_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000356};
357
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359} // namespace compiler
360} // namespace internal
361} // namespace v8
362
363#endif // V8_CCTEST_COMPILER_CALL_TESTER_H_