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