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

Side by Side Diff: tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.h

Issue 1385193002: Bisect clang Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 246985 Created 5 years, 2 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #ifndef TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_
6 #define TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_
7
8 #include <string>
9
10 #include "BlinkGCPluginOptions.h"
11 #include "CheckFieldsVisitor.h"
12 #include "CheckFinalizerVisitor.h"
13 #include "CheckGCRootsVisitor.h"
14 #include "Config.h"
15 #include "clang/AST/AST.h"
16 #include "clang/AST/ASTConsumer.h"
17 #include "clang/Basic/Diagnostic.h"
18 #include "clang/Frontend/CompilerInstance.h"
19
20 class JsonWriter;
21 class RecordInfo;
22
23 // Main class containing checks for various invariants of the Blink
24 // garbage collection infrastructure.
25 class BlinkGCPluginConsumer : public clang::ASTConsumer {
26 public:
27 BlinkGCPluginConsumer(clang::CompilerInstance& instance,
28 const BlinkGCPluginOptions& options);
29
30 void HandleTranslationUnit(clang::ASTContext& context) override;
31
32 void ParseFunctionTemplates(clang::TranslationUnitDecl* decl);
33
34 // Main entry for checking a record declaration.
35 void CheckRecord(RecordInfo* info);
36
37 // Check a class-like object (eg, class, specialization, instantiation).
38 void CheckClass(RecordInfo* info);
39
40 clang::CXXRecordDecl* GetDependentTemplatedDecl(const clang::Type& type);
41
42 void CheckPolymorphicClass(RecordInfo* info, clang::CXXMethodDecl* trace);
43
44 clang::CXXRecordDecl* GetLeftMostBase(clang::CXXRecordDecl* left_most);
45
46 bool DeclaresVirtualMethods(clang::CXXRecordDecl* decl);
47
48 void CheckLeftMostDerived(RecordInfo* info);
49
50 void CheckDispatch(RecordInfo* info);
51
52 void CheckFinalization(RecordInfo* info);
53
54 void CheckUnneededFinalization(RecordInfo* info);
55
56 bool HasNonEmptyFinalizer(RecordInfo* info);
57
58 // This is the main entry for tracing method definitions.
59 void CheckTracingMethod(clang::CXXMethodDecl* method);
60
61 // Determine what type of tracing method this is (dispatch or trace).
62 void CheckTraceOrDispatchMethod(RecordInfo* parent,
63 clang::CXXMethodDecl* method);
64
65 // Check an actual trace method.
66 void CheckTraceMethod(RecordInfo* parent,
67 clang::CXXMethodDecl* trace,
68 Config::TraceMethodType trace_type);
69
70 void DumpClass(RecordInfo* info);
71
72 // Adds either a warning or error, based on the current handling of -Werror.
73 clang::DiagnosticsEngine::Level getErrorLevel();
74
75 std::string GetLocString(clang::SourceLocation loc);
76
77 bool IsIgnored(RecordInfo* record);
78
79 bool IsIgnoredClass(RecordInfo* info);
80
81 bool InIgnoredDirectory(RecordInfo* info);
82
83 bool InCheckedNamespace(RecordInfo* info);
84
85 bool GetFilename(clang::SourceLocation loc, std::string* filename);
86
87 void ReportClassMustLeftMostlyDeriveGC(RecordInfo* info);
88 void ReportClassRequiresTraceMethod(RecordInfo* info);
89 void ReportBaseRequiresTracing(RecordInfo* derived,
90 clang::CXXMethodDecl* trace,
91 clang::CXXRecordDecl* base);
92 void ReportFieldsRequireTracing(RecordInfo* info,
93 clang::CXXMethodDecl* trace);
94 void ReportClassContainsInvalidFields(RecordInfo* info,
95 CheckFieldsVisitor::Errors* errors);
96 void ReportClassContainsGCRoots(RecordInfo* info,
97 CheckGCRootsVisitor::Errors* errors);
98 void ReportFinalizerAccessesFinalizedFields(
99 clang::CXXMethodDecl* dtor,
100 CheckFinalizerVisitor::Errors* fields);
101 void ReportClassRequiresFinalization(RecordInfo* info);
102 void ReportClassDoesNotRequireFinalization(RecordInfo* info);
103 void ReportClassMustDeclareGCMixinTraceMethod(RecordInfo* info);
104 void ReportOverriddenNonVirtualTrace(RecordInfo* info,
105 clang::CXXMethodDecl* trace,
106 clang::CXXMethodDecl* overridden);
107 void ReportMissingTraceDispatchMethod(RecordInfo* info);
108 void ReportMissingFinalizeDispatchMethod(RecordInfo* info);
109 void ReportMissingDispatchMethod(RecordInfo* info, unsigned error);
110 void ReportVirtualAndManualDispatch(RecordInfo* info,
111 clang::CXXMethodDecl* dispatch);
112 void ReportMissingTraceDispatch(const clang::FunctionDecl* dispatch,
113 RecordInfo* receiver);
114 void ReportMissingFinalizeDispatch(const clang::FunctionDecl* dispatch,
115 RecordInfo* receiver);
116 void ReportMissingDispatch(const clang::FunctionDecl* dispatch,
117 RecordInfo* receiver,
118 unsigned error);
119 void ReportDerivesNonStackAllocated(RecordInfo* info, BasePoint* base);
120 void ReportClassOverridesNew(RecordInfo* info, clang::CXXMethodDecl* newop);
121 void ReportClassDeclaresPureVirtualTrace(RecordInfo* info,
122 clang::CXXMethodDecl* trace);
123 void ReportLeftMostBaseMustBePolymorphic(RecordInfo* derived,
124 clang::CXXRecordDecl* base);
125 void ReportBaseClassMustDeclareVirtualTrace(RecordInfo* derived,
126 clang::CXXRecordDecl* base);
127 void NoteManualDispatchMethod(clang::CXXMethodDecl* dispatch);
128 void NoteBaseRequiresTracing(BasePoint* base);
129 void NoteFieldRequiresTracing(RecordInfo* holder, clang::FieldDecl* field);
130 void NotePartObjectContainsGCRoot(FieldPoint* point);
131 void NoteFieldContainsGCRoot(FieldPoint* point);
132 void NoteUserDeclaredDestructor(clang::CXXMethodDecl* dtor);
133 void NoteUserDeclaredFinalizer(clang::CXXMethodDecl* dtor);
134 void NoteBaseRequiresFinalization(BasePoint* base);
135 void NoteField(FieldPoint* point, unsigned note);
136 void NoteField(clang::FieldDecl* field, unsigned note);
137 void NoteOverriddenNonVirtualTrace(clang::CXXMethodDecl* overridden);
138
139 unsigned diag_class_must_left_mostly_derive_gc_;
140 unsigned diag_class_requires_trace_method_;
141 unsigned diag_base_requires_tracing_;
142 unsigned diag_fields_require_tracing_;
143 unsigned diag_class_contains_invalid_fields_;
144 unsigned diag_class_contains_invalid_fields_warning_;
145 unsigned diag_class_contains_gc_root_;
146 unsigned diag_class_requires_finalization_;
147 unsigned diag_class_does_not_require_finalization_;
148 unsigned diag_finalizer_accesses_finalized_field_;
149 unsigned diag_finalizer_eagerly_finalized_field_;
150 unsigned diag_overridden_non_virtual_trace_;
151 unsigned diag_missing_trace_dispatch_method_;
152 unsigned diag_missing_finalize_dispatch_method_;
153 unsigned diag_virtual_and_manual_dispatch_;
154 unsigned diag_missing_trace_dispatch_;
155 unsigned diag_missing_finalize_dispatch_;
156 unsigned diag_derives_non_stack_allocated_;
157 unsigned diag_class_overrides_new_;
158 unsigned diag_class_declares_pure_virtual_trace_;
159 unsigned diag_left_most_base_must_be_polymorphic_;
160 unsigned diag_base_class_must_declare_virtual_trace_;
161 unsigned diag_class_must_declare_gc_mixin_trace_method_;
162
163 unsigned diag_base_requires_tracing_note_;
164 unsigned diag_field_requires_tracing_note_;
165 unsigned diag_raw_ptr_to_gc_managed_class_note_;
166 unsigned diag_ref_ptr_to_gc_managed_class_note_;
167 unsigned diag_reference_ptr_to_gc_managed_class_note_;
168 unsigned diag_own_ptr_to_gc_managed_class_note_;
169 unsigned diag_member_to_gc_unmanaged_class_note_;
170 unsigned diag_stack_allocated_field_note_;
171 unsigned diag_member_in_unmanaged_class_note_;
172 unsigned diag_part_object_to_gc_derived_class_note_;
173 unsigned diag_part_object_contains_gc_root_note_;
174 unsigned diag_field_contains_gc_root_note_;
175 unsigned diag_finalized_field_note_;
176 unsigned diag_eagerly_finalized_field_note_;
177 unsigned diag_user_declared_destructor_note_;
178 unsigned diag_user_declared_finalizer_note_;
179 unsigned diag_base_requires_finalization_note_;
180 unsigned diag_field_requires_finalization_note_;
181 unsigned diag_overridden_non_virtual_trace_note_;
182 unsigned diag_manual_dispatch_method_note_;
183
184 clang::CompilerInstance& instance_;
185 clang::DiagnosticsEngine& diagnostic_;
186 BlinkGCPluginOptions options_;
187 RecordCache cache_;
188 JsonWriter* json_;
189 };
190
191
192 #endif // TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_
OLDNEW
« no previous file with comments | « tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp ('k') | tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698