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

Side by Side Diff: src/objects.h

Issue 10534063: Reland r11425 "Re-enable optimization for hot functions that have optimization disabled due to many… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 6 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 5339 matching lines...) Expand 10 before | Expand all | Expand 10 after
5350 // Bit field containing various information collected by the compiler to 5350 // Bit field containing various information collected by the compiler to
5351 // drive optimization. 5351 // drive optimization.
5352 inline int compiler_hints(); 5352 inline int compiler_hints();
5353 inline void set_compiler_hints(int value); 5353 inline void set_compiler_hints(int value);
5354 5354
5355 inline int ast_node_count(); 5355 inline int ast_node_count();
5356 inline void set_ast_node_count(int count); 5356 inline void set_ast_node_count(int count);
5357 5357
5358 // A counter used to determine when to stress the deoptimizer with a 5358 // A counter used to determine when to stress the deoptimizer with a
5359 // deopt. 5359 // deopt.
5360 inline int deopt_counter(); 5360 inline int stress_deopt_counter();
5361 inline void set_deopt_counter(int counter); 5361 inline void set_stress_deopt_counter(int counter);
5362 5362
5363 inline int profiler_ticks(); 5363 inline int profiler_ticks();
5364 5364
5365 // Inline cache age is used to infer whether the function survived a context 5365 // Inline cache age is used to infer whether the function survived a context
5366 // disposal or not. In the former case we reset the opt_count. 5366 // disposal or not. In the former case we reset the opt_count.
5367 inline int ic_age(); 5367 inline int ic_age();
5368 inline void set_ic_age(int age); 5368 inline void set_ic_age(int age);
5369 5369
5370 // Add information on assignments of the form this.x = ...; 5370 // Add information on assignments of the form this.x = ...;
5371 void SetThisPropertyAssignmentsInfo( 5371 void SetThisPropertyAssignmentsInfo(
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
5479 inline void set_this_property_assignments_count(int value); 5479 inline void set_this_property_assignments_count(int value);
5480 String* GetThisPropertyAssignmentName(int index); 5480 String* GetThisPropertyAssignmentName(int index);
5481 bool IsThisPropertyAssignmentArgument(int index); 5481 bool IsThisPropertyAssignmentArgument(int index);
5482 int GetThisPropertyAssignmentArgument(int index); 5482 int GetThisPropertyAssignmentArgument(int index);
5483 Object* GetThisPropertyAssignmentConstant(int index); 5483 Object* GetThisPropertyAssignmentConstant(int index);
5484 5484
5485 // [source code]: Source code for the function. 5485 // [source code]: Source code for the function.
5486 bool HasSourceCode(); 5486 bool HasSourceCode();
5487 Handle<Object> GetSourceCode(); 5487 Handle<Object> GetSourceCode();
5488 5488
5489 // Number of times the function was optimized.
5489 inline int opt_count(); 5490 inline int opt_count();
5490 inline void set_opt_count(int opt_count); 5491 inline void set_opt_count(int opt_count);
5491 5492
5493 // Number of times the function was deoptimized.
5494 inline void set_deopt_count(int value);
5495 inline int deopt_count();
5496 inline void increment_deopt_count();
5497
5498 // Number of time we tried to re-enable optimization after it
5499 // was disabled due to high number of deoptimizations.
5500 inline void set_opt_reenable_tries(int value);
5501 inline int opt_reenable_tries();
5502
5503 inline void TryReenableOptimization();
5504
5505 // Stores deopt_count, opt_reenable_tries and ic_age as bit-fields.
5506 inline void set_counters(int value);
5507 inline int counters();
5508
5509
5492 // Source size of this function. 5510 // Source size of this function.
5493 int SourceSize(); 5511 int SourceSize();
5494 5512
5495 // Calculate the instance size. 5513 // Calculate the instance size.
5496 int CalculateInstanceSize(); 5514 int CalculateInstanceSize();
5497 5515
5498 // Calculate the number of in-object properties. 5516 // Calculate the number of in-object properties.
5499 int CalculateInObjectProperties(); 5517 int CalculateInObjectProperties();
5500 5518
5501 // Dispatched behavior. 5519 // Dispatched behavior.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5538 kConstructStubOffset + kPointerSize; 5556 kConstructStubOffset + kPointerSize;
5539 static const int kFunctionDataOffset = 5557 static const int kFunctionDataOffset =
5540 kInstanceClassNameOffset + kPointerSize; 5558 kInstanceClassNameOffset + kPointerSize;
5541 static const int kScriptOffset = kFunctionDataOffset + kPointerSize; 5559 static const int kScriptOffset = kFunctionDataOffset + kPointerSize;
5542 static const int kDebugInfoOffset = kScriptOffset + kPointerSize; 5560 static const int kDebugInfoOffset = kScriptOffset + kPointerSize;
5543 static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize; 5561 static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize;
5544 static const int kInitialMapOffset = 5562 static const int kInitialMapOffset =
5545 kInferredNameOffset + kPointerSize; 5563 kInferredNameOffset + kPointerSize;
5546 static const int kThisPropertyAssignmentsOffset = 5564 static const int kThisPropertyAssignmentsOffset =
5547 kInitialMapOffset + kPointerSize; 5565 kInitialMapOffset + kPointerSize;
5548 // ic_age is a Smi field. It could be grouped with another Smi field into a 5566 // ast_node_count is a Smi field. It could be grouped with another Smi field
5549 // PSEUDO_SMI_ACCESSORS pair (on x64), if one becomes available. 5567 // into a PSEUDO_SMI_ACCESSORS pair (on x64), if one becomes available.
5550 static const int kICAgeOffset = kThisPropertyAssignmentsOffset + kPointerSize; 5568 static const int kAstNodeCountOffset =
5569 kThisPropertyAssignmentsOffset + kPointerSize;
5551 #if V8_HOST_ARCH_32_BIT 5570 #if V8_HOST_ARCH_32_BIT
5552 // Smi fields. 5571 // Smi fields.
5553 static const int kLengthOffset = 5572 static const int kLengthOffset =
5554 kICAgeOffset + kPointerSize; 5573 kAstNodeCountOffset + kPointerSize;
5555 static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize; 5574 static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize;
5556 static const int kExpectedNofPropertiesOffset = 5575 static const int kExpectedNofPropertiesOffset =
5557 kFormalParameterCountOffset + kPointerSize; 5576 kFormalParameterCountOffset + kPointerSize;
5558 static const int kNumLiteralsOffset = 5577 static const int kNumLiteralsOffset =
5559 kExpectedNofPropertiesOffset + kPointerSize; 5578 kExpectedNofPropertiesOffset + kPointerSize;
5560 static const int kStartPositionAndTypeOffset = 5579 static const int kStartPositionAndTypeOffset =
5561 kNumLiteralsOffset + kPointerSize; 5580 kNumLiteralsOffset + kPointerSize;
5562 static const int kEndPositionOffset = 5581 static const int kEndPositionOffset =
5563 kStartPositionAndTypeOffset + kPointerSize; 5582 kStartPositionAndTypeOffset + kPointerSize;
5564 static const int kFunctionTokenPositionOffset = 5583 static const int kFunctionTokenPositionOffset =
5565 kEndPositionOffset + kPointerSize; 5584 kEndPositionOffset + kPointerSize;
5566 static const int kCompilerHintsOffset = 5585 static const int kCompilerHintsOffset =
5567 kFunctionTokenPositionOffset + kPointerSize; 5586 kFunctionTokenPositionOffset + kPointerSize;
5568 static const int kThisPropertyAssignmentsCountOffset = 5587 static const int kThisPropertyAssignmentsCountOffset =
5569 kCompilerHintsOffset + kPointerSize; 5588 kCompilerHintsOffset + kPointerSize;
5570 static const int kOptCountOffset = 5589 static const int kOptCountOffset =
5571 kThisPropertyAssignmentsCountOffset + kPointerSize; 5590 kThisPropertyAssignmentsCountOffset + kPointerSize;
5572 static const int kAstNodeCountOffset = kOptCountOffset + kPointerSize; 5591 static const int kCountersOffset = kOptCountOffset + kPointerSize;
5573 static const int kDeoptCounterOffset = kAstNodeCountOffset + kPointerSize; 5592 static const int kStressDeoptCounterOffset = kCountersOffset + kPointerSize;
5574
5575 5593
5576 // Total size. 5594 // Total size.
5577 static const int kSize = kDeoptCounterOffset + kPointerSize; 5595 static const int kSize = kStressDeoptCounterOffset + kPointerSize;
5578 #else 5596 #else
5579 // The only reason to use smi fields instead of int fields 5597 // The only reason to use smi fields instead of int fields
5580 // is to allow iteration without maps decoding during 5598 // is to allow iteration without maps decoding during
5581 // garbage collections. 5599 // garbage collections.
5582 // To avoid wasting space on 64-bit architectures we use 5600 // To avoid wasting space on 64-bit architectures we use
5583 // the following trick: we group integer fields into pairs 5601 // the following trick: we group integer fields into pairs
5584 // First integer in each pair is shifted left by 1. 5602 // First integer in each pair is shifted left by 1.
5585 // By doing this we guarantee that LSB of each kPointerSize aligned 5603 // By doing this we guarantee that LSB of each kPointerSize aligned
5586 // word is not set and thus this word cannot be treated as pointer 5604 // word is not set and thus this word cannot be treated as pointer
5587 // to HeapObject during old space traversal. 5605 // to HeapObject during old space traversal.
5588 static const int kLengthOffset = 5606 static const int kLengthOffset =
5589 kICAgeOffset + kPointerSize; 5607 kAstNodeCountOffset + kPointerSize;
5590 static const int kFormalParameterCountOffset = 5608 static const int kFormalParameterCountOffset =
5591 kLengthOffset + kIntSize; 5609 kLengthOffset + kIntSize;
5592 5610
5593 static const int kExpectedNofPropertiesOffset = 5611 static const int kExpectedNofPropertiesOffset =
5594 kFormalParameterCountOffset + kIntSize; 5612 kFormalParameterCountOffset + kIntSize;
5595 static const int kNumLiteralsOffset = 5613 static const int kNumLiteralsOffset =
5596 kExpectedNofPropertiesOffset + kIntSize; 5614 kExpectedNofPropertiesOffset + kIntSize;
5597 5615
5598 static const int kEndPositionOffset = 5616 static const int kEndPositionOffset =
5599 kNumLiteralsOffset + kIntSize; 5617 kNumLiteralsOffset + kIntSize;
5600 static const int kStartPositionAndTypeOffset = 5618 static const int kStartPositionAndTypeOffset =
5601 kEndPositionOffset + kIntSize; 5619 kEndPositionOffset + kIntSize;
5602 5620
5603 static const int kFunctionTokenPositionOffset = 5621 static const int kFunctionTokenPositionOffset =
5604 kStartPositionAndTypeOffset + kIntSize; 5622 kStartPositionAndTypeOffset + kIntSize;
5605 static const int kCompilerHintsOffset = 5623 static const int kCompilerHintsOffset =
5606 kFunctionTokenPositionOffset + kIntSize; 5624 kFunctionTokenPositionOffset + kIntSize;
5607 5625
5608 static const int kThisPropertyAssignmentsCountOffset = 5626 static const int kThisPropertyAssignmentsCountOffset =
5609 kCompilerHintsOffset + kIntSize; 5627 kCompilerHintsOffset + kIntSize;
5610 static const int kOptCountOffset = 5628 static const int kOptCountOffset =
5611 kThisPropertyAssignmentsCountOffset + kIntSize; 5629 kThisPropertyAssignmentsCountOffset + kIntSize;
5612 5630
5613 static const int kAstNodeCountOffset = kOptCountOffset + kIntSize; 5631 static const int kCountersOffset = kOptCountOffset + kIntSize;
5614 static const int kDeoptCounterOffset = kAstNodeCountOffset + kIntSize; 5632 static const int kStressDeoptCounterOffset = kCountersOffset + kIntSize;
5615 5633
5616 // Total size. 5634 // Total size.
5617 static const int kSize = kDeoptCounterOffset + kIntSize; 5635 static const int kSize = kStressDeoptCounterOffset + kIntSize;
5618 5636
5619 #endif 5637 #endif
5620 5638
5621 // The construction counter for inobject slack tracking is stored in the 5639 // The construction counter for inobject slack tracking is stored in the
5622 // most significant byte of compiler_hints which is otherwise unused. 5640 // most significant byte of compiler_hints which is otherwise unused.
5623 // Its offset depends on the endian-ness of the architecture. 5641 // Its offset depends on the endian-ness of the architecture.
5624 #if __BYTE_ORDER == __LITTLE_ENDIAN 5642 #if __BYTE_ORDER == __LITTLE_ENDIAN
5625 static const int kConstructionCountOffset = kCompilerHintsOffset + 3; 5643 static const int kConstructionCountOffset = kCompilerHintsOffset + 3;
5626 #elif __BYTE_ORDER == __BIG_ENDIAN 5644 #elif __BYTE_ORDER == __BIG_ENDIAN
5627 static const int kConstructionCountOffset = kCompilerHintsOffset + 0; 5645 static const int kConstructionCountOffset = kCompilerHintsOffset + 0;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5660 kNative, 5678 kNative,
5661 kBoundFunction, 5679 kBoundFunction,
5662 kIsAnonymous, 5680 kIsAnonymous,
5663 kNameShouldPrintAsAnonymous, 5681 kNameShouldPrintAsAnonymous,
5664 kIsFunction, 5682 kIsFunction,
5665 kDontOptimize, 5683 kDontOptimize,
5666 kDontInline, 5684 kDontInline,
5667 kCompilerHintsCount // Pseudo entry 5685 kCompilerHintsCount // Pseudo entry
5668 }; 5686 };
5669 5687
5688 static const int kDeoptCountSize = 4;
5689 static const int kDeoptCountMask = (1 << kDeoptCountSize) - 1;
5690
5691 static const int kOptReenableTriesSize = 18;
5692 static const int kOptReenableTriesMask = (1 << kOptReenableTriesSize) - 1;
5693
5694 static const int kICAgeSize = 8;
5695 static const int kICAgeMask = (1 << kICAgeSize) - 1;
5696
5697 enum Counters {
5698 kDeoptCountShift,
Jakob Kummerow 2012/06/11 12:13:59 Don't you want to set kDeoptCountShift = kCounters
ulan 2012/06/11 16:07:31 set_counters takes care of this, removed kCounters
5699 kOptReenableTriesShift = kDeoptCountShift + kDeoptCountSize,
5700 kICAgeShift = kOptReenableTriesShift + kOptReenableTriesSize,
5701 kCountersSizeInBits = kICAgeShift + kICAgeSize // Pseudo entry
5702 };
5703
5670 private: 5704 private:
5671 #if V8_HOST_ARCH_32_BIT 5705 #if V8_HOST_ARCH_32_BIT
5672 // On 32 bit platforms, compiler hints is a smi. 5706 // On 32 bit platforms, compiler hints is a smi.
5673 static const int kCompilerHintsSmiTagSize = kSmiTagSize; 5707 static const int kCompilerHintsSmiTagSize = kSmiTagSize;
5674 static const int kCompilerHintsSize = kPointerSize; 5708 static const int kCompilerHintsSize = kPointerSize;
5709
5710 static const int kCountersSmiTagSize = kSmiTagSize;
5711 static const int kCountersSize = kPointerSize;
5675 #else 5712 #else
5676 // On 64 bit platforms, compiler hints is not a smi, see comment above. 5713 // On 64 bit platforms, compiler hints is not a smi, see comment above.
5677 static const int kCompilerHintsSmiTagSize = 0; 5714 static const int kCompilerHintsSmiTagSize = 0;
5678 static const int kCompilerHintsSize = kIntSize; 5715 static const int kCompilerHintsSize = kIntSize;
5716
5717 static const int kCountersSmiTagSize = 0;
5718 static const int kCountersSize = kIntSize;
5679 #endif 5719 #endif
5680 5720
5681 STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount <= 5721 STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount <=
5682 SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte); 5722 SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte);
5683 5723
5724 STATIC_ASSERT(SharedFunctionInfo::kCountersSizeInBits <=
5725 SharedFunctionInfo::kCountersSize * kBitsPerByte);
5684 public: 5726 public:
5685 // Constants for optimizing codegen for strict mode function and 5727 // Constants for optimizing codegen for strict mode function and
5686 // native tests. 5728 // native tests.
5687 // Allows to use byte-width instructions. 5729 // Allows to use byte-width instructions.
5688 static const int kStrictModeBitWithinByte = 5730 static const int kStrictModeBitWithinByte =
5689 (kStrictModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte; 5731 (kStrictModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte;
5690 5732
5691 static const int kExtendedModeBitWithinByte = 5733 static const int kExtendedModeBitWithinByte =
5692 (kExtendedModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte; 5734 (kExtendedModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte;
5693 5735
(...skipping 2984 matching lines...) Expand 10 before | Expand all | Expand 10 after
8678 } else { 8720 } else {
8679 value &= ~(1 << bit_position); 8721 value &= ~(1 << bit_position);
8680 } 8722 }
8681 return value; 8723 return value;
8682 } 8724 }
8683 }; 8725 };
8684 8726
8685 } } // namespace v8::internal 8727 } } // namespace v8::internal
8686 8728
8687 #endif // V8_OBJECTS_H_ 8729 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698