| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_CCTEST_COMPILER_CALL_TESTER_H_ | 5 #ifndef V8_CCTEST_COMPILER_CALL_TESTER_H_ |
| 6 #define V8_CCTEST_COMPILER_CALL_TESTER_H_ | 6 #define V8_CCTEST_COMPILER_CALL_TESTER_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/simulator.h" | 10 #include "src/simulator.h" |
| 11 | 11 |
| 12 #if V8_TARGET_ARCH_IA32 | 12 #if V8_TARGET_ARCH_IA32 |
| 13 #if __GNUC__ | 13 #if __GNUC__ |
| 14 #define V8_CDECL __attribute__((cdecl)) | 14 #define V8_CDECL __attribute__((cdecl)) |
| 15 #else | 15 #else |
| 16 #define V8_CDECL __cdecl | 16 #define V8_CDECL __cdecl |
| 17 #endif | 17 #endif |
| 18 #else | 18 #else |
| 19 #define V8_CDECL | 19 #define V8_CDECL |
| 20 #endif | 20 #endif |
| 21 | 21 |
| 22 namespace v8 { | 22 namespace v8 { |
| 23 namespace internal { | 23 namespace internal { |
| 24 namespace compiler { | 24 namespace compiler { |
| 25 | 25 |
| 26 template <typename R> | 26 template <typename R> |
| 27 struct ReturnValueTraits { | 27 struct ReturnValueTraits { |
| 28 static R Cast(uintptr_t r) { return reinterpret_cast<R>(r); } | 28 static R Cast(uintptr_t r) { return reinterpret_cast<R>(r); } |
| 29 static MachineRepresentation Representation() { | 29 static MachineType Representation() { |
| 30 // TODO(dcarney): detect when R is of a subclass of Object* instead of this | 30 // TODO(dcarney): detect when R is of a subclass of Object* instead of this |
| 31 // type check. | 31 // type check. |
| 32 while (false) { | 32 while (false) { |
| 33 *(static_cast<Object* volatile*>(0)) = static_cast<R>(0); | 33 *(static_cast<Object* volatile*>(0)) = static_cast<R>(0); |
| 34 } | 34 } |
| 35 return kMachineTagged; | 35 return kMachineTagged; |
| 36 } | 36 } |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 template <> | 39 template <> |
| 40 struct ReturnValueTraits<int32_t*> { | 40 struct ReturnValueTraits<int32_t*> { |
| 41 static int32_t* Cast(uintptr_t r) { return reinterpret_cast<int32_t*>(r); } | 41 static int32_t* Cast(uintptr_t r) { return reinterpret_cast<int32_t*>(r); } |
| 42 static MachineRepresentation Representation() { | 42 static MachineType Representation() { |
| 43 return MachineOperatorBuilder::pointer_rep(); | 43 return MachineOperatorBuilder::pointer_rep(); |
| 44 } | 44 } |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 template <> | 47 template <> |
| 48 struct ReturnValueTraits<void> { | 48 struct ReturnValueTraits<void> { |
| 49 static void Cast(uintptr_t r) {} | 49 static void Cast(uintptr_t r) {} |
| 50 static MachineRepresentation Representation() { | 50 static MachineType Representation() { |
| 51 return MachineOperatorBuilder::pointer_rep(); | 51 return MachineOperatorBuilder::pointer_rep(); |
| 52 } | 52 } |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 template <> | 55 template <> |
| 56 struct ReturnValueTraits<bool> { | 56 struct ReturnValueTraits<bool> { |
| 57 static bool Cast(uintptr_t r) { return static_cast<bool>(r); } | 57 static bool Cast(uintptr_t r) { return static_cast<bool>(r); } |
| 58 static MachineRepresentation Representation() { | 58 static MachineType Representation() { |
| 59 return MachineOperatorBuilder::pointer_rep(); | 59 return MachineOperatorBuilder::pointer_rep(); |
| 60 } | 60 } |
| 61 }; | 61 }; |
| 62 | 62 |
| 63 template <> | 63 template <> |
| 64 struct ReturnValueTraits<int32_t> { | 64 struct ReturnValueTraits<int32_t> { |
| 65 static int32_t Cast(uintptr_t r) { return static_cast<int32_t>(r); } | 65 static int32_t Cast(uintptr_t r) { return static_cast<int32_t>(r); } |
| 66 static MachineRepresentation Representation() { return kMachineWord32; } | 66 static MachineType Representation() { return kMachineWord32; } |
| 67 }; | 67 }; |
| 68 | 68 |
| 69 template <> | 69 template <> |
| 70 struct ReturnValueTraits<uint32_t> { | 70 struct ReturnValueTraits<uint32_t> { |
| 71 static uint32_t Cast(uintptr_t r) { return static_cast<uint32_t>(r); } | 71 static uint32_t Cast(uintptr_t r) { return static_cast<uint32_t>(r); } |
| 72 static MachineRepresentation Representation() { return kMachineWord32; } | 72 static MachineType Representation() { return kMachineWord32; } |
| 73 }; | 73 }; |
| 74 | 74 |
| 75 template <> | 75 template <> |
| 76 struct ReturnValueTraits<int64_t> { | 76 struct ReturnValueTraits<int64_t> { |
| 77 static int64_t Cast(uintptr_t r) { return static_cast<int64_t>(r); } | 77 static int64_t Cast(uintptr_t r) { return static_cast<int64_t>(r); } |
| 78 static MachineRepresentation Representation() { return kMachineWord64; } | 78 static MachineType Representation() { return kMachineWord64; } |
| 79 }; | 79 }; |
| 80 | 80 |
| 81 template <> | 81 template <> |
| 82 struct ReturnValueTraits<uint64_t> { | 82 struct ReturnValueTraits<uint64_t> { |
| 83 static uint64_t Cast(uintptr_t r) { return static_cast<uint64_t>(r); } | 83 static uint64_t Cast(uintptr_t r) { return static_cast<uint64_t>(r); } |
| 84 static MachineRepresentation Representation() { return kMachineWord64; } | 84 static MachineType Representation() { return kMachineWord64; } |
| 85 }; | 85 }; |
| 86 | 86 |
| 87 template <> | 87 template <> |
| 88 struct ReturnValueTraits<int16_t> { | 88 struct ReturnValueTraits<int16_t> { |
| 89 static int16_t Cast(uintptr_t r) { return static_cast<int16_t>(r); } | 89 static int16_t Cast(uintptr_t r) { return static_cast<int16_t>(r); } |
| 90 static MachineRepresentation Representation() { | 90 static MachineType Representation() { |
| 91 return MachineOperatorBuilder::pointer_rep(); | 91 return MachineOperatorBuilder::pointer_rep(); |
| 92 } | 92 } |
| 93 }; | 93 }; |
| 94 | 94 |
| 95 template <> | 95 template <> |
| 96 struct ReturnValueTraits<int8_t> { | 96 struct ReturnValueTraits<int8_t> { |
| 97 static int8_t Cast(uintptr_t r) { return static_cast<int8_t>(r); } | 97 static int8_t Cast(uintptr_t r) { return static_cast<int8_t>(r); } |
| 98 static MachineRepresentation Representation() { | 98 static MachineType Representation() { |
| 99 return MachineOperatorBuilder::pointer_rep(); | 99 return MachineOperatorBuilder::pointer_rep(); |
| 100 } | 100 } |
| 101 }; | 101 }; |
| 102 | 102 |
| 103 template <> | 103 template <> |
| 104 struct ReturnValueTraits<double> { | 104 struct ReturnValueTraits<double> { |
| 105 static double Cast(uintptr_t r) { | 105 static double Cast(uintptr_t r) { |
| 106 UNREACHABLE(); | 106 UNREACHABLE(); |
| 107 return 0.0; | 107 return 0.0; |
| 108 } | 108 } |
| 109 static MachineRepresentation Representation() { return kMachineFloat64; } | 109 static MachineType Representation() { return kMachineFloat64; } |
| 110 }; | 110 }; |
| 111 | 111 |
| 112 | 112 |
| 113 template <typename R> | 113 template <typename R> |
| 114 struct ParameterTraits { | 114 struct ParameterTraits { |
| 115 static uintptr_t Cast(R r) { return static_cast<uintptr_t>(r); } | 115 static uintptr_t Cast(R r) { return static_cast<uintptr_t>(r); } |
| 116 }; | 116 }; |
| 117 | 117 |
| 118 template <> | 118 template <> |
| 119 struct ParameterTraits<int*> { | 119 struct ParameterTraits<int*> { |
| 120 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); } | 120 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); } |
| 121 }; | 121 }; |
| 122 | 122 |
| 123 template <typename T> | 123 template <typename T> |
| 124 struct ParameterTraits<T*> { | 124 struct ParameterTraits<T*> { |
| 125 static uintptr_t Cast(void* r) { return reinterpret_cast<uintptr_t>(r); } | 125 static uintptr_t Cast(void* r) { return reinterpret_cast<uintptr_t>(r); } |
| 126 }; | 126 }; |
| 127 | 127 |
| 128 class CallHelper { | 128 class CallHelper { |
| 129 public: | 129 public: |
| 130 explicit CallHelper(Isolate* isolate) : isolate_(isolate) { USE(isolate_); } | 130 explicit CallHelper(Isolate* isolate) : isolate_(isolate) { USE(isolate_); } |
| 131 virtual ~CallHelper() {} | 131 virtual ~CallHelper() {} |
| 132 | 132 |
| 133 static MachineCallDescriptorBuilder* ToCallDescriptorBuilder( | 133 static MachineCallDescriptorBuilder* ToCallDescriptorBuilder( |
| 134 Zone* zone, MachineRepresentation return_type, | 134 Zone* zone, MachineType return_type, MachineType p0 = kMachineLast, |
| 135 MachineRepresentation p0 = kMachineLast, | 135 MachineType p1 = kMachineLast, MachineType p2 = kMachineLast, |
| 136 MachineRepresentation p1 = kMachineLast, | 136 MachineType p3 = kMachineLast, MachineType p4 = kMachineLast) { |
| 137 MachineRepresentation p2 = kMachineLast, | |
| 138 MachineRepresentation p3 = kMachineLast, | |
| 139 MachineRepresentation p4 = kMachineLast) { | |
| 140 const int kSize = 5; | 137 const int kSize = 5; |
| 141 MachineRepresentation* params = | 138 MachineType* params = zone->NewArray<MachineType>(kSize); |
| 142 zone->NewArray<MachineRepresentation>(kSize); | |
| 143 params[0] = p0; | 139 params[0] = p0; |
| 144 params[1] = p1; | 140 params[1] = p1; |
| 145 params[2] = p2; | 141 params[2] = p2; |
| 146 params[3] = p3; | 142 params[3] = p3; |
| 147 params[4] = p4; | 143 params[4] = p4; |
| 148 int parameter_count = 0; | 144 int parameter_count = 0; |
| 149 for (int i = 0; i < kSize; ++i) { | 145 for (int i = 0; i < kSize; ++i) { |
| 150 if (params[i] == kMachineLast) { | 146 if (params[i] == kMachineLast) { |
| 151 break; | 147 break; |
| 152 } | 148 } |
| 153 parameter_count++; | 149 parameter_count++; |
| 154 } | 150 } |
| 155 return new (zone) | 151 return new (zone) |
| 156 MachineCallDescriptorBuilder(return_type, parameter_count, params); | 152 MachineCallDescriptorBuilder(return_type, parameter_count, params); |
| 157 } | 153 } |
| 158 | 154 |
| 159 protected: | 155 protected: |
| 160 virtual void VerifyParameters(int parameter_count, | 156 virtual void VerifyParameters(int parameter_count, |
| 161 MachineRepresentation* parameters) = 0; | 157 MachineType* parameters) = 0; |
| 162 virtual byte* Generate() = 0; | 158 virtual byte* Generate() = 0; |
| 163 | 159 |
| 164 private: | 160 private: |
| 165 #if USE_SIMULATOR && V8_TARGET_ARCH_ARM64 | 161 #if USE_SIMULATOR && V8_TARGET_ARCH_ARM64 |
| 166 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) { | 162 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) { |
| 167 Simulator* simulator = Simulator::current(isolate_); | 163 Simulator* simulator = Simulator::current(isolate_); |
| 168 return static_cast<uintptr_t>(simulator->CallInt64(f, args)); | 164 return static_cast<uintptr_t>(simulator->CallInt64(f, args)); |
| 169 } | 165 } |
| 170 | 166 |
| 171 template <typename R, typename F> | 167 template <typename R, typename F> |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 template <typename P1, typename P2, typename P3> | 269 template <typename P1, typename P2, typename P3> |
| 274 void VerifyParameters3() {} | 270 void VerifyParameters3() {} |
| 275 | 271 |
| 276 template <typename P1, typename P2, typename P3, typename P4> | 272 template <typename P1, typename P2, typename P3, typename P4> |
| 277 void VerifyParameters4() {} | 273 void VerifyParameters4() {} |
| 278 #else | 274 #else |
| 279 void VerifyParameters0() { VerifyParameters(0, NULL); } | 275 void VerifyParameters0() { VerifyParameters(0, NULL); } |
| 280 | 276 |
| 281 template <typename P1> | 277 template <typename P1> |
| 282 void VerifyParameters1() { | 278 void VerifyParameters1() { |
| 283 MachineRepresentation parameters[] = { | 279 MachineType parameters[] = {ReturnValueTraits<P1>::Representation()}; |
| 284 ReturnValueTraits<P1>::Representation()}; | |
| 285 VerifyParameters(ARRAY_SIZE(parameters), parameters); | 280 VerifyParameters(ARRAY_SIZE(parameters), parameters); |
| 286 } | 281 } |
| 287 | 282 |
| 288 template <typename P1, typename P2> | 283 template <typename P1, typename P2> |
| 289 void VerifyParameters2() { | 284 void VerifyParameters2() { |
| 290 MachineRepresentation parameters[] = { | 285 MachineType parameters[] = {ReturnValueTraits<P1>::Representation(), |
| 291 ReturnValueTraits<P1>::Representation(), | 286 ReturnValueTraits<P2>::Representation()}; |
| 292 ReturnValueTraits<P2>::Representation()}; | |
| 293 VerifyParameters(ARRAY_SIZE(parameters), parameters); | 287 VerifyParameters(ARRAY_SIZE(parameters), parameters); |
| 294 } | 288 } |
| 295 | 289 |
| 296 template <typename P1, typename P2, typename P3> | 290 template <typename P1, typename P2, typename P3> |
| 297 void VerifyParameters3() { | 291 void VerifyParameters3() { |
| 298 MachineRepresentation parameters[] = { | 292 MachineType parameters[] = {ReturnValueTraits<P1>::Representation(), |
| 299 ReturnValueTraits<P1>::Representation(), | 293 ReturnValueTraits<P2>::Representation(), |
| 300 ReturnValueTraits<P2>::Representation(), | 294 ReturnValueTraits<P3>::Representation()}; |
| 301 ReturnValueTraits<P3>::Representation()}; | |
| 302 VerifyParameters(ARRAY_SIZE(parameters), parameters); | 295 VerifyParameters(ARRAY_SIZE(parameters), parameters); |
| 303 } | 296 } |
| 304 | 297 |
| 305 template <typename P1, typename P2, typename P3, typename P4> | 298 template <typename P1, typename P2, typename P3, typename P4> |
| 306 void VerifyParameters4() { | 299 void VerifyParameters4() { |
| 307 MachineRepresentation parameters[] = { | 300 MachineType parameters[] = {ReturnValueTraits<P1>::Representation(), |
| 308 ReturnValueTraits<P1>::Representation(), | 301 ReturnValueTraits<P2>::Representation(), |
| 309 ReturnValueTraits<P2>::Representation(), | 302 ReturnValueTraits<P3>::Representation(), |
| 310 ReturnValueTraits<P3>::Representation(), | 303 ReturnValueTraits<P4>::Representation()}; |
| 311 ReturnValueTraits<P4>::Representation()}; | |
| 312 VerifyParameters(ARRAY_SIZE(parameters), parameters); | 304 VerifyParameters(ARRAY_SIZE(parameters), parameters); |
| 313 } | 305 } |
| 314 #endif | 306 #endif |
| 315 | 307 |
| 316 // TODO(dcarney): replace Call() in CallHelper2 with these. | 308 // TODO(dcarney): replace Call() in CallHelper2 with these. |
| 317 template <typename R> | 309 template <typename R> |
| 318 R Call0() { | 310 R Call0() { |
| 319 typedef R V8_CDECL FType(); | 311 typedef R V8_CDECL FType(); |
| 320 VerifyParameters0(); | 312 VerifyParameters0(); |
| 321 return DoCall<R>(FUNCTION_CAST<FType*>(Generate())); | 313 return DoCall<R>(FUNCTION_CAST<FType*>(Generate())); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 375 |
| 384 private: | 376 private: |
| 385 CallHelper* helper() { return static_cast<C*>(this); } | 377 CallHelper* helper() { return static_cast<C*>(this); } |
| 386 }; | 378 }; |
| 387 | 379 |
| 388 } // namespace compiler | 380 } // namespace compiler |
| 389 } // namespace internal | 381 } // namespace internal |
| 390 } // namespace v8 | 382 } // namespace v8 |
| 391 | 383 |
| 392 #endif // V8_CCTEST_COMPILER_CALL_TESTER_H_ | 384 #endif // V8_CCTEST_COMPILER_CALL_TESTER_H_ |
| OLD | NEW |