1d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel//===- tools/llvm-cov/llvm-cov.cpp - LLVM coverage tool -------------------===// 2d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// 3d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// The LLVM Compiler Infrastructure 4d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// 5d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// This file is distributed under the University of Illinois Open Source 6d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// License. See LICENSE.TXT for details. 7d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// 8d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel//===----------------------------------------------------------------------===// 9d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// 10d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// llvm-cov is a command line tools to analyze and report coverage information. 11d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel// 12d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel//===----------------------------------------------------------------------===// 13d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 14d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/ADT/OwningPtr.h" 15d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/Support/CommandLine.h" 1658c620024ad00eae80a766e8e2b3b1d9414dc4cfDevang Patel#include "llvm/Support/GCOV.h" 17d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/Support/ManagedStatic.h" 18d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/Support/MemoryObject.h" 19d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/Support/PrettyStackTrace.h" 20d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/Support/Signals.h" 21d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel#include "llvm/Support/system_error.h" 22d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patelusing namespace llvm; 23d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 24d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patelstatic cl::opt<bool> 25d02c42bb855484cad379a345dee04c7c6463f1cbDevang PatelDumpGCOV("dump", cl::init(false), cl::desc("dump gcov file")); 26d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 27d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patelstatic cl::opt<std::string> 28d02c42bb855484cad379a345dee04c7c6463f1cbDevang PatelInputGCNO("gcno", cl::desc("<input gcno file>"), cl::init("")); 29d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 30d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patelstatic cl::opt<std::string> 31d02c42bb855484cad379a345dee04c7c6463f1cbDevang PatelInputGCDA("gcda", cl::desc("<input gcda file>"), cl::init("")); 32d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 33d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 34d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel//===----------------------------------------------------------------------===// 35d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patelint main(int argc, char **argv) { 36d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel // Print a stack trace if we signal out. 37d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel sys::PrintStackTraceOnErrorSignal(); 38d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel PrettyStackTraceProgram X(argc, argv); 39d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 40d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 41d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel cl::ParseCommandLineOptions(argc, argv, "llvm cov\n"); 42d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 43d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel GCOVFile GF; 44d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel if (InputGCNO.empty()) 45d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel errs() << " " << argv[0] << ": No gcov input file!\n"; 46d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 477a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel OwningPtr<MemoryBuffer> GCNO_Buff; 487a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputGCNO, GCNO_Buff)) { 49d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel errs() << InputGCNO << ": " << ec.message() << "\n"; 50d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel return 1; 51d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel } 527a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel GCOVBuffer GCNO_GB(GCNO_Buff.take()); 537a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel if (!GF.read(GCNO_GB)) { 54d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel errs() << "Invalid .gcno File!\n"; 55d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel return 1; 56d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel } 57d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 58d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel if (!InputGCDA.empty()) { 597a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel OwningPtr<MemoryBuffer> GCDA_Buff; 607a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputGCDA, GCDA_Buff)) { 61d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel errs() << InputGCDA << ": " << ec.message() << "\n"; 62d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel return 1; 63d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel } 647a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel GCOVBuffer GCDA_GB(GCDA_Buff.take()); 657a50202be59b59416d2d42820e68b26ed78b3d0fDevang Patel if (!GF.read(GCDA_GB)) { 66d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel errs() << "Invalid .gcda File!\n"; 67d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel return 1; 68d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel } 69d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel } 70d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 71d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 72d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel if (DumpGCOV) 73d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel GF.dump(); 74d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel 75d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel FileInfo FI; 76d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel GF.collectLineCounts(FI); 77d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel return 0; 78d02c42bb855484cad379a345dee04c7c6463f1cbDevang Patel} 79