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 <vector> 16 17 using namespace diagtool; 18 19 DiagTool::DiagTool(llvm::StringRef toolCmd, 20 llvm::StringRef toolDesc) 21 : cmd(toolCmd), description(toolDesc) {} 22 23 DiagTool::~DiagTool() {} 24 25 typedef llvm::StringMap<DiagTool *> ToolMap; 26 static inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); } 27 28 DiagTools::DiagTools() : tools(new ToolMap()) {} 29 DiagTools::~DiagTools() { delete getTools(tools); } 30 31 DiagTool *DiagTools::getTool(llvm::StringRef toolCmd) { 32 ToolMap::iterator it = getTools(tools)->find(toolCmd); 33 return (it == getTools(tools)->end()) ? nullptr : it->getValue(); 34 } 35 36 void DiagTools::registerTool(DiagTool *tool) { 37 (*getTools(tools))[tool->getName()] = tool; 38 } 39 40 void 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