| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 #include "vm/code_index_table.h" | 5 #include "vm/code_index_table.h" |
| 6 | 6 |
| 7 #include "vm/isolate.h" | 7 #include "vm/isolate.h" |
| 8 #include "vm/object.h" | 8 #include "vm/object.h" |
| 9 #include "vm/pages.h" | 9 #include "vm/pages.h" |
| 10 #include "vm/raw_object.h" | 10 #include "vm/raw_object.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 IndexArray<PcRange>* pc_ranges = code_pages_->At(i).pc_ranges; | 27 IndexArray<PcRange>* pc_ranges = code_pages_->At(i).pc_ranges; |
| 28 delete pc_ranges; | 28 delete pc_ranges; |
| 29 } | 29 } |
| 30 delete code_pages_; | 30 delete code_pages_; |
| 31 code_lists_ = Array::null(); | 31 code_lists_ = Array::null(); |
| 32 delete largecode_pc_ranges_; | 32 delete largecode_pc_ranges_; |
| 33 largecode_list_ = Array::null(); | 33 largecode_list_ = Array::null(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 | 36 |
| 37 void CodeIndexTable::AddFunction(const Function& func) { | 37 void CodeIndexTable::AddCode(const Code& code) { |
| 38 const Code& code = Code::Handle(func.code()); | |
| 39 ASSERT(!code.IsNull()); | 38 ASSERT(!code.IsNull()); |
| 40 uword entrypoint = code.EntryPoint(); // Entry point for a function. | 39 uword entrypoint = code.EntryPoint(); // Entry point for a function. |
| 41 intptr_t instr_size = code.Size(); // Instructions size for the function. | 40 intptr_t instr_size = code.Size(); // Instructions size for the function. |
| 42 if (PageSpace::IsPageAllocatableSize(instr_size)) { | 41 if (PageSpace::IsPageAllocatableSize(instr_size)) { |
| 43 uword page_start = (entrypoint & ~(PageSpace::kPageSize - 1)); | 42 uword page_start = (entrypoint & ~(PageSpace::kPageSize - 1)); |
| 44 int page_index = FindPageIndex(page_start); | 43 int page_index = FindPageIndex(page_start); |
| 45 if (page_index == -1) { | 44 if (page_index == -1) { |
| 46 // We do not have an entry for this code page, add one. | 45 // We do not have an entry for this code page, add one. |
| 47 page_index = AddPageIndex(page_start); | 46 page_index = AddPageIndex(page_start); |
| 48 } | 47 } |
| 49 ASSERT(page_index != -1); | 48 ASSERT(page_index != -1); |
| 50 // Add the entrypoint, size and function object at the specified index. | 49 // Add the entrypoint, size and function object at the specified index. |
| 51 AddFunctionToList(page_index, entrypoint, instr_size, func); | 50 AddCodeToList(page_index, entrypoint, instr_size, code); |
| 52 } else { | 51 } else { |
| 53 AddLargeFunction(entrypoint, instr_size, func); | 52 AddLargeCode(entrypoint, instr_size, code); |
| 54 } | 53 } |
| 55 } | 54 } |
| 56 | 55 |
| 57 | 56 |
| 58 RawFunction* CodeIndexTable::LookupFunction(uword pc) const { | |
| 59 const Code& code = Code::Handle(LookupCode(pc)); | |
| 60 if (code.IsNull()) { | |
| 61 return Function::null(); | |
| 62 } | |
| 63 return code.function(); | |
| 64 } | |
| 65 | |
| 66 | |
| 67 RawCode* CodeIndexTable::LookupCode(uword pc) const { | 57 RawCode* CodeIndexTable::LookupCode(uword pc) const { |
| 68 uword page_start = (pc & ~(PageSpace::kPageSize - 1)); | 58 uword page_start = (pc & ~(PageSpace::kPageSize - 1)); |
| 69 int page_index = FindPageIndex(page_start); | 59 int page_index = FindPageIndex(page_start); |
| 70 if (page_index == -1) { | 60 if (page_index == -1) { |
| 71 // Check if the pc exists in the large pc ranges as this might be | 61 // Check if the pc exists in the large pc ranges as this might be |
| 72 // the pc of a large code object. This would return the large code | 62 // the pc of a large code object. This would return the large code |
| 73 // or a null object if it doesn't exist in that list too. | 63 // or a null object if it doesn't exist in that list too. |
| 74 return LookupLargeCode(pc); | 64 return LookupLargeCode(pc); |
| 75 } | 65 } |
| 76 IndexArray<PcRange>* pc_ranges = code_pages_->At(page_index).pc_ranges; | 66 IndexArray<PcRange>* pc_ranges = code_pages_->At(page_index).pc_ranges; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 // table. | 114 // table. |
| 125 for (int i = 0; i < code_pages_->length(); i++) { | 115 for (int i = 0; i < code_pages_->length(); i++) { |
| 126 if (code_pages_->At(i).page_start == page_start) { | 116 if (code_pages_->At(i).page_start == page_start) { |
| 127 return i; | 117 return i; |
| 128 } | 118 } |
| 129 } | 119 } |
| 130 return -1; | 120 return -1; |
| 131 } | 121 } |
| 132 | 122 |
| 133 | 123 |
| 134 void CodeIndexTable::AddFunctionToList(int page_index, | 124 void CodeIndexTable::AddCodeToList(int page_index, |
| 135 uword entrypoint, | 125 uword entrypoint, |
| 136 intptr_t size, | 126 intptr_t size, |
| 137 const Function& func) { | 127 const Code& code) { |
| 138 // Get PC ranges index array at specified index. | 128 // Get PC ranges index array at specified index. |
| 139 IndexArray<PcRange>* pc_ranges = code_pages_->At(page_index).pc_ranges; | 129 IndexArray<PcRange>* pc_ranges = code_pages_->At(page_index).pc_ranges; |
| 140 ASSERT(pc_ranges != NULL); | 130 ASSERT(pc_ranges != NULL); |
| 141 const Array& codes_list = Array::Handle(code_lists_); | 131 const Array& codes_list = Array::Handle(code_lists_); |
| 142 ASSERT(!codes_list.IsNull()); | 132 ASSERT(!codes_list.IsNull()); |
| 143 // Get functions array present at specified index. | 133 // Get functions array present at specified index. |
| 144 Array& codes = Array::Handle(); | 134 Array& codes = Array::Handle(); |
| 145 codes ^= codes_list.At(page_index); | 135 codes ^= codes_list.At(page_index); |
| 146 ASSERT(!codes.IsNull()); | 136 ASSERT(!codes.IsNull()); |
| 147 // Asserting with an unsorted search, to ensure addition of pc was done right. | 137 // Asserting with an unsorted search, to ensure addition of pc was done right. |
| 148 ASSERT(FindPcIndex(*pc_ranges, entrypoint, kIsNotSorted) == -1); | 138 ASSERT(FindPcIndex(*pc_ranges, entrypoint, kIsNotSorted) == -1); |
| 149 AddFuncHelper(pc_ranges, codes, entrypoint, size, func); | 139 AddCodeHelper(pc_ranges, codes, entrypoint, size, code); |
| 150 if (pc_ranges->IsFull()) { | 140 if (pc_ranges->IsFull()) { |
| 151 // Grow the pc ranges table and the associated functions table. | 141 // Grow the pc ranges table and the associated functions table. |
| 152 int new_size = pc_ranges->length() + kInitialSize; | 142 int new_size = pc_ranges->length() + kInitialSize; |
| 153 pc_ranges->Resize(new_size); | 143 pc_ranges->Resize(new_size); |
| 154 codes = Array::Grow(codes, new_size); | 144 codes = Array::Grow(codes, new_size); |
| 155 codes_list.SetAt(page_index, codes); | 145 codes_list.SetAt(page_index, codes); |
| 156 } | 146 } |
| 157 } | 147 } |
| 158 | 148 |
| 159 | 149 |
| 160 void CodeIndexTable::AddLargeFunction(uword entrypoint, | 150 void CodeIndexTable::AddLargeCode(uword entrypoint, |
| 161 intptr_t size, | 151 intptr_t size, |
| 162 const Function& func) { | 152 const Code& code) { |
| 163 if (largecode_pc_ranges_ == NULL) { | 153 if (largecode_pc_ranges_ == NULL) { |
| 164 // No large functions seen so far. | 154 // No large functions seen so far. |
| 165 largecode_pc_ranges_ = new IndexArray<PcRange>(kInitialSize); | 155 largecode_pc_ranges_ = new IndexArray<PcRange>(kInitialSize); |
| 166 ASSERT(largecode_pc_ranges_ != NULL); | 156 ASSERT(largecode_pc_ranges_ != NULL); |
| 167 largecode_list_ = Array::New(kInitialSize); | 157 largecode_list_ = Array::New(kInitialSize); |
| 168 } | 158 } |
| 169 ASSERT(FindPcIndex(*largecode_pc_ranges_, entrypoint, kIsNotSorted) == -1); | 159 ASSERT(FindPcIndex(*largecode_pc_ranges_, entrypoint, kIsNotSorted) == -1); |
| 170 const Array& largecode_list = Array::Handle(largecode_list_); | 160 const Array& largecode_list = Array::Handle(largecode_list_); |
| 171 ASSERT(!largecode_list.IsNull()); | 161 ASSERT(!largecode_list.IsNull()); |
| 172 AddFuncHelper(largecode_pc_ranges_, largecode_list, entrypoint, size, func); | 162 AddCodeHelper(largecode_pc_ranges_, largecode_list, entrypoint, size, code); |
| 173 if (largecode_pc_ranges_->IsFull()) { | 163 if (largecode_pc_ranges_->IsFull()) { |
| 174 // Grow largecode_pc_ranges_ and largecode_list_. | 164 // Grow largecode_pc_ranges_ and largecode_list_. |
| 175 int new_size = largecode_pc_ranges_->length() + kInitialSize; | 165 int new_size = largecode_pc_ranges_->length() + kInitialSize; |
| 176 largecode_pc_ranges_->Resize(new_size); | 166 largecode_pc_ranges_->Resize(new_size); |
| 177 largecode_list_ = Array::Grow(largecode_list, new_size); | 167 largecode_list_ = Array::Grow(largecode_list, new_size); |
| 178 } | 168 } |
| 179 } | 169 } |
| 180 | 170 |
| 181 | 171 |
| 182 void CodeIndexTable::AddFuncHelper(IndexArray<PcRange>* pc_ranges, | 172 void CodeIndexTable::AddCodeHelper(IndexArray<PcRange>* pc_ranges, |
| 183 const Array& codes, | 173 const Array& codes, |
| 184 uword entrypoint, | 174 uword entrypoint, |
| 185 intptr_t size, | 175 intptr_t size, |
| 186 const Function& func) { | 176 const Code& code) { |
| 187 PcRange pc_range; | 177 PcRange pc_range; |
| 188 pc_range.entrypoint = entrypoint; | 178 pc_range.entrypoint = entrypoint; |
| 189 pc_range.size = size; | 179 pc_range.size = size; |
| 190 intptr_t next_slot = pc_ranges->length(); | 180 intptr_t next_slot = pc_ranges->length(); |
| 191 pc_ranges->Add(pc_range); // pc_range gets added at 'next_slot'. | 181 pc_ranges->Add(pc_range); // pc_range gets added at 'next_slot'. |
| 192 codes.SetAt(next_slot, Code::Handle(func.code())); | 182 codes.SetAt(next_slot, code); |
| 193 } | 183 } |
| 194 | 184 |
| 195 | 185 |
| 196 RawCode* CodeIndexTable::LookupLargeCode(uword pc) const { | 186 RawCode* CodeIndexTable::LookupLargeCode(uword pc) const { |
| 197 const Array& large_codes = Array::Handle(largecode_list_); | 187 const Array& large_codes = Array::Handle(largecode_list_); |
| 198 return LookupCodeFromList(largecode_pc_ranges_, | 188 return LookupCodeFromList(largecode_pc_ranges_, |
| 199 large_codes, | 189 large_codes, |
| 200 pc, | 190 pc, |
| 201 kIsNotSorted); | 191 kIsNotSorted); |
| 202 } | 192 } |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 return -1; // Entry not found. | 248 return -1; // Entry not found. |
| 259 } | 249 } |
| 260 | 250 |
| 261 | 251 |
| 262 void CodeIndexTable::GrowCodeIndexTable(int new_size) { | 252 void CodeIndexTable::GrowCodeIndexTable(int new_size) { |
| 263 code_pages_->Resize(new_size); | 253 code_pages_->Resize(new_size); |
| 264 code_lists_ = Array::Grow(Array::Handle(code_lists_), new_size); | 254 code_lists_ = Array::Grow(Array::Handle(code_lists_), new_size); |
| 265 } | 255 } |
| 266 | 256 |
| 267 } // namespace dart | 257 } // namespace dart |
| OLD | NEW |