OLD | NEW |
(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_ |
OLD | NEW |