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
 |