| 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 | |
| 20 | DiagTool::DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc) |
| 21 | : cmd(std::string(toolCmd)), description(std::string(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(v: tools); } |
| 30 | |
| 31 | DiagTool *DiagTools::getTool(llvm::StringRef toolCmd) { |
| 32 | ToolMap::iterator it = getTools(v: tools)->find(Key: toolCmd); |
| 33 | return (it == getTools(v: tools)->end()) ? nullptr : it->getValue(); |
| 34 | } |
| 35 | |
| 36 | void DiagTools::registerTool(DiagTool *tool) { |
| 37 | (*getTools(v: 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(v: tools)->begin(), |
| 44 | ei = getTools(v: tools)->end(); it != ei; ++it) { |
| 45 | toolNames.push_back(x: it->getKey()); |
| 46 | unsigned len = it->getKey().size(); |
| 47 | if (len > maxName) |
| 48 | maxName = len; |
| 49 | } |
| 50 | llvm::sort(C&: 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(toolCmd: *it)->getDescription() << '\n'; |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | namespace diagtool { |
| 65 | llvm::ManagedStatic<DiagTools> diagTools; |
| 66 | } |
| 67 |