12dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//===- DiagTool.h - Classes for defining diagtool tools -------------------===// 22dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// 32dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// The LLVM Compiler Infrastructure 42dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// 52dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// This file is distributed under the University of Illinois Open Source 62dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// License. See LICENSE.TXT for details. 72dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// 82dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//===----------------------------------------------------------------------===// 92dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// 102dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// This file implements the boilerplate for defining diagtool tools. 112dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// 122dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//===----------------------------------------------------------------------===// 132dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 142dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#ifndef DIAGTOOL_DIAGTOOL_H 152dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#define DIAGTOOL_DIAGTOOL_H 162dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 172dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include "llvm/ADT/StringRef.h" 182dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include "llvm/Support/raw_ostream.h" 1983f06e8223291cd8dabe94d0cbfd0553121d5a44Nick Lewycky#include "llvm/Support/ManagedStatic.h" 202dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include <string> 212dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 222dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 232dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremeneknamespace diagtool { 242dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 252dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass DiagTool { 262dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek const std::string cmd; 272dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek const std::string description; 282dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic: 292dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc); 302dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual ~DiagTool(); 312dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 322dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek llvm::StringRef getName() const { return cmd; } 332dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek llvm::StringRef getDescription() const { return description; } 342dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 352dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out) = 0; 362dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}; 372dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 382dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass DiagTools { 392dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek void *tools; 402dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic: 412dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek DiagTools(); 422dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek ~DiagTools(); 432dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 442dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek DiagTool *getTool(llvm::StringRef toolCmd); 452dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek void registerTool(DiagTool *tool); 462dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek void printCommands(llvm::raw_ostream &out); 472dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}; 482dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 4983f06e8223291cd8dabe94d0cbfd0553121d5a44Nick Lewyckyextern llvm::ManagedStatic<DiagTools> diagTools; 5083f06e8223291cd8dabe94d0cbfd0553121d5a44Nick Lewycky 512dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenektemplate <typename DIAGTOOL> 522dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass RegisterDiagTool { 532dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic: 5483f06e8223291cd8dabe94d0cbfd0553121d5a44Nick Lewycky RegisterDiagTool() { diagTools->registerTool(new DIAGTOOL()); } 552dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}; 562dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 572dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek} // end diagtool namespace 582dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 592dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#define DEF_DIAGTOOL(NAME, DESC, CLSNAME)\ 602dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremeneknamespace {\ 612dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass CLSNAME : public diagtool::DiagTool {\ 622dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic:\ 632dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek CLSNAME() : DiagTool(NAME, DESC) {}\ 642dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual ~CLSNAME() {}\ 652dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out);\ 662dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek};\ 672dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekdiagtool::RegisterDiagTool<CLSNAME> Register##CLSNAME;\ 682dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek} 692dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 702dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#endif 71