1 //===- DiagTool.cpp - Classes for defining diagtool tools -------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the boilerplate for defining diagtool tools.
12 //===----------------------------------------------------------------------===//
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/ADT/StringMap.h"
19 using namespace diagtool;
21 DiagTool::DiagTool(llvm::StringRef toolCmd,
22 llvm::StringRef toolDesc)
23 : cmd(toolCmd), description(toolDesc) {}
25 DiagTool::~DiagTool() {}
27 typedef llvm::StringMap<DiagTool *> ToolMap;
28 static inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); }
30 DiagTools::DiagTools() : tools(new ToolMap()) {}
31 DiagTools::~DiagTools() { delete getTools(tools); }
33 DiagTool *DiagTools::getTool(llvm::StringRef toolCmd) {
34 ToolMap::iterator it = getTools(tools)->find(toolCmd);
35 return (it == getTools(tools)->end()) ? nullptr : it->getValue();
38 void DiagTools::registerTool(DiagTool *tool) {
39 (*getTools(tools))[tool->getName()] = tool;
42 void DiagTools::printCommands(llvm::raw_ostream &out) {
43 std::vector<llvm::StringRef> toolNames;
45 for (ToolMap::iterator it = getTools(tools)->begin(),
46 ei = getTools(tools)->end(); it != ei; ++it) {
47 toolNames.push_back(it->getKey());
48 unsigned len = it->getKey().size();
52 std::sort(toolNames.begin(), toolNames.end());
54 for (std::vector<llvm::StringRef>::iterator it = toolNames.begin(),
55 ei = toolNames.end(); it != ei; ++it) {
58 unsigned spaces = (maxName + 3) - (it->size());
59 for (unsigned i = 0; i < spaces; ++i)
62 out << getTool(*it)->getDescription() << '\n';
67 llvm::ManagedStatic<DiagTools> diagTools;