71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- DiagTool.h - Classes for defining diagtool tools -------------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file implements the boilerplate for defining diagtool tools.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef DIAGTOOL_DIAGTOOL_H
 | |
| #define DIAGTOOL_DIAGTOOL_H
 | |
| 
 | |
| #include "llvm/ADT/StringRef.h"
 | |
| #include "llvm/Support/ManagedStatic.h"
 | |
| #include "llvm/Support/raw_ostream.h"
 | |
| #include <string>
 | |
| 
 | |
| 
 | |
| namespace diagtool {
 | |
| 
 | |
| class DiagTool {
 | |
|   const std::string cmd;
 | |
|   const std::string description;
 | |
| public:
 | |
|   DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc);
 | |
|   virtual ~DiagTool();
 | |
|   
 | |
|   llvm::StringRef getName() const { return cmd; }  
 | |
|   llvm::StringRef getDescription() const { return description; }  
 | |
| 
 | |
|   virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out) = 0;
 | |
| };
 | |
|   
 | |
| class DiagTools {
 | |
|   void *tools;
 | |
| public:
 | |
|   DiagTools();
 | |
|   ~DiagTools();
 | |
|   
 | |
|   DiagTool *getTool(llvm::StringRef toolCmd);
 | |
|   void registerTool(DiagTool *tool);  
 | |
|   void printCommands(llvm::raw_ostream &out);  
 | |
| };
 | |
| 
 | |
| extern llvm::ManagedStatic<DiagTools> diagTools;
 | |
| 
 | |
| template <typename DIAGTOOL>
 | |
| class RegisterDiagTool {
 | |
| public:
 | |
|   RegisterDiagTool() { diagTools->registerTool(new DIAGTOOL()); }
 | |
| };
 | |
| 
 | |
| } // end diagtool namespace
 | |
| 
 | |
| #define DEF_DIAGTOOL(NAME, DESC, CLSNAME)\
 | |
| namespace {\
 | |
| class CLSNAME : public diagtool::DiagTool {\
 | |
| public:\
 | |
|   CLSNAME() : DiagTool(NAME, DESC) {}\
 | |
|   virtual ~CLSNAME() {}\
 | |
|   virtual int run(unsigned argc, char *argv[], llvm::raw_ostream &out);\
 | |
| };\
 | |
| diagtool::RegisterDiagTool<CLSNAME> Register##CLSNAME;\
 | |
| }
 | |
| 
 | |
| #endif
 | 
