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