1*67e74705SXin Li //===- DiagTool.cpp - Classes for defining diagtool tools -------------------===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li // 10*67e74705SXin Li // This file implements the boilerplate for defining diagtool tools. 11*67e74705SXin Li // 12*67e74705SXin Li //===----------------------------------------------------------------------===// 13*67e74705SXin Li 14*67e74705SXin Li #include "DiagTool.h" 15*67e74705SXin Li #include "llvm/ADT/SmallString.h" 16*67e74705SXin Li #include "llvm/ADT/StringMap.h" 17*67e74705SXin Li #include <vector> 18*67e74705SXin Li 19*67e74705SXin Li using namespace diagtool; 20*67e74705SXin Li DiagTool(llvm::StringRef toolCmd,llvm::StringRef toolDesc)21*67e74705SXin LiDiagTool::DiagTool(llvm::StringRef toolCmd, 22*67e74705SXin Li llvm::StringRef toolDesc) 23*67e74705SXin Li : cmd(toolCmd), description(toolDesc) {} 24*67e74705SXin Li ~DiagTool()25*67e74705SXin LiDiagTool::~DiagTool() {} 26*67e74705SXin Li 27*67e74705SXin Li typedef llvm::StringMap<DiagTool *> ToolMap; getTools(void * v)28*67e74705SXin Listatic inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); } 29*67e74705SXin Li DiagTools()30*67e74705SXin LiDiagTools::DiagTools() : tools(new ToolMap()) {} ~DiagTools()31*67e74705SXin LiDiagTools::~DiagTools() { delete getTools(tools); } 32*67e74705SXin Li getTool(llvm::StringRef toolCmd)33*67e74705SXin LiDiagTool *DiagTools::getTool(llvm::StringRef toolCmd) { 34*67e74705SXin Li ToolMap::iterator it = getTools(tools)->find(toolCmd); 35*67e74705SXin Li return (it == getTools(tools)->end()) ? nullptr : it->getValue(); 36*67e74705SXin Li } 37*67e74705SXin Li registerTool(DiagTool * tool)38*67e74705SXin Livoid DiagTools::registerTool(DiagTool *tool) { 39*67e74705SXin Li (*getTools(tools))[tool->getName()] = tool; 40*67e74705SXin Li } 41*67e74705SXin Li printCommands(llvm::raw_ostream & out)42*67e74705SXin Livoid DiagTools::printCommands(llvm::raw_ostream &out) { 43*67e74705SXin Li std::vector<llvm::StringRef> toolNames; 44*67e74705SXin Li unsigned maxName = 0; 45*67e74705SXin Li for (ToolMap::iterator it = getTools(tools)->begin(), 46*67e74705SXin Li ei = getTools(tools)->end(); it != ei; ++it) { 47*67e74705SXin Li toolNames.push_back(it->getKey()); 48*67e74705SXin Li unsigned len = it->getKey().size(); 49*67e74705SXin Li if (len > maxName) 50*67e74705SXin Li maxName = len; 51*67e74705SXin Li } 52*67e74705SXin Li std::sort(toolNames.begin(), toolNames.end()); 53*67e74705SXin Li 54*67e74705SXin Li for (std::vector<llvm::StringRef>::iterator it = toolNames.begin(), 55*67e74705SXin Li ei = toolNames.end(); it != ei; ++it) { 56*67e74705SXin Li 57*67e74705SXin Li out << " " << (*it); 58*67e74705SXin Li unsigned spaces = (maxName + 3) - (it->size()); 59*67e74705SXin Li for (unsigned i = 0; i < spaces; ++i) 60*67e74705SXin Li out << ' '; 61*67e74705SXin Li 62*67e74705SXin Li out << getTool(*it)->getDescription() << '\n'; 63*67e74705SXin Li } 64*67e74705SXin Li } 65*67e74705SXin Li 66*67e74705SXin Li namespace diagtool { 67*67e74705SXin Li llvm::ManagedStatic<DiagTools> diagTools; 68*67e74705SXin Li } 69