OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 "platform/address_sanitizer.h" | 5 #include "platform/address_sanitizer.h" |
6 #include "platform/memory_sanitizer.h" | 6 #include "platform/memory_sanitizer.h" |
7 #include "platform/utils.h" | 7 #include "platform/utils.h" |
8 | 8 |
9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
10 #include "vm/atomic.h" | 10 #include "vm/atomic.h" |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 196 |
197 uword pc() { | 197 uword pc() { |
198 return pc_; | 198 return pc_; |
199 } | 199 } |
200 | 200 |
201 // Returns false on failure. | 201 // Returns false on failure. |
202 bool LocateReturnAddress(uword* return_address); | 202 bool LocateReturnAddress(uword* return_address); |
203 | 203 |
204 // Returns offset into code object. | 204 // Returns offset into code object. |
205 intptr_t RelativePC() { | 205 intptr_t RelativePC() { |
206 ASSERT(pc() >= code_.EntryPoint()); | 206 ASSERT(pc() >= code_.PayloadStart()); |
207 return static_cast<intptr_t>(pc() - code_.EntryPoint()); | 207 return static_cast<intptr_t>(pc() - code_.PayloadStart()); |
208 } | 208 } |
209 | 209 |
210 uint8_t* CodePointer(intptr_t offset) { | 210 uint8_t* CodePointer(intptr_t offset) { |
211 const intptr_t size = code_.Size(); | 211 const intptr_t size = code_.Size(); |
212 ASSERT(offset < size); | 212 ASSERT(offset < size); |
213 uint8_t* code_pointer = reinterpret_cast<uint8_t*>(code_.EntryPoint()); | 213 uint8_t* code_pointer = reinterpret_cast<uint8_t*>(code_.PayloadStart()); |
214 code_pointer += offset; | 214 code_pointer += offset; |
215 return code_pointer; | 215 return code_pointer; |
216 } | 216 } |
217 | 217 |
218 uword StackAt(intptr_t i) { | 218 uword StackAt(intptr_t i) { |
219 ASSERT(i >= 0); | 219 ASSERT(i >= 0); |
220 ASSERT(i < Sample::kStackBufferSizeInWords); | 220 ASSERT(i < Sample::kStackBufferSizeInWords); |
221 return stack_buffer_[i]; | 221 return stack_buffer_[i]; |
222 } | 222 } |
223 | 223 |
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1254 &counters_); | 1254 &counters_); |
1255 } | 1255 } |
1256 | 1256 |
1257 | 1257 |
1258 | 1258 |
1259 CodeDescriptor::CodeDescriptor(const Code& code) : code_(code) { | 1259 CodeDescriptor::CodeDescriptor(const Code& code) : code_(code) { |
1260 ASSERT(!code_.IsNull()); | 1260 ASSERT(!code_.IsNull()); |
1261 } | 1261 } |
1262 | 1262 |
1263 | 1263 |
1264 uword CodeDescriptor::Entry() const { | 1264 uword CodeDescriptor::Start() const { |
1265 return code_.EntryPoint(); | 1265 return code_.PayloadStart(); |
1266 } | 1266 } |
1267 | 1267 |
1268 | 1268 |
1269 uword CodeDescriptor::Size() const { | 1269 uword CodeDescriptor::Size() const { |
1270 return code_.Size(); | 1270 return code_.Size(); |
1271 } | 1271 } |
1272 | 1272 |
1273 | 1273 |
1274 int64_t CodeDescriptor::CompileTimestamp() const { | 1274 int64_t CodeDescriptor::CompileTimestamp() const { |
1275 return code_.compile_timestamp(); | 1275 return code_.compile_timestamp(); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 if (length() <= 1) { | 1330 if (length() <= 1) { |
1331 return; | 1331 return; |
1332 } | 1332 } |
1333 ASSERT(FindCode(0) == NULL); | 1333 ASSERT(FindCode(0) == NULL); |
1334 ASSERT(FindCode(~0) == NULL); | 1334 ASSERT(FindCode(~0) == NULL); |
1335 // Sanity check that we don't have duplicate entries and that the entries | 1335 // Sanity check that we don't have duplicate entries and that the entries |
1336 // are sorted. | 1336 // are sorted. |
1337 for (intptr_t i = 0; i < length() - 1; i++) { | 1337 for (intptr_t i = 0; i < length() - 1; i++) { |
1338 const CodeDescriptor* a = At(i); | 1338 const CodeDescriptor* a = At(i); |
1339 const CodeDescriptor* b = At(i + 1); | 1339 const CodeDescriptor* b = At(i + 1); |
1340 ASSERT(a->Entry() < b->Entry()); | 1340 ASSERT(a->Start() < b->Start()); |
1341 ASSERT(FindCode(a->Entry()) == a); | 1341 ASSERT(FindCode(a->Start()) == a); |
1342 ASSERT(FindCode(b->Entry()) == b); | 1342 ASSERT(FindCode(b->Start()) == b); |
1343 ASSERT(FindCode(a->Entry() + a->Size() - 1) == a); | 1343 ASSERT(FindCode(a->Start() + a->Size() - 1) == a); |
1344 ASSERT(FindCode(b->Entry() + b->Size() - 1) == b); | 1344 ASSERT(FindCode(b->Start() + b->Size() - 1) == b); |
1345 } | 1345 } |
1346 #endif | 1346 #endif |
1347 } | 1347 } |
1348 | 1348 |
1349 | 1349 |
1350 void CodeLookupTable::Add(const Code& code) { | 1350 void CodeLookupTable::Add(const Code& code) { |
1351 ASSERT(!code.IsNull()); | 1351 ASSERT(!code.IsNull()); |
1352 CodeDescriptor* cd = new CodeDescriptor(code); | 1352 CodeDescriptor* cd = new CodeDescriptor(code); |
1353 code_objects_.Add(cd); | 1353 code_objects_.Add(cd); |
1354 } | 1354 } |
1355 | 1355 |
1356 | 1356 |
1357 const CodeDescriptor* CodeLookupTable::FindCode(uword pc) const { | 1357 const CodeDescriptor* CodeLookupTable::FindCode(uword pc) const { |
1358 intptr_t first = 0; | 1358 intptr_t first = 0; |
1359 intptr_t count = length(); | 1359 intptr_t count = length(); |
1360 while (count > 0) { | 1360 while (count > 0) { |
1361 intptr_t current = first; | 1361 intptr_t current = first; |
1362 intptr_t step = count / 2; | 1362 intptr_t step = count / 2; |
1363 current += step; | 1363 current += step; |
1364 const CodeDescriptor* cd = At(current); | 1364 const CodeDescriptor* cd = At(current); |
1365 if (pc >= cd->Entry()) { | 1365 if (pc >= cd->Start()) { |
1366 first = ++current; | 1366 first = ++current; |
1367 count -= step + 1; | 1367 count -= step + 1; |
1368 } else { | 1368 } else { |
1369 count = step; | 1369 count = step; |
1370 } | 1370 } |
1371 } | 1371 } |
1372 // First points to the first code object whose entry is greater than PC. | 1372 // First points to the first code object whose entry is greater than PC. |
1373 // That means the code object we need to check is first - 1. | 1373 // That means the code object we need to check is first - 1. |
1374 if (first == 0) { | 1374 if (first == 0) { |
1375 return NULL; | 1375 return NULL; |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1581 | 1581 |
1582 | 1582 |
1583 ProcessedSampleBuffer::ProcessedSampleBuffer() | 1583 ProcessedSampleBuffer::ProcessedSampleBuffer() |
1584 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { | 1584 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { |
1585 ASSERT(code_lookup_table_ != NULL); | 1585 ASSERT(code_lookup_table_ != NULL); |
1586 } | 1586 } |
1587 | 1587 |
1588 #endif // !PRODUCT | 1588 #endif // !PRODUCT |
1589 | 1589 |
1590 } // namespace dart | 1590 } // namespace dart |
OLD | NEW |