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

Side by Side Diff: runtime/vm/object.h

Issue 2670843006: Encode inlining information in CodeSourceMap and remove inlining interval arrays. (Closed)
Patch Set: . Created 3 years, 10 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
« no previous file with comments | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/object.cc » ('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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef RUNTIME_VM_OBJECT_H_ 5 #ifndef RUNTIME_VM_OBJECT_H_
6 #define RUNTIME_VM_OBJECT_H_ 6 #define RUNTIME_VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 4383 matching lines...) Expand 10 before | Expand all | Expand 10 after
4394 static intptr_t InstanceSize() { 4394 static intptr_t InstanceSize() {
4395 ASSERT(sizeof(RawCodeSourceMap) == 4395 ASSERT(sizeof(RawCodeSourceMap) ==
4396 OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data)); 4396 OFFSET_OF_RETURNED_VALUE(RawCodeSourceMap, data));
4397 return 0; 4397 return 0;
4398 } 4398 }
4399 static intptr_t InstanceSize(intptr_t len) { 4399 static intptr_t InstanceSize(intptr_t len) {
4400 ASSERT(0 <= len && len <= kMaxElements); 4400 ASSERT(0 <= len && len <= kMaxElements);
4401 return RoundedAllocationSize(sizeof(RawCodeSourceMap) + len); 4401 return RoundedAllocationSize(sizeof(RawCodeSourceMap) + len);
4402 } 4402 }
4403 4403
4404 static RawCodeSourceMap* New(GrowableArray<uint8_t>* delta_encoded_data); 4404 static RawCodeSourceMap* New(intptr_t length);
4405
4406 intptr_t Length() const { return raw_ptr()->length_; }
4407 uint8_t* Data() const {
4408 return UnsafeMutableNonPointer(&raw_ptr()->data()[0]);
4409 }
4405 4410
4406 void PrintToJSONObject(JSONObject* jsobj, bool ref) const; 4411 void PrintToJSONObject(JSONObject* jsobj, bool ref) const;
4407 4412
4408 // Encode integer in SLEB128 format.
4409 static void EncodeInteger(GrowableArray<uint8_t>* data, intptr_t value);
4410
4411 // Decode SLEB128 encoded integer. Update byte_index to the next integer.
4412 intptr_t DecodeInteger(intptr_t* byte_index) const;
4413
4414 TokenPosition TokenPositionForPCOffset(uword pc_offset) const;
4415 RawFunction* FunctionForPCOffset(const Code& code,
4416 const Function& function,
4417 uword pc_offset) const;
4418 RawScript* ScriptForPCOffset(const Code& code,
4419 const Function& function,
4420 uword pc_offset) const;
4421
4422 static void Dump(const CodeSourceMap& code_source_map,
4423 const Code& code,
4424 const Function& function);
4425
4426 class Iterator : ValueObject {
4427 public:
4428 explicit Iterator(const CodeSourceMap& code_source_map)
4429 : code_source_map_(code_source_map),
4430 byte_index_(0),
4431 cur_pc_offset_(0),
4432 cur_token_pos_(0) {}
4433
4434 bool MoveNext() {
4435 // Moves to the next record.
4436 while (byte_index_ < code_source_map_.Length()) {
4437 cur_pc_offset_ += code_source_map_.DecodeInteger(&byte_index_);
4438 cur_token_pos_ += code_source_map_.DecodeInteger(&byte_index_);
4439
4440 return true;
4441 }
4442 return false;
4443 }
4444
4445 uword PcOffset() const { return cur_pc_offset_; }
4446 TokenPosition TokenPos() const { return TokenPosition(cur_token_pos_); }
4447
4448 private:
4449 friend class CodeSourceMap;
4450
4451 const CodeSourceMap& code_source_map_;
4452 intptr_t byte_index_;
4453
4454 intptr_t cur_pc_offset_;
4455 intptr_t cur_token_pos_;
4456 };
4457
4458 private: 4413 private:
4459 static RawCodeSourceMap* New(intptr_t length);
4460
4461 intptr_t Length() const;
4462 void SetLength(intptr_t value) const; 4414 void SetLength(intptr_t value) const;
4463 void CopyData(GrowableArray<uint8_t>* data);
4464 4415
4465 FINAL_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap, Object); 4416 FINAL_HEAP_OBJECT_IMPLEMENTATION(CodeSourceMap, Object);
4466 friend class Class; 4417 friend class Class;
4467 friend class Object; 4418 friend class Object;
4468 }; 4419 };
4469 4420
4470 4421
4471 class StackMap : public Object { 4422 class StackMap : public Object {
4472 public: 4423 public:
4473 static const intptr_t kNoMaximum = -1; 4424 static const intptr_t kNoMaximum = -1;
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
4723 #else 4674 #else
4724 ASSERT(code_source_map.IsOld()); 4675 ASSERT(code_source_map.IsOld());
4725 StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw()); 4676 StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw());
4726 #endif 4677 #endif
4727 } 4678 }
4728 4679
4729 // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas 4680 // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas
4730 // that are embedded inside the Code object. 4681 // that are embedded inside the Code object.
4731 void ResetICDatas(Zone* zone) const; 4682 void ResetICDatas(Zone* zone) const;
4732 4683
4733 TokenPosition GetTokenPositionAt(intptr_t offset) const;
4734
4735 // Array of DeoptInfo objects. 4684 // Array of DeoptInfo objects.
4736 RawArray* deopt_info_array() const { 4685 RawArray* deopt_info_array() const {
4737 #if defined(DART_PRECOMPILED_RUNTIME) 4686 #if defined(DART_PRECOMPILED_RUNTIME)
4738 UNREACHABLE(); 4687 UNREACHABLE();
4739 return NULL; 4688 return NULL;
4740 #else 4689 #else
4741 return raw_ptr()->deopt_info_array_; 4690 return raw_ptr()->deopt_info_array_;
4742 #endif 4691 #endif
4743 } 4692 }
4744 void set_deopt_info_array(const Array& array) const; 4693 void set_deopt_info_array(const Array& array) const;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
4819 return NULL; 4768 return NULL;
4820 #else 4769 #else
4821 return raw_ptr()->return_address_metadata_; 4770 return raw_ptr()->return_address_metadata_;
4822 #endif 4771 #endif
4823 } 4772 }
4824 // Sets |return_address_metadata|. 4773 // Sets |return_address_metadata|.
4825 void SetPrologueOffset(intptr_t offset) const; 4774 void SetPrologueOffset(intptr_t offset) const;
4826 // Returns -1 if no prologue offset is available. 4775 // Returns -1 if no prologue offset is available.
4827 intptr_t GetPrologueOffset() const; 4776 intptr_t GetPrologueOffset() const;
4828 4777
4829 enum InlinedIntervalEntries { 4778 RawArray* inlined_id_to_function() const;
4830 kInlIntStart = 0, 4779 void set_inlined_id_to_function(const Array& value) const;
4831 kInlIntInliningId = 1,
4832 kInlIntNumEntries = 2,
4833 };
4834 4780
4835 RawArray* GetInlinedIntervals() const; 4781 // Provides the call stack at the given pc offset, with the top-of-stack in
4836 void SetInlinedIntervals(const Array& value) const; 4782 // the last element and the root function (this) as the first element, along
4783 // with the corresponding source positions. Note the token position for each
4784 // function except the top-of-stack is the position of the call to the next
4785 // function. The stack will be empty if we lack the metadata to produce it,
4786 // which happens for stub code.
4787 void GetInlinedFunctionsAt(
4788 intptr_t pc_offset,
4789 GrowableArray<const Function*>* functions,
4790 GrowableArray<TokenPosition>* token_positions) const;
4837 4791
4838 RawArray* GetInlinedIdToFunction() const; 4792 NOT_IN_PRODUCT(void PrintJSONInlineIntervals(JSONObject* object) const);
4839 void SetInlinedIdToFunction(const Array& value) const; 4793 void DumpInlineIntervals() const;
4840 4794 void DumpSourcePositions() const;
4841 RawArray* GetInlinedIdToTokenPos() const;
4842 void SetInlinedIdToTokenPos(const Array& value) const;
4843
4844 RawArray* GetInlinedCallerIdMap() const;
4845 void SetInlinedCallerIdMap(const Array& value) const;
4846
4847 // If |token_positions| is not NULL it will be populated with the token
4848 // positions of the inlined calls.
4849 void GetInlinedFunctionsAt(
4850 intptr_t offset,
4851 GrowableArray<Function*>* fs,
4852 GrowableArray<TokenPosition>* token_positions = NULL) const;
4853
4854 void DumpInlinedIntervals() const;
4855 4795
4856 RawLocalVarDescriptors* var_descriptors() const { 4796 RawLocalVarDescriptors* var_descriptors() const {
4857 #if defined(DART_PRECOMPILED_RUNTIME) 4797 #if defined(DART_PRECOMPILED_RUNTIME)
4858 UNREACHABLE(); 4798 UNREACHABLE();
4859 return NULL; 4799 return NULL;
4860 #else 4800 #else
4861 return raw_ptr()->var_descriptors_; 4801 return raw_ptr()->var_descriptors_;
4862 #endif 4802 #endif
4863 } 4803 }
4864 void set_var_descriptors(const LocalVarDescriptors& value) const { 4804 void set_var_descriptors(const LocalVarDescriptors& value) const {
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
5029 ASSERT(index >= 0); 4969 ASSERT(index >= 0);
5030 ASSERT(index < pointer_offsets_length()); 4970 ASSERT(index < pointer_offsets_length());
5031 // TODO(iposva): Unit test is missing for this functionality. 4971 // TODO(iposva): Unit test is missing for this functionality.
5032 return &UnsafeMutableNonPointer(raw_ptr()->data())[index]; 4972 return &UnsafeMutableNonPointer(raw_ptr()->data())[index];
5033 } 4973 }
5034 void SetPointerOffsetAt(int index, int32_t offset_in_instructions) { 4974 void SetPointerOffsetAt(int index, int32_t offset_in_instructions) {
5035 NoSafepointScope no_safepoint; 4975 NoSafepointScope no_safepoint;
5036 *PointerOffsetAddrAt(index) = offset_in_instructions; 4976 *PointerOffsetAddrAt(index) = offset_in_instructions;
5037 } 4977 }
5038 4978
5039 // Currently slow, as it searches linearly through inlined_intervals().
5040 intptr_t GetCallerId(intptr_t inlined_id) const;
5041
5042 intptr_t BinarySearchInSCallTable(uword pc) const; 4979 intptr_t BinarySearchInSCallTable(uword pc) const;
5043 static RawCode* LookupCodeInIsolate(Isolate* isolate, uword pc); 4980 static RawCode* LookupCodeInIsolate(Isolate* isolate, uword pc);
5044 4981
5045 // New is a private method as RawInstruction and RawCode objects should 4982 // New is a private method as RawInstruction and RawCode objects should
5046 // only be created using the Code::FinalizeCode method. This method creates 4983 // only be created using the Code::FinalizeCode method. This method creates
5047 // the RawInstruction and RawCode objects, sets up the pointer offsets 4984 // the RawInstruction and RawCode objects, sets up the pointer offsets
5048 // and links the two in a GC safe manner. 4985 // and links the two in a GC safe manner.
5049 static RawCode* New(intptr_t pointer_offsets_length); 4986 static RawCode* New(intptr_t pointer_offsets_length);
5050 4987
5051 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object); 4988 FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object);
(...skipping 3904 matching lines...) Expand 10 before | Expand all | Expand 10 after
8956 8893
8957 inline void TypeArguments::SetHash(intptr_t value) const { 8894 inline void TypeArguments::SetHash(intptr_t value) const {
8958 // This is only safe because we create a new Smi, which does not cause 8895 // This is only safe because we create a new Smi, which does not cause
8959 // heap allocation. 8896 // heap allocation.
8960 StoreSmi(&raw_ptr()->hash_, Smi::New(value)); 8897 StoreSmi(&raw_ptr()->hash_, Smi::New(value));
8961 } 8898 }
8962 8899
8963 } // namespace dart 8900 } // namespace dart
8964 8901
8965 #endif // RUNTIME_VM_OBJECT_H_ 8902 #endif // RUNTIME_VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698