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