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