Home | History | Annotate | Line # | Download | only in diagtool
      1      1.1  joerg //===- DiagTool.cpp - Classes for defining diagtool tools -------------------===//
      2      1.1  joerg //
      3      1.1  joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4      1.1  joerg // See https://llvm.org/LICENSE.txt for license information.
      5      1.1  joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6      1.1  joerg //
      7      1.1  joerg //===----------------------------------------------------------------------===//
      8      1.1  joerg //
      9      1.1  joerg // This file implements the boilerplate for defining diagtool tools.
     10      1.1  joerg //
     11      1.1  joerg //===----------------------------------------------------------------------===//
     12      1.1  joerg 
     13      1.1  joerg #include "DiagTool.h"
     14      1.1  joerg #include "llvm/ADT/StringMap.h"
     15      1.1  joerg #include <vector>
     16      1.1  joerg 
     17      1.1  joerg using namespace diagtool;
     18      1.1  joerg 
     19  1.1.1.2  joerg DiagTool::DiagTool(llvm::StringRef toolCmd, llvm::StringRef toolDesc)
     20  1.1.1.2  joerg     : cmd(std::string(toolCmd)), description(std::string(toolDesc)) {}
     21      1.1  joerg 
     22      1.1  joerg DiagTool::~DiagTool() {}
     23      1.1  joerg 
     24      1.1  joerg typedef llvm::StringMap<DiagTool *> ToolMap;
     25      1.1  joerg static inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); }
     26      1.1  joerg 
     27      1.1  joerg DiagTools::DiagTools() : tools(new ToolMap()) {}
     28      1.1  joerg DiagTools::~DiagTools() { delete getTools(tools); }
     29      1.1  joerg 
     30      1.1  joerg DiagTool *DiagTools::getTool(llvm::StringRef toolCmd) {
     31      1.1  joerg   ToolMap::iterator it = getTools(tools)->find(toolCmd);
     32      1.1  joerg   return (it == getTools(tools)->end()) ? nullptr : it->getValue();
     33      1.1  joerg }
     34      1.1  joerg 
     35      1.1  joerg void DiagTools::registerTool(DiagTool *tool) {
     36      1.1  joerg   (*getTools(tools))[tool->getName()] = tool;
     37      1.1  joerg }
     38      1.1  joerg 
     39      1.1  joerg void DiagTools::printCommands(llvm::raw_ostream &out) {
     40      1.1  joerg   std::vector<llvm::StringRef> toolNames;
     41      1.1  joerg   unsigned maxName = 0;
     42      1.1  joerg   for (ToolMap::iterator it = getTools(tools)->begin(),
     43      1.1  joerg        ei = getTools(tools)->end(); it != ei; ++it) {
     44      1.1  joerg     toolNames.push_back(it->getKey());
     45      1.1  joerg     unsigned len = it->getKey().size();
     46      1.1  joerg     if (len > maxName)
     47      1.1  joerg       maxName = len;
     48      1.1  joerg   }
     49      1.1  joerg   llvm::sort(toolNames);
     50      1.1  joerg 
     51      1.1  joerg   for (std::vector<llvm::StringRef>::iterator it = toolNames.begin(),
     52      1.1  joerg        ei = toolNames.end(); it != ei; ++it) {
     53      1.1  joerg 
     54      1.1  joerg     out << "  " << (*it);
     55      1.1  joerg     unsigned spaces = (maxName + 3) - (it->size());
     56      1.1  joerg     for (unsigned i = 0; i < spaces; ++i)
     57      1.1  joerg       out << ' ';
     58      1.1  joerg 
     59      1.1  joerg     out << getTool(*it)->getDescription() << '\n';
     60      1.1  joerg   }
     61      1.1  joerg }
     62      1.1  joerg 
     63      1.1  joerg namespace diagtool {
     64      1.1  joerg   llvm::ManagedStatic<DiagTools> diagTools;
     65      1.1  joerg }
     66