• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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 // This clang plugin checks various invariants of the Blink garbage
6 // collection infrastructure.
7 //
8 // Errors are described at:
9 // http://www.chromium.org/developers/blink-gc-plugin-errors
10 
11 #include "BlinkGCPluginConsumer.h"
12 #include "BlinkGCPluginOptions.h"
13 #include "Config.h"
14 
15 #include "clang/Frontend/CompilerInstance.h"
16 #include "clang/Frontend/FrontendPluginRegistry.h"
17 
18 using namespace clang;
19 
20 class BlinkGCPluginAction : public PluginASTAction {
21  public:
BlinkGCPluginAction()22   BlinkGCPluginAction() {}
23 
24  protected:
25   // Overridden from PluginASTAction:
CreateASTConsumer(CompilerInstance & instance,llvm::StringRef ref)26   virtual std::unique_ptr<ASTConsumer> CreateASTConsumer(
27       CompilerInstance& instance,
28       llvm::StringRef ref) {
29     return llvm::make_unique<BlinkGCPluginConsumer>(instance, options_);
30   }
31 
ParseArgs(const CompilerInstance &,const std::vector<std::string> & args)32   virtual bool ParseArgs(const CompilerInstance&,
33                          const std::vector<std::string>& args) {
34     for (const auto& arg : args) {
35       if (arg == "dump-graph") {
36         options_.dump_graph = true;
37       } else if (arg == "warn-unneeded-finalizer") {
38         options_.warn_unneeded_finalizer = true;
39       } else {
40         llvm::errs() << "Unknown blink-gc-plugin argument: " << arg << "\n";
41         return false;
42       }
43     }
44     return true;
45   }
46 
47  private:
48   BlinkGCPluginOptions options_;
49 };
50 
51 static FrontendPluginRegistry::Add<BlinkGCPluginAction> X(
52     "blink-gc-plugin",
53     "Check Blink GC invariants");
54