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