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