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

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

Issue 1841863002: Update monet. (Closed) Base URL: https://github.com/domokit/monet.git@master
Patch Set: Created 4 years, 8 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 private:
33 void ParseFunctionTemplates(clang::TranslationUnitDecl* decl);
34
35 // Main entry for checking a record declaration.
36 void CheckRecord(RecordInfo* info);
37
38 // Check a class-like object (eg, class, specialization, instantiation).
39 void CheckClass(RecordInfo* info);
40
41 clang::CXXRecordDecl* GetDependentTemplatedDecl(const clang::Type& type);
42
43 void CheckPolymorphicClass(RecordInfo* info, clang::CXXMethodDecl* trace);
44
45 clang::CXXRecordDecl* GetLeftMostBase(clang::CXXRecordDecl* left_most);
46
47 bool DeclaresVirtualMethods(clang::CXXRecordDecl* decl);
48
49 void CheckLeftMostDerived(RecordInfo* info);
50
51 void CheckDispatch(RecordInfo* info);
52
53 void CheckFinalization(RecordInfo* info);
54
55 void CheckUnneededFinalization(RecordInfo* info);
56
57 bool HasNonEmptyFinalizer(RecordInfo* info);
58
59 // This is the main entry for tracing method definitions.
60 void CheckTracingMethod(clang::CXXMethodDecl* method);
61
62 // Determine what type of tracing method this is (dispatch or trace).
63 void CheckTraceOrDispatchMethod(RecordInfo* parent,
64 clang::CXXMethodDecl* method);
65
66 // Check an actual trace method.
67 void CheckTraceMethod(RecordInfo* parent,
68 clang::CXXMethodDecl* trace,
69 Config::TraceMethodType trace_type);
70
71 void DumpClass(RecordInfo* info);
72
73 // Adds either a warning or error, based on the current handling of -Werror.
74 clang::DiagnosticsEngine::Level getErrorLevel();
75
76 std::string GetLocString(clang::SourceLocation loc);
77
78 bool IsIgnored(RecordInfo* record);
79
80 bool IsIgnoredClass(RecordInfo* info);
81
82 bool InIgnoredDirectory(RecordInfo* info);
83
84 bool InCheckedNamespace(RecordInfo* info);
85
86 bool GetFilename(clang::SourceLocation loc, std::string* filename);
87
88 clang::DiagnosticBuilder ReportDiagnostic(
89 clang::SourceLocation location,
90 unsigned diag_id);
91
92 void ReportClassMustLeftMostlyDeriveGC(RecordInfo* info);
93 void ReportClassRequiresTraceMethod(RecordInfo* info);
94 void ReportBaseRequiresTracing(RecordInfo* derived,
95 clang::CXXMethodDecl* trace,
96 clang::CXXRecordDecl* base);
97 void ReportFieldsRequireTracing(RecordInfo* info,
98 clang::CXXMethodDecl* trace);
99 void ReportClassContainsInvalidFields(RecordInfo* info,
100 CheckFieldsVisitor::Errors* errors);
101 void ReportClassContainsGCRoots(RecordInfo* info,
102 CheckGCRootsVisitor::Errors* errors);
103 void ReportFinalizerAccessesFinalizedFields(
104 clang::CXXMethodDecl* dtor,
105 CheckFinalizerVisitor::Errors* fields);
106 void ReportClassRequiresFinalization(RecordInfo* info);
107 void ReportClassDoesNotRequireFinalization(RecordInfo* info);
108 void ReportClassMustDeclareGCMixinTraceMethod(RecordInfo* info);
109 void ReportOverriddenNonVirtualTrace(RecordInfo* info,
110 clang::CXXMethodDecl* trace,
111 clang::CXXMethodDecl* overridden);
112 void ReportMissingTraceDispatchMethod(RecordInfo* info);
113 void ReportMissingFinalizeDispatchMethod(RecordInfo* info);
114 void ReportMissingDispatchMethod(RecordInfo* info, unsigned error);
115 void ReportVirtualAndManualDispatch(RecordInfo* info,
116 clang::CXXMethodDecl* dispatch);
117 void ReportMissingTraceDispatch(const clang::FunctionDecl* dispatch,
118 RecordInfo* receiver);
119 void ReportMissingFinalizeDispatch(const clang::FunctionDecl* dispatch,
120 RecordInfo* receiver);
121 void ReportMissingDispatch(const clang::FunctionDecl* dispatch,
122 RecordInfo* receiver,
123 unsigned error);
124 void ReportDerivesNonStackAllocated(RecordInfo* info, BasePoint* base);
125 void ReportClassOverridesNew(RecordInfo* info, clang::CXXMethodDecl* newop);
126 void ReportClassDeclaresPureVirtualTrace(RecordInfo* info,
127 clang::CXXMethodDecl* trace);
128 void ReportLeftMostBaseMustBePolymorphic(RecordInfo* derived,
129 clang::CXXRecordDecl* base);
130 void ReportBaseClassMustDeclareVirtualTrace(RecordInfo* derived,
131 clang::CXXRecordDecl* base);
132 void NoteManualDispatchMethod(clang::CXXMethodDecl* dispatch);
133 void NoteBaseRequiresTracing(BasePoint* base);
134 void NoteFieldRequiresTracing(RecordInfo* holder, clang::FieldDecl* field);
135 void NotePartObjectContainsGCRoot(FieldPoint* point);
136 void NoteFieldContainsGCRoot(FieldPoint* point);
137 void NoteUserDeclaredDestructor(clang::CXXMethodDecl* dtor);
138 void NoteUserDeclaredFinalizer(clang::CXXMethodDecl* dtor);
139 void NoteBaseRequiresFinalization(BasePoint* base);
140 void NoteField(FieldPoint* point, unsigned note);
141 void NoteField(clang::FieldDecl* field, unsigned note);
142 void NoteOverriddenNonVirtualTrace(clang::CXXMethodDecl* overridden);
143
144 unsigned diag_class_must_left_mostly_derive_gc_;
145 unsigned diag_class_requires_trace_method_;
146 unsigned diag_base_requires_tracing_;
147 unsigned diag_fields_require_tracing_;
148 unsigned diag_class_contains_invalid_fields_;
149 unsigned diag_class_contains_invalid_fields_warning_;
150 unsigned diag_class_contains_gc_root_;
151 unsigned diag_class_requires_finalization_;
152 unsigned diag_class_does_not_require_finalization_;
153 unsigned diag_finalizer_accesses_finalized_field_;
154 unsigned diag_finalizer_eagerly_finalized_field_;
155 unsigned diag_overridden_non_virtual_trace_;
156 unsigned diag_missing_trace_dispatch_method_;
157 unsigned diag_missing_finalize_dispatch_method_;
158 unsigned diag_virtual_and_manual_dispatch_;
159 unsigned diag_missing_trace_dispatch_;
160 unsigned diag_missing_finalize_dispatch_;
161 unsigned diag_derives_non_stack_allocated_;
162 unsigned diag_class_overrides_new_;
163 unsigned diag_class_declares_pure_virtual_trace_;
164 unsigned diag_left_most_base_must_be_polymorphic_;
165 unsigned diag_base_class_must_declare_virtual_trace_;
166 unsigned diag_class_must_declare_gc_mixin_trace_method_;
167
168 unsigned diag_base_requires_tracing_note_;
169 unsigned diag_field_requires_tracing_note_;
170 unsigned diag_raw_ptr_to_gc_managed_class_note_;
171 unsigned diag_ref_ptr_to_gc_managed_class_note_;
172 unsigned diag_reference_ptr_to_gc_managed_class_note_;
173 unsigned diag_own_ptr_to_gc_managed_class_note_;
174 unsigned diag_member_to_gc_unmanaged_class_note_;
175 unsigned diag_stack_allocated_field_note_;
176 unsigned diag_member_in_unmanaged_class_note_;
177 unsigned diag_part_object_to_gc_derived_class_note_;
178 unsigned diag_part_object_contains_gc_root_note_;
179 unsigned diag_field_contains_gc_root_note_;
180 unsigned diag_finalized_field_note_;
181 unsigned diag_eagerly_finalized_field_note_;
182 unsigned diag_user_declared_destructor_note_;
183 unsigned diag_user_declared_finalizer_note_;
184 unsigned diag_base_requires_finalization_note_;
185 unsigned diag_field_requires_finalization_note_;
186 unsigned diag_overridden_non_virtual_trace_note_;
187 unsigned diag_manual_dispatch_method_note_;
188
189 clang::CompilerInstance& instance_;
190 clang::DiagnosticsEngine& diagnostic_;
191 BlinkGCPluginOptions options_;
192 RecordCache cache_;
193 JsonWriter* json_;
194 };
195
196
197 #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