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