1274955Ssvnmir//===- llvm-cov.cpp - LLVM coverage tool ----------------------------------===//
2226584Sdim//
3226584Sdim//                     The LLVM Compiler Infrastructure
4226584Sdim//
5226584Sdim// This file is distributed under the University of Illinois Open Source
6226584Sdim// License. See LICENSE.TXT for details.
7226584Sdim//
8226584Sdim//===----------------------------------------------------------------------===//
9226584Sdim//
10226584Sdim// llvm-cov is a command line tools to analyze and report coverage information.
11226584Sdim//
12226584Sdim//===----------------------------------------------------------------------===//
13226584Sdim
14277323Sdim#include "llvm/ADT/StringRef.h"
15277323Sdim#include "llvm/ADT/StringSwitch.h"
16288943Sdim#include "llvm/Support/CommandLine.h"
17274955Ssvnmir#include "llvm/Support/Path.h"
18288943Sdim#include "llvm/Support/Process.h"
19277323Sdim#include "llvm/Support/raw_ostream.h"
20277323Sdim#include <string>
21277323Sdim
22226584Sdimusing namespace llvm;
23226584Sdim
24277323Sdim/// \brief The main entry point for the 'show' subcommand.
25277323Sdimint showMain(int argc, const char *argv[]);
26226584Sdim
27277323Sdim/// \brief The main entry point for the 'report' subcommand.
28277323Sdimint reportMain(int argc, const char *argv[]);
29226584Sdim
30277323Sdim/// \brief The main entry point for the 'convert-for-testing' subcommand.
31277323Sdimint convertForTestingMain(int argc, const char *argv[]);
32226584Sdim
33277323Sdim/// \brief The main entry point for the gcov compatible coverage tool.
34277323Sdimint gcovMain(int argc, const char *argv[]);
35274955Ssvnmir
36277323Sdim/// \brief Top level help.
37288943Sdimstatic int helpMain(int argc, const char *argv[]) {
38288943Sdim  errs() << "Usage: llvm-cov {gcov|report|show} [OPTION]...\n\n"
39288943Sdim         << "Shows code coverage information.\n\n"
40288943Sdim         << "Subcommands:\n"
41288943Sdim         << "  gcov:   Work with the gcov format.\n"
42288943Sdim         << "  show:   Annotate source files using instrprof style coverage.\n"
43288943Sdim         << "  report: Summarize instrprof style coverage information.\n";
44277323Sdim  return 0;
45277323Sdim}
46274955Ssvnmir
47288943Sdim/// \brief Top level version information.
48288943Sdimstatic int versionMain(int argc, const char *argv[]) {
49288943Sdim  cl::PrintVersionMessage();
50288943Sdim  return 0;
51288943Sdim}
52288943Sdim
53277323Sdimint main(int argc, const char **argv) {
54277323Sdim  // If argv[0] is or ends with 'gcov', always be gcov compatible
55277323Sdim  if (sys::path::stem(argv[0]).endswith_lower("gcov"))
56277323Sdim    return gcovMain(argc, argv);
57274955Ssvnmir
58277323Sdim  // Check if we are invoking a specific tool command.
59277323Sdim  if (argc > 1) {
60277323Sdim    typedef int (*MainFunction)(int, const char *[]);
61277323Sdim    MainFunction Func = StringSwitch<MainFunction>(argv[1])
62277323Sdim                            .Case("convert-for-testing", convertForTestingMain)
63277323Sdim                            .Case("gcov", gcovMain)
64277323Sdim                            .Case("report", reportMain)
65277323Sdim                            .Case("show", showMain)
66277323Sdim                            .Cases("-h", "-help", "--help", helpMain)
67288943Sdim                            .Cases("-version", "--version", versionMain)
68277323Sdim                            .Default(nullptr);
69274955Ssvnmir
70277323Sdim    if (Func) {
71277323Sdim      std::string Invocation = std::string(argv[0]) + " " + argv[1];
72277323Sdim      argv[1] = Invocation.c_str();
73277323Sdim      return Func(argc - 1, argv + 1);
74226584Sdim    }
75226584Sdim  }
76226584Sdim
77288943Sdim  if (argc > 1) {
78288943Sdim    if (sys::Process::StandardErrHasColors())
79288943Sdim      errs().changeColor(raw_ostream::RED);
80288943Sdim    errs() << "Unrecognized command: " << argv[1] << ".\n\n";
81288943Sdim    if (sys::Process::StandardErrHasColors())
82288943Sdim      errs().resetColor();
83288943Sdim  }
84288943Sdim  helpMain(argc, argv);
85288943Sdim  return 1;
86274955Ssvnmir}
87