xref: /openbsd-src/gnu/llvm/clang/tools/diagtool/DiagTool.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
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)20ec727ea7Spatrick DiagTool::DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc)
21ec727ea7Spatrick     : cmd(std::string(toolCmd)), description(std::string(toolDesc)) {}
22e5dd7070Spatrick 
~DiagTool()23e5dd7070Spatrick DiagTool::~DiagTool() {}
24e5dd7070Spatrick 
25e5dd7070Spatrick typedef llvm::StringMap<DiagTool *> ToolMap;
getTools(void * v)26e5dd7070Spatrick static inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); }
27e5dd7070Spatrick 
DiagTools()28e5dd7070Spatrick DiagTools::DiagTools() : tools(new ToolMap()) {}
~DiagTools()29e5dd7070Spatrick DiagTools::~DiagTools() { delete getTools(tools); }
30e5dd7070Spatrick 
getTool(llvm::StringRef toolCmd)31e5dd7070Spatrick DiagTool *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)36e5dd7070Spatrick void DiagTools::registerTool(DiagTool *tool) {
37e5dd7070Spatrick   (*getTools(tools))[tool->getName()] = tool;
38e5dd7070Spatrick }
39e5dd7070Spatrick 
printCommands(llvm::raw_ostream & out)40e5dd7070Spatrick void 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