xref: /llvm-project/clang/tools/diagtool/DiagTool.h (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
1f88d335cSTed Kremenek //===- DiagTool.h - Classes for defining diagtool tools -------------------===//
2f88d335cSTed Kremenek //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f88d335cSTed Kremenek //
7f88d335cSTed Kremenek //===----------------------------------------------------------------------===//
8f88d335cSTed Kremenek //
9f88d335cSTed Kremenek // This file implements the boilerplate for defining diagtool tools.
10f88d335cSTed Kremenek //
11f88d335cSTed Kremenek //===----------------------------------------------------------------------===//
12f88d335cSTed Kremenek 
132f5db8b3SBenjamin Kramer #ifndef LLVM_CLANG_TOOLS_DIAGTOOL_DIAGTOOL_H
142f5db8b3SBenjamin Kramer #define LLVM_CLANG_TOOLS_DIAGTOOL_DIAGTOOL_H
15f88d335cSTed Kremenek 
16f88d335cSTed Kremenek #include "llvm/ADT/StringRef.h"
171c5f3fa1SNick Lewycky #include "llvm/Support/ManagedStatic.h"
18cc0694c8SChandler Carruth #include "llvm/Support/raw_ostream.h"
19f88d335cSTed Kremenek #include <string>
20f88d335cSTed Kremenek 
21f88d335cSTed Kremenek 
22f88d335cSTed Kremenek namespace diagtool {
23f88d335cSTed Kremenek 
24f88d335cSTed Kremenek class DiagTool {
25f88d335cSTed Kremenek   const std::string cmd;
26f88d335cSTed Kremenek   const std::string description;
27f88d335cSTed Kremenek public:
28f88d335cSTed Kremenek   DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc);
29f88d335cSTed Kremenek   virtual ~DiagTool();
30f88d335cSTed Kremenek 
getName()31f88d335cSTed Kremenek   llvm::StringRef getName() const { return cmd; }
getDescription()32f88d335cSTed Kremenek   llvm::StringRef getDescription() const { return description; }
33f88d335cSTed Kremenek 
34f88d335cSTed Kremenek   virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out) = 0;
35f88d335cSTed Kremenek };
36f88d335cSTed Kremenek 
37f88d335cSTed Kremenek class DiagTools {
38f88d335cSTed Kremenek   void *tools;
39f88d335cSTed Kremenek public:
40f88d335cSTed Kremenek   DiagTools();
41f88d335cSTed Kremenek   ~DiagTools();
42f88d335cSTed Kremenek 
43f88d335cSTed Kremenek   DiagTool *getTool(llvm::StringRef toolCmd);
44f88d335cSTed Kremenek   void registerTool(DiagTool *tool);
45f88d335cSTed Kremenek   void printCommands(llvm::raw_ostream &out);
46f88d335cSTed Kremenek };
47f88d335cSTed Kremenek 
481c5f3fa1SNick Lewycky extern llvm::ManagedStatic<DiagTools> diagTools;
49f88d335cSTed Kremenek 
50f88d335cSTed Kremenek template <typename DIAGTOOL>
51f88d335cSTed Kremenek class RegisterDiagTool {
52f88d335cSTed Kremenek public:
RegisterDiagTool()531c5f3fa1SNick Lewycky   RegisterDiagTool() { diagTools->registerTool(new DIAGTOOL()); }
54f88d335cSTed Kremenek };
55f88d335cSTed Kremenek 
56ab9db510SAlexander Kornienko } // end diagtool namespace
57f88d335cSTed Kremenek 
58f88d335cSTed Kremenek #define DEF_DIAGTOOL(NAME, DESC, CLSNAME)\
59f88d335cSTed Kremenek namespace {\
60f88d335cSTed Kremenek class CLSNAME : public diagtool::DiagTool {\
61f88d335cSTed Kremenek public:\
62f88d335cSTed Kremenek   CLSNAME() : DiagTool(NAME, DESC) {}\
63f88d335cSTed Kremenek   virtual ~CLSNAME() {}\
6436835568SCraig Topper   int run(unsigned argc, char *argv[], llvm::raw_ostream &out) override;\
65f88d335cSTed Kremenek };\
66f88d335cSTed Kremenek diagtool::RegisterDiagTool<CLSNAME> Register##CLSNAME;\
67f88d335cSTed Kremenek }
68f88d335cSTed Kremenek 
69f88d335cSTed Kremenek #endif
70