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