DiagTool.h revision 2dc651dfd4a4497c39b862e060200d6d58f5c4ec
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" 192dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include <string> 202dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 212dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 222dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremeneknamespace diagtool { 232dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 242dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass DiagTool { 252dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek const std::string cmd; 262dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek const std::string description; 272dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic: 282dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc); 292dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual ~DiagTool(); 302dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 312dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek llvm::StringRef getName() const { return cmd; } 322dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek llvm::StringRef getDescription() const { return description; } 332dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 342dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out) = 0; 352dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}; 362dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 372dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass DiagTools { 382dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek void *tools; 392dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic: 402dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek DiagTools(); 412dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek ~DiagTools(); 422dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 432dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek DiagTool *getTool(llvm::StringRef toolCmd); 442dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek void registerTool(DiagTool *tool); 452dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek void printCommands(llvm::raw_ostream &out); 462dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}; 472dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 482dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekextern DiagTools diagTools; 492dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 502dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenektemplate <typename DIAGTOOL> 512dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass RegisterDiagTool { 522dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic: 532dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek RegisterDiagTool() { diagTools.registerTool(new DIAGTOOL()); } 542dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}; 552dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 562dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek} // end diagtool namespace 572dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 582dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#define DEF_DIAGTOOL(NAME, DESC, CLSNAME)\ 592dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremeneknamespace {\ 602dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekclass CLSNAME : public diagtool::DiagTool {\ 612dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekpublic:\ 622dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek CLSNAME() : DiagTool(NAME, DESC) {}\ 632dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual ~CLSNAME() {}\ 642dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out);\ 652dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek};\ 662dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekdiagtool::RegisterDiagTool<CLSNAME> Register##CLSNAME;\ 672dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek} 682dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek 692dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#endif 70