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