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
18using namespace diagtool;
19
20DiagTool::DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc)
21 : cmd(std::string(toolCmd)), description(std::string(toolDesc)) {}
22
23DiagTool::~DiagTool() {}
24
25typedef llvm::StringMap<DiagTool *> ToolMap;
26static inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); }
27
28DiagTools::DiagTools() : tools(new ToolMap()) {}
29DiagTools::~DiagTools() { delete getTools(v: tools); }
30
31DiagTool *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
36void DiagTools::registerTool(DiagTool *tool) {
37 (*getTools(v: tools))[tool->getName()] = tool;
38}
39
40void 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
64namespace diagtool {
65 llvm::ManagedStatic<DiagTools> diagTools;
66}
67