1 //===- llvm-cov.cpp - LLVM coverage tool ----------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // llvm-cov is a command line tools to analyze and report coverage information. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/ADT/StringRef.h" 15 #include "llvm/ADT/StringSwitch.h" 16 #include "llvm/Support/CommandLine.h" 17 #include "llvm/Support/Path.h" 18 #include "llvm/Support/Process.h" 19 #include "llvm/Support/raw_ostream.h" 20 #include <string> 21 22 using namespace llvm; 23 24 /// \brief The main entry point for the 'show' subcommand. 25 int showMain(int argc, const char *argv[]); 26 27 /// \brief The main entry point for the 'report' subcommand. 28 int reportMain(int argc, const char *argv[]); 29 30 /// \brief The main entry point for the 'convert-for-testing' subcommand. 31 int convertForTestingMain(int argc, const char *argv[]); 32 33 /// \brief The main entry point for the gcov compatible coverage tool. 34 int gcovMain(int argc, const char *argv[]); 35 36 /// \brief Top level help. 37 static int helpMain(int argc, const char *argv[]) { 38 errs() << "Usage: llvm-cov {gcov|report|show} [OPTION]...\n\n" 39 << "Shows code coverage information.\n\n" 40 << "Subcommands:\n" 41 << " gcov: Work with the gcov format.\n" 42 << " show: Annotate source files using instrprof style coverage.\n" 43 << " report: Summarize instrprof style coverage information.\n"; 44 return 0; 45 } 46 47 /// \brief Top level version information. 48 static int versionMain(int argc, const char *argv[]) { 49 cl::PrintVersionMessage(); 50 return 0; 51 } 52 53 int main(int argc, const char **argv) { 54 // If argv[0] is or ends with 'gcov', always be gcov compatible 55 if (sys::path::stem(argv[0]).endswith_lower("gcov")) 56 return gcovMain(argc, argv); 57 58 // Check if we are invoking a specific tool command. 59 if (argc > 1) { 60 typedef int (*MainFunction)(int, const char *[]); 61 MainFunction Func = StringSwitch<MainFunction>(argv[1]) 62 .Case("convert-for-testing", convertForTestingMain) 63 .Case("gcov", gcovMain) 64 .Case("report", reportMain) 65 .Case("show", showMain) 66 .Cases("-h", "-help", "--help", helpMain) 67 .Cases("-version", "--version", versionMain) 68 .Default(nullptr); 69 70 if (Func) { 71 std::string Invocation = std::string(argv[0]) + " " + argv[1]; 72 argv[1] = Invocation.c_str(); 73 return Func(argc - 1, argv + 1); 74 } 75 } 76 77 if (argc > 1) { 78 if (sys::Process::StandardErrHasColors()) 79 errs().changeColor(raw_ostream::RED); 80 errs() << "Unrecognized command: " << argv[1] << ".\n\n"; 81 if (sys::Process::StandardErrHasColors()) 82 errs().resetColor(); 83 } 84 helpMain(argc, argv); 85 return 1; 86 } 87