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