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