Index: tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.h |
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.h b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b48a338a29a6a8dc626ad52d20e9a04f2a9a26b |
--- /dev/null |
+++ b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.h |
@@ -0,0 +1,192 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_ |
+#define TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_ |
+ |
+#include <string> |
+ |
+#include "BlinkGCPluginOptions.h" |
+#include "CheckFieldsVisitor.h" |
+#include "CheckFinalizerVisitor.h" |
+#include "CheckGCRootsVisitor.h" |
+#include "Config.h" |
+#include "clang/AST/AST.h" |
+#include "clang/AST/ASTConsumer.h" |
+#include "clang/Basic/Diagnostic.h" |
+#include "clang/Frontend/CompilerInstance.h" |
+ |
+class JsonWriter; |
+class RecordInfo; |
+ |
+// Main class containing checks for various invariants of the Blink |
+// garbage collection infrastructure. |
+class BlinkGCPluginConsumer : public clang::ASTConsumer { |
+ public: |
+ BlinkGCPluginConsumer(clang::CompilerInstance& instance, |
+ const BlinkGCPluginOptions& options); |
+ |
+ void HandleTranslationUnit(clang::ASTContext& context) override; |
+ |
+ void ParseFunctionTemplates(clang::TranslationUnitDecl* decl); |
+ |
+ // Main entry for checking a record declaration. |
+ void CheckRecord(RecordInfo* info); |
+ |
+ // Check a class-like object (eg, class, specialization, instantiation). |
+ void CheckClass(RecordInfo* info); |
+ |
+ clang::CXXRecordDecl* GetDependentTemplatedDecl(const clang::Type& type); |
+ |
+ void CheckPolymorphicClass(RecordInfo* info, clang::CXXMethodDecl* trace); |
+ |
+ clang::CXXRecordDecl* GetLeftMostBase(clang::CXXRecordDecl* left_most); |
+ |
+ bool DeclaresVirtualMethods(clang::CXXRecordDecl* decl); |
+ |
+ void CheckLeftMostDerived(RecordInfo* info); |
+ |
+ void CheckDispatch(RecordInfo* info); |
+ |
+ void CheckFinalization(RecordInfo* info); |
+ |
+ void CheckUnneededFinalization(RecordInfo* info); |
+ |
+ bool HasNonEmptyFinalizer(RecordInfo* info); |
+ |
+ // This is the main entry for tracing method definitions. |
+ void CheckTracingMethod(clang::CXXMethodDecl* method); |
+ |
+ // Determine what type of tracing method this is (dispatch or trace). |
+ void CheckTraceOrDispatchMethod(RecordInfo* parent, |
+ clang::CXXMethodDecl* method); |
+ |
+ // Check an actual trace method. |
+ void CheckTraceMethod(RecordInfo* parent, |
+ clang::CXXMethodDecl* trace, |
+ Config::TraceMethodType trace_type); |
+ |
+ void DumpClass(RecordInfo* info); |
+ |
+ // Adds either a warning or error, based on the current handling of -Werror. |
+ clang::DiagnosticsEngine::Level getErrorLevel(); |
+ |
+ std::string GetLocString(clang::SourceLocation loc); |
+ |
+ bool IsIgnored(RecordInfo* record); |
+ |
+ bool IsIgnoredClass(RecordInfo* info); |
+ |
+ bool InIgnoredDirectory(RecordInfo* info); |
+ |
+ bool InCheckedNamespace(RecordInfo* info); |
+ |
+ bool GetFilename(clang::SourceLocation loc, std::string* filename); |
+ |
+ void ReportClassMustLeftMostlyDeriveGC(RecordInfo* info); |
+ void ReportClassRequiresTraceMethod(RecordInfo* info); |
+ void ReportBaseRequiresTracing(RecordInfo* derived, |
+ clang::CXXMethodDecl* trace, |
+ clang::CXXRecordDecl* base); |
+ void ReportFieldsRequireTracing(RecordInfo* info, |
+ clang::CXXMethodDecl* trace); |
+ void ReportClassContainsInvalidFields(RecordInfo* info, |
+ CheckFieldsVisitor::Errors* errors); |
+ void ReportClassContainsGCRoots(RecordInfo* info, |
+ CheckGCRootsVisitor::Errors* errors); |
+ void ReportFinalizerAccessesFinalizedFields( |
+ clang::CXXMethodDecl* dtor, |
+ CheckFinalizerVisitor::Errors* fields); |
+ void ReportClassRequiresFinalization(RecordInfo* info); |
+ void ReportClassDoesNotRequireFinalization(RecordInfo* info); |
+ void ReportClassMustDeclareGCMixinTraceMethod(RecordInfo* info); |
+ void ReportOverriddenNonVirtualTrace(RecordInfo* info, |
+ clang::CXXMethodDecl* trace, |
+ clang::CXXMethodDecl* overridden); |
+ void ReportMissingTraceDispatchMethod(RecordInfo* info); |
+ void ReportMissingFinalizeDispatchMethod(RecordInfo* info); |
+ void ReportMissingDispatchMethod(RecordInfo* info, unsigned error); |
+ void ReportVirtualAndManualDispatch(RecordInfo* info, |
+ clang::CXXMethodDecl* dispatch); |
+ void ReportMissingTraceDispatch(const clang::FunctionDecl* dispatch, |
+ RecordInfo* receiver); |
+ void ReportMissingFinalizeDispatch(const clang::FunctionDecl* dispatch, |
+ RecordInfo* receiver); |
+ void ReportMissingDispatch(const clang::FunctionDecl* dispatch, |
+ RecordInfo* receiver, |
+ unsigned error); |
+ void ReportDerivesNonStackAllocated(RecordInfo* info, BasePoint* base); |
+ void ReportClassOverridesNew(RecordInfo* info, clang::CXXMethodDecl* newop); |
+ void ReportClassDeclaresPureVirtualTrace(RecordInfo* info, |
+ clang::CXXMethodDecl* trace); |
+ void ReportLeftMostBaseMustBePolymorphic(RecordInfo* derived, |
+ clang::CXXRecordDecl* base); |
+ void ReportBaseClassMustDeclareVirtualTrace(RecordInfo* derived, |
+ clang::CXXRecordDecl* base); |
+ void NoteManualDispatchMethod(clang::CXXMethodDecl* dispatch); |
+ void NoteBaseRequiresTracing(BasePoint* base); |
+ void NoteFieldRequiresTracing(RecordInfo* holder, clang::FieldDecl* field); |
+ void NotePartObjectContainsGCRoot(FieldPoint* point); |
+ void NoteFieldContainsGCRoot(FieldPoint* point); |
+ void NoteUserDeclaredDestructor(clang::CXXMethodDecl* dtor); |
+ void NoteUserDeclaredFinalizer(clang::CXXMethodDecl* dtor); |
+ void NoteBaseRequiresFinalization(BasePoint* base); |
+ void NoteField(FieldPoint* point, unsigned note); |
+ void NoteField(clang::FieldDecl* field, unsigned note); |
+ void NoteOverriddenNonVirtualTrace(clang::CXXMethodDecl* overridden); |
+ |
+ unsigned diag_class_must_left_mostly_derive_gc_; |
+ unsigned diag_class_requires_trace_method_; |
+ unsigned diag_base_requires_tracing_; |
+ unsigned diag_fields_require_tracing_; |
+ unsigned diag_class_contains_invalid_fields_; |
+ unsigned diag_class_contains_invalid_fields_warning_; |
+ unsigned diag_class_contains_gc_root_; |
+ unsigned diag_class_requires_finalization_; |
+ unsigned diag_class_does_not_require_finalization_; |
+ unsigned diag_finalizer_accesses_finalized_field_; |
+ unsigned diag_finalizer_eagerly_finalized_field_; |
+ unsigned diag_overridden_non_virtual_trace_; |
+ unsigned diag_missing_trace_dispatch_method_; |
+ unsigned diag_missing_finalize_dispatch_method_; |
+ unsigned diag_virtual_and_manual_dispatch_; |
+ unsigned diag_missing_trace_dispatch_; |
+ unsigned diag_missing_finalize_dispatch_; |
+ unsigned diag_derives_non_stack_allocated_; |
+ unsigned diag_class_overrides_new_; |
+ unsigned diag_class_declares_pure_virtual_trace_; |
+ unsigned diag_left_most_base_must_be_polymorphic_; |
+ unsigned diag_base_class_must_declare_virtual_trace_; |
+ unsigned diag_class_must_declare_gc_mixin_trace_method_; |
+ |
+ unsigned diag_base_requires_tracing_note_; |
+ unsigned diag_field_requires_tracing_note_; |
+ unsigned diag_raw_ptr_to_gc_managed_class_note_; |
+ unsigned diag_ref_ptr_to_gc_managed_class_note_; |
+ unsigned diag_reference_ptr_to_gc_managed_class_note_; |
+ unsigned diag_own_ptr_to_gc_managed_class_note_; |
+ unsigned diag_member_to_gc_unmanaged_class_note_; |
+ unsigned diag_stack_allocated_field_note_; |
+ unsigned diag_member_in_unmanaged_class_note_; |
+ unsigned diag_part_object_to_gc_derived_class_note_; |
+ unsigned diag_part_object_contains_gc_root_note_; |
+ unsigned diag_field_contains_gc_root_note_; |
+ unsigned diag_finalized_field_note_; |
+ unsigned diag_eagerly_finalized_field_note_; |
+ unsigned diag_user_declared_destructor_note_; |
+ unsigned diag_user_declared_finalizer_note_; |
+ unsigned diag_base_requires_finalization_note_; |
+ unsigned diag_field_requires_finalization_note_; |
+ unsigned diag_overridden_non_virtual_trace_note_; |
+ unsigned diag_manual_dispatch_method_note_; |
+ |
+ clang::CompilerInstance& instance_; |
+ clang::DiagnosticsEngine& diagnostic_; |
+ BlinkGCPluginOptions options_; |
+ RecordCache cache_; |
+ JsonWriter* json_; |
+}; |
+ |
+ |
+#endif // TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_ |