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

Side by Side Diff: third_party/WebKit/Source/platform/heap/TraceTraits.h

Issue 2643403003: Disable g++ inlining of eager-tracing mark() method. (Closed)
Patch Set: Created 3 years, 11 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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef TraceTraits_h 5 #ifndef TraceTraits_h
6 #define TraceTraits_h 6 #define TraceTraits_h
7 7
8 #include "platform/heap/GCInfo.h" 8 #include "platform/heap/GCInfo.h"
9 #include "platform/heap/Heap.h" 9 #include "platform/heap/Heap.h"
10 #include "platform/heap/InlinedGlobalMarkingVisitor.h" 10 #include "platform/heap/InlinedGlobalMarkingVisitor.h"
(...skipping 21 matching lines...) Expand all
32 class Member; 32 class Member;
33 template <typename T> 33 template <typename T>
34 class TraceEagerlyTrait; 34 class TraceEagerlyTrait;
35 template <typename T> 35 template <typename T>
36 class TraceTrait; 36 class TraceTrait;
37 template <typename T> 37 template <typename T>
38 class WeakMember; 38 class WeakMember;
39 template <typename T> 39 template <typename T>
40 class WeakPersistent; 40 class WeakPersistent;
41 41
42 // "g++ -Os" reasonably considers the mark() eager-tracing specialization
43 // as an inlinable method. Its optimization pipeline will however trigger
44 // unconditional uses of that inlining inside trace() methods, i.e., without
45 // consideration for resulting code size, so one for each use of
46 // "visitor->trace(..)". This results in an unwanted amount of extra code
47 // across all trace methods. Address the issue indirectly by turning off
48 // inlining for the method. See crbug.com/681991 for further details.
49 //
50 // TODO(sof): revisit with later g++ versions, or when g++ is no
51 // longer used for production builds.
52 #if !defined(__clang__) && defined(__GNUC__)
53 #define NOINLINE_GXX_ONLY NOINLINE
54 #else
55 #define NOINLINE_GXX_ONLY
56 #endif
57
42 template <typename T, bool = NeedsAdjustAndMark<T>::value> 58 template <typename T, bool = NeedsAdjustAndMark<T>::value>
43 class AdjustAndMarkTrait; 59 class AdjustAndMarkTrait;
44 60
45 template <typename T> 61 template <typename T>
46 class AdjustAndMarkTrait<T, false> { 62 class AdjustAndMarkTrait<T, false> {
47 STATIC_ONLY(AdjustAndMarkTrait); 63 STATIC_ONLY(AdjustAndMarkTrait);
48 64
49 public: 65 public:
50 template <typename VisitorDispatcher> 66 template <typename VisitorDispatcher>
51 static void mark(VisitorDispatcher visitor, const T* t) { 67 static NOINLINE_GXX_ONLY void mark(VisitorDispatcher visitor, const T* t) {
52 #if DCHECK_IS_ON() 68 #if DCHECK_IS_ON()
53 assertObjectHasGCInfo(const_cast<T*>(t), GCInfoTrait<T>::index()); 69 assertObjectHasGCInfo(const_cast<T*>(t), GCInfoTrait<T>::index());
54 #endif 70 #endif
55 // Default mark method of the trait just calls the two-argument mark 71 // Default mark method of the trait just calls the two-argument mark
56 // method on the visitor. The second argument is the static trace method 72 // method on the visitor. The second argument is the static trace method
57 // of the trait, which by default calls the instance method 73 // of the trait, which by default calls the instance method
58 // trace(Visitor*) on the object. 74 // trace(Visitor*) on the object.
59 // 75 //
60 // If the trait allows it, invoke the trace callback right here on the 76 // If the trait allows it, invoke the trace callback right here on the
61 // not-yet-marked object. 77 // not-yet-marked object.
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 // since iterating over the hash table backing will find the whole 807 // since iterating over the hash table backing will find the whole
792 // chain. 808 // chain.
793 visitor->markNoTracing(node); 809 visitor->markNoTracing(node);
794 return false; 810 return false;
795 } 811 }
796 }; 812 };
797 813
798 } // namespace WTF 814 } // namespace WTF
799 815
800 #endif 816 #endif
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