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

Side by Side Diff: Source/heap/Heap.h

Issue 181323005: Make HeapObjectHeader and FinalizedHeapObjectHeader visible in the shared object for newer GCC. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Added windows fix Created 6 years, 9 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 private: 214 private:
215 friend class Heap; 215 friend class Heap;
216 friend class ThreadHeap<Header>; 216 friend class ThreadHeap<Header>;
217 217
218 LargeHeapObject<Header>* m_next; 218 LargeHeapObject<Header>* m_next;
219 }; 219 };
220 220
221 // The BasicObjectHeader is the minimal object header. It is used when 221 // The BasicObjectHeader is the minimal object header. It is used when
222 // encountering heap space of size allocationGranularity to mark it as 222 // encountering heap space of size allocationGranularity to mark it as
223 // as freelist entry. 223 // as freelist entry.
224 class BasicObjectHeader { 224 class HEAP_EXPORT BasicObjectHeader {
225 public: 225 public:
226 NO_SANITIZE_ADDRESS 226 NO_SANITIZE_ADDRESS
227 explicit BasicObjectHeader(size_t encodedSize) 227 explicit BasicObjectHeader(size_t encodedSize)
228 : m_size(encodedSize) { } 228 : m_size(encodedSize) { }
229 229
230 static size_t freeListEncodedSize(size_t size) { return size | freeListMask; } 230 static size_t freeListEncodedSize(size_t size) { return size | freeListMask; }
231 231
232 NO_SANITIZE_ADDRESS 232 NO_SANITIZE_ADDRESS
233 bool isFree() { return m_size & freeListMask; } 233 bool isFree() { return m_size & freeListMask; }
234 234
235 NO_SANITIZE_ADDRESS 235 NO_SANITIZE_ADDRESS
236 size_t size() const { return m_size & sizeMask; } 236 size_t size() const { return m_size & sizeMask; }
237 237
238 protected: 238 protected:
239 size_t m_size; 239 size_t m_size;
240 }; 240 };
241 241
242 // Our heap object layout is layered with the HeapObjectHeader closest 242 // Our heap object layout is layered with the HeapObjectHeader closest
243 // to the payload, this can be wrapped in a FinalizedObjectHeader if the 243 // to the payload, this can be wrapped in a FinalizedObjectHeader if the
244 // object is on the GeneralHeap and not on a specific TypedHeap. 244 // object is on the GeneralHeap and not on a specific TypedHeap.
245 // Finally if the object is a large object (> blinkPageSize/2) then it is 245 // Finally if the object is a large object (> blinkPageSize/2) then it is
246 // wrapped with a LargeObjectHeader. 246 // wrapped with a LargeObjectHeader.
247 // 247 //
248 // Object memory layout: 248 // Object memory layout:
249 // [ LargeObjectHeader | ] [ FinalizedObjectHeader | ] HeapObjectHeader | payloa d 249 // [ LargeObjectHeader | ] [ FinalizedObjectHeader | ] HeapObjectHeader | payloa d
250 // The [ ] notation denotes that the LargeObjectHeader and the FinalizedObjectHe ader 250 // The [ ] notation denotes that the LargeObjectHeader and the FinalizedObjectHe ader
251 // are independently optional. 251 // are independently optional.
252 class HeapObjectHeader : public BasicObjectHeader { 252 class HEAP_EXPORT HeapObjectHeader : public BasicObjectHeader {
253 public: 253 public:
254 NO_SANITIZE_ADDRESS 254 NO_SANITIZE_ADDRESS
255 explicit HeapObjectHeader(size_t encodedSize) 255 explicit HeapObjectHeader(size_t encodedSize)
256 : BasicObjectHeader(encodedSize) 256 : BasicObjectHeader(encodedSize)
257 #ifndef NDEBUG 257 #ifndef NDEBUG
258 , m_magic(magic) 258 , m_magic(magic)
259 #endif 259 #endif
260 { } 260 { }
261 261
262 NO_SANITIZE_ADDRESS 262 NO_SANITIZE_ADDRESS
(...skipping 17 matching lines...) Expand all
280 inline void setDebugMark(); 280 inline void setDebugMark();
281 inline void clearDebugMark(); 281 inline void clearDebugMark();
282 inline bool hasDebugMark() const; 282 inline bool hasDebugMark() const;
283 283
284 // Zap magic number with a new magic number that means there was once an 284 // Zap magic number with a new magic number that means there was once an
285 // object allocated here, but it was freed because nobody marked it during 285 // object allocated here, but it was freed because nobody marked it during
286 // GC. 286 // GC.
287 void zapMagic(); 287 void zapMagic();
288 288
289 static void finalize(const GCInfo*, Address, size_t); 289 static void finalize(const GCInfo*, Address, size_t);
290 HEAP_EXPORT static HeapObjectHeader* fromPayload(const void*); 290 static HeapObjectHeader* fromPayload(const void*);
291 291
292 static const intptr_t magic = 0xc0de247; 292 static const intptr_t magic = 0xc0de247;
293 static const intptr_t zappedMagic = 0xC0DEdead; 293 static const intptr_t zappedMagic = 0xC0DEdead;
294 // The zap value for vtables should be < 4K to ensure it cannot be 294 // The zap value for vtables should be < 4K to ensure it cannot be
295 // used for dispatch. 295 // used for dispatch.
296 static const intptr_t zappedVTable = 0xd0d; 296 static const intptr_t zappedVTable = 0xd0d;
297 297
298 private: 298 private:
299 #ifndef NDEBUG 299 #ifndef NDEBUG
300 intptr_t m_magic; 300 intptr_t m_magic;
301 #endif 301 #endif
302 }; 302 };
303 303
304 const size_t objectHeaderSize = sizeof(HeapObjectHeader); 304 const size_t objectHeaderSize = sizeof(HeapObjectHeader);
305 305
306 // Each object on the GeneralHeap needs to carry a pointer to its 306 // Each object on the GeneralHeap needs to carry a pointer to its
307 // own GCInfo structure for tracing and potential finalization. 307 // own GCInfo structure for tracing and potential finalization.
308 class FinalizedHeapObjectHeader : public HeapObjectHeader { 308 class HEAP_EXPORT FinalizedHeapObjectHeader : public HeapObjectHeader {
309 public: 309 public:
310 NO_SANITIZE_ADDRESS 310 NO_SANITIZE_ADDRESS
311 FinalizedHeapObjectHeader(size_t encodedSize, const GCInfo* gcInfo) 311 FinalizedHeapObjectHeader(size_t encodedSize, const GCInfo* gcInfo)
312 : HeapObjectHeader(encodedSize) 312 : HeapObjectHeader(encodedSize)
313 , m_gcInfo(gcInfo) 313 , m_gcInfo(gcInfo)
314 { 314 {
315 } 315 }
316 316
317 inline Address payload(); 317 inline Address payload();
318 inline size_t payloadSize(); 318 inline size_t payloadSize();
319 319
320 NO_SANITIZE_ADDRESS 320 NO_SANITIZE_ADDRESS
321 const GCInfo* gcInfo() { return m_gcInfo; } 321 const GCInfo* gcInfo() { return m_gcInfo; }
322 322
323 NO_SANITIZE_ADDRESS 323 NO_SANITIZE_ADDRESS
324 TraceCallback traceCallback() { return m_gcInfo->m_trace; } 324 TraceCallback traceCallback() { return m_gcInfo->m_trace; }
325 325
326 void finalize(); 326 void finalize();
327 327
328 NO_SANITIZE_ADDRESS 328 NO_SANITIZE_ADDRESS
329 inline bool hasFinalizer() { return m_gcInfo->hasFinalizer(); } 329 inline bool hasFinalizer() { return m_gcInfo->hasFinalizer(); }
330 330
331 HEAP_EXPORT static FinalizedHeapObjectHeader* fromPayload(const void*); 331 static FinalizedHeapObjectHeader* fromPayload(const void*);
332 332
333 private: 333 private:
334 const GCInfo* m_gcInfo; 334 const GCInfo* m_gcInfo;
335 }; 335 };
336 336
337 const size_t finalizedHeaderSize = sizeof(FinalizedHeapObjectHeader); 337 const size_t finalizedHeaderSize = sizeof(FinalizedHeapObjectHeader);
338 338
339 class FreeListEntry : public HeapObjectHeader { 339 class FreeListEntry : public HeapObjectHeader {
340 public: 340 public:
341 NO_SANITIZE_ADDRESS 341 NO_SANITIZE_ADDRESS
(...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 // to export. This forces it to export all the methods from ThreadHeap. 1682 // to export. This forces it to export all the methods from ThreadHeap.
1683 template<> void ThreadHeap<FinalizedHeapObjectHeader>::addPageToHeap(const GCInf o*); 1683 template<> void ThreadHeap<FinalizedHeapObjectHeader>::addPageToHeap(const GCInf o*);
1684 template<> void ThreadHeap<HeapObjectHeader>::addPageToHeap(const GCInfo*); 1684 template<> void ThreadHeap<HeapObjectHeader>::addPageToHeap(const GCInfo*);
1685 extern template class HEAP_EXPORT ThreadHeap<FinalizedHeapObjectHeader>; 1685 extern template class HEAP_EXPORT ThreadHeap<FinalizedHeapObjectHeader>;
1686 extern template class HEAP_EXPORT ThreadHeap<HeapObjectHeader>; 1686 extern template class HEAP_EXPORT ThreadHeap<HeapObjectHeader>;
1687 #endif 1687 #endif
1688 1688
1689 } 1689 }
1690 1690
1691 #endif // Heap_h 1691 #endif // Heap_h
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698