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

Side by Side Diff: tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp

Issue 2060553002: GC plugin: improve error reporting when tracing illegal fields. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: robustify namespace equality checking instead Created 4 years, 6 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 | « tools/clang/blink_gc_plugin/DiagnosticsReporter.h ('k') | tools/clang/blink_gc_plugin/Edge.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #include "DiagnosticsReporter.h" 5 #include "DiagnosticsReporter.h"
6 6
7 using namespace clang; 7 using namespace clang;
8 8
9 namespace { 9 namespace {
10 10
11 const char kClassMustLeftMostlyDeriveGC[] = 11 const char kClassMustLeftMostlyDeriveGC[] =
12 "[blink-gc] Class %0 must derive its GC base in the left-most position."; 12 "[blink-gc] Class %0 must derive its GC base in the left-most position.";
13 13
14 const char kClassRequiresTraceMethod[] = 14 const char kClassRequiresTraceMethod[] =
15 "[blink-gc] Class %0 requires a trace method."; 15 "[blink-gc] Class %0 requires a trace method.";
16 16
17 const char kBaseRequiresTracing[] = 17 const char kBaseRequiresTracing[] =
18 "[blink-gc] Base class %0 of derived class %1 requires tracing."; 18 "[blink-gc] Base class %0 of derived class %1 requires tracing.";
19 19
20 const char kBaseRequiresTracingNote[] = 20 const char kBaseRequiresTracingNote[] =
21 "[blink-gc] Untraced base class %0 declared here:"; 21 "[blink-gc] Untraced base class %0 declared here:";
22 22
23 const char kFieldsRequireTracing[] = 23 const char kFieldsRequireTracing[] =
24 "[blink-gc] Class %0 has untraced fields that require tracing."; 24 "[blink-gc] Class %0 has untraced fields that require tracing.";
25 25
26 const char kFieldsImproperlyTraced[] =
27 "[blink-gc] Class %0 has untraced or not traceable fields.";
28
26 const char kFieldRequiresTracingNote[] = 29 const char kFieldRequiresTracingNote[] =
27 "[blink-gc] Untraced field %0 declared here:"; 30 "[blink-gc] Untraced field %0 declared here:";
28 31
32 const char kFieldShouldNotBeTracedNote[] =
33 "[blink-gc] Untraceable field %0 declared here:";
34
29 const char kClassContainsInvalidFields[] = 35 const char kClassContainsInvalidFields[] =
30 "[blink-gc] Class %0 contains invalid fields."; 36 "[blink-gc] Class %0 contains invalid fields.";
31 37
32 const char kClassContainsGCRoot[] = 38 const char kClassContainsGCRoot[] =
33 "[blink-gc] Class %0 contains GC root in field %1."; 39 "[blink-gc] Class %0 contains GC root in field %1.";
34 40
35 const char kClassRequiresFinalization[] = 41 const char kClassRequiresFinalization[] =
36 "[blink-gc] Class %0 requires finalization."; 42 "[blink-gc] Class %0 requires finalization.";
37 43
38 const char kClassDoesNotRequireFinalization[] = 44 const char kClassDoesNotRequireFinalization[] =
(...skipping 11 matching lines...) Expand all
50 const char kRefPtrToGCManagedClassNote[] = 56 const char kRefPtrToGCManagedClassNote[] =
51 "[blink-gc] RefPtr field %0 to a GC managed class declared here:"; 57 "[blink-gc] RefPtr field %0 to a GC managed class declared here:";
52 58
53 const char kReferencePtrToGCManagedClassNote[] = 59 const char kReferencePtrToGCManagedClassNote[] =
54 "[blink-gc] Reference pointer field %0 to a GC managed class" 60 "[blink-gc] Reference pointer field %0 to a GC managed class"
55 " declared here:"; 61 " declared here:";
56 62
57 const char kOwnPtrToGCManagedClassNote[] = 63 const char kOwnPtrToGCManagedClassNote[] =
58 "[blink-gc] OwnPtr field %0 to a GC managed class declared here:"; 64 "[blink-gc] OwnPtr field %0 to a GC managed class declared here:";
59 65
66 const char kUniquePtrToGCManagedClassNote[] =
67 "[blink-gc] std::unique_ptr field %0 to a GC managed class declared here:";
68
60 const char kMemberToGCUnmanagedClassNote[] = 69 const char kMemberToGCUnmanagedClassNote[] =
61 "[blink-gc] Member field %0 to non-GC managed class declared here:"; 70 "[blink-gc] Member field %0 to non-GC managed class declared here:";
62 71
63 const char kStackAllocatedFieldNote[] = 72 const char kStackAllocatedFieldNote[] =
64 "[blink-gc] Stack-allocated field %0 declared here:"; 73 "[blink-gc] Stack-allocated field %0 declared here:";
65 74
66 const char kMemberInUnmanagedClassNote[] = 75 const char kMemberInUnmanagedClassNote[] =
67 "[blink-gc] Member field %0 in unmanaged class declared here:"; 76 "[blink-gc] Member field %0 in unmanaged class declared here:";
68 77
69 const char kPartObjectToGCDerivedClassNote[] = 78 const char kPartObjectToGCDerivedClassNote[] =
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 { 164 {
156 // Register warning/error messages. 165 // Register warning/error messages.
157 diag_class_must_left_mostly_derive_gc_ = diagnostic_.getCustomDiagID( 166 diag_class_must_left_mostly_derive_gc_ = diagnostic_.getCustomDiagID(
158 getErrorLevel(), kClassMustLeftMostlyDeriveGC); 167 getErrorLevel(), kClassMustLeftMostlyDeriveGC);
159 diag_class_requires_trace_method_ = 168 diag_class_requires_trace_method_ =
160 diagnostic_.getCustomDiagID(getErrorLevel(), kClassRequiresTraceMethod); 169 diagnostic_.getCustomDiagID(getErrorLevel(), kClassRequiresTraceMethod);
161 diag_base_requires_tracing_ = 170 diag_base_requires_tracing_ =
162 diagnostic_.getCustomDiagID(getErrorLevel(), kBaseRequiresTracing); 171 diagnostic_.getCustomDiagID(getErrorLevel(), kBaseRequiresTracing);
163 diag_fields_require_tracing_ = 172 diag_fields_require_tracing_ =
164 diagnostic_.getCustomDiagID(getErrorLevel(), kFieldsRequireTracing); 173 diagnostic_.getCustomDiagID(getErrorLevel(), kFieldsRequireTracing);
174 diag_fields_improperly_traced_ =
175 diagnostic_.getCustomDiagID(getErrorLevel(), kFieldsImproperlyTraced);
165 diag_class_contains_invalid_fields_ = diagnostic_.getCustomDiagID( 176 diag_class_contains_invalid_fields_ = diagnostic_.getCustomDiagID(
166 getErrorLevel(), kClassContainsInvalidFields); 177 getErrorLevel(), kClassContainsInvalidFields);
167 diag_class_contains_gc_root_ = 178 diag_class_contains_gc_root_ =
168 diagnostic_.getCustomDiagID(getErrorLevel(), kClassContainsGCRoot); 179 diagnostic_.getCustomDiagID(getErrorLevel(), kClassContainsGCRoot);
169 diag_class_requires_finalization_ = diagnostic_.getCustomDiagID( 180 diag_class_requires_finalization_ = diagnostic_.getCustomDiagID(
170 getErrorLevel(), kClassRequiresFinalization); 181 getErrorLevel(), kClassRequiresFinalization);
171 diag_class_does_not_require_finalization_ = diagnostic_.getCustomDiagID( 182 diag_class_does_not_require_finalization_ = diagnostic_.getCustomDiagID(
172 DiagnosticsEngine::Warning, kClassDoesNotRequireFinalization); 183 DiagnosticsEngine::Warning, kClassDoesNotRequireFinalization);
173 diag_finalizer_accesses_finalized_field_ = diagnostic_.getCustomDiagID( 184 diag_finalizer_accesses_finalized_field_ = diagnostic_.getCustomDiagID(
174 getErrorLevel(), kFinalizerAccessesFinalizedField); 185 getErrorLevel(), kFinalizerAccessesFinalizedField);
(...skipping 20 matching lines...) Expand all
195 diag_left_most_base_must_be_polymorphic_ = diagnostic_.getCustomDiagID( 206 diag_left_most_base_must_be_polymorphic_ = diagnostic_.getCustomDiagID(
196 getErrorLevel(), kLeftMostBaseMustBePolymorphic); 207 getErrorLevel(), kLeftMostBaseMustBePolymorphic);
197 diag_base_class_must_declare_virtual_trace_ = diagnostic_.getCustomDiagID( 208 diag_base_class_must_declare_virtual_trace_ = diagnostic_.getCustomDiagID(
198 getErrorLevel(), kBaseClassMustDeclareVirtualTrace); 209 getErrorLevel(), kBaseClassMustDeclareVirtualTrace);
199 210
200 // Register note messages. 211 // Register note messages.
201 diag_base_requires_tracing_note_ = diagnostic_.getCustomDiagID( 212 diag_base_requires_tracing_note_ = diagnostic_.getCustomDiagID(
202 DiagnosticsEngine::Note, kBaseRequiresTracingNote); 213 DiagnosticsEngine::Note, kBaseRequiresTracingNote);
203 diag_field_requires_tracing_note_ = diagnostic_.getCustomDiagID( 214 diag_field_requires_tracing_note_ = diagnostic_.getCustomDiagID(
204 DiagnosticsEngine::Note, kFieldRequiresTracingNote); 215 DiagnosticsEngine::Note, kFieldRequiresTracingNote);
216 diag_field_should_not_be_traced_note_ = diagnostic_.getCustomDiagID(
217 DiagnosticsEngine::Note, kFieldShouldNotBeTracedNote);
205 diag_raw_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID( 218 diag_raw_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID(
206 DiagnosticsEngine::Note, kRawPtrToGCManagedClassNote); 219 DiagnosticsEngine::Note, kRawPtrToGCManagedClassNote);
207 diag_ref_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID( 220 diag_ref_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID(
208 DiagnosticsEngine::Note, kRefPtrToGCManagedClassNote); 221 DiagnosticsEngine::Note, kRefPtrToGCManagedClassNote);
209 diag_reference_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID( 222 diag_reference_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID(
210 DiagnosticsEngine::Note, kReferencePtrToGCManagedClassNote); 223 DiagnosticsEngine::Note, kReferencePtrToGCManagedClassNote);
211 diag_own_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID( 224 diag_own_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID(
212 DiagnosticsEngine::Note, kOwnPtrToGCManagedClassNote); 225 DiagnosticsEngine::Note, kOwnPtrToGCManagedClassNote);
226 diag_unique_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID(
227 DiagnosticsEngine::Note, kUniquePtrToGCManagedClassNote);
213 diag_member_to_gc_unmanaged_class_note_ = diagnostic_.getCustomDiagID( 228 diag_member_to_gc_unmanaged_class_note_ = diagnostic_.getCustomDiagID(
214 DiagnosticsEngine::Note, kMemberToGCUnmanagedClassNote); 229 DiagnosticsEngine::Note, kMemberToGCUnmanagedClassNote);
215 diag_stack_allocated_field_note_ = diagnostic_.getCustomDiagID( 230 diag_stack_allocated_field_note_ = diagnostic_.getCustomDiagID(
216 DiagnosticsEngine::Note, kStackAllocatedFieldNote); 231 DiagnosticsEngine::Note, kStackAllocatedFieldNote);
217 diag_member_in_unmanaged_class_note_ = diagnostic_.getCustomDiagID( 232 diag_member_in_unmanaged_class_note_ = diagnostic_.getCustomDiagID(
218 DiagnosticsEngine::Note, kMemberInUnmanagedClassNote); 233 DiagnosticsEngine::Note, kMemberInUnmanagedClassNote);
219 diag_part_object_to_gc_derived_class_note_ = diagnostic_.getCustomDiagID( 234 diag_part_object_to_gc_derived_class_note_ = diagnostic_.getCustomDiagID(
220 DiagnosticsEngine::Note, kPartObjectToGCDerivedClassNote); 235 DiagnosticsEngine::Note, kPartObjectToGCDerivedClassNote);
221 diag_part_object_contains_gc_root_note_ = diagnostic_.getCustomDiagID( 236 diag_part_object_contains_gc_root_note_ = diagnostic_.getCustomDiagID(
222 DiagnosticsEngine::Note, kPartObjectContainsGCRootNote); 237 DiagnosticsEngine::Note, kPartObjectContainsGCRootNote);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 } 287 }
273 288
274 void DiagnosticsReporter::BaseRequiresTracing( 289 void DiagnosticsReporter::BaseRequiresTracing(
275 RecordInfo* derived, 290 RecordInfo* derived,
276 CXXMethodDecl* trace, 291 CXXMethodDecl* trace,
277 CXXRecordDecl* base) { 292 CXXRecordDecl* base) {
278 ReportDiagnostic(trace->getLocStart(), diag_base_requires_tracing_) 293 ReportDiagnostic(trace->getLocStart(), diag_base_requires_tracing_)
279 << base << derived->record(); 294 << base << derived->record();
280 } 295 }
281 296
282 void DiagnosticsReporter::FieldsRequireTracing( 297 void DiagnosticsReporter::FieldsImproperlyTraced(
283 RecordInfo* info, 298 RecordInfo* info,
284 CXXMethodDecl* trace) { 299 CXXMethodDecl* trace) {
285 ReportDiagnostic(trace->getLocStart(), diag_fields_require_tracing_) 300 // Only mention untraceable in header diagnostic if they appear.
301 unsigned diag = diag_fields_require_tracing_;
302 for (auto& field : info->GetFields()) {
303 if (field.second.IsInproperlyTraced()) {
304 diag = diag_fields_improperly_traced_;
305 break;
306 }
307 }
308 ReportDiagnostic(trace->getLocStart(), diag)
286 << info->record(); 309 << info->record();
287 for (auto& field : info->GetFields()) 310 for (auto& field : info->GetFields()) {
288 if (!field.second.IsProperlyTraced()) 311 if (!field.second.IsProperlyTraced())
289 NoteFieldRequiresTracing(info, field.first); 312 NoteFieldRequiresTracing(info, field.first);
313 if (field.second.IsInproperlyTraced())
314 NoteFieldShouldNotBeTraced(info, field.first);
315 }
290 } 316 }
291 317
292 void DiagnosticsReporter::ClassContainsInvalidFields( 318 void DiagnosticsReporter::ClassContainsInvalidFields(
293 RecordInfo* info, 319 RecordInfo* info,
294 const CheckFieldsVisitor::Errors& errors) { 320 const CheckFieldsVisitor::Errors& errors) {
295 321
296 ReportDiagnostic(info->record()->getLocStart(), 322 ReportDiagnostic(info->record()->getLocStart(),
297 diag_class_contains_invalid_fields_) 323 diag_class_contains_invalid_fields_)
298 << info->record(); 324 << info->record();
299 325
300 for (auto& error : errors) { 326 for (auto& error : errors) {
301 unsigned note; 327 unsigned note;
302 if (error.second == CheckFieldsVisitor::kRawPtrToGCManaged) { 328 if (error.second == CheckFieldsVisitor::kRawPtrToGCManaged) {
303 note = diag_raw_ptr_to_gc_managed_class_note_; 329 note = diag_raw_ptr_to_gc_managed_class_note_;
304 } else if (error.second == CheckFieldsVisitor::kRefPtrToGCManaged) { 330 } else if (error.second == CheckFieldsVisitor::kRefPtrToGCManaged) {
305 note = diag_ref_ptr_to_gc_managed_class_note_; 331 note = diag_ref_ptr_to_gc_managed_class_note_;
306 } else if (error.second == CheckFieldsVisitor::kReferencePtrToGCManaged) { 332 } else if (error.second == CheckFieldsVisitor::kReferencePtrToGCManaged) {
307 note = diag_reference_ptr_to_gc_managed_class_note_; 333 note = diag_reference_ptr_to_gc_managed_class_note_;
308 } else if (error.second == CheckFieldsVisitor::kOwnPtrToGCManaged) { 334 } else if (error.second == CheckFieldsVisitor::kOwnPtrToGCManaged) {
309 note = diag_own_ptr_to_gc_managed_class_note_; 335 note = diag_own_ptr_to_gc_managed_class_note_;
336 } else if (error.second == CheckFieldsVisitor::kUniquePtrToGCManaged) {
337 note = diag_unique_ptr_to_gc_managed_class_note_;
310 } else if (error.second == CheckFieldsVisitor::kMemberToGCUnmanaged) { 338 } else if (error.second == CheckFieldsVisitor::kMemberToGCUnmanaged) {
311 note = diag_member_to_gc_unmanaged_class_note_; 339 note = diag_member_to_gc_unmanaged_class_note_;
312 } else if (error.second == CheckFieldsVisitor::kMemberInUnmanaged) { 340 } else if (error.second == CheckFieldsVisitor::kMemberInUnmanaged) {
313 note = diag_member_in_unmanaged_class_note_; 341 note = diag_member_in_unmanaged_class_note_;
314 } else if (error.second == CheckFieldsVisitor::kPtrFromHeapToStack) { 342 } else if (error.second == CheckFieldsVisitor::kPtrFromHeapToStack) {
315 note = diag_stack_allocated_field_note_; 343 note = diag_stack_allocated_field_note_;
316 } else if (error.second == CheckFieldsVisitor::kGCDerivedPartObject) { 344 } else if (error.second == CheckFieldsVisitor::kGCDerivedPartObject) {
317 note = diag_part_object_to_gc_derived_class_note_; 345 note = diag_part_object_to_gc_derived_class_note_;
318 } else { 346 } else {
319 assert(false && "Unknown field error"); 347 assert(false && "Unknown field error");
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 diag_base_requires_tracing_note_) 503 diag_base_requires_tracing_note_)
476 << base->info()->record(); 504 << base->info()->record();
477 } 505 }
478 506
479 void DiagnosticsReporter::NoteFieldRequiresTracing( 507 void DiagnosticsReporter::NoteFieldRequiresTracing(
480 RecordInfo* holder, 508 RecordInfo* holder,
481 FieldDecl* field) { 509 FieldDecl* field) {
482 NoteField(field, diag_field_requires_tracing_note_); 510 NoteField(field, diag_field_requires_tracing_note_);
483 } 511 }
484 512
513 void DiagnosticsReporter::NoteFieldShouldNotBeTraced(
514 RecordInfo* holder,
515 FieldDecl* field) {
516 NoteField(field, diag_field_should_not_be_traced_note_);
517 }
518
485 void DiagnosticsReporter::NotePartObjectContainsGCRoot(FieldPoint* point) { 519 void DiagnosticsReporter::NotePartObjectContainsGCRoot(FieldPoint* point) {
486 FieldDecl* field = point->field(); 520 FieldDecl* field = point->field();
487 ReportDiagnostic(field->getLocStart(), 521 ReportDiagnostic(field->getLocStart(),
488 diag_part_object_contains_gc_root_note_) 522 diag_part_object_contains_gc_root_note_)
489 << field << field->getParent(); 523 << field << field->getParent();
490 } 524 }
491 525
492 void DiagnosticsReporter::NoteFieldContainsGCRoot(FieldPoint* point) { 526 void DiagnosticsReporter::NoteFieldContainsGCRoot(FieldPoint* point) {
493 NoteField(point, diag_field_contains_gc_root_note_); 527 NoteField(point, diag_field_contains_gc_root_note_);
494 } 528 }
(...skipping 23 matching lines...) Expand all
518 void DiagnosticsReporter::NoteField(FieldDecl* field, unsigned note) { 552 void DiagnosticsReporter::NoteField(FieldDecl* field, unsigned note) {
519 ReportDiagnostic(field->getLocStart(), note) << field; 553 ReportDiagnostic(field->getLocStart(), note) << field;
520 } 554 }
521 555
522 void DiagnosticsReporter::NoteOverriddenNonVirtualTrace( 556 void DiagnosticsReporter::NoteOverriddenNonVirtualTrace(
523 CXXMethodDecl* overridden) { 557 CXXMethodDecl* overridden) {
524 ReportDiagnostic(overridden->getLocStart(), 558 ReportDiagnostic(overridden->getLocStart(),
525 diag_overridden_non_virtual_trace_note_) 559 diag_overridden_non_virtual_trace_note_)
526 << overridden; 560 << overridden;
527 } 561 }
OLDNEW
« no previous file with comments | « tools/clang/blink_gc_plugin/DiagnosticsReporter.h ('k') | tools/clang/blink_gc_plugin/Edge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698