12dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//===- DiagTool.cpp - Classes for defining diagtool tools -------------------===//
22dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//
32dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//                     The LLVM Compiler Infrastructure
42dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//
52dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// This file is distributed under the University of Illinois Open Source
62dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// License. See LICENSE.TXT for details.
72dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//
82dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//===----------------------------------------------------------------------===//
92dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//
102dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek// This file implements the boilerplate for defining diagtool tools.
112dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//
122dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek//===----------------------------------------------------------------------===//
132dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
142dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include "DiagTool.h"
152dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include "llvm/ADT/StringMap.h"
162dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include "llvm/ADT/SmallString.h"
172dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek#include <vector>
182dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
192dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekusing namespace diagtool;
202dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
212dc651dfd4a4497c39b862e060200d6d58f5c4ecTed KremenekDiagTool::DiagTool(llvm::StringRef toolCmd,
222dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek                   llvm::StringRef toolDesc)
232dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  : cmd(toolCmd), description(toolDesc) {}
242dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
252dc651dfd4a4497c39b862e060200d6d58f5c4ecTed KremenekDiagTool::~DiagTool() {}
262dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
272dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenektypedef llvm::StringMap<DiagTool *> ToolMap;
282dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekstatic inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); }
292dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
302dc651dfd4a4497c39b862e060200d6d58f5c4ecTed KremenekDiagTools::DiagTools() : tools(new ToolMap()) {}
312dc651dfd4a4497c39b862e060200d6d58f5c4ecTed KremenekDiagTools::~DiagTools() { delete getTools(tools); }
322dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
332dc651dfd4a4497c39b862e060200d6d58f5c4ecTed KremenekDiagTool *DiagTools::getTool(llvm::StringRef toolCmd) {
342dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  ToolMap::iterator it = getTools(tools)->find(toolCmd);
352dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  return (it == getTools(tools)->end()) ? 0 : it->getValue();
362dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}
372dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
382dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekvoid DiagTools::registerTool(DiagTool *tool) {
392dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  getTools(tools)->GetOrCreateValue(tool->getName(), tool);
402dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}
412dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
422dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenekvoid DiagTools::printCommands(llvm::raw_ostream &out) {
432dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  std::vector<llvm::StringRef> toolNames;
442dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  unsigned maxName = 0;
452dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  for (ToolMap::iterator it = getTools(tools)->begin(),
462dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek       ei = getTools(tools)->end(); it != ei; ++it) {
472dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    toolNames.push_back(it->getKey());
482dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    unsigned len = it->getKey().size();
492dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    if (len > maxName)
502dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek      maxName = len;
512dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  }
522dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  std::sort(toolNames.begin(), toolNames.end());
532dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
542dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  for (std::vector<llvm::StringRef>::iterator it = toolNames.begin(),
552dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek       ei = toolNames.end(); it != ei; ++it) {
562dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
572dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    out << "  " << (*it);
582dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    unsigned spaces = (maxName + 3) - (it->size());
592dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    for (unsigned i = 0; i < spaces; ++i)
602dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek      out << ' ';
612dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
622dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek    out << getTool(*it)->getDescription() << '\n';
632dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek  }
642dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}
652dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek
662dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremeneknamespace diagtool {
6783f06e8223291cd8dabe94d0cbfd0553121d5a44Nick Lewycky  llvm::ManagedStatic<DiagTools> diagTools;
682dc651dfd4a4497c39b862e060200d6d58f5c4ecTed Kremenek}
69