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

Side by Side Diff: src/compiler/js-generic-lowering.cc

Issue 544123002: Do not cache CodeStubInterfaceDescriptor on the isolate. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: 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
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 #include "src/code-stubs.h" 5 #include "src/code-stubs.h"
6 #include "src/compiler/common-operator.h" 6 #include "src/compiler/common-operator.h"
7 #include "src/compiler/graph-inl.h" 7 #include "src/compiler/graph-inl.h"
8 #include "src/compiler/js-generic-lowering.h" 8 #include "src/compiler/js-generic-lowering.h"
9 #include "src/compiler/machine-operator.h" 9 #include "src/compiler/machine-operator.h"
10 #include "src/compiler/node-aux-data-inl.h" 10 #include "src/compiler/node-aux-data-inl.h"
11 #include "src/compiler/node-properties-inl.h" 11 #include "src/compiler/node-properties-inl.h"
12 #include "src/unique.h" 12 #include "src/unique.h"
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 namespace compiler { 16 namespace compiler {
17 17
18 18
19 // TODO(mstarzinger): This is a temporary workaround for non-hydrogen stubs for
20 // which we don't have an interface descriptor yet. Use ReplaceWithStubCall
21 // once these stub have been made into a HydrogenCodeStub.
22 template <typename T>
23 static CodeStubInterfaceDescriptor* GetInterfaceDescriptor(Isolate* isolate,
24 T* stub) {
25 CodeStub::Major key = static_cast<CodeStub*>(stub)->MajorKey();
26 CodeStubInterfaceDescriptor* d = isolate->code_stub_interface_descriptor(key);
27 stub->InitializeInterfaceDescriptor(d);
28 return d;
29 }
30
31
32 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub 19 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
33 // which doesn't have an interface descriptor yet. It mimics a hydrogen code 20 // which doesn't have an interface descriptor yet. It mimics a hydrogen code
34 // stub for the underlying IC stub code. 21 // stub for the underlying IC stub code.
35 class LoadICStubShim : public HydrogenCodeStub { 22 class LoadICStubShim : public HydrogenCodeStub {
36 public: 23 public:
37 LoadICStubShim(Isolate* isolate, ContextualMode contextual_mode) 24 LoadICStubShim(Isolate* isolate, ContextualMode contextual_mode)
38 : HydrogenCodeStub(isolate), contextual_mode_(contextual_mode) { 25 : HydrogenCodeStub(isolate), contextual_mode_(contextual_mode) {}
39 i::compiler::GetInterfaceDescriptor(isolate, this);
40 }
41 26
42 virtual Handle<Code> GenerateCode() OVERRIDE { 27 virtual Handle<Code> GenerateCode() OVERRIDE {
43 ExtraICState extra_state = LoadIC::ComputeExtraICState(contextual_mode_); 28 ExtraICState extra_state = LoadIC::ComputeExtraICState(contextual_mode_);
44 return LoadIC::initialize_stub(isolate(), extra_state); 29 return LoadIC::initialize_stub(isolate(), extra_state);
45 } 30 }
46 31
47 virtual void InitializeInterfaceDescriptor( 32 virtual void InitializeInterfaceDescriptor(
48 CodeStubInterfaceDescriptor* descriptor) OVERRIDE { 33 CodeStubInterfaceDescriptor* descriptor) OVERRIDE {
49 LoadDescriptor call_descriptor(isolate()); 34 LoadDescriptor call_descriptor(isolate());
50 descriptor->Initialize(MajorKey(), call_descriptor); 35 descriptor->Initialize(MajorKey(), call_descriptor);
51 } 36 }
52 37
53 private: 38 private:
54 virtual Major MajorKey() const OVERRIDE { return NoCache; } 39 virtual Major MajorKey() const OVERRIDE { return NoCache; }
55 virtual bool UseSpecialCache() OVERRIDE { return true; } 40 virtual bool UseSpecialCache() OVERRIDE { return true; }
56 41
57 ContextualMode contextual_mode_; 42 ContextualMode contextual_mode_;
58 }; 43 };
59 44
60 45
61 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub 46 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
62 // which doesn't have an interface descriptor yet. It mimics a hydrogen code 47 // which doesn't have an interface descriptor yet. It mimics a hydrogen code
63 // stub for the underlying IC stub code. 48 // stub for the underlying IC stub code.
64 class KeyedLoadICStubShim : public HydrogenCodeStub { 49 class KeyedLoadICStubShim : public HydrogenCodeStub {
65 public: 50 public:
66 explicit KeyedLoadICStubShim(Isolate* isolate) : HydrogenCodeStub(isolate) { 51 explicit KeyedLoadICStubShim(Isolate* isolate) : HydrogenCodeStub(isolate) {}
67 i::compiler::GetInterfaceDescriptor(isolate, this);
68 }
69 52
70 virtual Handle<Code> GenerateCode() OVERRIDE { 53 virtual Handle<Code> GenerateCode() OVERRIDE {
71 return isolate()->builtins()->KeyedLoadIC_Initialize(); 54 return isolate()->builtins()->KeyedLoadIC_Initialize();
72 } 55 }
73 56
74 virtual void InitializeInterfaceDescriptor( 57 virtual void InitializeInterfaceDescriptor(
75 CodeStubInterfaceDescriptor* descriptor) OVERRIDE { 58 CodeStubInterfaceDescriptor* descriptor) OVERRIDE {
76 LoadDescriptor call_descriptor(isolate()); 59 LoadDescriptor call_descriptor(isolate());
77 descriptor->Initialize(MajorKey(), call_descriptor); 60 descriptor->Initialize(MajorKey(), call_descriptor);
78 } 61 }
79 62
80 private: 63 private:
81 virtual Major MajorKey() const OVERRIDE { return NoCache; } 64 virtual Major MajorKey() const OVERRIDE { return NoCache; }
82 virtual bool UseSpecialCache() OVERRIDE { return true; } 65 virtual bool UseSpecialCache() OVERRIDE { return true; }
83 }; 66 };
84 67
85 68
86 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub 69 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
87 // which doesn't have an interface descriptor yet. It mimics a hydrogen code 70 // which doesn't have an interface descriptor yet. It mimics a hydrogen code
88 // stub for the underlying IC stub code. 71 // stub for the underlying IC stub code.
89 class StoreICStubShim : public HydrogenCodeStub { 72 class StoreICStubShim : public HydrogenCodeStub {
90 public: 73 public:
91 StoreICStubShim(Isolate* isolate, StrictMode strict_mode) 74 StoreICStubShim(Isolate* isolate, StrictMode strict_mode)
92 : HydrogenCodeStub(isolate), strict_mode_(strict_mode) { 75 : HydrogenCodeStub(isolate), strict_mode_(strict_mode) {}
93 i::compiler::GetInterfaceDescriptor(isolate, this);
94 }
95 76
96 virtual Handle<Code> GenerateCode() OVERRIDE { 77 virtual Handle<Code> GenerateCode() OVERRIDE {
97 return StoreIC::initialize_stub(isolate(), strict_mode_); 78 return StoreIC::initialize_stub(isolate(), strict_mode_);
98 } 79 }
99 80
100 virtual void InitializeInterfaceDescriptor( 81 virtual void InitializeInterfaceDescriptor(
101 CodeStubInterfaceDescriptor* descriptor) OVERRIDE { 82 CodeStubInterfaceDescriptor* descriptor) OVERRIDE {
102 StoreDescriptor call_descriptor(isolate()); 83 StoreDescriptor call_descriptor(isolate());
103 descriptor->Initialize(MajorKey(), call_descriptor); 84 descriptor->Initialize(MajorKey(), call_descriptor);
104 } 85 }
105 86
106 private: 87 private:
107 virtual Major MajorKey() const OVERRIDE { return NoCache; } 88 virtual Major MajorKey() const OVERRIDE { return NoCache; }
108 virtual bool UseSpecialCache() OVERRIDE { return true; } 89 virtual bool UseSpecialCache() OVERRIDE { return true; }
109 90
110 StrictMode strict_mode_; 91 StrictMode strict_mode_;
111 }; 92 };
112 93
113 94
114 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub 95 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub
115 // which doesn't have an interface descriptor yet. It mimics a hydrogen code 96 // which doesn't have an interface descriptor yet. It mimics a hydrogen code
116 // stub for the underlying IC stub code. 97 // stub for the underlying IC stub code.
117 class KeyedStoreICStubShim : public HydrogenCodeStub { 98 class KeyedStoreICStubShim : public HydrogenCodeStub {
118 public: 99 public:
119 KeyedStoreICStubShim(Isolate* isolate, StrictMode strict_mode) 100 KeyedStoreICStubShim(Isolate* isolate, StrictMode strict_mode)
120 : HydrogenCodeStub(isolate), strict_mode_(strict_mode) { 101 : HydrogenCodeStub(isolate), strict_mode_(strict_mode) {}
121 i::compiler::GetInterfaceDescriptor(isolate, this);
122 }
123 102
124 virtual Handle<Code> GenerateCode() OVERRIDE { 103 virtual Handle<Code> GenerateCode() OVERRIDE {
125 return strict_mode_ == SLOPPY 104 return strict_mode_ == SLOPPY
126 ? isolate()->builtins()->KeyedStoreIC_Initialize() 105 ? isolate()->builtins()->KeyedStoreIC_Initialize()
127 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); 106 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
128 } 107 }
129 108
130 virtual void InitializeInterfaceDescriptor( 109 virtual void InitializeInterfaceDescriptor(
131 CodeStubInterfaceDescriptor* descriptor) OVERRIDE { 110 CodeStubInterfaceDescriptor* descriptor) OVERRIDE {
132 StoreDescriptor call_descriptor(isolate()); 111 StoreDescriptor call_descriptor(isolate());
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 if (OperatorProperties::HasFrameStateInput(node->op())) { 262 if (OperatorProperties::HasFrameStateInput(node->op())) {
284 result |= CallDescriptor::kNeedsFrameState; 263 result |= CallDescriptor::kNeedsFrameState;
285 } 264 }
286 return result; 265 return result;
287 } 266 }
288 267
289 268
290 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, 269 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token,
291 bool pure) { 270 bool pure) {
292 BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack. 271 BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack.
293 CodeStubInterfaceDescriptor* d = stub.GetInterfaceDescriptor(); 272 CodeStubInterfaceDescriptor d;
273 stub.InitializeInterfaceDescriptor(&d);
294 bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op()); 274 bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op());
295 CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor( 275 CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor(
296 d, 0, CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node)); 276 &d, 0, CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node));
297 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token); 277 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token);
298 NodeVector inputs(zone()); 278 NodeVector inputs(zone());
299 inputs.reserve(node->InputCount() + 1); 279 inputs.reserve(node->InputCount() + 1);
300 inputs.push_back(CodeConstant(ic)); 280 inputs.push_back(CodeConstant(ic));
301 inputs.push_back(NodeProperties::GetValueInput(node, 0)); 281 inputs.push_back(NodeProperties::GetValueInput(node, 0));
302 inputs.push_back(NodeProperties::GetValueInput(node, 1)); 282 inputs.push_back(NodeProperties::GetValueInput(node, 1));
303 inputs.push_back(NodeProperties::GetContextInput(node)); 283 inputs.push_back(NodeProperties::GetContextInput(node));
304 if (pure) { 284 if (pure) {
305 // A pure (strict) comparison doesn't have an effect, control or frame 285 // A pure (strict) comparison doesn't have an effect, control or frame
306 // state. But for the graph, we need to add control and effect inputs. 286 // state. But for the graph, we need to add control and effect inputs.
(...skipping 26 matching lines...) Expand all
333 } 313 }
334 node->TrimInputCount(dest); 314 node->TrimInputCount(dest);
335 } 315 }
336 316
337 ReplaceWithRuntimeCall(node, Runtime::kBooleanize); 317 ReplaceWithRuntimeCall(node, Runtime::kBooleanize);
338 } 318 }
339 319
340 320
341 void JSGenericLowering::ReplaceWithStubCall(Node* node, HydrogenCodeStub* stub, 321 void JSGenericLowering::ReplaceWithStubCall(Node* node, HydrogenCodeStub* stub,
342 CallDescriptor::Flags flags) { 322 CallDescriptor::Flags flags) {
343 CodeStubInterfaceDescriptor* d = stub->GetInterfaceDescriptor(); 323 CodeStubInterfaceDescriptor d;
324 stub->InitializeInterfaceDescriptor(&d);
344 CallDescriptor* desc = 325 CallDescriptor* desc =
345 linkage()->GetStubCallDescriptor(d, 0, flags | FlagsForNode(node)); 326 linkage()->GetStubCallDescriptor(&d, 0, flags | FlagsForNode(node));
346 Node* stub_code = CodeConstant(stub->GetCode()); 327 Node* stub_code = CodeConstant(stub->GetCode());
347 PatchInsertInput(node, 0, stub_code); 328 PatchInsertInput(node, 0, stub_code);
348 PatchOperator(node, common()->Call(desc)); 329 PatchOperator(node, common()->Call(desc));
349 } 330 }
350 331
351 332
352 void JSGenericLowering::ReplaceWithBuiltinCall(Node* node, 333 void JSGenericLowering::ReplaceWithBuiltinCall(Node* node,
353 Builtins::JavaScript id, 334 Builtins::JavaScript id,
354 int nargs) { 335 int nargs) {
355 CallFunctionStub stub(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS); 336 CallFunctionStub stub(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS);
356 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); 337 CodeStubInterfaceDescriptor d;
357 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, nargs); 338 stub.InitializeInterfaceDescriptor(&d);
339 CallDescriptor* desc = linkage()->GetStubCallDescriptor(&d, nargs);
358 // TODO(mstarzinger): Accessing the builtins object this way prevents sharing 340 // TODO(mstarzinger): Accessing the builtins object this way prevents sharing
359 // of code across native contexts. Fix this by loading from given context. 341 // of code across native contexts. Fix this by loading from given context.
360 Handle<JSFunction> function( 342 Handle<JSFunction> function(
361 JSFunction::cast(info()->context()->builtins()->javascript_builtin(id))); 343 JSFunction::cast(info()->context()->builtins()->javascript_builtin(id)));
362 Node* stub_code = CodeConstant(stub.GetCode()); 344 Node* stub_code = CodeConstant(stub.GetCode());
363 Node* function_node = FunctionConstant(function); 345 Node* function_node = FunctionConstant(function);
364 PatchInsertInput(node, 0, stub_code); 346 PatchInsertInput(node, 0, stub_code);
365 PatchInsertInput(node, 1, function_node); 347 PatchInsertInput(node, 1, function_node);
366 PatchOperator(node, common()->Call(desc)); 348 PatchOperator(node, common()->Call(desc));
367 } 349 }
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 ReplaceWithBuiltinCall(node, Builtins::IN, 2); 453 ReplaceWithBuiltinCall(node, Builtins::IN, 2);
472 return node; 454 return node;
473 } 455 }
474 456
475 457
476 Node* JSGenericLowering::LowerJSInstanceOf(Node* node) { 458 Node* JSGenericLowering::LowerJSInstanceOf(Node* node) {
477 InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>( 459 InstanceofStub::Flags flags = static_cast<InstanceofStub::Flags>(
478 InstanceofStub::kReturnTrueFalseObject | 460 InstanceofStub::kReturnTrueFalseObject |
479 InstanceofStub::kArgsInRegisters); 461 InstanceofStub::kArgsInRegisters);
480 InstanceofStub stub(isolate(), flags); 462 InstanceofStub stub(isolate(), flags);
481 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); 463 CodeStubInterfaceDescriptor d;
482 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, 0); 464 stub.InitializeInterfaceDescriptor(&d);
465 CallDescriptor* desc = linkage()->GetStubCallDescriptor(&d, 0);
483 Node* stub_code = CodeConstant(stub.GetCode()); 466 Node* stub_code = CodeConstant(stub.GetCode());
484 PatchInsertInput(node, 0, stub_code); 467 PatchInsertInput(node, 0, stub_code);
485 PatchOperator(node, common()->Call(desc)); 468 PatchOperator(node, common()->Call(desc));
486 return node; 469 return node;
487 } 470 }
488 471
489 472
490 Node* JSGenericLowering::LowerJSLoadContext(Node* node) { 473 Node* JSGenericLowering::LowerJSLoadContext(Node* node) {
491 ContextAccess access = OpParameter<ContextAccess>(node); 474 ContextAccess access = OpParameter<ContextAccess>(node);
492 // TODO(mstarzinger): Use simplified operators instead of machine operators 475 // TODO(mstarzinger): Use simplified operators instead of machine operators
(...skipping 27 matching lines...) Expand all
520 node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1)); 503 node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1));
521 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); 504 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index())));
522 PatchOperator(node, machine()->Store(kMachAnyTagged, kFullWriteBarrier)); 505 PatchOperator(node, machine()->Store(kMachAnyTagged, kFullWriteBarrier));
523 return node; 506 return node;
524 } 507 }
525 508
526 509
527 Node* JSGenericLowering::LowerJSCallConstruct(Node* node) { 510 Node* JSGenericLowering::LowerJSCallConstruct(Node* node) {
528 int arity = OpParameter<int>(node); 511 int arity = OpParameter<int>(node);
529 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); 512 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
530 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); 513 CodeStubInterfaceDescriptor d;
514 stub.InitializeInterfaceDescriptor(&d);
531 CallDescriptor* desc = 515 CallDescriptor* desc =
532 linkage()->GetStubCallDescriptor(d, arity, FlagsForNode(node)); 516 linkage()->GetStubCallDescriptor(&d, arity, FlagsForNode(node));
533 Node* stub_code = CodeConstant(stub.GetCode()); 517 Node* stub_code = CodeConstant(stub.GetCode());
534 Node* construct = NodeProperties::GetValueInput(node, 0); 518 Node* construct = NodeProperties::GetValueInput(node, 0);
535 PatchInsertInput(node, 0, stub_code); 519 PatchInsertInput(node, 0, stub_code);
536 PatchInsertInput(node, 1, Int32Constant(arity - 1)); 520 PatchInsertInput(node, 1, Int32Constant(arity - 1));
537 PatchInsertInput(node, 2, construct); 521 PatchInsertInput(node, 2, construct);
538 PatchInsertInput(node, 3, jsgraph()->UndefinedConstant()); 522 PatchInsertInput(node, 3, jsgraph()->UndefinedConstant());
539 PatchOperator(node, common()->Call(desc)); 523 PatchOperator(node, common()->Call(desc));
540 return node; 524 return node;
541 } 525 }
542 526
543 527
544 Node* JSGenericLowering::LowerJSCallFunction(Node* node) { 528 Node* JSGenericLowering::LowerJSCallFunction(Node* node) {
545 CallParameters p = OpParameter<CallParameters>(node); 529 CallParameters p = OpParameter<CallParameters>(node);
546 CallFunctionStub stub(isolate(), p.arity - 2, p.flags); 530 CallFunctionStub stub(isolate(), p.arity - 2, p.flags);
547 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); 531 CodeStubInterfaceDescriptor d;
532 stub.InitializeInterfaceDescriptor(&d);
548 CallDescriptor* desc = 533 CallDescriptor* desc =
549 linkage()->GetStubCallDescriptor(d, p.arity - 1, FlagsForNode(node)); 534 linkage()->GetStubCallDescriptor(&d, p.arity - 1, FlagsForNode(node));
550 Node* stub_code = CodeConstant(stub.GetCode()); 535 Node* stub_code = CodeConstant(stub.GetCode());
551 PatchInsertInput(node, 0, stub_code); 536 PatchInsertInput(node, 0, stub_code);
552 PatchOperator(node, common()->Call(desc)); 537 PatchOperator(node, common()->Call(desc));
553 return node; 538 return node;
554 } 539 }
555 540
556 541
557 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) { 542 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) {
558 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); 543 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node);
559 int arity = OperatorProperties::GetValueInputCount(node->op()); 544 int arity = OperatorProperties::GetValueInputCount(node->op());
560 ReplaceWithRuntimeCall(node, function, arity); 545 ReplaceWithRuntimeCall(node, function, arity);
561 return node; 546 return node;
562 } 547 }
563 548
564 } // namespace compiler 549 } // namespace compiler
565 } // namespace internal 550 } // namespace internal
566 } // namespace v8 551 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698