Update copyright to LGPL on all files
[dyninst.git] / depGraphAPI / test / testAll.C
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #include <iostream>
33 #include <stdio.h>
34 #include <stdint.h>
35 #include <unistd.h>
36
37 #include "BPatch.h"
38 #include "BPatch_function.h"
39 #include "BPatch_Vector.h"
40 #include "BPatch_thread.h"
41 #include "BPatch_snippet.h"
42
43 #include "Graph.h"
44
45 #include "DDG.h"
46 #include "CDG.h"
47 #include "PDG.h"
48 #include "FDG.h"
49 #include "xPDG.h"
50
51 BPatch bpatch;
52
53 using namespace Dyninst;
54 using namespace DepGraphAPI;
55
56 #define DDG_ID 1
57 #define CDG_ID 2
58 #define FDG_ID 4
59 #define PDG_ID 8
60 #define XPDG_ID 16
61
62 int main(int argc, const char** argv)
63 {
64   
65   if( argc < 3 )
66     {
67       std::cerr << "Usage: " << argv[0] 
68                 << " <test_program> <func_to_analyze> [graph type: any subset of ddg, cdg, fdg, pdg, xpdg]" 
69                 << std::endl;
70       exit( EXIT_FAILURE );
71     }
72   
73   unsigned process = 0;
74   if (argc == 3) {
75       process = 31;
76   }
77   else {
78       for (int i = 3; i < argc; i++) {
79           if (strcmp(argv[i], "ddg") == 0) {
80               process += DDG_ID;
81           }
82           else if (strcmp(argv[i], "cdg") == 0) {
83               process += CDG_ID;
84           }
85           else if (strcmp(argv[i], "fdg") == 0) {
86               process += FDG_ID;
87           }
88           else if (strcmp(argv[i], "pdg") == 0) {
89               process += PDG_ID;
90           }
91           else if (strcmp(argv[i], "xpdg") == 0) {
92               process += XPDG_ID;
93           }
94           else {
95               std::cerr << "Unrecognized argument: " << argv[i] << ". Exiting!" << std::endl;
96               exit( EXIT_FAILURE );
97           }
98       }
99   }
100
101   BPatch_addressSpace *app = bpatch.openBinary(argv[1], true);
102
103   BPatch_image* appImage = app->getImage();
104
105   BPatch_Vector <BPatch_function *> function;
106   appImage->findFunction(argv[2], 
107                          function);
108
109   std::string str;
110   
111   if (process & DDG_ID) {
112       DDG::Ptr ddg = DDG::analyze(function[0]);
113       std::string str(argv[2]);
114       str += ".ddg.dot";
115       ddg->printDOT(str);
116   }
117
118   if (process & CDG_ID) {
119       CDG::Ptr cdg = CDG::analyze(function[0]);
120       str = std::string(argv[2]);
121       str += ".cdg.dot";
122       cdg->printDOT(str);
123   }
124
125   if (process & FDG_ID) {
126       FDG::Ptr fdg = FDG::analyze(function[0]);
127       str = std::string(argv[2]);
128       str += ".fdg.dot";
129       fdg->printDOT(str);
130   }
131
132   if (process & PDG_ID) {
133       PDG::Ptr pdg = PDG::analyze(function[0]);
134       str = std::string(argv[2]);
135       str += ".pdg.dot";
136       pdg->printDOT(str);
137   }
138
139   if (process & XPDG_ID) {
140       xPDG::Ptr xpdg = xPDG::analyze(function[0]);
141       str = std::string(argv[2]);
142       str += ".xpdg.dot";
143       xpdg->printDOT(str);
144   }
145   return EXIT_SUCCESS;
146 }