annotate codeOptimizer.py @ 14:d98bd27f77b2 default tip

Testcase for loops.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Wed, 14 Nov 2012 22:18:24 +0100
parents 2213edf59af4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
1 #!/usr/bin/env python -O
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
2
1
a1224150b8f6 Cleanup and making code easier to read.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 0
diff changeset
3 import sys
0
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
4
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
5 from Compilable import Compilable
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
6 from DepGraph import DepGraph
3
f65c2d63ab66 Rename Options to Config
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 2
diff changeset
7 from Config import Config
0
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
8
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
9
4
3a56cd936c59 Cleanup some code.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 3
diff changeset
10 def usage(name):
3a56cd936c59 Cleanup some code.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 3
diff changeset
11 print "Usage is:\n\t%s <xml configuration file> [files for analysis]" % name
0
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
12
11
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
13 def codeOptimizer(options, infiles):
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
14
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
15 if not infiles:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
16 infiles = options.getFiles()
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
17
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
18 files = {}
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
19 unknown = []
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
20
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
21 for file in infiles:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
22 if Compilable.acceptsFile(file):
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
23 c = Compilable(file)
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
24 c.setFlags(options.getCxxflags(file))
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
25 files[file] = c
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
26 else:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
27 unknown.append(file)
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
28
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
29 if len(unknown) > 0:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
30 delim = ", "
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
31 raise SystemExit(delim.join(unknown) + " are of unknown filetype")
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
32
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
33 depgraph = DepGraph()
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
34
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
35 for file in files:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
36 depgraph.add(files[file])
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
37
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
38 for file in files:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
39 depgraph.addDependency(files[file],
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
40 list(files[dep]
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
41 for dep in files[file].dependencies()))
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
42
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
43 files = depgraph.directedGraph()
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
44 print files
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
45
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
46 for file in files:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
47 if not file.worksWithoutModifications():
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
48 print file.path
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
49 raise SystemExit(file.path + " does not compile at all")
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
50
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
51 for file in files:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
52 removable = file.removeRemovableIncludes()
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
53 if removable:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
54 print 'Removable lines in ' + file.path
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
55 for r in removable:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
56 print str(r) + ' : ' + file.lines[r].rstrip()
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
57
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
58 replacable = file.replaceIncludes(dict.fromkeys(removable, '\n'))
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
59 if replacable:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
60 print 'Replacable lines in ' + file.path
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
61 for r in replacable:
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
62 print str(r) + ' : ' + file.lines[r].rstrip()
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
63
5b542d05e2b1 Make main function an actual function for easier testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 7
diff changeset
64
13
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
65 def codeOptimizerFromFilename(conffile, infiles = []):
12
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
66 try:
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
67 options = Config(conffile)
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
68 except:
13
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
69 print conffile + ' is not a valid xml file'
12
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
70 sys.exit(1)
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
71
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
72 codeOptimizer(options, infiles)
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
73
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
74
07e34df56b2a Separate target for running from only conffilename.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 11
diff changeset
75
13
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
76 if __name__ == '__main__':
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
77 if len(sys.argv) < 2:
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
78 usage(sys.argv[0])
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
79 sys.exit(1)
0
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
80
13
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
81 infiles = sys.argv[2:]
0
28b636105ed6 Working version of codeOptimizer.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents:
diff changeset
82
13
2213edf59af4 Further improvements to ease testing.
Tom Fredrik Blenning Klaussen <bfg@blenning.no>
parents: 12
diff changeset
83 codeOptimizerFromFilename(sys.argv[1], infiles)