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