blob: 04a706e0a0ca8d2f2d9e7438a517367387ff6c87 [file] [log] [blame]
Zhongxing Xu22daf792009-07-16 01:03:49 +00001//===--- clang-wpa.cpp - clang whole program analyzer ---------------------===//
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// This tool reads a sequence of precompiled AST files, and do various
11// cross translation unit analyses.
12//
13//===----------------------------------------------------------------------===//
14
Zhongxing Xudc3240c2009-07-16 01:00:25 +000015#include "clang/Basic/FileManager.h"
Daniel Dunbar31b87d82009-09-21 03:03:39 +000016#include "clang/Basic/SourceManager.h"
Daniel Dunbar8fd57fe2009-12-03 07:20:04 +000017#include "clang/Frontend/ASTUnit.h"
Daniel Dunbar5262fda2009-12-03 01:45:44 +000018#include "clang/Frontend/CompilerInstance.h"
Daniel Dunbar8fd57fe2009-12-03 07:20:04 +000019#include "clang/Index/CallGraph.h"
Douglas Gregorf45d6732010-04-06 01:25:58 +000020#include "llvm/ADT/IntrusiveRefCntPtr.h"
Zhongxing Xudc3240c2009-07-16 01:00:25 +000021#include "llvm/Support/CommandLine.h"
22#include "llvm/Support/raw_ostream.h"
23using namespace clang;
24using namespace idx;
25
26static llvm::cl::list<std::string>
27InputFilenames(llvm::cl::Positional, llvm::cl::desc("<input AST files>"));
28
Zhongxing Xu9b80ceb2010-07-02 06:58:30 +000029static llvm::cl::opt<bool> ViewCallGraph("view-call-graph",
30 llvm::cl::desc("Display the call graph."));
31
Zhongxing Xudc3240c2009-07-16 01:00:25 +000032int main(int argc, char **argv) {
33 llvm::cl::ParseCommandLineOptions(argc, argv, "clang-wpa");
34 FileManager FileMgr;
Argyrios Kyrtzidis05945452009-07-29 23:39:09 +000035 std::vector<ASTUnit*> ASTUnits;
Zhongxing Xudc3240c2009-07-16 01:00:25 +000036
Zhongxing Xu6d956df2010-07-02 06:39:46 +000037 Program Prog;
38
Zhongxing Xudc3240c2009-07-16 01:00:25 +000039 if (InputFilenames.empty())
40 return 0;
41
Daniel Dunbarbb3503a2009-12-06 09:56:30 +000042 DiagnosticOptions DiagOpts;
Douglas Gregor7969f932010-04-06 04:03:12 +000043 llvm::IntrusiveRefCntPtr<Diagnostic> Diags
44 = CompilerInstance::createDiagnostics(DiagOpts, argc, argv);
Zhongxing Xudc3240c2009-07-16 01:00:25 +000045 for (unsigned i = 0, e = InputFilenames.size(); i != e; ++i) {
46 const std::string &InFile = InputFilenames[i];
Douglas Gregorf45d6732010-04-06 01:25:58 +000047 llvm::OwningPtr<ASTUnit> AST(ASTUnit::LoadFromPCHFile(InFile, Diags));
Daniel Dunbar5262fda2009-12-03 01:45:44 +000048 if (!AST)
Zhongxing Xudc3240c2009-07-16 01:00:25 +000049 return 1;
Zhongxing Xudc3240c2009-07-16 01:00:25 +000050
Argyrios Kyrtzidis05945452009-07-29 23:39:09 +000051 ASTUnits.push_back(AST.take());
Zhongxing Xudc3240c2009-07-16 01:00:25 +000052 }
53
Zhongxing Xu9b80ceb2010-07-02 06:58:30 +000054 if (ViewCallGraph) {
55 llvm::OwningPtr<CallGraph> CG;
56 CG.reset(new CallGraph(Prog));
Zhongxing Xudc3240c2009-07-16 01:00:25 +000057
Zhongxing Xu9b80ceb2010-07-02 06:58:30 +000058 for (unsigned i = 0, e = ASTUnits.size(); i != e; ++i)
59 CG->addTU(ASTUnits[i]->getASTContext());
Zhongxing Xudc3240c2009-07-16 01:00:25 +000060
Zhongxing Xu9b80ceb2010-07-02 06:58:30 +000061 CG->ViewCallGraph();
62 return 0;
63 }
Zhongxing Xudc3240c2009-07-16 01:00:25 +000064}