OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
233 , m_endOfStack(reinterpret_cast<intptr_t*>(getStackStart())) | 233 , m_endOfStack(reinterpret_cast<intptr_t*>(getStackStart())) |
234 , m_safePointScopeMarker(0) | 234 , m_safePointScopeMarker(0) |
235 , m_atSafePoint(false) | 235 , m_atSafePoint(false) |
236 , m_interruptors() | 236 , m_interruptors() |
237 , m_gcRequested(false) | 237 , m_gcRequested(false) |
238 , m_sweepRequested(0) | 238 , m_sweepRequested(0) |
239 , m_sweepInProgress(false) | 239 , m_sweepInProgress(false) |
240 , m_noAllocationCount(0) | 240 , m_noAllocationCount(0) |
241 , m_inGC(false) | 241 , m_inGC(false) |
242 , m_heapContainsCache(new HeapContainsCache()) | 242 , m_heapContainsCache(new HeapContainsCache()) |
243 #if defined(ADDRESS_SANITIZER) && !OS(WIN) | |
244 , m_asanFakeStack(__asan_get_current_fake_stack()) | |
245 #endif | |
243 { | 246 { |
244 ASSERT(!**s_threadSpecific); | 247 ASSERT(!**s_threadSpecific); |
245 **s_threadSpecific = this; | 248 **s_threadSpecific = this; |
246 | 249 |
247 m_persistents = new PersistentAnchor(); | 250 m_persistents = new PersistentAnchor(); |
248 m_stats.clear(); | 251 m_stats.clear(); |
249 m_statsAfterLastGC.clear(); | 252 m_statsAfterLastGC.clear(); |
250 // First allocate the general heap, second iterate through to | 253 // First allocate the general heap, second iterate through to |
251 // allocate the type specific heaps | 254 // allocate the type specific heaps |
252 m_heaps[GeneralHeap] = new ThreadHeap<FinalizedHeapObjectHeader>(this); | 255 m_heaps[GeneralHeap] = new ThreadHeap<FinalizedHeapObjectHeader>(this); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
300 delete state; | 303 delete state; |
301 } | 304 } |
302 | 305 |
303 void ThreadState::visitRoots(Visitor* visitor) | 306 void ThreadState::visitRoots(Visitor* visitor) |
304 { | 307 { |
305 AttachedThreadStateSet& threads = attachedThreads(); | 308 AttachedThreadStateSet& threads = attachedThreads(); |
306 for (AttachedThreadStateSet::iterator it = threads.begin(), end = threads.en d(); it != end; ++it) | 309 for (AttachedThreadStateSet::iterator it = threads.begin(), end = threads.en d(); it != end; ++it) |
307 (*it)->trace(visitor); | 310 (*it)->trace(visitor); |
308 } | 311 } |
309 | 312 |
313 #if defined(ADDRESS_SANITIZER) && !OS(WIN) | |
314 NO_SANITIZE_ADDRESS | |
kcc1
2014/02/06 13:44:06
I'd put #ifdef inside the function body, this will
Mads Ager (chromium)
2014/02/06 14:15:17
Good idea. Done!
| |
315 void ThreadState::visitAsanFakeStackForPointer(Visitor* visitor, Address ptr) | |
316 { | |
317 Address* start = reinterpret_cast<Address*>(m_startOfStack); | |
318 Address* end = reinterpret_cast<Address*>(m_endOfStack); | |
319 Address* fakeFrameStart = 0; | |
320 Address* fakeFrameEnd = 0; | |
321 Address* maybeFakeFrame = reinterpret_cast<Address*>(ptr); | |
322 Address* realFrameForFakeFrame = | |
323 reinterpret_cast<Address*>( | |
324 __asan_addr_is_in_fake_stack( | |
325 m_asanFakeStack, maybeFakeFrame, | |
326 reinterpret_cast<void**>(&fakeFrameStart), | |
327 reinterpret_cast<void**>(&fakeFrameEnd))); | |
328 if (realFrameForFakeFrame) { | |
329 // This is a fake frame from the asan fake stack. | |
330 if (realFrameForFakeFrame > end && start > realFrameForFakeFrame) { | |
331 // The real stack address for the asan fake frame is | |
332 // within the stack range that we need to scan so we need | |
333 // to visit the values in the fake frame. | |
334 for (Address* p = fakeFrameStart; p < fakeFrameEnd; p++) | |
335 Heap::checkAndMarkPointer(visitor, *p); | |
336 } | |
337 } | |
338 } | |
339 #endif | |
340 | |
310 NO_SANITIZE_ADDRESS | 341 NO_SANITIZE_ADDRESS |
311 void ThreadState::visitStack(Visitor* visitor) | 342 void ThreadState::visitStack(Visitor* visitor) |
312 { | 343 { |
313 Address* end = reinterpret_cast<Address*>(m_startOfStack); | 344 Address* end = reinterpret_cast<Address*>(m_startOfStack); |
314 for (Address* current = reinterpret_cast<Address*>(m_endOfStack); current < end; ++current) { | 345 for (Address* current = reinterpret_cast<Address*>(m_endOfStack); current < end; ++current) { |
315 Heap::checkAndMarkPointer(visitor, *current); | 346 Heap::checkAndMarkPointer(visitor, *current); |
347 #if defined(ADDRESS_SANITIZER) && !OS(WIN) | |
348 visitAsanFakeStackForPointer(visitor, *current); | |
349 #endif | |
316 } | 350 } |
317 | 351 |
318 for (Vector<Address>::iterator it = m_safePointStackCopy.begin(); it != m_sa fePointStackCopy.end(); ++it) | 352 for (Vector<Address>::iterator it = m_safePointStackCopy.begin(); it != m_sa fePointStackCopy.end(); ++it) { |
319 Heap::checkAndMarkPointer(visitor, *it); | 353 Heap::checkAndMarkPointer(visitor, *it); |
354 #if defined(ADDRESS_SANITIZER) && !OS(WIN) | |
355 visitAsanFakeStackForPointer(visitor, *it); | |
356 #endif | |
357 } | |
320 } | 358 } |
321 | 359 |
322 void ThreadState::visitPersistents(Visitor* visitor) | 360 void ThreadState::visitPersistents(Visitor* visitor) |
323 { | 361 { |
324 for (PersistentNode* current = m_persistents->m_next; current != m_persisten ts; current = current->m_next) { | 362 for (PersistentNode* current = m_persistents->m_next; current != m_persisten ts; current = current->m_next) { |
325 current->trace(visitor); | 363 current->trace(visitor); |
326 } | 364 } |
327 } | 365 } |
328 | 366 |
329 void ThreadState::trace(Visitor* visitor) | 367 void ThreadState::trace(Visitor* visitor) |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 state->safePoint(HeapPointersOnStack); | 675 state->safePoint(HeapPointersOnStack); |
638 } | 676 } |
639 | 677 |
640 ThreadState::AttachedThreadStateSet& ThreadState::attachedThreads() | 678 ThreadState::AttachedThreadStateSet& ThreadState::attachedThreads() |
641 { | 679 { |
642 DEFINE_STATIC_LOCAL(AttachedThreadStateSet, threads, ()); | 680 DEFINE_STATIC_LOCAL(AttachedThreadStateSet, threads, ()); |
643 return threads; | 681 return threads; |
644 } | 682 } |
645 | 683 |
646 } | 684 } |
OLD | NEW |