Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: test/cctest/compiler/call-tester.h

Issue 530783002: Convert Linkage to use MachineSignature. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebase. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | test/cctest/compiler/codegen-tester.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // TODO(titzer): move MachineType selection for C types into machine-type.h 26 // TODO(titzer): use c-signature.h instead of ReturnValueTraits
27 template <typename R> 27 template <typename R>
28 struct ReturnValueTraits { 28 struct ReturnValueTraits {
29 static R Cast(uintptr_t r) { return reinterpret_cast<R>(r); } 29 static R Cast(uintptr_t r) { return reinterpret_cast<R>(r); }
30 static MachineType Representation() { 30 static MachineType Representation() {
31 // TODO(dcarney): detect when R is of a subclass of Object* instead of this 31 // TODO(dcarney): detect when R is of a subclass of Object* instead of this
32 // type check. 32 // type check.
33 while (false) { 33 while (false) {
34 *(static_cast<Object* volatile*>(0)) = static_cast<R>(0); 34 *(static_cast<Object* volatile*>(0)) = static_cast<R>(0);
35 } 35 }
36 return kMachAnyTagged; 36 return kMachAnyTagged;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); } 123 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); }
124 }; 124 };
125 125
126 template <typename T> 126 template <typename T>
127 struct ParameterTraits<T*> { 127 struct ParameterTraits<T*> {
128 static uintptr_t Cast(void* r) { return reinterpret_cast<uintptr_t>(r); } 128 static uintptr_t Cast(void* r) { return reinterpret_cast<uintptr_t>(r); }
129 }; 129 };
130 130
131 class CallHelper { 131 class CallHelper {
132 public: 132 public:
133 explicit CallHelper(Isolate* isolate) : isolate_(isolate) { USE(isolate_); } 133 explicit CallHelper(Isolate* isolate, MachineSignature* machine_sig)
134 : machine_sig_(machine_sig), isolate_(isolate) {
135 USE(isolate_);
136 }
134 virtual ~CallHelper() {} 137 virtual ~CallHelper() {}
135 138
136 static MachineCallDescriptorBuilder* ToCallDescriptorBuilder( 139 static MachineSignature* MakeMachineSignature(
137 Zone* zone, MachineType return_type, MachineType p0 = kMachNone, 140 Zone* zone, MachineType return_type, MachineType p0 = kMachNone,
138 MachineType p1 = kMachNone, MachineType p2 = kMachNone, 141 MachineType p1 = kMachNone, MachineType p2 = kMachNone,
139 MachineType p3 = kMachNone, MachineType p4 = kMachNone) { 142 MachineType p3 = kMachNone, MachineType p4 = kMachNone) {
140 const int kSize = 5; 143 // Count the number of parameters.
141 MachineType* params = zone->NewArray<MachineType>(kSize); 144 size_t param_count = 5;
142 params[0] = p0; 145 MachineType types[] = {p0, p1, p2, p3, p4};
143 params[1] = p1; 146 while (param_count > 0 && types[param_count - 1] == kMachNone)
144 params[2] = p2; 147 param_count--;
145 params[3] = p3; 148 size_t return_count = return_type == kMachNone ? 0 : 1;
146 params[4] = p4; 149
147 int parameter_count = 0; 150 // Build the machine signature.
148 for (int i = 0; i < kSize; ++i) { 151 MachineSignature::Builder builder(zone, return_count, param_count);
149 if (params[i] == kMachNone) { 152 if (return_count > 0) builder.AddReturn(return_type);
150 break; 153 for (size_t i = 0; i < param_count; i++) {
151 } 154 builder.AddParam(types[i]);
152 parameter_count++;
153 } 155 }
154 return new (zone) 156 return builder.Build();
155 MachineCallDescriptorBuilder(return_type, parameter_count, params);
156 } 157 }
157 158
158 protected: 159 protected:
159 virtual void VerifyParameters(int parameter_count, 160 MachineSignature* machine_sig_;
160 MachineType* parameters) = 0; 161 void VerifyParameters(size_t parameter_count, MachineType* parameter_types) {
162 CHECK(machine_sig_->parameter_count() == parameter_count);
163 for (size_t i = 0; i < parameter_count; i++) {
164 CHECK_EQ(machine_sig_->GetParam(i), parameter_types[i]);
165 }
166 }
161 virtual byte* Generate() = 0; 167 virtual byte* Generate() = 0;
162 168
163 private: 169 private:
164 #if USE_SIMULATOR && V8_TARGET_ARCH_ARM64 170 #if USE_SIMULATOR && V8_TARGET_ARCH_ARM64
165 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) { 171 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) {
166 Simulator* simulator = Simulator::current(isolate_); 172 Simulator* simulator = Simulator::current(isolate_);
167 return static_cast<uintptr_t>(simulator->CallInt64(f, args)); 173 return static_cast<uintptr_t>(simulator->CallInt64(f, args));
168 } 174 }
169 175
170 template <typename R, typename F> 176 template <typename R, typename F>
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 384
379 private: 385 private:
380 CallHelper* helper() { return static_cast<C*>(this); } 386 CallHelper* helper() { return static_cast<C*>(this); }
381 }; 387 };
382 388
383 } // namespace compiler 389 } // namespace compiler
384 } // namespace internal 390 } // namespace internal
385 } // namespace v8 391 } // namespace v8
386 392
387 #endif // V8_CCTEST_COMPILER_CALL_TESTER_H_ 393 #endif // V8_CCTEST_COMPILER_CALL_TESTER_H_
OLDNEW
« no previous file with comments | « src/objects.h ('k') | test/cctest/compiler/codegen-tester.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698