Home | History | Annotate | Download | only in diagtool
      1 //===- DiagTool.h - Classes for defining diagtool tools -------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the boilerplate for defining diagtool tools.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_TOOLS_DIAGTOOL_DIAGTOOL_H
     15 #define LLVM_CLANG_TOOLS_DIAGTOOL_DIAGTOOL_H
     16 
     17 #include "llvm/ADT/StringRef.h"
     18 #include "llvm/Support/ManagedStatic.h"
     19 #include "llvm/Support/raw_ostream.h"
     20 #include <string>
     21 
     22 
     23 namespace diagtool {
     24 
     25 class DiagTool {
     26   const std::string cmd;
     27   const std::string description;
     28 public:
     29   DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc);
     30   virtual ~DiagTool();
     31 
     32   llvm::StringRef getName() const { return cmd; }
     33   llvm::StringRef getDescription() const { return description; }
     34 
     35   virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out) = 0;
     36 };
     37 
     38 class DiagTools {
     39   void *tools;
     40 public:
     41   DiagTools();
     42   ~DiagTools();
     43 
     44   DiagTool *getTool(llvm::StringRef toolCmd);
     45   void registerTool(DiagTool *tool);
     46   void printCommands(llvm::raw_ostream &out);
     47 };
     48 
     49 extern llvm::ManagedStatic<DiagTools> diagTools;
     50 
     51 template <typename DIAGTOOL>
     52 class RegisterDiagTool {
     53 public:
     54   RegisterDiagTool() { diagTools->registerTool(new DIAGTOOL()); }
     55 };
     56 
     57 } // end diagtool namespace
     58 
     59 #define DEF_DIAGTOOL(NAME, DESC, CLSNAME)\
     60 namespace {\
     61 class CLSNAME : public diagtool::DiagTool {\
     62 public:\
     63   CLSNAME() : DiagTool(NAME, DESC) {}\
     64   virtual ~CLSNAME() {}\
     65   int run(unsigned argc, char *argv[], llvm::raw_ostream &out) override;\
     66 };\
     67 diagtool::RegisterDiagTool<CLSNAME> Register##CLSNAME;\
     68 }
     69 
     70 #endif
     71